From aaf1213c6f70af0b517f6aa13cd837d3468a7a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Mon, 6 Feb 2023 22:25:03 +0100 Subject: [PATCH 01/14] vendor/bc: import version 6.2.4 This update contains only documentation changes (new main repository URL and changed mail address of the program author) and changes to the build system that do not affect the FreeBSD base system build. --- LICENSE.md | 6 +-- NEWS.md | 18 +++++++++ README.md | 22 +++++----- gen/bc_help.txt | 2 +- gen/dc_help.txt | 2 +- gen/strgen.sh | 16 +++++++- include/version.h | 2 +- manuals/bc/A.1 | 4 +- manuals/bc/A.1.md | 4 +- manuals/bc/E.1 | 4 +- manuals/bc/E.1.md | 4 +- manuals/bc/EH.1 | 4 +- manuals/bc/EH.1.md | 4 +- manuals/bc/EHN.1 | 4 +- manuals/bc/EHN.1.md | 4 +- manuals/bc/EN.1 | 4 +- manuals/bc/EN.1.md | 4 +- manuals/bc/H.1 | 4 +- manuals/bc/H.1.md | 4 +- manuals/bc/HN.1 | 4 +- manuals/bc/HN.1.md | 4 +- manuals/bc/N.1 | 4 +- manuals/bc/N.1.md | 4 +- manuals/bcl.3 | 4 +- manuals/bcl.3.md | 4 +- manuals/build.md | 2 +- manuals/dc/A.1 | 4 +- manuals/dc/A.1.md | 4 +- manuals/dc/E.1 | 4 +- manuals/dc/E.1.md | 4 +- manuals/dc/EH.1 | 4 +- manuals/dc/EH.1.md | 4 +- manuals/dc/EHN.1 | 4 +- manuals/dc/EHN.1.md | 4 +- manuals/dc/EN.1 | 4 +- manuals/dc/EN.1.md | 4 +- manuals/dc/H.1 | 4 +- manuals/dc/H.1.md | 4 +- manuals/dc/HN.1 | 4 +- manuals/dc/HN.1.md | 4 +- manuals/dc/N.1 | 4 +- manuals/dc/N.1.md | 4 +- scripts/functions.sh | 82 ++++++++++++++++++++++++++++++++++++++ scripts/locale_install.sh | 11 ++++- src/data.c | 2 +- tests/all.sh | 27 ++++++++++++- tests/bc/timeconst.sh | 18 ++++++++- tests/dc/scripts/easter.sh | 50 ++++++++++++++++++++++- tests/error.sh | 21 +++++++--- tests/errors.sh | 17 +++++++- tests/history.py | 2 +- tests/history.sh | 18 ++++++++- tests/other.sh | 17 +++++++- tests/read.sh | 19 +++++++-- tests/script.sh | 29 ++++++++++++-- tests/scripts.sh | 25 +++++++++++- tests/stdin.sh | 17 +++++++- tests/test.sh | 23 ++++++++++- 58 files changed, 469 insertions(+), 115 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 8e6b7e0b905..b65095edc26 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License -Copyright (c) 2018-2023 Gavin D. Howard +Copyright (c) 2018-2023 Gavin D. Howard Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -31,7 +31,7 @@ copyrights and license: Copyright (c) 2010-2014, Salvatore Sanfilippo
Copyright (c) 2010-2013, Pieter Noordhuis
Copyright (c) 2018 rain-1
-Copyright (c) 2018-2023, Gavin D. Howard +Copyright (c) 2018-2023, Gavin D. Howard Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -60,7 +60,7 @@ The files `src/rand.c` and `include/rand.h` are under the following copyrights and license: Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors -Copyright (c) 2018-2023 Gavin D. Howard +Copyright (c) 2018-2023 Gavin D. Howard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/NEWS.md b/NEWS.md index 36952fdaf58..4601db456f8 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,23 @@ # News +## 6.2.4 + +This is a production release that fixes a test failure that happens when +`tests/bc/scripts/timeconst.bc` doesn't exist. This should only affect +packagers. + +This bug happened because I forgot something I added in the previous release: +better error checking in tests to help packagers. Unfortunately, I was too +zealous with the error checking. + +## 6.2.3 + +This is a production release that moves `bc` to . + +That's all it does: update links. Users do ***NOT*** need to upgrade; there are +redirects that will stay in place indefinitely. This release is only for new +users. + ## 6.2.2 This is a production release that fixes a bug. diff --git a/README.md b/README.md index 438cab0d169..9d395f74718 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # `bc` -***WARNING: New user registration for https://git.yzena.com/ is disabled because -of spam. If you need to report a bug with `bc`, email gavin at this site minus -the `git.` part for an account, and I will create one for you. Or you can report -an issue at [GitHub][29].*** +***WARNING: New user registration for is disabled +because of spam. If you need to report a bug with `bc`, email gavin at this site +minus the `git.` part for an account, and I will create one for you. Or you can +report an issue at [GitHub][29].*** -***WARNING: This project has moved to [https://git.yzena.com/][20] for [these -reasons][21], though GitHub will remain a mirror.*** +***WARNING: This project has moved to [https://git.gavinhoward.com/][20] for +[these reasons][21], though GitHub will remain a mirror.*** This is an implementation of the [POSIX `bc` calculator][12] that implements [GNU `bc`][1] extensions, as well as the period (`.`) extension for the BSD @@ -443,6 +443,10 @@ This `bc` uses the commit message guidelines laid out in [this blog post][10]. This `bc` uses [semantic versioning][11]. +## AI-Free + +This repository is 100% AI-Free code. + ## Contents Items labeled with `(maintainer use only)` are not included in release source @@ -481,10 +485,10 @@ Folders: [10]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html [11]: http://semver.org/ [12]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html -[17]: https://git.yzena.com/gavin/vim-bc -[18]: https://git.yzena.com/gavin/bc_libs +[17]: https://git.gavinhoward.com/gavin/vim-bc +[18]: https://git.gavinhoward.com/gavin/bc_libs [19]: ./manuals/benchmarks.md -[20]: https://git.yzena.com/gavin/bc +[20]: https://git.gavinhoward.com/gavin/bc [21]: https://gavinhoward.com/2020/04/i-am-moving-away-from-github/ [22]: https://www.deepl.com/translator [23]: https://cgit.freebsd.org/src/tree/contrib/bc diff --git a/gen/bc_help.txt b/gen/bc_help.txt index f78ba9e71dd..c51ba186db1 100644 --- a/gen/bc_help.txt +++ b/gen/bc_help.txt @@ -37,7 +37,7 @@ usage: %s [options] [file...] bc is a command-line, arbitrary-precision calculator with a Turing-complete language. For details, use `man %s` or see the online documentation at -https://git.yzena.com/gavin/bc/src/tag/%s/manuals/bc/%s.1.md. +https://git.gavinhoward.com/gavin/bc/src/tag/%s/manuals/bc/%s.1.md. This bc is compatible with both the GNU bc and the POSIX bc spec. See the GNU bc manual (https://www.gnu.org/software/bc/manual/bc.html) and bc spec diff --git a/gen/dc_help.txt b/gen/dc_help.txt index 8b313f8d9e0..7d9e7ec28d2 100644 --- a/gen/dc_help.txt +++ b/gen/dc_help.txt @@ -37,7 +37,7 @@ usage: %s [options] [file...] dc is a reverse-polish notation command-line calculator which supports unlimited precision arithmetic. For details, use `man %s` or see the online documentation -at https://git.yzena.com/gavin/bc/src/tag/%s/manuals/bc/%s.1.md. +at https://git.gavinhoward.com/gavin/bc/src/tag/%s/manuals/bc/%s.1.md. This dc is (mostly) compatible with the OpenBSD dc and the GNU dc. See the OpenBSD man page (http://man.openbsd.org/OpenBSD-current/man1/dc.1) and the GNU diff --git a/gen/strgen.sh b/gen/strgen.sh index 5ef66fb2d8c..a65e221ad0b 100755 --- a/gen/strgen.sh +++ b/gen/strgen.sh @@ -36,21 +36,33 @@ script="$0" scriptdir=$(dirname "$script") . "$scriptdir/../scripts/functions.sh" +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + printf 'usage: %s input output exclude name [label [define [remove_tabs]]]\n' "$progname" + exit 1 +} + # See strgen.c comment on main() for what these mean. Note, however, that this # script generates a string literal, not a char array. To understand the # consequences of that, see manuals/development.md#strgenc. if [ $# -lt 3 ]; then - echo "usage: $progname input output exclude name [label [define [remove_tabs]]]" - exit 1 + usage "Not enough arguments" fi input="$1" +check_file_arg "$input" output="$2" exclude="$3" name="$4" label="$5" define="$6" remove_tabs="$7" +check_bool_arg "$remove_tabs" tmpinput=$(mktemp -t "${input##*/}_XXXXXX") diff --git a/include/version.h b/include/version.h index e1b72de90ee..6d8ddfea094 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.2.2 +#define VERSION 6.2.4 #endif // BC_VERSION_H diff --git a/manuals/bc/A.1 b/manuals/bc/A.1 index 629cc32c4c6..b1996a1f282 100644 --- a/manuals/bc/A.1 +++ b/manuals/bc/A.1 @@ -2977,8 +2977,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md index 40cfa5fcdad..e7b4c821219 100644 --- a/manuals/bc/A.1.md +++ b/manuals/bc/A.1.md @@ -2498,8 +2498,8 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bc/E.1 b/manuals/bc/E.1 index 89f95ef81cf..fea1cecdc4c 100644 --- a/manuals/bc/E.1 +++ b/manuals/bc/E.1 @@ -1810,8 +1810,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/E.1.md b/manuals/bc/E.1.md index 30451dabd64..3631267f2dc 100644 --- a/manuals/bc/E.1.md +++ b/manuals/bc/E.1.md @@ -1506,8 +1506,8 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1 index e006a5c41c8..2a36cab7f77 100644 --- a/manuals/bc/EH.1 +++ b/manuals/bc/EH.1 @@ -1781,8 +1781,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/EH.1.md b/manuals/bc/EH.1.md index 28f874c36eb..f2f49ea7694 100644 --- a/manuals/bc/EH.1.md +++ b/manuals/bc/EH.1.md @@ -1480,8 +1480,8 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1 index e7714871025..75768a03c14 100644 --- a/manuals/bc/EHN.1 +++ b/manuals/bc/EHN.1 @@ -1774,8 +1774,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/EHN.1.md b/manuals/bc/EHN.1.md index 09288c577a5..a38503cc8a2 100644 --- a/manuals/bc/EHN.1.md +++ b/manuals/bc/EHN.1.md @@ -1472,8 +1472,8 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1 index 99ecfd2056e..9c015858319 100644 --- a/manuals/bc/EN.1 +++ b/manuals/bc/EN.1 @@ -1803,8 +1803,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/EN.1.md b/manuals/bc/EN.1.md index 52bacfa5df6..28b558d8b21 100644 --- a/manuals/bc/EN.1.md +++ b/manuals/bc/EN.1.md @@ -1498,8 +1498,8 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bc/H.1 b/manuals/bc/H.1 index 856d2c604de..cbd93da0df8 100644 --- a/manuals/bc/H.1 +++ b/manuals/bc/H.1 @@ -2948,8 +2948,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md index 4a1278dbec8..ac35def9019 100644 --- a/manuals/bc/H.1.md +++ b/manuals/bc/H.1.md @@ -2472,8 +2472,8 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1 index 5356950aa68..5893d2a7f9a 100644 --- a/manuals/bc/HN.1 +++ b/manuals/bc/HN.1 @@ -2941,8 +2941,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md index 8dd0674512a..82a99addd34 100644 --- a/manuals/bc/HN.1.md +++ b/manuals/bc/HN.1.md @@ -2464,8 +2464,8 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bc/N.1 b/manuals/bc/N.1 index 517e403aa6c..791f4740700 100644 --- a/manuals/bc/N.1 +++ b/manuals/bc/N.1 @@ -2970,8 +2970,8 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md index 2c85180f670..b8339ea31a5 100644 --- a/manuals/bc/N.1.md +++ b/manuals/bc/N.1.md @@ -2490,8 +2490,8 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.yzena.com/gavin/bc . +No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/bcl.3 b/manuals/bcl.3 index e066103d02f..6bebaa8f02c 100644 --- a/manuals/bcl.3 +++ b/manuals/bcl.3 @@ -1446,8 +1446,8 @@ This is also true of bcl(3). .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc. +Report bugs at https://git.gavinhoward.com/gavin/bc. .SH AUTHORS .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/bcl.3.md b/manuals/bcl.3.md index e2d92866ddb..6c6967b4477 100644 --- a/manuals/bcl.3.md +++ b/manuals/bcl.3.md @@ -1230,8 +1230,8 @@ use a period (**.**) as a radix point, regardless of the value of # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc. +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc. # AUTHORS -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/build.md b/manuals/build.md index 5cec45f596b..d9c46ae2260 100644 --- a/manuals/build.md +++ b/manuals/build.md @@ -40,7 +40,7 @@ accepted build options. ## Windows For releases, Windows builds of `bc`, `dc`, and `bcl` are available for download -from and GitHub. +from and GitHub. However, if you wish to build it yourself, this `bc` can be built using Visual Studio or MSBuild. diff --git a/manuals/dc/A.1 b/manuals/dc/A.1 index 6500bf9129e..13ed8c4cf80 100644 --- a/manuals/dc/A.1 +++ b/manuals/dc/A.1 @@ -1718,8 +1718,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/A.1.md b/manuals/dc/A.1.md index 4c40e38dcee..b656650cb82 100644 --- a/manuals/dc/A.1.md +++ b/manuals/dc/A.1.md @@ -1517,8 +1517,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/dc/E.1 b/manuals/dc/E.1 index 7f2477f1077..3fb69dfe70d 100644 --- a/manuals/dc/E.1 +++ b/manuals/dc/E.1 @@ -1496,8 +1496,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/E.1.md b/manuals/dc/E.1.md index 437fc645937..0bbe9761288 100644 --- a/manuals/dc/E.1.md +++ b/manuals/dc/E.1.md @@ -1341,8 +1341,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/dc/EH.1 b/manuals/dc/EH.1 index ba4e6750702..da7776edd53 100644 --- a/manuals/dc/EH.1 +++ b/manuals/dc/EH.1 @@ -1470,8 +1470,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/EH.1.md b/manuals/dc/EH.1.md index 6d1dd78985b..0751d3f78d2 100644 --- a/manuals/dc/EH.1.md +++ b/manuals/dc/EH.1.md @@ -1318,8 +1318,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/dc/EHN.1 b/manuals/dc/EHN.1 index 5f454d01cc2..10ef283ea05 100644 --- a/manuals/dc/EHN.1 +++ b/manuals/dc/EHN.1 @@ -1466,8 +1466,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/EHN.1.md b/manuals/dc/EHN.1.md index e3786886a03..9ba7fe13e0a 100644 --- a/manuals/dc/EHN.1.md +++ b/manuals/dc/EHN.1.md @@ -1313,8 +1313,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/dc/EN.1 b/manuals/dc/EN.1 index 6f08fc8d3c0..abdcbe8c63f 100644 --- a/manuals/dc/EN.1 +++ b/manuals/dc/EN.1 @@ -1492,8 +1492,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/EN.1.md b/manuals/dc/EN.1.md index b97e121e222..5c0590c53ae 100644 --- a/manuals/dc/EN.1.md +++ b/manuals/dc/EN.1.md @@ -1336,8 +1336,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/dc/H.1 b/manuals/dc/H.1 index cc2f156205e..c96100e51bc 100644 --- a/manuals/dc/H.1 +++ b/manuals/dc/H.1 @@ -1692,8 +1692,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/H.1.md b/manuals/dc/H.1.md index b8ad29b28a8..0dddf66d700 100644 --- a/manuals/dc/H.1.md +++ b/manuals/dc/H.1.md @@ -1494,8 +1494,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/dc/HN.1 b/manuals/dc/HN.1 index 8d16b10a23d..a6644ecd575 100644 --- a/manuals/dc/HN.1 +++ b/manuals/dc/HN.1 @@ -1688,8 +1688,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/HN.1.md b/manuals/dc/HN.1.md index d658409b836..d39a7497d3a 100644 --- a/manuals/dc/HN.1.md +++ b/manuals/dc/HN.1.md @@ -1489,8 +1489,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/manuals/dc/N.1 b/manuals/dc/N.1 index 54fbadeed09..f9aeb1acfb6 100644 --- a/manuals/dc/N.1 +++ b/manuals/dc/N.1 @@ -1714,8 +1714,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS .PP None are known. -Report bugs at https://git.yzena.com/gavin/bc . +Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR .PP Gavin D. -Howard and contributors. +Howard and contributors. diff --git a/manuals/dc/N.1.md b/manuals/dc/N.1.md index 35573c49da9..3c36661d390 100644 --- a/manuals/dc/N.1.md +++ b/manuals/dc/N.1.md @@ -1512,8 +1512,8 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.yzena.com/gavin/bc . +None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . # AUTHOR -Gavin D. Howard and contributors. +Gavin D. Howard and contributors. diff --git a/scripts/functions.sh b/scripts/functions.sh index 98cb5cf7aae..8ae765859e5 100755 --- a/scripts/functions.sh +++ b/scripts/functions.sh @@ -71,6 +71,88 @@ err_exit() { exit "$2" } +# Function for checking the "d"/"dir" argument of scripts. This function expects +# a usage() function to exist in the caller. +# @param 1 The argument to check. +check_d_arg() { + + if [ "$#" -ne 1 ]; then + printf 'Invalid number of args to check_d_arg\n' + exit 1 + fi + + _check_d_arg_arg="$1" + shift + + if [ "$_check_d_arg_arg" != "bc" ] && [ "$_check_d_arg_arg" != "dc" ]; then + _check_d_arg_msg=$(printf 'Invalid d arg: %s\nMust be either "bc" or "dc".\n\n' \ + "$_check_d_arg_arg") + usage "$_check_d_arg_msg" + fi +} + +# Function for checking the boolean arguments of scripts. This function expects +# a usage() function to exist in the caller. +# @param 1 The argument to check. +check_bool_arg() { + + if [ "$#" -ne 1 ]; then + printf 'Invalid number of args to check_bool_arg\n' + exit 1 + fi + + _check_bool_arg_arg="$1" + shift + + if [ "$_check_bool_arg_arg" != "0" ] && [ "$_check_bool_arg_arg" != "1" ]; then + _check_bool_arg_msg=$(printf 'Invalid bool arg: %s\nMust be either "0" or "1".\n\n' \ + "$_check_bool_arg_arg") + usage "$_check_bool_arg_msg" + fi +} + +# Function for checking the executable arguments of scripts. This function +# expects a usage() function to exist in the caller. +# @param 1 The argument to check. +check_exec_arg() { + + if [ "$#" -ne 1 ]; then + printf 'Invalid number of args to check_exec_arg\n' + exit 1 + fi + + _check_exec_arg_arg="$1" + shift + + if [ ! -x "$_check_exec_arg_arg" ]; then + if ! command -v "$_check_exec_arg_arg" >/dev/null 2>&1; then + _check_exec_arg_msg=$(printf 'Invalid exec arg: %s\nMust be an executable file.\n\n' \ + "$_check_exec_arg_arg") + usage "$_check_exec_arg_msg" + fi + fi +} + +# Function for checking the file arguments of scripts. This function expects a +# usage() function to exist in the caller. +# @param 1 The argument to check. +check_file_arg() { + + if [ "$#" -ne 1 ]; then + printf 'Invalid number of args to check_file_arg\n' + exit 1 + fi + + _check_file_arg_arg="$1" + shift + + if [ ! -f "$_check_file_arg_arg" ]; then + _check_file_arg_msg=$(printf 'Invalid file arg: %s\nMust be a file.\n\n' \ + "$_check_file_arg_arg") + usage "$_check_file_arg_msg" + fi +} + # Check the return code on a test and exit with a fail if it's non-zero. # @param d The calculator under test. # @param err The return code. diff --git a/scripts/locale_install.sh b/scripts/locale_install.sh index a2d9ccda7ad..75534a735cd 100755 --- a/scripts/locale_install.sh +++ b/scripts/locale_install.sh @@ -28,6 +28,7 @@ # # Just print the usage and exit with an error. +# @param 1 A message to print. usage() { if [ $# -eq 1 ]; then printf '%s\n' "$1" @@ -189,7 +190,7 @@ while getopts "l" opt; do done -test "$#" -ge 2 || usage +test "$#" -ge 2 || usage "Must have at least two arguments" nlspath="$1" shift @@ -240,11 +241,15 @@ for file in $locales_dir/*.msg; do continue fi + printf 'Installing %s...' "$locale" + # Generate the proper location for the cat file. loc=$(gen_nlspath "$destdir/$nlspath" "$locale" "$main_exec") gencatfile "$loc" "$file" + printf 'done\n' + done # Now that we have done the non-symlinks, it's time to do the symlinks. Think @@ -275,6 +280,8 @@ for file in $locales_dir/*.msg; do # Make sure to skip non-symlinks; they are already done. if [ -L "$file" ]; then + printf 'Linking %s...' "$locale" + # This song and dance is because we want to generate relative symlinks. # They take less space, but also, they are more resilient to being # moved. @@ -294,6 +301,8 @@ for file in $locales_dir/*.msg; do # Finally, symlink to the install of the generated cat file that # corresponds to the correct msg file. ln -fs "$rel" "$loc" + + printf 'done\n' fi done diff --git a/src/data.c b/src/data.c index 1694bb68471..284d3de7b64 100644 --- a/src/data.c +++ b/src/data.c @@ -71,7 +71,7 @@ const uchar dc_sig_msg_len = (uchar) (sizeof(dc_sig_msg) - 1); /// The copyright banner. const char bc_copyright[] = "Copyright (c) 2018-2023 Gavin D. Howard and contributors\n" - "Report bugs at: https://git.yzena.com/gavin/bc\n\n" + "Report bugs at: https://git.gavinhoward.com/gavin/bc\n\n" "This is free software with ABSOLUTELY NO WARRANTY.\n"; // clang-format on diff --git a/tests/all.sh b/tests/all.sh index 0ef8ae6cb49..099804777c1 100755 --- a/tests/all.sh +++ b/tests/all.sh @@ -32,6 +32,18 @@ testdir=$(dirname "$script") . "$testdir/../scripts/functions.sh" +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + print 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [gen_tests] [run_problematic_tests] [time_tests] [exec args...]\n' \ + "$script" + exit 1 +} + # We need to figure out if we should run stuff in parallel. pll=1 @@ -48,50 +60,63 @@ done if [ "$#" -ge 1 ]; then d="$1" shift + check_d_arg "$d" else - err_exit "usage: $script [-n] dir [run_extra_tests] [run_stack_tests] [gen_tests] [run_problematic_tests] [time_tests] [exec args...]" 1 + usage "Not enough arguments" fi if [ "$#" -lt 1 ]; then extra=1 + check_bool_arg "$extra" else extra="$1" shift + check_bool_arg "$extra" fi if [ "$#" -lt 1 ]; then run_stack_tests=1 + check_bool_arg "$run_stack_tests" else run_stack_tests="$1" shift + check_bool_arg "$run_stack_tests" fi if [ "$#" -lt 1 ]; then generate_tests=1 + check_bool_arg "$generate_tests" else generate_tests="$1" shift + check_bool_arg "$generate_tests" fi if [ "$#" -lt 1 ]; then problematic_tests=1 + check_bool_arg "$problematic_tests" else problematic_tests="$1" shift + check_bool_arg "$problematic_tests" fi if [ "$#" -lt 1 ]; then time_tests=0 + check_bool_arg "$time_tests" else time_tests="$1" shift + check_bool_arg "$time_tests" fi if [ "$#" -lt 1 ]; then exe="$testdir/../bin/$d" + check_exec_arg "$exe" else exe="$1" shift + check_exec_arg "$exe" fi stars="***********************************************************************" diff --git a/tests/bc/timeconst.sh b/tests/bc/timeconst.sh index 3751700077f..fbd2909e099 100755 --- a/tests/bc/timeconst.sh +++ b/tests/bc/timeconst.sh @@ -34,7 +34,21 @@ testdir=$(dirname "$script") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir/..} -# Gets the timeconst script, which could be a command-line argument. +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + printf 'usage: %s [timeconst_script] [exec args...]\n' "$0" + exit 1 +} + +. "$testdir/../../scripts/functions.sh" + +# Gets the timeconst script, which could be a command-line argument. I don't +# need to check for error because we just skip if it doesn't work. if [ "$#" -gt 0 ]; then timeconst="$1" shift @@ -46,8 +60,10 @@ fi if [ "$#" -gt 0 ]; then bc="$1" shift + check_exec_arg "$bc" else bc="$testdir/../../bin/bc" + check_exec_arg "$bc" fi out1="$outputdir/bc_outputs/bc_timeconst.txt" diff --git a/tests/dc/scripts/easter.sh b/tests/dc/scripts/easter.sh index 27dfe34580e..1f8e7aa797f 100755 --- a/tests/dc/scripts/easter.sh +++ b/tests/dc/scripts/easter.sh @@ -1,13 +1,59 @@ #!/bin/sh +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +set -e + +script="$0" + +testdir=$(dirname "${script}") + +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + printf 'usage: %s dc_exec year [options...]\n' "$script" + exit 1 +} + +. "$testdir/../../../scripts/functions.sh" if test $# -lt 2 then - echo usage: $0 dc_exec year [options...] - exit 1 + usage "Not enough arguments; need 2" fi dc_exec="$1" shift +check_exec_arg "$dc_exec" year="$1" shift diff --git a/tests/error.sh b/tests/error.sh index 35a6af0edf3..11d7a8126a2 100755 --- a/tests/error.sh +++ b/tests/error.sh @@ -34,25 +34,38 @@ testdir=$(dirname "$script") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} -# Command-line processing. -if [ "$#" -lt 2 ]; then - +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi printf 'usage: %s dir test problematic_tests [exec args...]\n' "$script" exit 1 +} +# Command-line processing. +if [ "$#" -lt 3 ]; then + usage "Not enough arguments" else d="$1" shift + check_d_arg "$d" t="$1" shift problematic="$1" shift + check_bool_arg "$problematic" fi +testfile="$testdir/$d/errors/$t" +check_file_arg "$testfile" + if [ "$#" -lt 1 ]; then exe="$testdir/../bin/$d" else @@ -94,8 +107,6 @@ else halt="q" fi -testfile="$testdir/$d/errors/$t" - printf 'Running %s error file %s with clamping...' "$d" "$t" printf '%s\n' "$halt" | "$exe" "$@" $opts -c "$testfile" 2> "$out" > /dev/null diff --git a/tests/errors.sh b/tests/errors.sh index 5005f3e9aeb..11d03299b41 100755 --- a/tests/errors.sh +++ b/tests/errors.sh @@ -36,20 +36,33 @@ testdir=$(dirname "$script") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} -# Command-line processing. -if [ "$#" -eq 0 ]; then +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi printf 'usage: %s dir [exec args...]\n' "$script" exit 1 +} + +# Command-line processing. +if [ "$#" -eq 0 ]; then + usage "Not enough arguments" else d="$1" shift + check_d_arg "$d" fi if [ "$#" -lt 1 ]; then exe="$testdir/../bin/$d" + check_exec_arg "$exe" else exe="$1" shift + check_exec_arg "$exe" fi # I use these, so unset them to make the tests work. diff --git a/tests/history.py b/tests/history.py index b9acf73cb58..ced05fe7219 100755 --- a/tests/history.py +++ b/tests/history.py @@ -128,7 +128,7 @@ def write_str(child, s): def bc_banner(child): bc_banner1 = "bc [0-9]+\.[0-9]+\.[0-9]+\r\n" bc_banner2 = "Copyright \(c\) 2018-[2-9][0-9][0-9][0-9] Gavin D. Howard and contributors\r\n" - bc_banner3 = "Report bugs at: https://git.yzena.com/gavin/bc\r\n\r\n" + bc_banner3 = "Report bugs at: https://git.gavinhoward.com/gavin/bc\r\n\r\n" bc_banner4 = "This is free software with ABSOLUTELY NO WARRANTY.\r\n\r\n" expect(child, bc_banner1) expect(child, bc_banner2) diff --git a/tests/history.sh b/tests/history.sh index ff4ffa562ca..e68d568dcec 100755 --- a/tests/history.sh +++ b/tests/history.sh @@ -33,7 +33,16 @@ testdir=$(dirname "$script") . "$testdir/../scripts/functions.sh" -# usage: history.sh dir -a|idx [exe args...] +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + printf 'usage: %s dir -a|idx [exe args...]\n' "$script" + exit 1 +} # If Python does not exist, then just skip. py=$(command -v python3) @@ -51,9 +60,14 @@ if [ "$err" -ne 0 ]; then fi fi +if [ "$#" -lt 2 ]; then + usage "Not enough arguments; expect 2 arguments" +fi + # d is "bc" or "dc" d="$1" shift +check_d_arg "$d" # idx is either an index of the test to run or "-a". If it is "-a", then all # tests are run. @@ -65,9 +79,11 @@ if [ "$#" -gt 0 ]; then # exe is the executable to run. exe="$1" shift + check_exec_arg "$exe" else exe="$testdir/../bin/$d" + check_exec_arg "$exe" fi if [ "$d" = "bc" ]; then diff --git a/tests/other.sh b/tests/other.sh index fe228eec331..4f491a64c77 100755 --- a/tests/other.sh +++ b/tests/other.sh @@ -36,24 +36,39 @@ testdir=$(dirname "$script") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + printf 'usage: %s dir extra_math [exec args...]\n' "$script" + exit 1 +} + # Command-line processing. if [ "$#" -ge 2 ]; then d="$1" shift + check_d_arg "$d" extra_math="$1" shift + check_bool_arg "$extra_math" else - err_exit "usage: $script dir extra_math [exec args...]" 1 + usage "Not enough arguments; need 2" fi if [ "$#" -lt 1 ]; then exe="$testdir/../bin/$d" + check_exec_arg "$exe" else exe="$1" shift + check_exec_arg "$exe" fi if [ "$d" = "bc" ]; then diff --git a/tests/read.sh b/tests/read.sh index a5c66d9d4fe..d7be18fdcec 100755 --- a/tests/read.sh +++ b/tests/read.sh @@ -36,24 +36,37 @@ testdir=$(dirname "$script") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} -# Command-line processing. -if [ "$#" -lt 1 ]; then - printf 'usage: %s dir [exe [args...]]\n' "$0" +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + printf 'usage: %s dir [exe [args...]]\n' "$script" printf 'valid dirs are:\n' printf '\n' cat "$testdir/all.txt" printf '\n' exit 1 +} + +# Command-line processing. +if [ "$#" -lt 1 ]; then + usage "Not enough arguments" fi d="$1" shift +check_d_arg "$d" if [ "$#" -gt 0 ]; then exe="$1" shift + check_exec_arg "$exe" else exe="$testdir/../bin/$d" + check_exec_arg "$exe" fi name="$testdir/$d/read.txt" diff --git a/tests/script.sh b/tests/script.sh index d720878fafa..460940a2138 100755 --- a/tests/script.sh +++ b/tests/script.sh @@ -37,49 +37,72 @@ testdir=$(dirname "${script}") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} -# Command-line processing. -if [ "$#" -lt 2 ]; then +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi printf 'usage: %s dir script [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script" exit 1 +} + +# Command-line processing. +if [ "$#" -lt 2 ]; then + usage "Not enough arguments; expect 2 arguments" fi d="$1" shift +check_d_arg "$d" + +scriptdir="$testdir/$d/scripts" f="$1" shift +check_file_arg "$scriptdir/$f" if [ "$#" -gt 0 ]; then run_extra_tests="$1" shift + check_bool_arg "$run_extra_tests" else run_extra_tests=1 + check_bool_arg "$run_extra_tests" fi if [ "$#" -gt 0 ]; then run_stack_tests="$1" shift + check_bool_arg "$run_stack_tests" else run_stack_tests=1 + check_bool_arg "$run_stack_tests" fi if [ "$#" -gt 0 ]; then generate="$1" shift + check_bool_arg "$generate" else generate=1 + check_bool_arg "$generate" fi if [ "$#" -gt 0 ]; then time_tests="$1" shift + check_bool_arg "$time_tests" else time_tests=0 + check_bool_arg "$generate" fi if [ "$#" -gt 0 ]; then exe="$1" shift + check_exec_arg "$exe" else exe="$testdir/../bin/$d" fi @@ -100,8 +123,6 @@ else halt="q" fi -scriptdir="$testdir/$d/scripts" - name="${f%.*}" # We specifically want to skip this because it is handled specially. diff --git a/tests/scripts.sh b/tests/scripts.sh index ee21b2a9be6..5c3b6fc3d02 100755 --- a/tests/scripts.sh +++ b/tests/scripts.sh @@ -31,6 +31,17 @@ script="$0" testdir=$(dirname "${script}") +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi + printf 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script" + exit 1 +} + pids="" # We need to figure out if we should run stuff in parallel. @@ -47,46 +58,56 @@ done # Command-line processing. if [ "$#" -eq 0 ]; then - printf 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script" - exit 1 + usage "Need at least 1 argument" else d="$1" shift + check_d_arg "$d" fi if [ "$#" -gt 0 ]; then run_extra_tests="$1" shift + check_bool_arg "$run_extra_tests" else run_extra_tests=1 + check_bool_arg "$run_extra_tests" fi if [ "$#" -gt 0 ]; then run_stack_tests="$1" shift + check_bool_arg "$run_stack_tests" else run_stack_tests=1 + check_bool_arg "$run_stack_tests" fi if [ "$#" -gt 0 ]; then generate="$1" shift + check_bool_arg "$generate" else generate=1 + check_bool_arg "$generate" fi if [ "$#" -gt 0 ]; then time_tests="$1" shift + check_bool_arg "$time_tests" else time_tests=0 + check_bool_arg "$time_tests" fi if [ "$#" -gt 0 ]; then exe="$1" shift + check_exec_arg "$exe" else exe="$testdir/../bin/$d" + check_exec_arg "$exe" fi scriptdir="$testdir/$d/scripts" diff --git a/tests/stdin.sh b/tests/stdin.sh index d8585052bf0..a650c5b996a 100755 --- a/tests/stdin.sh +++ b/tests/stdin.sh @@ -37,24 +37,37 @@ testdir=$(dirname "$script") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} -# Command-line processing. -if [ "$#" -lt 1 ]; then +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi printf 'usage: %s dir [exe [args...]]\n' "$0" printf 'valid dirs are:\n' printf '\n' cat "$testdir/all.txt" printf '\n' exit 1 +} + +# Command-line processing. +if [ "$#" -lt 1 ]; then + usage "Not enough arguments" fi d="$1" shift +check_d_arg "$d" if [ "$#" -gt 0 ]; then exe="$1" shift + check_exec_arg "$exe" else exe="$testdir/../bin/$d" + check_exec_arg "$exe" fi out="$outputdir/${d}_outputs/stdin_results.txt" diff --git a/tests/test.sh b/tests/test.sh index 95606ded4f9..11c7e05f739 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -37,19 +37,32 @@ testdir=$(dirname "$script") outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} -# Command-line processing. -if [ "$#" -lt 2 ]; then +# Just print the usage and exit with an error. This can receive a message to +# print. +# @param 1 A message to print. +usage() { + if [ $# -eq 1 ]; then + printf '%s\n\n' "$1" + fi printf 'usage: %s dir test [generate_tests] [time_tests] [exe [args...]]\n' "$0" printf 'valid dirs are:\n' printf '\n' cat "$testdir/all.txt" printf '\n' exit 1 +} + +# Command-line processing. +if [ "$#" -lt 2 ]; then + usage "Need at least 2 arguments" fi d="$1" shift +check_d_arg "$d" +# We don't use check_file_arg on the test or the result because they might be +# generated. t="$1" name="$testdir/$d/$t.txt" results="$testdir/$d/${t}_results.txt" @@ -58,22 +71,28 @@ shift if [ "$#" -gt 0 ]; then generate_tests="$1" shift + check_bool_arg "$generate_tests" else generate_tests=1 + check_bool_arg "$generate_tests" fi if [ "$#" -gt 0 ]; then time_tests="$1" shift + check_bool_arg "$time_tests" else time_tests=0 + check_bool_arg "$time_tests" fi if [ "$#" -gt 0 ]; then exe="$1" shift + check_exec_arg "$exe" else exe="$testdir/../bin/$d" + check_exec_arg "$exe" fi out="$outputdir/${d}_outputs/${t}_results.txt" From 61e1a12bb6c3bfdb0a4e499c88e8eaa2b548e427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Fri, 24 Feb 2023 23:14:58 +0100 Subject: [PATCH 02/14] vendor/bc: import version 6.3.1 This version adds a command to dc to query whether extended registers are enabled or not. --- MEMORY_BUGS.md | 5 ++ Makefile.in | 10 ++-- NEWS.md | 25 ++++++++ gen/lib2.bc | 4 +- gen/strgen.c | 6 +- gen/strgen.sh | 4 +- include/bcl.h | 6 ++ include/lang.h | 7 ++- include/lex.h | 17 +++--- include/parse.h | 14 ++--- include/program.h | 12 ++-- include/rand.h | 6 +- include/status.h | 24 ++++---- include/vector.h | 4 +- include/version.h | 2 +- include/vm.h | 6 +- manuals/bc/A.1 | 6 +- manuals/bc/A.1.md | 2 +- manuals/bc/E.1 | 6 +- manuals/bc/E.1.md | 2 +- manuals/bc/EH.1 | 6 +- manuals/bc/EH.1.md | 2 +- manuals/bc/EHN.1 | 6 +- manuals/bc/EHN.1.md | 2 +- manuals/bc/EN.1 | 6 +- manuals/bc/EN.1.md | 2 +- manuals/bc/H.1 | 6 +- manuals/bc/H.1.md | 2 +- manuals/bc/HN.1 | 6 +- manuals/bc/HN.1.md | 2 +- manuals/bc/N.1 | 6 +- manuals/bc/N.1.md | 2 +- manuals/bcl.3 | 2 +- manuals/dc/A.1 | 12 ++-- manuals/dc/A.1.md | 10 ++-- manuals/dc/E.1 | 12 ++-- manuals/dc/E.1.md | 10 ++-- manuals/dc/EH.1 | 12 ++-- manuals/dc/EH.1.md | 10 ++-- manuals/dc/EHN.1 | 12 ++-- manuals/dc/EHN.1.md | 10 ++-- manuals/dc/EN.1 | 12 ++-- manuals/dc/EN.1.md | 10 ++-- manuals/dc/H.1 | 12 ++-- manuals/dc/H.1.md | 10 ++-- manuals/dc/HN.1 | 12 ++-- manuals/dc/HN.1.md | 10 ++-- manuals/dc/N.1 | 12 ++-- manuals/dc/N.1.md | 10 ++-- scripts/exec-install.sh | 6 ++ scripts/format.sh | 2 + scripts/link.sh | 5 ++ scripts/lint.sh | 5 +- scripts/locale_install.sh | 3 +- scripts/safe-install.sh | 12 ++-- src/args.c | 4 +- src/bc_parse.c | 6 +- src/data.c | 16 ++--- src/dc_lex.c | 1 + src/dc_parse.c | 1 + src/file.c | 4 +- src/history.c | 4 +- src/lang.c | 8 +-- src/library.c | 4 +- src/num.c | 12 ++-- src/parse.c | 4 +- src/program.c | 49 ++++++++++------ src/read.c | 4 +- src/vm.c | 34 +++++------ tests/all.sh | 3 +- tests/error.sh | 8 +-- tests/errors.sh | 8 +-- tests/other.sh | 120 ++++++++++++++++++++++++-------------- tests/script.sh | 6 +- tests/scripts.sh | 5 +- tests/test.sh | 6 +- vs/bc.vcxproj | 2 +- 77 files changed, 442 insertions(+), 294 deletions(-) diff --git a/MEMORY_BUGS.md b/MEMORY_BUGS.md index d675b28b342..12e0b854e9d 100644 --- a/MEMORY_BUGS.md +++ b/MEMORY_BUGS.md @@ -51,3 +51,8 @@ existed in. had properly hooked Valgrind into my `bcl` tests, but I had not. The first version without this bug is `6.0.1`. + +* In version `6.0.0` until `6.2.4` (inclusive) of `bcl`, there is a possible + use-after-free if `bcl_init()` fails. + + The first version without this bug is `6.2.5`. diff --git a/Makefile.in b/Makefile.in index 83417a33382..89ddb7589c4 100644 --- a/Makefile.in +++ b/Makefile.in @@ -239,25 +239,25 @@ $(GEN_EXEC): $(GEN_DIR) %%GEN_EXEC_TARGET%% $(BC_LIB_C): $(GEN_EXEC) $(BC_LIB) - $(GEN_EMU) $(GEN_EXEC) $(BC_LIB) $(BC_LIB_C) $(BC_EXCLUDE_EXTRA_MATH) $(BC_LIB_C_ARGS) + $(GEN_EMU) $(GEN_EXEC) $(BC_LIB) $(BC_LIB_C) $(BC_EXCLUDE_EXTRA_MATH) $(BC_LIB_C_ARGS) "" "" 1 $(BC_LIB_O): $(BC_LIB_C) $(CC) $(CFLAGS) -o $@ -c $< $(BC_LIB2_C): $(GEN_EXEC) $(BC_LIB2) - $(GEN_EMU) $(GEN_EXEC) $(BC_LIB2) $(BC_LIB2_C) $(BC_EXCLUDE_EXTRA_MATH) $(BC_LIB2_C_ARGS) + $(GEN_EMU) $(GEN_EXEC) $(BC_LIB2) $(BC_LIB2_C) $(BC_EXCLUDE_EXTRA_MATH) $(BC_LIB2_C_ARGS) "" "" 1 $(BC_LIB2_O): $(BC_LIB2_C) $(CC) $(CFLAGS) -o $@ -c $< $(BC_HELP_C): $(GEN_EXEC) $(BC_HELP) - $(GEN_EMU) $(GEN_EXEC) $(BC_HELP) $(BC_HELP_C) $(BC_EXCLUDE_EXTRA_MATH) bc_help "" $(BC_ENABLED_NAME) + $(GEN_EMU) $(GEN_EXEC) $(BC_HELP) $(BC_HELP_C) $(BC_EXCLUDE_EXTRA_MATH) bc_help "" $(BC_ENABLED_NAME) 0 $(BC_HELP_O): $(BC_HELP_C) $(CC) $(CFLAGS) -o $@ -c $< $(DC_HELP_C): $(GEN_EXEC) $(DC_HELP) - $(GEN_EMU) $(GEN_EXEC) $(DC_HELP) $(DC_HELP_C) $(BC_EXCLUDE_EXTRA_MATH) dc_help "" $(DC_ENABLED_NAME) + $(GEN_EMU) $(GEN_EXEC) $(DC_HELP) $(DC_HELP_C) $(BC_EXCLUDE_EXTRA_MATH) dc_help "" $(DC_ENABLED_NAME) 0 $(DC_HELP_O): $(DC_HELP_C) $(CC) $(CFLAGS) -o $@ -c $< @@ -536,6 +536,7 @@ clean:%%CLEAN_PREREQS%% @$(RM) -f $(BC_HELP_C) $(BC_HELP_O) @$(RM) -f $(DC_HELP_C) $(DC_HELP_O) @$(RM) -fr vs/bin/ vs/lib/ + @$(RM) -f $(BCL_PC) clean_benchmarks: @printf 'Cleaning benchmarks...\n' @@ -548,6 +549,7 @@ clean_config: clean clean_benchmarks @$(RM) -f Makefile @$(RM) -f $(BC_MD) $(BC_MANPAGE) @$(RM) -f $(DC_MD) $(DC_MANPAGE) + @$(RM) -f compile_commands.json clean_coverage: @printf 'Cleaning coverage files...\n' diff --git a/NEWS.md b/NEWS.md index 4601db456f8..ad118e401c3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,30 @@ # News +## 6.3.1 + +This is a production release that fixes a `bc` dependency loop for minimal +environments and Linux from Scratch. + +## 6.3.0 + +This is a production release with a couple of fixes for manuals and a new +feature for `dc`: there is now a command to query whether extended registers are +enabled or not. + +Users who don't care do not need to upgrade. + +## 6.2.6 + +This is a production release that fixes an install bug that affected locale +installation of all locales when using `mksh`. Users do ***NOT*** need to +upgrade if they don't use `mksh` and/or don't need to install all locales. + +## 6.2.5 + +This is a production release that fixes a test bug that affected Android and +`mksh`. Users do ***NOT*** need to upgrade unless they use `mksh` or another +affected shell and need to run the test suite. + ## 6.2.4 This is a production release that fixes a test failure that happens when diff --git a/gen/lib2.bc b/gen/lib2.bc index 826f8a430ce..2811430d534 100644 --- a/gen/lib2.bc +++ b/gen/lib2.bc @@ -36,7 +36,7 @@ define p(x,y){ auto a a=y$ - if(y==a)return (x^a)@scale + if(y==a)return(x^a)@scale return e(y*l(x)) } define r(x,p){ @@ -474,7 +474,7 @@ define bxor(a,b){ return bunrev(t) } define bshl(a,b){return abs(a)$*2^abs(b)$} -define bshr(a,b){return (abs(a)$/2^abs(b)$)$} +define bshr(a,b){return(abs(a)$/2^abs(b)$)$} define bnotn(x,n){ auto s,t,m[] s=scale diff --git a/gen/strgen.c b/gen/strgen.c index dbea0212f61..2cb3ed9e847 100644 --- a/gen/strgen.c +++ b/gen/strgen.c @@ -157,11 +157,11 @@ bc_read_file(const char* path) assert(path != NULL); -#ifndef NDEBUG +#if BC_DEBUG // Need this to quiet MSan. // NOLINTNEXTLINE memset(&pstat, 0, sizeof(struct stat)); -#endif // NDEBUG +#endif // BC_DEBUG fd = bc_read_open(path, O_RDONLY); @@ -360,7 +360,7 @@ main(int argc, char* argv[]) has_define = (argc > 6 && strcmp("", argv[6]) != 0); define = has_define ? argv[6] : ""; - remove_tabs = (argc > 7); + remove_tabs = (argc > 7 && atoi(argv[7]) != 0); in = bc_read_file(argv[1]); if (in == NULL) return INVALID_INPUT_FILE; diff --git a/gen/strgen.sh b/gen/strgen.sh index a65e221ad0b..2b8927b5528 100755 --- a/gen/strgen.sh +++ b/gen/strgen.sh @@ -62,7 +62,9 @@ name="$4" label="$5" define="$6" remove_tabs="$7" -check_bool_arg "$remove_tabs" +if [ "$remove_tabs" != "" ]; then + check_bool_arg "$remove_tabs" +fi tmpinput=$(mktemp -t "${input##*/}_XXXXXX") diff --git a/include/bcl.h b/include/bcl.h index 234fe475f00..253138231c6 100644 --- a/include/bcl.h +++ b/include/bcl.h @@ -41,6 +41,12 @@ #include #include +#ifndef NDEBUG +#define BC_DEBUG (1) +#else // NDEBUG +#define BC_DEBUG (0) +#endif // NDEBUG + #ifdef _WIN32 #include #include diff --git a/include/lang.h b/include/lang.h index 2d977653224..97aeeaa98da 100644 --- a/include/lang.h +++ b/include/lang.h @@ -277,6 +277,9 @@ typedef enum BcInst #if DC_ENABLED + /// dc extended registers command. + BC_INST_EXTENDED_REGISTERS, + /// dc's return; it pops an executing string off of the stack. BC_INST_POP_EXEC, @@ -575,7 +578,7 @@ bc_func_insert(BcFunc* f, struct BcProgram* p, char* name, BcType type, void bc_func_reset(BcFunc* f); -#ifndef NDEBUG +#if BC_DEBUG /** * Frees a function. This is a destructor. This is only used in debug builds * because all functions are freed at exit. We free them in debug builds to @@ -584,7 +587,7 @@ bc_func_reset(BcFunc* f); */ void bc_func_free(void* func); -#endif // NDEBUG +#endif // BC_DEBUG /** * Initializes an array, which is the array type in bc and dc source code. Since diff --git a/include/lex.h b/include/lex.h index 54d704f8b44..ac9b7b6ea69 100644 --- a/include/lex.h +++ b/include/lex.h @@ -49,11 +49,11 @@ * @param l The lexer. * @param e The error. */ -#ifndef NDEBUG +#if BC_DEBUG #define bc_lex_err(l, e) (bc_vm_handleError((e), __FILE__, __LINE__, (l)->line)) -#else // NDEBUG +#else // BC_DEBUG #define bc_lex_err(l, e) (bc_vm_handleError((e), (l)->line)) -#endif // NDEBUG +#endif // BC_DEBUG /** * A convenience macro for throwing errors in lex code. This takes care of @@ -61,12 +61,12 @@ * @param l The lexer. * @param e The error. */ -#ifndef NDEBUG +#if BC_DEBUG #define bc_lex_verr(l, e, ...) \ (bc_vm_handleError((e), __FILE__, __LINE__, (l)->line, __VA_ARGS__)) -#else // NDEBUG +#else // BC_DEBUG #define bc_lex_verr(l, e, ...) (bc_vm_handleError((e), (l)->line, __VA_ARGS__)) -#endif // NDEBUG +#endif // BC_DEBUG // BC_LEX_NEG_CHAR returns the char that corresponds to negative for the // current calculator. @@ -409,6 +409,9 @@ typedef enum BcLexType #if DC_ENABLED + /// dc extended registers keyword. + BC_LEX_EXTENDED_REGISTERS, + /// A special token for dc to calculate equal without a register. BC_LEX_EQ_NO_REG, @@ -533,7 +536,7 @@ void bc_lex_init(BcLex* l); /** - * Frees a lexer. This is not guarded by #ifndef NDEBUG because a separate + * Frees a lexer. This is not guarded by #if BC_DEBUG because a separate * parser is created at runtime to parse read() expressions and dc strings, and * that parser needs a lexer. * @param l The lexer to free. diff --git a/include/parse.h b/include/parse.h index 2527aeb824f..ece413e7bd7 100644 --- a/include/parse.h +++ b/include/parse.h @@ -110,12 +110,12 @@ * @param p The parser. * @param e The error. */ -#ifndef NDEBUG +#if BC_DEBUG #define bc_parse_err(p, e) \ (bc_vm_handleError((e), __FILE__, __LINE__, (p)->l.line)) -#else // NDEBUG +#else // BC_DEBUG #define bc_parse_err(p, e) (bc_vm_handleError((e), (p)->l.line)) -#endif // NDEBUG +#endif // BC_DEBUG /** * A convenience macro for throwing errors in parse code. This takes care of @@ -124,13 +124,13 @@ * @param e The error. * @param ... The varags that are needed. */ -#ifndef NDEBUG +#if BC_DEBUG #define bc_parse_verr(p, e, ...) \ (bc_vm_handleError((e), __FILE__, __LINE__, (p)->l.line, __VA_ARGS__)) -#else // NDEBUG +#else // BC_DEBUG #define bc_parse_verr(p, e, ...) \ (bc_vm_handleError((e), (p)->l.line, __VA_ARGS__)) -#endif // NDEBUG +#endif // BC_DEBUG // Forward declarations. struct BcParse; @@ -215,7 +215,7 @@ void bc_parse_init(BcParse* p, struct BcProgram* prog, size_t func); /** - * Frees a parser. This is not guarded by #ifndef NDEBUG because a separate + * Frees a parser. This is not guarded by #if BC_DEBUG because a separate * parser is created at runtime to parse read() expressions and dc strings. * @param p The parser to free. */ diff --git a/include/program.h b/include/program.h index 3a3ea6c9dab..ff32d5db776 100644 --- a/include/program.h +++ b/include/program.h @@ -247,9 +247,9 @@ typedef struct BcProgram // In debug mode, we want bc to check the stack, but otherwise, we don't because // the bc language implicitly mandates that the stack should always have enough // items. -#ifdef NDEBUG +#ifdef BC_DEBUG #define BC_PROG_NO_STACK_CHECK -#endif // NDEBUG +#endif // BC_DEBUG #endif // DC_ENABLED @@ -298,7 +298,7 @@ typedef void (*BcProgramUnary)(BcResult* r, BcNum* n); void bc_program_init(BcProgram* p); -#ifndef NDEBUG +#if BC_DEBUG /** * Frees a BcProgram. This is only used in debug builds because a BcProgram is @@ -309,7 +309,7 @@ bc_program_init(BcProgram* p); void bc_program_free(BcProgram* p); -#endif // NDEBUG +#endif // BC_DEBUG /** * Prints a stack trace of the bc functions or dc strings currently executing. @@ -608,6 +608,7 @@ extern const char bc_program_esc_seqs[]; &&lbl_BC_INST_MODEXP, \ &&lbl_BC_INST_DIVMOD, \ &&lbl_BC_INST_PRINT_STREAM, \ + &&lbl_BC_INST_EXTENDED_REGISTERS, \ &&lbl_BC_INST_POP_EXEC, \ &&lbl_BC_INST_EXECUTE, \ &&lbl_BC_INST_EXEC_COND, \ @@ -701,6 +702,7 @@ extern const char bc_program_esc_seqs[]; &&lbl_BC_INST_MODEXP, \ &&lbl_BC_INST_DIVMOD, \ &&lbl_BC_INST_PRINT_STREAM, \ + &&lbl_BC_INST_EXTENDED_REGISTERS, \ &&lbl_BC_INST_POP_EXEC, \ &&lbl_BC_INST_EXECUTE, \ &&lbl_BC_INST_EXEC_COND, \ @@ -959,6 +961,7 @@ extern const char bc_program_esc_seqs[]; &&lbl_BC_INST_MODEXP, \ &&lbl_BC_INST_DIVMOD, \ &&lbl_BC_INST_PRINT_STREAM, \ + &&lbl_BC_INST_EXTENDED_REGISTERS, \ &&lbl_BC_INST_POP_EXEC, \ &&lbl_BC_INST_EXECUTE, \ &&lbl_BC_INST_EXEC_COND, \ @@ -1027,6 +1030,7 @@ extern const char bc_program_esc_seqs[]; &&lbl_BC_INST_MODEXP, \ &&lbl_BC_INST_DIVMOD, \ &&lbl_BC_INST_PRINT_STREAM, \ + &&lbl_BC_INST_EXTENDED_REGISTERS, \ &&lbl_BC_INST_POP_EXEC, \ &&lbl_BC_INST_EXECUTE, \ &&lbl_BC_INST_EXEC_COND, \ diff --git a/include/rand.h b/include/rand.h index 7db0ee90af1..e516295d7c5 100644 --- a/include/rand.h +++ b/include/rand.h @@ -53,11 +53,11 @@ #if BC_ENABLE_LIBRARY #define BC_RAND_USE_FREE (1) #else // BC_ENABLE_LIBRARY -#ifndef NDEBUG +#if BC_DEBUG #define BC_RAND_USE_FREE (1) -#else // NDEBUG +#else // BC_DEBUG #define BC_RAND_USE_FREE (0) -#endif // NDEBUG +#endif // BC_DEBUG #endif // BC_ENABLE_LIBRARY /** diff --git a/include/status.h b/include/status.h index 9962d58d0be..198cf5704a5 100644 --- a/include/status.h +++ b/include/status.h @@ -700,7 +700,7 @@ typedef enum BcMode #define BC_SIG_INTERRUPT(vm) BC_UNLIKELY((vm)->sig != 0) #endif // _WIN32 -#ifndef NDEBUG +#if BC_DEBUG /// Assert that signals are locked. There are non-async-signal-safe functions in /// bc, and they *must* have signals locked. Other functions are expected to @@ -724,7 +724,7 @@ typedef enum BcMode } \ while (0) -#else // NDEBUG +#else // BC_DEBUG /// Assert that signals are locked. There are non-async-signal-safe functions in /// bc, and they *must* have signals locked. Other functions are expected to @@ -738,7 +738,7 @@ typedef enum BcMode /// (no-op in non-debug mode) that check that signals are unlocked. #define BC_SIG_ASSERT_NOT_LOCKED -#endif // NDEBUG +#endif // BC_DEBUG /// Locks signals. #define BC_SIG_LOCK \ @@ -957,33 +957,33 @@ typedef enum BcMode * @param l The line of the script that the error happened. * @param ... Extra arguments for error messages as necessary. */ -#ifndef NDEBUG +#if BC_DEBUG #define bc_error(e, l, ...) \ (bc_vm_handleError((e), __FILE__, __LINE__, (l), __VA_ARGS__)) -#else // NDEBUG +#else // BC_DEBUG #define bc_error(e, l, ...) (bc_vm_handleError((e), (l), __VA_ARGS__)) -#endif // NDEBUG +#endif // BC_DEBUG /** * Call bc's error handling routine. * @param e The error. */ -#ifndef NDEBUG +#if BC_DEBUG #define bc_err(e) (bc_vm_handleError((e), __FILE__, __LINE__, 0)) -#else // NDEBUG +#else // BC_DEBUG #define bc_err(e) (bc_vm_handleError((e), 0)) -#endif // NDEBUG +#endif // BC_DEBUG /** * Call bc's error handling routine. * @param e The error. */ -#ifndef NDEBUG +#if BC_DEBUG #define bc_verr(e, ...) \ (bc_vm_handleError((e), __FILE__, __LINE__, 0, __VA_ARGS__)) -#else // NDEBUG +#else // BC_DEBUG #define bc_verr(e, ...) (bc_vm_handleError((e), 0, __VA_ARGS__)) -#endif // NDEBUG +#endif // BC_DEBUG #endif // BC_ENABLE_LIBRARY diff --git a/include/vector.h b/include/vector.h index 51c5e8b9529..b86be142453 100644 --- a/include/vector.h +++ b/include/vector.h @@ -85,12 +85,12 @@ typedef enum BcDtorType #if !BC_ENABLE_LIBRARY -#ifndef NDEBUG +#if BC_DEBUG /// BcFunc destructor. BC_DTOR_FUNC, -#endif // NDEBUG +#endif // BC_DEBUG /// BcSlab destructor. BC_DTOR_SLAB, diff --git a/include/version.h b/include/version.h index 6d8ddfea094..f5e345b3b18 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.2.4 +#define VERSION 6.3.1 #endif // BC_VERSION_H diff --git a/include/vm.h b/include/vm.h index 1c303add2de..dd21d43f526 100644 --- a/include/vm.h +++ b/include/vm.h @@ -999,7 +999,7 @@ bc_vm_atexit(void); size_t bc_vm_numDigits(size_t val); -#ifndef NDEBUG +#if BC_DEBUG /** * Handle an error. This is the true error handler. It will start a jump series @@ -1013,7 +1013,7 @@ bc_vm_numDigits(size_t val); void bc_vm_handleError(BcErr e, const char* file, int fline, size_t line, ...); -#else // NDEBUG +#else // BC_DEBUG /** * Handle an error. This is the true error handler. It will start a jump series @@ -1025,7 +1025,7 @@ bc_vm_handleError(BcErr e, const char* file, int fline, size_t line, ...); void bc_vm_handleError(BcErr e, size_t line, ...); -#endif // NDEBUG +#endif // BC_DEBUG /** * Handle a fatal error. diff --git a/manuals/bc/A.1 b/manuals/bc/A.1 index b1996a1f282..5de2d3529bc 100644 --- a/manuals/bc/A.1 +++ b/manuals/bc/A.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -477,8 +477,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md index e7b4c821219..3f34f451c9e 100644 --- a/manuals/bc/A.1.md +++ b/manuals/bc/A.1.md @@ -372,7 +372,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bc/E.1 b/manuals/bc/E.1 index fea1cecdc4c..ecb8b128712 100644 --- a/manuals/bc/E.1 +++ b/manuals/bc/E.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -433,8 +433,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/E.1.md b/manuals/bc/E.1.md index 3631267f2dc..5411dcf6cc7 100644 --- a/manuals/bc/E.1.md +++ b/manuals/bc/E.1.md @@ -344,7 +344,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1 index 2a36cab7f77..507e7f4a9a7 100644 --- a/manuals/bc/EH.1 +++ b/manuals/bc/EH.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -433,8 +433,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/EH.1.md b/manuals/bc/EH.1.md index f2f49ea7694..6f4c4326300 100644 --- a/manuals/bc/EH.1.md +++ b/manuals/bc/EH.1.md @@ -344,7 +344,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1 index 75768a03c14..e00fcd578b1 100644 --- a/manuals/bc/EHN.1 +++ b/manuals/bc/EHN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -433,8 +433,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/EHN.1.md b/manuals/bc/EHN.1.md index a38503cc8a2..6f7a3321020 100644 --- a/manuals/bc/EHN.1.md +++ b/manuals/bc/EHN.1.md @@ -344,7 +344,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1 index 9c015858319..ea842eac7e9 100644 --- a/manuals/bc/EN.1 +++ b/manuals/bc/EN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -433,8 +433,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/EN.1.md b/manuals/bc/EN.1.md index 28b558d8b21..189193bf2a0 100644 --- a/manuals/bc/EN.1.md +++ b/manuals/bc/EN.1.md @@ -344,7 +344,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bc/H.1 b/manuals/bc/H.1 index cbd93da0df8..d477dc8ab24 100644 --- a/manuals/bc/H.1 +++ b/manuals/bc/H.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -477,8 +477,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md index ac35def9019..2cb0b4eb27c 100644 --- a/manuals/bc/H.1.md +++ b/manuals/bc/H.1.md @@ -372,7 +372,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1 index 5893d2a7f9a..10d9621c42e 100644 --- a/manuals/bc/HN.1 +++ b/manuals/bc/HN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -477,8 +477,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md index 82a99addd34..25f136a21e0 100644 --- a/manuals/bc/HN.1.md +++ b/manuals/bc/HN.1.md @@ -372,7 +372,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bc/N.1 b/manuals/bc/N.1 index 791f4740700..f39e51277b6 100644 --- a/manuals/bc/N.1 +++ b/manuals/bc/N.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -477,8 +477,8 @@ Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than .RS .PP This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). +\f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions +in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP This is a \f[B]non-portable extension\f[R]. .RE diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md index b8339ea31a5..56a4b2274d2 100644 --- a/manuals/bc/N.1.md +++ b/manuals/bc/N.1.md @@ -372,7 +372,7 @@ The following are the options that bc(1) accepts. : Makes bc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, + This can be set for individual numbers with the **plz(x)**, **plznl(x)**, **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see the **LIBRARY** section). diff --git a/manuals/bcl.3 b/manuals/bcl.3 index 6bebaa8f02c..5c3731a141e 100644 --- a/manuals/bcl.3 +++ b/manuals/bcl.3 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BCL" "3" "October 2022" "Gavin D. Howard" "Libraries Manual" +.TH "BCL" "3" "February 2023" "Gavin D. Howard" "Libraries Manual" .nh .ad l .SH NAME diff --git a/manuals/dc/A.1 b/manuals/dc/A.1 index 13ed8c4cf80..bef54876d7f 100644 --- a/manuals/dc/A.1 +++ b/manuals/dc/A.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -271,10 +271,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1255,6 +1251,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/A.1.md b/manuals/dc/A.1.md index b656650cb82..44b1578b670 100644 --- a/manuals/dc/A.1.md +++ b/manuals/dc/A.1.md @@ -224,10 +224,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -1087,6 +1083,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/manuals/dc/E.1 b/manuals/dc/E.1 index 3fb69dfe70d..41de5e08f74 100644 --- a/manuals/dc/E.1 +++ b/manuals/dc/E.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -256,10 +256,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1040,6 +1036,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/E.1.md b/manuals/dc/E.1.md index 0bbe9761288..8a172d8a124 100644 --- a/manuals/dc/E.1.md +++ b/manuals/dc/E.1.md @@ -215,10 +215,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -918,6 +914,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/manuals/dc/EH.1 b/manuals/dc/EH.1 index da7776edd53..08cb483dc92 100644 --- a/manuals/dc/EH.1 +++ b/manuals/dc/EH.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -256,10 +256,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1040,6 +1036,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/EH.1.md b/manuals/dc/EH.1.md index 0751d3f78d2..1c5b6f566b1 100644 --- a/manuals/dc/EH.1.md +++ b/manuals/dc/EH.1.md @@ -215,10 +215,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -918,6 +914,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/manuals/dc/EHN.1 b/manuals/dc/EHN.1 index 10ef283ea05..efeb0bbaecf 100644 --- a/manuals/dc/EHN.1 +++ b/manuals/dc/EHN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -256,10 +256,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1040,6 +1036,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/EHN.1.md b/manuals/dc/EHN.1.md index 9ba7fe13e0a..8a3c6d2b780 100644 --- a/manuals/dc/EHN.1.md +++ b/manuals/dc/EHN.1.md @@ -215,10 +215,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -918,6 +914,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/manuals/dc/EN.1 b/manuals/dc/EN.1 index abdcbe8c63f..ce1e6b9be79 100644 --- a/manuals/dc/EN.1 +++ b/manuals/dc/EN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -256,10 +256,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1040,6 +1036,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/EN.1.md b/manuals/dc/EN.1.md index 5c0590c53ae..f8deee533c4 100644 --- a/manuals/dc/EN.1.md +++ b/manuals/dc/EN.1.md @@ -215,10 +215,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -918,6 +914,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/manuals/dc/H.1 b/manuals/dc/H.1 index c96100e51bc..8baa0b74316 100644 --- a/manuals/dc/H.1 +++ b/manuals/dc/H.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -271,10 +271,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1255,6 +1251,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/H.1.md b/manuals/dc/H.1.md index 0dddf66d700..7166c155efa 100644 --- a/manuals/dc/H.1.md +++ b/manuals/dc/H.1.md @@ -224,10 +224,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -1087,6 +1083,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/manuals/dc/HN.1 b/manuals/dc/HN.1 index a6644ecd575..2a392630986 100644 --- a/manuals/dc/HN.1 +++ b/manuals/dc/HN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -271,10 +271,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1255,6 +1251,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/HN.1.md b/manuals/dc/HN.1.md index d39a7497d3a..6239a12b286 100644 --- a/manuals/dc/HN.1.md +++ b/manuals/dc/HN.1.md @@ -224,10 +224,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -1087,6 +1083,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/manuals/dc/N.1 b/manuals/dc/N.1 index f9aeb1acfb6..b7b501fbed1 100644 --- a/manuals/dc/N.1 +++ b/manuals/dc/N.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "October 2022" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -271,10 +271,6 @@ Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This can be set for individual numbers with the \f[B]plz(x)\f[R], -plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the -extended math library (see the \f[B]LIBRARY\f[R] section). -.PP This is a \f[B]non-portable extension\f[R]. .RE .PP @@ -1255,6 +1251,12 @@ section). Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack. .TP +\f[B]gx\f[R] +Pushes \f[B]1\f[R] onto the stack if extended register mode is on, +\f[B]0\f[R] otherwise. +See the \f[I]Extended Register Mode\f[R] subsection of the +\f[B]REGISTERS\f[R] section for more information. +.TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options diff --git a/manuals/dc/N.1.md b/manuals/dc/N.1.md index 3c36661d390..8795d947eec 100644 --- a/manuals/dc/N.1.md +++ b/manuals/dc/N.1.md @@ -224,10 +224,6 @@ The following are the options that dc(1) accepts. : Makes dc(1) print all numbers greater than **-1** and less than **1**, and not equal to **0**, with a leading zero. - This can be set for individual numbers with the **plz(x)**, plznl(x)**, - **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see - the **LIBRARY** section). - This is a **non-portable extension**. All long options are **non-portable extensions**. @@ -1087,6 +1083,12 @@ other character produces a parse error (see the **ERRORS** section). : Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT VARIABLES** section) onto the stack. +**gx** + +: Pushes **1** onto the stack if extended register mode is on, **0** + otherwise. See the *Extended Register Mode* subsection of the **REGISTERS** + section for more information. + **gz** : Pushes **0** onto the stack if the leading zero setting has not been enabled diff --git a/scripts/exec-install.sh b/scripts/exec-install.sh index 3b9375af383..8180b29c999 100755 --- a/scripts/exec-install.sh +++ b/scripts/exec-install.sh @@ -60,6 +60,12 @@ fi # If it's a symlink, create an equivalent in the install directory. for exe in $bindir/*; do + # Skip any directories in case the bin/ directory is also used as the + # prefix. + if [ -d "$exe" ]; then + continue + fi + base=$(basename "$exe") if [ -L "$exe" ]; then diff --git a/scripts/format.sh b/scripts/format.sh index efb90ef1f32..dd227555b0f 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -29,6 +29,8 @@ scriptdir=$(dirname "$0") +. "$scriptdir/functions.sh" + cd "$scriptdir/.." if [ "$#" -gt 0 ]; then diff --git a/scripts/link.sh b/scripts/link.sh index 4a472828f3e..7d95f866e17 100755 --- a/scripts/link.sh +++ b/scripts/link.sh @@ -32,6 +32,11 @@ usage() { exit 1 } +script="$0" +scriptdir=$(dirname "$script") + +. "$scriptdir/functions.sh" + # Command-line processing. test "$#" -gt 1 || usage diff --git a/scripts/lint.sh b/scripts/lint.sh index 78260dff2da..5a217204f8f 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -27,7 +27,10 @@ # POSSIBILITY OF SUCH DAMAGE. # -scriptdir=$(dirname "$0") +script="$0" +scriptdir=$(dirname "$script") + +. "$scriptdir/functions.sh" cd "$scriptdir/.." diff --git a/scripts/locale_install.sh b/scripts/locale_install.sh index 75534a735cd..3816f54ef49 100755 --- a/scripts/locale_install.sh +++ b/scripts/locale_install.sh @@ -184,11 +184,12 @@ all_locales=0 while getopts "l" opt; do case "$opt" in - l) all_locales=1 ; shift ;; + l) all_locales=1 ;; ?) usage "Invalid option: $opt" ;; esac done +shift $(($OPTIND - 1)) test "$#" -ge 2 || usage "Must have at least two arguments" diff --git a/scripts/safe-install.sh b/scripts/safe-install.sh index 04108838668..5774a17e20d 100755 --- a/scripts/safe-install.sh +++ b/scripts/safe-install.sh @@ -41,7 +41,7 @@ set -e if test "$mkdirp" ; then umask 022 -case "$2" in +case "$dst" in */*) mkdir -p "${dst%/*}" ;; esac fi @@ -51,15 +51,15 @@ trap 'rm -f "$tmp"' EXIT INT QUIT TERM HUP umask 077 if test "$symlink" ; then -ln -s "$1" "$tmp" +ln -s "$src" "$tmp" else -cat < "$1" > "$tmp" +cat < "$src" > "$tmp" chmod "$mode" "$tmp" fi -mv -f "$tmp" "$2" -test -d "$2" && { -rm -f "$2/$tmp" +mv -f "$tmp" "$dst" +test -d "$dst" && { +rm -f "$dst/$tmp" printf "%s: %s is a directory\n" "$0" "$dst" 1>&2 exit 1 } diff --git a/src/args.c b/src/args.c index 60a82ac1b86..9cb8165f883 100644 --- a/src/args.c +++ b/src/args.c @@ -345,7 +345,7 @@ bc_args(int argc, char* argv[], bool exit_exprs, BcBigDig* scale, } #endif // DC_ENABLED -#ifndef NDEBUG +#if BC_DEBUG // We shouldn't get here because bc_opt_error()/bc_error() should // longjmp() out. case '?': @@ -357,7 +357,7 @@ bc_args(int argc, char* argv[], bool exit_exprs, BcBigDig* scale, abort(); #endif // !BC_CLANG } -#endif // NDEBUG +#endif // BC_DEBUG } } diff --git a/src/bc_parse.c b/src/bc_parse.c index c64c194863f..4cf886ef5a9 100644 --- a/src/bc_parse.c +++ b/src/bc_parse.c @@ -1888,6 +1888,7 @@ bc_parse_stmt(BcParse* p) case BC_LEX_KW_AUTO: case BC_LEX_KW_DEFINE: #if DC_ENABLED + case BC_LEX_EXTENDED_REGISTERS: case BC_LEX_EQ_NO_REG: case BC_LEX_COLON: case BC_LEX_EXECUTE: @@ -2436,6 +2437,7 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) case BC_LEX_KW_STREAM: case BC_LEX_KW_ELSE: #if DC_ENABLED + case BC_LEX_EXTENDED_REGISTERS: case BC_LEX_EQ_NO_REG: case BC_LEX_COLON: case BC_LEX_EXECUTE: @@ -2462,11 +2464,11 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) case BC_LEX_ARRAY_LENGTH: #endif // DC_ENABLED { -#ifndef NDEBUG +#if BC_DEBUG // We should never get here, even in debug builds. bc_parse_err(p, BC_ERR_PARSE_TOKEN); break; -#endif // NDEBUG +#endif // BC_DEBUG } } diff --git a/src/data.c b/src/data.c index 284d3de7b64..abaf3b8e39a 100644 --- a/src/data.c +++ b/src/data.c @@ -308,9 +308,9 @@ const BcVecFree bc_vec_dtors[] = { bc_vec_free, bc_num_free, #if !BC_ENABLE_LIBRARY -#ifndef NDEBUG +#if BC_DEBUG bc_func_free, -#endif // NDEBUG +#endif // BC_DEBUG bc_slab_free, bc_const_free, bc_result_free, @@ -1199,12 +1199,12 @@ const uchar dc_parse_insts[] = { #if BC_ENABLED BC_INST_INVALID, #endif // BC_ENABLED - BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM, BC_INST_INVALID, - BC_INST_REL_EQ, BC_INST_INVALID, BC_INST_EXECUTE, - BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK, BC_INST_INVALID, - BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP, - BC_INST_POP, BC_INST_INVALID, BC_INST_INVALID, - BC_INST_INVALID, + BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM, BC_INST_INVALID, + BC_INST_EXTENDED_REGISTERS, BC_INST_REL_EQ, BC_INST_INVALID, + BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK, + BC_INST_INVALID, BC_INST_STACK_LEN, BC_INST_DUPLICATE, + BC_INST_SWAP, BC_INST_POP, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, #if BC_ENABLE_EXTRA_MATH BC_INST_INVALID, #endif // BC_ENABLE_EXTRA_MATH diff --git a/src/dc_lex.c b/src/dc_lex.c index cf737ea3c80..963e3f1331c 100644 --- a/src/dc_lex.c +++ b/src/dc_lex.c @@ -278,6 +278,7 @@ dc_lex_token(BcLex* l) c2 = l->buf[l->i]; if (c2 == 'l') l->t = BC_LEX_KW_LINE_LENGTH; + else if (c2 == 'x') l->t = BC_LEX_EXTENDED_REGISTERS; else if (c2 == 'z') l->t = BC_LEX_KW_LEADING_ZERO; else bc_lex_invalidChar(l, c2); diff --git a/src/dc_parse.c b/src/dc_parse.c index 638ccfb769c..2a6f387ac67 100644 --- a/src/dc_parse.c +++ b/src/dc_parse.c @@ -349,6 +349,7 @@ dc_parse_token(BcParse* p, BcLexType t, uint8_t flags) case BC_LEX_KW_LEADING_ZERO: case BC_LEX_KW_STREAM: case BC_LEX_KW_ELSE: + case BC_LEX_EXTENDED_REGISTERS: case BC_LEX_EQ_NO_REG: case BC_LEX_EXECUTE: case BC_LEX_PRINT_STACK: diff --git a/src/file.c b/src/file.c index aeee9f97aa9..c038c4472f3 100644 --- a/src/file.c +++ b/src/file.c @@ -336,7 +336,7 @@ bc_file_vprintf(BcFile* restrict f, const char* fmt, va_list args) bc_file_puts(f, bc_flush_none, s); } -#ifndef NDEBUG +#if BC_DEBUG // We only print signed integers in debug code. else if (c == 'd') { @@ -357,7 +357,7 @@ bc_file_vprintf(BcFile* restrict f, const char* fmt, va_list args) bc_file_puts(f, bc_flush_none, buf); } } -#endif // NDEBUG +#endif // BC_DEBUG else { unsigned long long ull; diff --git a/src/history.c b/src/history.c index 472eec55c25..924b62b41c2 100644 --- a/src/history.c +++ b/src/history.c @@ -2187,11 +2187,11 @@ bc_history_free(BcHistory* h) SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), h->orig_in); SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), h->orig_out); #endif // _WIN32 -#ifndef NDEBUG +#if BC_DEBUG bc_vec_free(&h->buf); bc_vec_free(&h->history); bc_vec_free(&h->extras); -#endif // NDEBUG +#endif // BC_DEBUG } #if BC_DEBUG_CODE diff --git a/src/lang.c b/src/lang.c index cb928ba31f7..b1c7d4808ec 100644 --- a/src/lang.c +++ b/src/lang.c @@ -136,7 +136,7 @@ bc_func_reset(BcFunc* f) #endif // BC_ENABLED } -#ifndef NDEBUG +#if BC_DEBUG void bc_func_free(void* func) { @@ -155,7 +155,7 @@ bc_func_free(void* func) } #endif // BC_ENABLED } -#endif // NDEBUG +#endif // BC_DEBUG void bc_array_init(BcVec* a, bool nums) @@ -302,10 +302,10 @@ bc_result_copy(BcResult* d, BcResult* src) case BC_RESULT_VOID: case BC_RESULT_LAST: { -#ifndef NDEBUG +#if BC_DEBUG // We should *never* try copying either of these. abort(); -#endif // NDEBUG +#endif // BC_DEBUG } #endif // BC_ENABLED } diff --git a/src/library.c b/src/library.c index 223fe4a208f..6283d198139 100644 --- a/src/library.c +++ b/src/library.c @@ -201,6 +201,8 @@ bcl_init(void) err: + BC_FUNC_FOOTER(vm, e); + // This is why we had to set them to NULL. if (BC_ERR(vm != NULL && vm->err)) { @@ -211,8 +213,6 @@ bcl_init(void) free(vm); } - BC_FUNC_FOOTER(vm, e); - return e; } diff --git a/src/num.c b/src/num.c index 58beb1dbad8..8f70c6a409d 100644 --- a/src/num.c +++ b/src/num.c @@ -3474,11 +3474,11 @@ bc_num_len(const BcNum* restrict n) void bc_num_parse(BcNum* restrict n, const char* restrict val, BcBigDig base) { -#ifndef NDEBUG +#if BC_DEBUG #if BC_ENABLE_LIBRARY BcVm* vm = bcl_getspecific(); #endif // BC_ENABLE_LIBRARY -#endif // NDEBUG +#endif // BC_DEBUG assert(n != NULL && val != NULL && base); assert(base >= BC_NUM_MIN_BASE && base <= vm->maxes[BC_PROG_GLOBALS_IBASE]); @@ -3539,11 +3539,11 @@ bc_num_print(BcNum* restrict n, BcBigDig base, bool newline) BcBigDig bc_num_bigdig2(const BcNum* restrict n) { -#ifndef NDEBUG +#if BC_DEBUG #if BC_ENABLE_LIBRARY BcVm* vm = bcl_getspecific(); #endif // BC_ENABLE_LIBRARY -#endif // NDEBUG +#endif // BC_DEBUG // This function returns no errors because it's guaranteed to succeed if // its preconditions are met. Those preconditions include both n needs to @@ -4256,11 +4256,11 @@ bc_num_modexp(BcNum* a, BcNum* b, BcNum* c, BcNum* restrict d) if (BC_ERR(BC_NUM_ZERO(c))) bc_err(BC_ERR_MATH_DIVIDE_BY_ZERO); if (BC_ERR(BC_NUM_NEG(b))) bc_err(BC_ERR_MATH_NEGATIVE); -#ifndef NDEBUG +#if BC_DEBUG || BC_GCC // This is entirely for quieting a useless scan-build error. btemp.len = 0; ctemp.len = 0; -#endif // NDEBUG +#endif // BC_DEBUG || BC_GCC // Eliminate fractional parts that are zero or error if they are not zero. if (BC_ERR(bc_num_nonInt(a, &atemp) || bc_num_nonInt(b, &btemp) || diff --git a/src/parse.c b/src/parse.c index 1834bde2883..b02a195f83b 100644 --- a/src/parse.c +++ b/src/parse.c @@ -223,7 +223,7 @@ bc_parse_reset(BcParse* p) if (BC_ERR(vm->status)) BC_JMP; } -#ifndef NDEBUG +#if BC_DEBUG void bc_parse_free(BcParse* p) { @@ -244,7 +244,7 @@ bc_parse_free(BcParse* p) bc_lex_free(&p->l); } -#endif // NDEBUG +#endif // BC_DEBUG void bc_parse_init(BcParse* p, BcProgram* prog, size_t func) diff --git a/src/program.c b/src/program.c index 7e2ba8178b6..b6fac12c7d6 100644 --- a/src/program.c +++ b/src/program.c @@ -411,12 +411,12 @@ bc_program_num(BcProgram* p, BcResult* r) // We should never get here; this is taken care of earlier because a // result is expected. case BC_RESULT_VOID: -#ifndef NDEBUG +#if BC_DEBUG { abort(); // Fallthrough } -#endif // NDEBUG +#endif // BC_DEBUG case BC_RESULT_LAST: { n = &p->last; @@ -839,14 +839,14 @@ bc_program_rand(BcProgram* p) bc_program_pushBigdig(p, (BcBigDig) rand, BC_RESULT_TEMP); -#ifndef NDEBUG +#if BC_DEBUG // This is just to ensure that the generated number is correct. I also use // braces because I declare every local at the top of the scope. { BcResult* r = bc_vec_top(&p->results); assert(BC_NUM_RDX_VALID_NP(r->d.n)); } -#endif // NDEBUG +#endif // BC_DEBUG } #endif // BC_ENABLE_EXTRA_MATH @@ -1140,13 +1140,13 @@ bc_program_logical(BcProgram* p, uchar inst) cond = (cmp > 0); break; } -#ifndef NDEBUG +#if BC_DEBUG default: { // There is a bug if we get here. abort(); } -#endif // NDEBUG +#endif // BC_DEBUG } } @@ -2689,12 +2689,20 @@ bc_program_globalSetting(BcProgram* p, uchar inst) BcBigDig val; // Make sure the instruction is valid. +#if DC_ENABLED + assert((inst >= BC_INST_LINE_LENGTH && inst <= BC_INST_LEADING_ZERO) || + (BC_IS_DC && inst == BC_INST_EXTENDED_REGISTERS)); +#else // DC_ENABLED assert(inst >= BC_INST_LINE_LENGTH && inst <= BC_INST_LEADING_ZERO); +#endif // DC_ENABLED if (inst == BC_INST_LINE_LENGTH) val = (BcBigDig) vm->line_len; #if BC_ENABLED else if (inst == BC_INST_GLOBAL_STACKS) val = (BC_G != 0); #endif // BC_ENABLED +#if DC_ENABLED + else if (inst == BC_INST_EXTENDED_REGISTERS) val = (DC_X != 0); +#endif // DC_ENABLED else val = (BC_Z != 0); // Push the global. @@ -2779,7 +2787,7 @@ bc_program_insertFunc(BcProgram* p, const char* name) return idx; } -#ifndef NDEBUG +#if BC_DEBUG void bc_program_free(BcProgram* p) { @@ -2826,7 +2834,7 @@ bc_program_free(BcProgram* p) if (BC_IS_DC) bc_vec_free(&p->tail_calls); #endif // DC_ENABLED } -#endif // NDEBUG +#endif // BC_DEBUG void bc_program_init(BcProgram* p) @@ -2883,11 +2891,11 @@ bc_program_init(BcProgram* p) if (BC_IS_BC) bc_num_init(&p->last, BC_NUM_DEF_SIZE); #endif // BC_ENABLED -#ifndef NDEBUG +#if BC_DEBUG bc_vec_init(&p->fns, sizeof(BcFunc), BC_DTOR_FUNC); -#else // NDEBUG +#else // BC_DEBUG bc_vec_init(&p->fns, sizeof(BcFunc), BC_DTOR_NONE); -#endif // NDEBUG +#endif // BC_DEBUG bc_map_init(&p->fn_map); bc_program_insertFunc(p, bc_func_main); bc_program_insertFunc(p, bc_func_read); @@ -3002,9 +3010,9 @@ bc_program_exec(BcProgram* p) BcNum* num; #endif // BC_ENABLED #if !BC_HAS_COMPUTED_GOTO -#ifndef NDEBUG +#if BC_DEBUG size_t jmp_bufs_len; -#endif // NDEBUG +#endif // BC_DEBUG #endif // !BC_HAS_COMPUTED_GOTO #if BC_HAS_COMPUTED_GOTO @@ -3042,9 +3050,9 @@ bc_program_exec(BcProgram* p) #if !BC_HAS_COMPUTED_GOTO -#ifndef NDEBUG +#if BC_DEBUG jmp_bufs_len = vm->jmp_bufs.len; -#endif // NDEBUG +#endif // BC_DEBUG // This loop is the heart of the execution engine. It *is* the engine. For // computed goto, it is ignored. @@ -3246,6 +3254,9 @@ bc_program_exec(BcProgram* p) #if BC_ENABLED BC_PROG_LBL(BC_INST_GLOBAL_STACKS): #endif // BC_ENABLED +#if DC_ENABLED + BC_PROG_LBL(BC_INST_EXTENDED_REGISTERS): +#endif // DC_ENABLE BC_PROG_LBL(BC_INST_LEADING_ZERO): // clang-format on { @@ -3669,9 +3680,9 @@ bc_program_exec(BcProgram* p) default: { BC_UNREACHABLE -#if !defined(NDEBUG) && !BC_CLANG +#if BC_DEBUG && !BC_CLANG abort(); -#endif // !defined(NDEBUG) && !BC_CLANG +#endif // BC_DEBUG && !BC_CLANG } #endif // BC_HAS_COMPUTED_GOTO } @@ -3688,12 +3699,12 @@ bc_program_exec(BcProgram* p) #else // BC_HAS_COMPUTED_GOTO -#ifndef NDEBUG +#if BC_DEBUG // This is to allow me to use a debugger to see the last instruction, // which will point to which function was the problem. But it's also a // good smoke test for error handling changes. assert(jmp_bufs_len == vm->jmp_bufs.len); -#endif // NDEBUG +#endif // BC_DEBUG #endif // BC_HAS_COMPUTED_GOTO } diff --git a/src/read.c b/src/read.c index d5af9e1ba27..de9e24ed6ac 100644 --- a/src/read.c +++ b/src/read.c @@ -279,11 +279,11 @@ bc_read_file(const char* path) assert(path != NULL); -#ifndef NDEBUG +#if BC_DEBUG // Need this to quiet MSan. // NOLINTNEXTLINE memset(&pstat, 0, sizeof(struct stat)); -#endif // NDEBUG +#endif // BC_DEBUG fd = bc_read_open(path, O_RDONLY); diff --git a/src/vm.c b/src/vm.c index 0296d0f4b9c..3a7913e30c8 100644 --- a/src/vm.c +++ b/src/vm.c @@ -101,9 +101,9 @@ bc_vm_jmp(void) bc_file_flush(&vm->ferr, bc_flush_none); #endif // BC_DEBUG_CODE -#ifndef NDEBUG +#if BC_DEBUG assert(vm->jmp_bufs.len - (size_t) vm->sig_pop); -#endif // NDEBUG +#endif // BC_DEBUG if (vm->jmp_bufs.len == 0) abort(); if (vm->sig_pop) bc_vec_pop(&vm->jmp_bufs); @@ -349,13 +349,13 @@ bc_vm_handleError(BcErr e) BC_JMP; } #else // BC_ENABLE_LIBRARY -#ifndef NDEBUG +#if BC_DEBUG void bc_vm_handleError(BcErr e, const char* file, int fline, size_t line, ...) -#else // NDEBUG +#else // BC_DEBUG void bc_vm_handleError(BcErr e, size_t line, ...) -#endif // NDEBUG +#endif // BC_DEBUG { BcStatus s; va_list args; @@ -423,9 +423,9 @@ bc_vm_handleError(BcErr e, size_t line, ...) bc_file_putchar(&vm->ferr, bc_flush_none, '\n'); } -#ifndef NDEBUG +#if BC_DEBUG bc_file_printf(&vm->ferr, "\n %s:%d\n", file, fline); -#endif // NDEBUG +#endif // BC_DEBUG bc_file_puts(&vm->ferr, bc_flush_none, "\n"); @@ -650,7 +650,7 @@ bc_vm_shutdown(void) if (BC_TTY && !vm->history.badTerm) bc_history_free(&vm->history); #endif // BC_ENABLE_HISTORY -#ifndef NDEBUG +#if BC_DEBUG #if !BC_ENABLE_LIBRARY bc_vec_free(&vm->env_args); free(vm->env_args_buffer); @@ -670,7 +670,7 @@ bc_vm_shutdown(void) #endif // !BC_ENABLE_LIBRARY bc_vm_freeTemps(); -#endif // NDEBUG +#endif // BC_DEBUG #if !BC_ENABLE_LIBRARY // We always want to flush. @@ -1242,12 +1242,12 @@ bc_vm_stdin(void) goto restart; } -#ifndef NDEBUG +#if BC_DEBUG // Since these are tied to this function, free them here. We only free in // debug mode because stdin is always the last thing read. bc_vec_free(&vm->line_buf); bc_vec_free(&vm->buffer); -#endif // NDEBUG +#endif // BC_DEBUG BC_LONGJMP_CONT(vm); } @@ -1767,17 +1767,17 @@ bc_vm_init(void) void bc_vm_atexit(void) { -#ifndef NDEBUG +#if BC_DEBUG #if BC_ENABLE_LIBRARY BcVm* vm = bcl_getspecific(); #endif // BC_ENABLE_LIBRARY -#endif // NDEBUG +#endif // BC_DEBUG bc_vm_shutdown(); -#ifndef NDEBUG +#if BC_DEBUG bc_vec_free(&vm->jmp_bufs); -#endif // NDEBUG +#endif // BC_DEBUG } #else // BC_ENABLE_LIBRARY int @@ -1788,9 +1788,9 @@ bc_vm_atexit(int status) bc_vm_shutdown(); -#ifndef NDEBUG +#if BC_DEBUG bc_vec_free(&vm->jmp_bufs); -#endif // NDEBUG +#endif // BC_DEBUG return s; } diff --git a/tests/all.sh b/tests/all.sh index 099804777c1..9174d398260 100755 --- a/tests/all.sh +++ b/tests/all.sh @@ -50,11 +50,12 @@ pll=1 while getopts "n" opt; do case "$opt" in - n) pll=0 ; shift ; set -e ;; + n) pll=0 ; set -e ;; ?) usage "Invalid option: $opt" ;; esac done +shift $(($OPTIND - 1)) # Command-line processing. if [ "$#" -ge 1 ]; then diff --git a/tests/error.sh b/tests/error.sh index 11d7a8126a2..b87a3d35447 100755 --- a/tests/error.sh +++ b/tests/error.sh @@ -109,7 +109,7 @@ fi printf 'Running %s error file %s with clamping...' "$d" "$t" -printf '%s\n' "$halt" | "$exe" "$@" $opts -c "$testfile" 2> "$out" > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $opts -c "$testfile" 2> "$out" > /dev/null err="$?" checkerrtest "$d" "$err" "$testfile" "$out" "$exebase" > /dev/null @@ -118,7 +118,7 @@ printf 'pass\n' printf 'Running %s error file %s without clamping...' "$d" "$t" -printf '%s\n' "$halt" | "$exe" "$@" $opts -C "$testfile" 2> "$out" > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $opts -C "$testfile" 2> "$out" > /dev/null err="$?" checkerrtest "$d" "$err" "$testfile" "$out" "$exebase" > /dev/null @@ -127,7 +127,7 @@ printf 'pass\n' printf 'Running %s error file %s through cat with clamping...' "$d" "$t" -cat "$testfile" | "$exe" "$@" $opts -c 2> "$out" > /dev/null +cat "$testfile" 2> /dev/null | "$exe" "$@" $opts -c 2> "$out" > /dev/null err="$?" checkerrtest "$d" "$err" "$testfile" "$out" "$exebase" @@ -136,7 +136,7 @@ printf 'pass\n' printf 'Running %s error file %s through cat without clamping...' "$d" "$t" -cat "$testfile" | "$exe" "$@" $opts -C 2> "$out" > /dev/null +cat "$testfile" 2> /dev/null | "$exe" "$@" $opts -C 2> "$out" > /dev/null err="$?" checkerrtest "$d" "$err" "$testfile" "$out" "$exebase" diff --git a/tests/errors.sh b/tests/errors.sh index 11d03299b41..081beb72411 100755 --- a/tests/errors.sh +++ b/tests/errors.sh @@ -98,12 +98,12 @@ fi printf 'Running %s command-line error tests...' "$d" -printf '%s\n' "$halt" | "$exe" "$@" -e "1+1" -f- -e "2+2" 2> "$out" > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -e "1+1" -f- -e "2+2" 2> "$out" > /dev/null err="$?" checkerrtest "$d" "$err" "command-line -e test" "$out" "$exebase" -printf '%s\n' "$halt" | "$exe" "$@" -e "1+1" -f- -f "$testdir/$d/decimal.txt" 2> "$out" > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -e "1+1" -f- -f "$testdir/$d/decimal.txt" 2> "$out" > /dev/null err="$?" checkerrtest "$d" "$err" "command-line -f test" "$out" "$exebase" @@ -123,7 +123,7 @@ for testfile in $testdir/$d/*errors.txt; do # Just test warnings. line="last" - printf '%s\n' "$line" | "$exe" "$@" "-lw" 2> "$out" > /dev/null + printf '%s\n' "$line" 2> /dev/null | "$exe" "$@" "-lw" 2> "$out" > /dev/null err="$?" if [ "$err" -ne 0 ]; then @@ -150,7 +150,7 @@ for testfile in $testdir/$d/*errors.txt; do rm -f "$out" - printf '%s\n' "$line" | "$exe" "$@" "$options" 2> "$out" > /dev/null + printf '%s\n' "$line" 2> /dev/null | "$exe" "$@" "$options" 2> "$out" > /dev/null err="$?" checkerrtest "$d" "$err" "$line" "$out" "$exebase" diff --git a/tests/other.sh b/tests/other.sh index 4f491a64c77..c3a739a32e7 100755 --- a/tests/other.sh +++ b/tests/other.sh @@ -112,14 +112,14 @@ set +e printf '\nRunning %s quit test...' "$d" -printf '%s\n' "$halt" | "$exe" "$@" > /dev/null 2>&1 +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" > /dev/null 2>&1 checktest_retcode "$d" "$?" "quit" # bc has two halt or quit commands, so test the second as well. if [ "$d" = bc ]; then - printf '%s\n' "quit" | "$exe" "$@" > /dev/null 2>&1 + printf '%s\n' "quit" 2> /dev/null | "$exe" "$@" > /dev/null 2>&1 checktest_retcode "$d" "$?" quit @@ -142,11 +142,11 @@ if [ "$d" = "bc" ]; then export BC_ENV_ARGS=" '-l' '' -q" - printf 's(.02893)\n' | "$exe" "$@" > /dev/null + printf 's(.02893)\n' 2> /dev/null | "$exe" "$@" > /dev/null checktest_retcode "$d" "$?" "environment var" - printf 'halt\n' | "$exe" "$@" -e 4 > /dev/null + printf 'halt\n' 2> /dev/null | "$exe" "$@" -e 4 > /dev/null err="$?" checktest_retcode "$d" "$?" "environment var" @@ -168,19 +168,19 @@ if [ "$d" = "bc" ]; then printf '5\n0\n' > "$redefine_res" - printf 'halt\n' | "$exe" "$@" --redefine=print -e 'define print(x) { x }' -e 'print(5)' > "$redefine_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" --redefine=print -e 'define print(x) { x }' -e 'print(5)' > "$redefine_out" err="$?" checktest "$d" "$err" "keyword redefinition" "$redefine_res" "$redefine_out" - printf 'halt\n' | "$exe" "$@" -r "abs" -r "else" -e 'abs = 5;else = 0' -e 'abs;else' > "$redefine_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" -r "abs" -r "else" -e 'abs = 5;else = 0' -e 'abs;else' > "$redefine_out" err="$?" checktest "$d" "$err" "keyword redefinition" "$redefine_res" "$redefine_out" if [ "$extra_math" -ne 0 ]; then - printf 'halt\n' | "$exe" "$@" -lr abs -e "perm(5, 1)" -e "0" > "$redefine_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" -lr abs -e "perm(5, 1)" -e "0" > "$redefine_out" err="$?" checktest "$d" "$err" "keyword not redefined in builtin library" "$redefine_res" "$redefine_out" @@ -204,7 +204,7 @@ if [ "$d" = "bc" ]; then multiline_expr_out="$outputdir/bc_outputs/multiline_expr_results.txt" # tests/bc/misc1.txt happens to have a multiline comment in it. - printf 'halt\n' | "$exe" "$@" -f "$testdir/bc/misc1.txt" > "$multiline_expr_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/misc1.txt" > "$multiline_expr_out" err="$?" checktest "$d" "$err" "multiline comment in expression file" "$testdir/bc/misc1_results.txt" \ @@ -213,7 +213,7 @@ if [ "$d" = "bc" ]; then printf 'pass\n' printf 'Running multiline comment expression file error test...' - printf 'halt\n' | "$exe" "$@" -f "$testdir/bc/errors/05.txt" 2> "$multiline_expr_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/errors/05.txt" 2> "$multiline_expr_out" err="$?" checkerrtest "$d" "$err" "multiline comment in expression file error" \ @@ -223,7 +223,7 @@ if [ "$d" = "bc" ]; then printf 'Running multiline string expression file test...' # tests/bc/strings.txt happens to have a multiline string in it. - printf 'halt\n' | "$exe" "$@" -f "$testdir/bc/strings.txt" > "$multiline_expr_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/strings.txt" > "$multiline_expr_out" err="$?" checktest "$d" "$err" "multiline string in expression file" "$testdir/bc/strings_results.txt" \ @@ -232,13 +232,13 @@ if [ "$d" = "bc" ]; then printf 'pass\n' printf 'Running multiline string expression file error test...' - printf 'halt\n' | "$exe" "$@" -f "$testdir/bc/errors/16.txt" 2> "$multiline_expr_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/errors/16.txt" 2> "$multiline_expr_out" err="$?" checkerrtest "$d" "$err" "multiline string in expression file with backslash error" \ "$multiline_expr_out" "$d" - printf 'halt\n' | "$exe" "$@" -f "$testdir/bc/errors/04.txt" 2> "$multiline_expr_out" + printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/errors/04.txt" 2> "$multiline_expr_out" err="$?" checkerrtest "$d" "$err" "multiline string in expression file error" \ @@ -251,7 +251,7 @@ else export DC_ENV_ARGS="'-x'" export DC_EXPR_EXIT="1" - printf '4s stuff\n' | "$exe" "$@" > /dev/null + printf '4s stuff\n' 2> /dev/null | "$exe" "$@" > /dev/null checktest_retcode "$d" "$?" "environment var" @@ -266,15 +266,15 @@ else # dc has an extra test for a case that someone found running this easter.dc # script. It went into an infinite loop, so we want to check that we did not # regress. - printf 'three\n' | cut -c1-3 > /dev/null + printf 'three\n' 2> /dev/null | cut -c1-3 > /dev/null err=$? if [ "$err" -eq 0 ]; then printf 'Running dc Easter script...' - easter_res="$outputdir/dc_outputs/easter.txt" - easter_out="$outputdir/dc_outputs/easter_results.txt" + easter_out="$outputdir/dc_outputs/easter.txt" + easter_res="$outputdir/dc_outputs/easter_results.txt" outdir=$(dirname "$easter_out") @@ -284,14 +284,44 @@ else printf '4 April 2021\n' > "$easter_res" - "$testdir/dc/scripts/easter.sh" "$exe" 2021 "$@" | cut -c1-12 > "$easter_out" + "$testdir/dc/scripts/easter.sh" "$exe" 2021 "$@" 2> /dev/null | cut -c1-12 > "$easter_out" err="$?" - checktest "$d" "$err" "Easter script" "$easter_res" "$easter_out" + checktest "$d" "$err" "Easter script" "$easter_out" "$easter_res" printf 'pass\n' fi + unset DC_ENV_ARGS + unset DC_EXPR_EXIT + + printf 'Running dc extended register command tests...' + + ext_reg_out="$outputdir/dc_outputs/ext_reg.txt" + ext_reg_res="$outputdir/dc_outputs/ext_reg_results.txt" + + outdir=$(dirname "$ext_reg_out") + + if [ ! -d "$outdir" ]; then + mkdir -p "$outdir" + fi + + printf '0\n' > "$ext_reg_res" + + "$exe" "$@" -e "gxpR" 2> /dev/null > "$ext_reg_out" + err="$?" + + checktest "$d" "$err" "Extended register command" "$ext_reg_out" "$ext_reg_res" + + printf '1\n' > "$ext_reg_res" + + "$exe" "$@" -x -e "gxpR" 2> /dev/null > "$ext_reg_out" + err="$?" + + checktest "$d" "$err" "Extended register command" "$ext_reg_out" "$ext_reg_res" + + printf 'pass\n' + fi out1="$outputdir/${d}_outputs/${d}_other.txt" @@ -302,26 +332,26 @@ printf 'Running %s line length tests...' "$d" printf '%s\n' "$numres" > "$out1" export "$line_var"=80 -printf '%s\n' "$num" | "$exe" "$@" > "$out2" +printf '%s\n' "$num" 2> /dev/null | "$exe" "$@" > "$out2" checktest "$d" "$?" "line length" "$out1" "$out2" printf '%s\n' "$num70" > "$out1" export "$line_var"=2147483647 -printf '%s\n' "$num" | "$exe" "$@" > "$out2" +printf '%s\n' "$num" 2> /dev/null | "$exe" "$@" > "$out2" checktest "$d" "$?" "line length 2" "$out1" "$out2" printf '%s\n' "$num2" > "$out1" export "$line_var"=62 -printf '%s\n' "$num" | "$exe" "$@" -L > "$out2" +printf '%s\n' "$num" 2> /dev/null | "$exe" "$@" -L > "$out2" checktest "$d" "$?" "line length 3" "$out1" "$out2" printf '0\n' > "$out1" -printf '%s\n' "$lltest" | "$exe" "$@" -L > "$out2" +printf '%s\n' "$lltest" 2> /dev/null | "$exe" "$@" -L > "$out2" checktest "$d" "$?" "line length 3" "$out1" "$out2" @@ -342,23 +372,23 @@ printf '%s\n%s\n%s\n%s\n' "$results" "$results" "$results" "$results" > "$out1" checktest "$d" "$?" "arg" "$out1" "$out2" -printf '%s\n' "$halt" | "$exe" "$@" -- "$f" "$f" "$f" "$f" > "$out2" +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -- "$f" "$f" "$f" "$f" > "$out2" checktest "$d" "$?" "arg" "$out1" "$out2" if [ "$d" = "bc" ]; then - printf '%s\n' "$halt" | "$exe" "$@" -i > /dev/null 2>&1 + printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -i > /dev/null 2>&1 fi -printf '%s\n' "$halt" | "$exe" "$@" -h > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -h > /dev/null checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" | "$exe" "$@" -P > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -P > /dev/null checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" | "$exe" "$@" -R > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -R > /dev/null checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" | "$exe" "$@" -v > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -v > /dev/null checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" | "$exe" "$@" -V > /dev/null +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -V > /dev/null checktest_retcode "$d" "$?" "arg" out=$(printf '0.1\n-0.1\n1.1\n-1.1\n0.1\n-0.1\n') @@ -370,12 +400,12 @@ else data=$(printf '0.1pR\n_0.1pR\n1.1pR\n_1.1pR\n.1pR\n_.1pR\n') fi -printf '%s\n' "$data" | "$exe" "$@" -z > "$out2" +printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" -z > "$out2" checktest "$d" "$?" "leading zero" "$out1" "$out2" if [ "$d" = "bc" ] && [ "$extra_math" -ne 0 ]; then - printf '%s\n' "$halt" | "$exe" "$@" -lz "$testdir/bc/leadingzero.txt" > "$out2" + printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -lz "$testdir/bc/leadingzero.txt" > "$out2" checktest "$d" "$?" "leading zero script" "$testdir/bc/leadingzero_results.txt" "$out2" @@ -446,10 +476,10 @@ if [ "$extra_math" -ne 0 ]; then data=$(printf 'J2@OIKAiAopRpRpRpR') fi - printf '%s\n' "$data" | "$exe" "$@" -S14 -I15 -O16 -E17.25 > "$out2" + printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" -S14 -I15 -O16 -E17.25 > "$out2" checktest "$d" "$?" "builtin variable args" "$out1" "$out2" - printf '%s\n' "$data" | "$exe" "$@" --scale=14 --ibase=15 --obase=16 --seed=17.25 > "$out2" + printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" --scale=14 --ibase=15 --obase=16 --seed=17.25 > "$out2" checktest "$d" "$?" "builtin variable long args" "$out1" "$out2" else @@ -463,10 +493,10 @@ else data=$(printf 'OIKAiAopRpRpR') fi - printf '%s\n' "$data" | "$exe" "$@" -S14 -I15 -O16 > "$out2" + printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" -S14 -I15 -O16 > "$out2" checktest "$d" "$?" "builtin variable args" "$out1" "$out2" - printf '%s\n' "$data" | "$exe" "$@" --scale=14 --ibase=15 --obase=16 > "$out2" + printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" --scale=14 --ibase=15 --obase=16 > "$out2" checktest "$d" "$?" "builtin variable long args" "$out1" "$out2" fi @@ -476,40 +506,40 @@ if [ "$d" = "bc" ]; then out=$(printf '100\n') printf '%s\n' "$out" > "$out1" - printf 'scale\n' | "$exe" "$@" -S100 -l > "$out2" + printf 'scale\n' 2> /dev/null | "$exe" "$@" -S100 -l > "$out2" checktest "$d" "$?" "builtin variable args with math lib" "$out1" "$out2" - printf 'scale\n' | "$exe" "$@" --scale=100 --mathlib > "$out2" + printf 'scale\n' 2> /dev/null | "$exe" "$@" --scale=100 --mathlib > "$out2" checktest "$d" "$?" "builtin variable long args with math lib" "$out1" "$out2" export BC_ENV_ARGS="-l" - printf 'scale\n' | "$exe" "$@" -S100 > "$out2" + printf 'scale\n' 2> /dev/null | "$exe" "$@" -S100 > "$out2" checktest "$d" "$?" "builtin variable args with math lib env arg" "$out1" "$out2" - printf 'scale\n' | "$exe" "$@" --scale=100 > "$out2" + printf 'scale\n' 2> /dev/null | "$exe" "$@" --scale=100 > "$out2" checktest "$d" "$?" "builtin variable long args with math lib env arg" "$out1" "$out2" export BC_ENV_ARGS="-S100" - printf 'scale\n' | "$exe" "$@" -l > "$out2" + printf 'scale\n' 2> /dev/null | "$exe" "$@" -l > "$out2" checktest "$d" "$?" "builtin variable args with math lib arg" "$out1" "$out2" export BC_ENV_ARGS="--scale=100" - printf 'scale\n' | "$exe" "$@" -l > "$out2" + printf 'scale\n' 2> /dev/null | "$exe" "$@" -l > "$out2" checktest "$d" "$?" "builtin variable long args with math lib arg" "$out1" "$out2" fi -printf 'scale\n' | "$exe" "$@" --scale=18923c.rlg > /dev/null 2> "$out2" +printf 'scale\n' 2> /dev/null | "$exe" "$@" --scale=18923c.rlg > /dev/null 2> "$out2" err="$?" checkerrtest "$d" "$err" "invalid command-line arg for builtin variable" "$out2" "$d" if [ "$extra_math" -ne 0 ]; then - printf 'seed\n' | "$exe" "$@" --seed=18923c.rlg > /dev/null 2> "$out2" + printf 'seed\n' 2> /dev/null | "$exe" "$@" --seed=18923c.rlg > /dev/null 2> "$out2" err="$?" checkerrtest "$d" "$err" "invalid command-line arg for seed" "$out2" "$d" @@ -540,7 +570,7 @@ printf 'pass\n' printf 'Running %s binary stdin test...' "$d" -cat "$bin" | "$exe" "$@" > /dev/null 2> "$out2" +cat "$bin" 2> /dev/null | "$exe" "$@" > /dev/null 2> "$out2" err="$?" checkerrtest "$d" "$err" "binary stdin" "$out2" "$d" @@ -550,7 +580,7 @@ printf 'pass\n' if [ "$d" = "bc" ]; then printf 'Running %s limits tests...' "$d" - printf 'limits\n' | "$exe" "$@" /dev/null > "$out2" 2>&1 + printf 'limits\n' 2> /dev/null | "$exe" "$@" /dev/null > "$out2" 2>&1 checktest_retcode "$d" "$?" "limits" diff --git a/tests/script.sh b/tests/script.sh index 460940a2138..438af17c79c 100755 --- a/tests/script.sh +++ b/tests/script.sh @@ -194,7 +194,7 @@ else # where GNU bc is wrong. See the development manual # (manuals/development.md#script-tests) for more information. printf 'Generating %s results...' "$f" - printf '%s\n' "$halt" | "$d" "$s" | sed -n -f "$testdir/script.sed" > "$results" + printf '%s\n' "$halt" 2> /dev/null | "$d" "$s" | sed -n -f "$testdir/script.sed" > "$results" printf 'done\n' res="$results" fi @@ -206,11 +206,11 @@ printf 'Running %s script %s...' "$d" "$f" # Yes this is poor timing, but it works. if [ "$time_tests" -ne 0 ]; then printf '\n' - printf '%s\n' "$halt" | /usr/bin/time -p "$exe" "$@" $options "$s" > "$out" + printf '%s\n' "$halt" 2> /dev/null | /usr/bin/time -p "$exe" "$@" $options "$s" > "$out" err="$?" printf '\n' else - printf '%s\n' "$halt" | "$exe" "$@" $options "$s" > "$out" + printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $options "$s" > "$out" err="$?" fi diff --git a/tests/scripts.sh b/tests/scripts.sh index 5c3b6fc3d02..dda57e43505 100755 --- a/tests/scripts.sh +++ b/tests/scripts.sh @@ -31,6 +31,8 @@ script="$0" testdir=$(dirname "${script}") +. "$testdir/../scripts/functions.sh" + # Just print the usage and exit with an error. This can receive a message to # print. # @param 1 A message to print. @@ -50,11 +52,12 @@ pll=1 while getopts "n" opt; do case "$opt" in - n) pll=0 ; shift ; set -e ;; + n) pll=0 ; set -e ;; ?) usage "Invalid option: $opt" ;; esac done +shift $(($OPTIND - 1)) # Command-line processing. if [ "$#" -eq 0 ]; then diff --git a/tests/test.sh b/tests/test.sh index 11c7e05f739..343705bf10a 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -138,7 +138,7 @@ fi # If the results do not exist, generate.. if [ ! -f "$results" ]; then printf 'Generating %s %s results...' "$d" "$t" - printf '%s\n' "$halt" | "$d" $options "$name" > "$results" + printf '%s\n' "$halt" 2> /dev/null | "$d" $options "$name" > "$results" printf 'done\n' fi @@ -157,11 +157,11 @@ printf 'Running %s %s...' "$d" "$t" if [ "$time_tests" -ne 0 ]; then printf '\n' - printf '%s\n' "$halt" | /usr/bin/time -p "$exe" "$@" $options "$name" > "$out" + printf '%s\n' "$halt" 2> /dev/null | /usr/bin/time -p "$exe" "$@" $options "$name" > "$out" err="$?" printf '\n' else - printf '%s\n' "$halt" | "$exe" "$@" $options "$name" > "$out" + printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $options "$name" > "$out" err="$?" fi diff --git a/vs/bc.vcxproj b/vs/bc.vcxproj index 3579f9094be..312af50e8a6 100644 --- a/vs/bc.vcxproj +++ b/vs/bc.vcxproj @@ -295,4 +295,4 @@ - \ No newline at end of file + From 0ff539eb7ca570d65a23a7ad13a91a673d89abcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Fri, 3 Mar 2023 23:15:06 +0100 Subject: [PATCH 03/14] vendor/bc: import version 6.4.0 This version contains a fix for an issue that can affect complex bc scripts that use multiple read() functions that receive input from an interactive user. The same value could be returned multiple times. --- Makefile.in | 2 +- NEWS.md | 19 ++ configure.sh | 2 +- include/bcl.h | 51 ++++ include/library.h | 210 +++++++++++-- include/program.h | 210 +++++-------- include/version.h | 2 +- include/vm.h | 4 + manuals/bcl.3 | 422 +++++++++++++++++++++++++- manuals/bcl.3.md | 320 +++++++++++++++++++- src/data.c | 75 +++-- src/library.c | 739 ++++++++++++++++++++++++++++++++-------------- src/program.c | 13 +- src/vm.c | 2 + tests/bcl.c | 52 +++- tests/read.sh | 13 + 16 files changed, 1693 insertions(+), 443 deletions(-) diff --git a/Makefile.in b/Makefile.in index 89ddb7589c4..f936fc2c6de 100644 --- a/Makefile.in +++ b/Makefile.in @@ -536,7 +536,6 @@ clean:%%CLEAN_PREREQS%% @$(RM) -f $(BC_HELP_C) $(BC_HELP_O) @$(RM) -f $(DC_HELP_C) $(DC_HELP_O) @$(RM) -fr vs/bin/ vs/lib/ - @$(RM) -f $(BCL_PC) clean_benchmarks: @printf 'Cleaning benchmarks...\n' @@ -550,6 +549,7 @@ clean_config: clean clean_benchmarks @$(RM) -f $(BC_MD) $(BC_MANPAGE) @$(RM) -f $(DC_MD) $(DC_MANPAGE) @$(RM) -f compile_commands.json + @$(RM) -f $(BCL_PC) clean_coverage: @printf 'Cleaning coverage files...\n' diff --git a/NEWS.md b/NEWS.md index ad118e401c3..6dff6822fb1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,24 @@ # News +## 6.4.0 + +This is a production release that fixes a `read()`/`?` bug and adds features to +`bcl`. + +The bug was that multiple read calls could repeat old data. + +The new features in `bcl` are functions to preserve `BclNumber` arguments and +not free them. + +***WARNING for `bcl` Users***: The `bcl_rand_seedWithNum()` function used to not +consume its arguments. Now it does. This change could have made this version +`7.0.0`, but I'm 99.9% confident that there are no `bcl` users, or if there are, +they probably don't use the PRNG. So I took a risk and didn't update the major +version. + +`bcl` now includes more capacity to check for invalid numbers when built to run +under Valgrind. + ## 6.3.1 This is a production release that fixes a `bc` dependency loop for minimal diff --git a/configure.sh b/configure.sh index 3ada5298e9e..021d30807ff 100755 --- a/configure.sh +++ b/configure.sh @@ -1801,7 +1801,7 @@ if [ "$library" -ne 0 ]; then contents=$(replace "$contents" "LIBDIR" "$LIBDIR") contents=$(replace "$contents" "VERSION" "$version") - printf '%s\n' "$contents" > "./bcl.pc" + printf '%s\n' "$contents" > "$scriptdir/bcl.pc" pkg_config_install="\$(SAFE_INSTALL) \$(PC_INSTALL_ARGS) \"\$(BCL_PC)\" \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\"" pkg_config_uninstall="\$(RM) -f \"\$(DESTDIR)\$(PC_PATH)/\$(BCL_PC)\"" diff --git a/include/bcl.h b/include/bcl.h index 253138231c6..0908e215182 100644 --- a/include/bcl.h +++ b/include/bcl.h @@ -36,6 +36,9 @@ #ifndef BC_BCL_H #define BC_BCL_H +// TODO: Add a generation index when building with Valgrind to check for +// use-after-free's or double frees. + #include #include #include @@ -238,42 +241,78 @@ bcl_dup(BclNumber s); BclError bcl_bigdig(BclNumber n, BclBigDig* result); +BclError +bcl_bigdig_keep(BclNumber n, BclBigDig* result); + BclNumber bcl_bigdig2num(BclBigDig val); BclNumber bcl_add(BclNumber a, BclNumber b); +BclNumber +bcl_add_keep(BclNumber a, BclNumber b); + BclNumber bcl_sub(BclNumber a, BclNumber b); +BclNumber +bcl_sub_keep(BclNumber a, BclNumber b); + BclNumber bcl_mul(BclNumber a, BclNumber b); +BclNumber +bcl_mul_keep(BclNumber a, BclNumber b); + BclNumber bcl_div(BclNumber a, BclNumber b); +BclNumber +bcl_div_keep(BclNumber a, BclNumber b); + BclNumber bcl_mod(BclNumber a, BclNumber b); +BclNumber +bcl_mod_keep(BclNumber a, BclNumber b); + BclNumber bcl_pow(BclNumber a, BclNumber b); +BclNumber +bcl_pow_keep(BclNumber a, BclNumber b); + BclNumber bcl_lshift(BclNumber a, BclNumber b); +BclNumber +bcl_lshift_keep(BclNumber a, BclNumber b); + BclNumber bcl_rshift(BclNumber a, BclNumber b); +BclNumber +bcl_rshift_keep(BclNumber a, BclNumber b); + BclNumber bcl_sqrt(BclNumber a); +BclNumber +bcl_sqrt_keep(BclNumber a); + BclError bcl_divmod(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d); +BclError +bcl_divmod_keep(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d); + BclNumber bcl_modexp(BclNumber a, BclNumber b, BclNumber c); +BclNumber +bcl_modexp_keep(BclNumber a, BclNumber b, BclNumber c); + ssize_t bcl_cmp(BclNumber a, BclNumber b); @@ -289,18 +328,30 @@ bcl_parse(const char* restrict val); char* bcl_string(BclNumber n); +char* +bcl_string_keep(BclNumber n); + BclNumber bcl_irand(BclNumber a); +BclNumber +bcl_irand_keep(BclNumber a); + BclNumber bcl_frand(size_t places); BclNumber bcl_ifrand(BclNumber a, size_t places); +BclNumber +bcl_ifrand_keep(BclNumber a, size_t places); + BclError bcl_rand_seedWithNum(BclNumber n); +BclError +bcl_rand_seedWithNum_keep(BclNumber n); + BclError bcl_rand_seed(unsigned char seed[BCL_SEED_SIZE]); diff --git a/include/library.h b/include/library.h index 76df91392da..1edd3757444 100644 --- a/include/library.h +++ b/include/library.h @@ -47,6 +47,145 @@ #include #include +#if BC_ENABLE_MEMCHECK + +/** + * A typedef for Valgrind builds. This is to add a generation index for error + * checking. + */ +typedef struct BclNum +{ + /// The number. + BcNum n; + + /// The generation index. + size_t gen_idx; + +} BclNum; + +/** + * Clears the generation byte in a BclNumber and returns the value. + * @param n The BclNumber. + * @return The value of the index. + */ +#define BCL_NO_GEN(n) \ + ((n).i & ~(((size_t) UCHAR_MAX) << ((sizeof(size_t) - 1) * CHAR_BIT))) + +/** + * Gets the generation index in a BclNumber. + * @param n The BclNumber. + * @return The generation index. + */ +#define BCL_GET_GEN(n) ((n).i >> ((sizeof(size_t) - 1) * CHAR_BIT)) + +/** + * Turns a BclNumber into a BcNum. + * @param c The context. + * @param n The BclNumber. + */ +#define BCL_NUM(c, n) ((BclNum*) bc_vec_item(&(c)->nums, BCL_NO_GEN(n))) + +/** + * Clears the generation index top byte in the BclNumber. + * @param n The BclNumber. + */ +#define BCL_CLEAR_GEN(n) \ + do \ + { \ + (n).i &= ~(((size_t) UCHAR_MAX) << ((sizeof(size_t) - 1) * CHAR_BIT)); \ + } \ + while (0) + +#define BCL_CHECK_NUM_GEN(c, bn) \ + do \ + { \ + size_t gen_ = BCL_GET_GEN(bn); \ + BclNum* ptr_ = BCL_NUM(c, bn); \ + if (BCL_NUM_ARRAY(ptr_) == NULL) \ + { \ + bcl_nonexistentNum(); \ + } \ + if (gen_ != ptr_->gen_idx) \ + { \ + bcl_invalidGeneration(); \ + } \ + } \ + while (0) + +#define BCL_CHECK_NUM_VALID(c, bn) \ + do \ + { \ + size_t idx_ = BCL_NO_GEN(bn); \ + if ((c)->nums.len <= idx_) \ + { \ + bcl_numIdxOutOfRange(); \ + } \ + BCL_CHECK_NUM_GEN(c, bn); \ + } \ + while (0) + +/** + * Returns the limb array of the number. + * @param bn The number. + * @return The limb array. + */ +#define BCL_NUM_ARRAY(bn) ((bn)->n.num) + +/** + * Returns the limb array of the number for a non-pointer. + * @param bn The number. + * @return The limb array. + */ +#define BCL_NUM_ARRAY_NP(bn) ((bn).n.num) + +/** + * Returns the BcNum pointer. + * @param bn The number. + * @return The BcNum pointer. + */ +#define BCL_NUM_NUM(bn) (&(bn)->n) + +/** + * Returns the BcNum pointer for a non-pointer. + * @param bn The number. + * @return The BcNum pointer. + */ +#define BCL_NUM_NUM_NP(bn) (&(bn).n) + +// These functions only abort. They exist to give developers some idea of what +// went wrong when bugs are found, if they look at the Valgrind stack trace. + +BC_NORETURN void +bcl_invalidGeneration(void); + +BC_NORETURN void +bcl_nonexistentNum(void); + +BC_NORETURN void +bcl_numIdxOutOfRange(void); + +#else // BC_ENABLE_MEMCHECK + +/** + * A typedef for non-Valgrind builds. + */ +typedef BcNum BclNum; + +#define BCL_NO_GEN(n) ((n).i) +#define BCL_NUM(c, n) ((BclNum*) bc_vec_item(&(c)->nums, (n).i)) +#define BCL_CLEAR_GEN(n) ((void) (n)) + +#define BCL_CHECK_NUM_GEN(c, bn) +#define BCL_CHECK_NUM_VALID(c, n) + +#define BCL_NUM_ARRAY(bn) ((bn)->num) +#define BCL_NUM_ARRAY_NP(bn) ((bn).num) + +#define BCL_NUM_NUM(bn) (bn) +#define BCL_NUM_NUM_NP(bn) (&(bn)) + +#endif // BC_ENABLE_MEMCHECK + /** * A header that sets a jump. * @param vm The thread data. @@ -88,19 +227,19 @@ * idx. * @param c The context. * @param e The error. - * @param n The number. + * @param bn The number. * @param idx The idx to set as the return value. */ -#define BC_MAYBE_SETUP(c, e, n, idx) \ - do \ - { \ - if (BC_ERR((e) != BCL_ERROR_NONE)) \ - { \ - if ((n).num != NULL) bc_num_free(&(n)); \ - idx.i = 0 - (size_t) (e); \ - } \ - else idx = bcl_num_insert(c, &(n)); \ - } \ +#define BC_MAYBE_SETUP(c, e, bn, idx) \ + do \ + { \ + if (BC_ERR((e) != BCL_ERROR_NONE)) \ + { \ + if (BCL_NUM_ARRAY_NP(bn) != NULL) bc_num_free(BCL_NUM_NUM_NP(bn)); \ + idx.i = 0 - (size_t) (e); \ + } \ + else idx = bcl_num_insert(c, &(bn)); \ + } \ while (0) /** @@ -108,17 +247,17 @@ * is bad. * @param c The context. */ -#define BC_CHECK_CTXT(vm, c) \ - do \ - { \ - c = bcl_contextHelper(vm); \ - if (BC_ERR(c == NULL)) \ - { \ - BclNumber n_num; \ - n_num.i = 0 - (size_t) BCL_ERROR_INVALID_CONTEXT; \ - return n_num; \ - } \ - } \ +#define BC_CHECK_CTXT(vm, c) \ + do \ + { \ + c = bcl_contextHelper(vm); \ + if (BC_ERR(c == NULL)) \ + { \ + BclNumber n_num_; \ + n_num_.i = 0 - (size_t) BCL_ERROR_INVALID_CONTEXT; \ + return n_num_; \ + } \ + } \ while (0) /** @@ -157,16 +296,18 @@ #define BC_CHECK_NUM(c, n) \ do \ { \ - if (BC_ERR((n).i >= (c)->nums.len)) \ + size_t no_gen_ = BCL_NO_GEN(n); \ + if (BC_ERR(no_gen_ >= (c)->nums.len)) \ { \ if ((n).i > 0 - (size_t) BCL_ERROR_NELEMS) return (n); \ else \ { \ - BclNumber n_num; \ - n_num.i = 0 - (size_t) BCL_ERROR_INVALID_NUM; \ - return n_num; \ + BclNumber n_num_; \ + n_num_.i = 0 - (size_t) BCL_ERROR_INVALID_NUM; \ + return n_num_; \ } \ } \ + BCL_CHECK_NUM_GEN(c, n); \ } \ while (0) @@ -181,7 +322,8 @@ #define BC_CHECK_NUM_ERR(c, n) \ do \ { \ - if (BC_ERR((n).i >= (c)->nums.len)) \ + size_t no_gen_ = BCL_NO_GEN(n); \ + if (BC_ERR(no_gen_ >= (c)->nums.len)) \ { \ if ((n).i > 0 - (size_t) BCL_ERROR_NELEMS) \ { \ @@ -189,17 +331,25 @@ } \ else return BCL_ERROR_INVALID_NUM; \ } \ + BCL_CHECK_NUM_GEN(c, n); \ } \ while (0) //clang-format on /** - * Turns a BclNumber into a BcNum. + * Grows the context's nums array if necessary. * @param c The context. - * @param n The BclNumber. */ -#define BC_NUM(c, n) ((BcNum*) bc_vec_item(&(c)->nums, (n).i)) +#define BCL_GROW_NUMS(c) \ + do \ + { \ + if ((c)->free_nums.len == 0) \ + { \ + bc_vec_grow(&((c)->nums), 1); \ + } \ + } \ + while (0) /** * Frees a BcNum for bcl. This is a destructor. diff --git a/include/program.h b/include/program.h index ff32d5db776..1df753afad2 100644 --- a/include/program.h +++ b/include/program.h @@ -904,148 +904,82 @@ extern const char bc_program_esc_seqs[]; #if BC_ENABLE_EXTRA_MATH -#define BC_PROG_LBLS \ - static const void* const bc_program_inst_lbls[] = { \ - &&lbl_BC_INST_NEG, \ - &&lbl_BC_INST_BOOL_NOT, \ - &&lbl_BC_INST_TRUNC, \ - &&lbl_BC_INST_POWER, \ - &&lbl_BC_INST_MULTIPLY, \ - &&lbl_BC_INST_DIVIDE, \ - &&lbl_BC_INST_MODULUS, \ - &&lbl_BC_INST_PLUS, \ - &&lbl_BC_INST_MINUS, \ - &&lbl_BC_INST_PLACES, \ - &&lbl_BC_INST_LSHIFT, \ - &&lbl_BC_INST_RSHIFT, \ - &&lbl_BC_INST_REL_EQ, \ - &&lbl_BC_INST_REL_LE, \ - &&lbl_BC_INST_REL_GE, \ - &&lbl_BC_INST_REL_NE, \ - &&lbl_BC_INST_REL_LT, \ - &&lbl_BC_INST_REL_GT, \ - &&lbl_BC_INST_BOOL_OR, \ - &&lbl_BC_INST_BOOL_AND, \ - &&lbl_BC_INST_ASSIGN_NO_VAL, \ - &&lbl_BC_INST_NUM, \ - &&lbl_BC_INST_VAR, \ - &&lbl_BC_INST_ARRAY_ELEM, \ - &&lbl_BC_INST_ARRAY, \ - &&lbl_BC_INST_ZERO, \ - &&lbl_BC_INST_ONE, \ - &&lbl_BC_INST_IBASE, \ - &&lbl_BC_INST_OBASE, \ - &&lbl_BC_INST_SCALE, \ - &&lbl_BC_INST_SEED, \ - &&lbl_BC_INST_LENGTH, \ - &&lbl_BC_INST_SCALE_FUNC, \ - &&lbl_BC_INST_SQRT, \ - &&lbl_BC_INST_ABS, \ - &&lbl_BC_INST_IS_NUMBER, \ - &&lbl_BC_INST_IS_STRING, \ - &&lbl_BC_INST_IRAND, \ - &&lbl_BC_INST_ASCIIFY, \ - &&lbl_BC_INST_READ, \ - &&lbl_BC_INST_RAND, \ - &&lbl_BC_INST_MAXIBASE, \ - &&lbl_BC_INST_MAXOBASE, \ - &&lbl_BC_INST_MAXSCALE, \ - &&lbl_BC_INST_MAXRAND, \ - &&lbl_BC_INST_LINE_LENGTH, \ - &&lbl_BC_INST_LEADING_ZERO, \ - &&lbl_BC_INST_PRINT, \ - &&lbl_BC_INST_PRINT_POP, \ - &&lbl_BC_INST_STR, \ - &&lbl_BC_INST_POP, \ - &&lbl_BC_INST_SWAP, \ - &&lbl_BC_INST_MODEXP, \ - &&lbl_BC_INST_DIVMOD, \ - &&lbl_BC_INST_PRINT_STREAM, \ - &&lbl_BC_INST_EXTENDED_REGISTERS, \ - &&lbl_BC_INST_POP_EXEC, \ - &&lbl_BC_INST_EXECUTE, \ - &&lbl_BC_INST_EXEC_COND, \ - &&lbl_BC_INST_PRINT_STACK, \ - &&lbl_BC_INST_CLEAR_STACK, \ - &&lbl_BC_INST_REG_STACK_LEN, \ - &&lbl_BC_INST_STACK_LEN, \ - &&lbl_BC_INST_DUPLICATE, \ - &&lbl_BC_INST_LOAD, \ - &&lbl_BC_INST_PUSH_VAR, \ - &&lbl_BC_INST_PUSH_TO_VAR, \ - &&lbl_BC_INST_QUIT, \ - &&lbl_BC_INST_NQUIT, \ - &&lbl_BC_INST_EXEC_STACK_LEN, \ - &&lbl_BC_INST_INVALID, \ +#define BC_PROG_LBLS \ + static const void* const bc_program_inst_lbls[] = { \ + &&lbl_BC_INST_NEG, &&lbl_BC_INST_BOOL_NOT, \ + &&lbl_BC_INST_TRUNC, &&lbl_BC_INST_POWER, \ + &&lbl_BC_INST_MULTIPLY, &&lbl_BC_INST_DIVIDE, \ + &&lbl_BC_INST_MODULUS, &&lbl_BC_INST_PLUS, \ + &&lbl_BC_INST_MINUS, &&lbl_BC_INST_PLACES, \ + &&lbl_BC_INST_LSHIFT, &&lbl_BC_INST_RSHIFT, \ + &&lbl_BC_INST_REL_EQ, &&lbl_BC_INST_REL_LE, \ + &&lbl_BC_INST_REL_GE, &&lbl_BC_INST_REL_NE, \ + &&lbl_BC_INST_REL_LT, &&lbl_BC_INST_REL_GT, \ + &&lbl_BC_INST_BOOL_OR, &&lbl_BC_INST_BOOL_AND, \ + &&lbl_BC_INST_ASSIGN_NO_VAL, &&lbl_BC_INST_NUM, \ + &&lbl_BC_INST_VAR, &&lbl_BC_INST_ARRAY_ELEM, \ + &&lbl_BC_INST_ARRAY, &&lbl_BC_INST_ZERO, \ + &&lbl_BC_INST_ONE, &&lbl_BC_INST_IBASE, \ + &&lbl_BC_INST_OBASE, &&lbl_BC_INST_SCALE, \ + &&lbl_BC_INST_SEED, &&lbl_BC_INST_LENGTH, \ + &&lbl_BC_INST_SCALE_FUNC, &&lbl_BC_INST_SQRT, \ + &&lbl_BC_INST_ABS, &&lbl_BC_INST_IS_NUMBER, \ + &&lbl_BC_INST_IS_STRING, &&lbl_BC_INST_IRAND, \ + &&lbl_BC_INST_ASCIIFY, &&lbl_BC_INST_READ, \ + &&lbl_BC_INST_RAND, &&lbl_BC_INST_MAXIBASE, \ + &&lbl_BC_INST_MAXOBASE, &&lbl_BC_INST_MAXSCALE, \ + &&lbl_BC_INST_MAXRAND, &&lbl_BC_INST_LINE_LENGTH, \ + &&lbl_BC_INST_LEADING_ZERO, &&lbl_BC_INST_PRINT, \ + &&lbl_BC_INST_PRINT_POP, &&lbl_BC_INST_STR, \ + &&lbl_BC_INST_POP, &&lbl_BC_INST_SWAP, \ + &&lbl_BC_INST_MODEXP, &&lbl_BC_INST_DIVMOD, \ + &&lbl_BC_INST_PRINT_STREAM, &&lbl_BC_INST_EXTENDED_REGISTERS, \ + &&lbl_BC_INST_POP_EXEC, &&lbl_BC_INST_EXECUTE, \ + &&lbl_BC_INST_EXEC_COND, &&lbl_BC_INST_PRINT_STACK, \ + &&lbl_BC_INST_CLEAR_STACK, &&lbl_BC_INST_REG_STACK_LEN, \ + &&lbl_BC_INST_STACK_LEN, &&lbl_BC_INST_DUPLICATE, \ + &&lbl_BC_INST_LOAD, &&lbl_BC_INST_PUSH_VAR, \ + &&lbl_BC_INST_PUSH_TO_VAR, &&lbl_BC_INST_QUIT, \ + &&lbl_BC_INST_NQUIT, &&lbl_BC_INST_EXEC_STACK_LEN, \ + &&lbl_BC_INST_INVALID, \ } #else // BC_ENABLE_EXTRA_MATH -#define BC_PROG_LBLS \ - static const void* const bc_program_inst_lbls[] = { \ - &&lbl_BC_INST_NEG, \ - &&lbl_BC_INST_BOOL_NOT, \ - &&lbl_BC_INST_POWER, \ - &&lbl_BC_INST_MULTIPLY, \ - &&lbl_BC_INST_DIVIDE, \ - &&lbl_BC_INST_MODULUS, \ - &&lbl_BC_INST_PLUS, \ - &&lbl_BC_INST_MINUS, \ - &&lbl_BC_INST_REL_EQ, \ - &&lbl_BC_INST_REL_LE, \ - &&lbl_BC_INST_REL_GE, \ - &&lbl_BC_INST_REL_NE, \ - &&lbl_BC_INST_REL_LT, \ - &&lbl_BC_INST_REL_GT, \ - &&lbl_BC_INST_BOOL_OR, \ - &&lbl_BC_INST_BOOL_AND, \ - &&lbl_BC_INST_ASSIGN_NO_VAL, \ - &&lbl_BC_INST_NUM, \ - &&lbl_BC_INST_VAR, \ - &&lbl_BC_INST_ARRAY_ELEM, \ - &&lbl_BC_INST_ARRAY, \ - &&lbl_BC_INST_ZERO, \ - &&lbl_BC_INST_ONE, \ - &&lbl_BC_INST_IBASE, \ - &&lbl_BC_INST_OBASE, \ - &&lbl_BC_INST_SCALE, \ - &&lbl_BC_INST_LENGTH, \ - &&lbl_BC_INST_SCALE_FUNC, \ - &&lbl_BC_INST_SQRT, \ - &&lbl_BC_INST_ABS, \ - &&lbl_BC_INST_IS_NUMBER, \ - &&lbl_BC_INST_IS_STRING, \ - &&lbl_BC_INST_ASCIIFY, \ - &&lbl_BC_INST_READ, \ - &&lbl_BC_INST_MAXIBASE, \ - &&lbl_BC_INST_MAXOBASE, \ - &&lbl_BC_INST_MAXSCALE, \ - &&lbl_BC_INST_LINE_LENGTH, \ - &&lbl_BC_INST_LEADING_ZERO, \ - &&lbl_BC_INST_PRINT, \ - &&lbl_BC_INST_PRINT_POP, \ - &&lbl_BC_INST_STR, \ - &&lbl_BC_INST_POP, \ - &&lbl_BC_INST_SWAP, \ - &&lbl_BC_INST_MODEXP, \ - &&lbl_BC_INST_DIVMOD, \ - &&lbl_BC_INST_PRINT_STREAM, \ - &&lbl_BC_INST_EXTENDED_REGISTERS, \ - &&lbl_BC_INST_POP_EXEC, \ - &&lbl_BC_INST_EXECUTE, \ - &&lbl_BC_INST_EXEC_COND, \ - &&lbl_BC_INST_PRINT_STACK, \ - &&lbl_BC_INST_CLEAR_STACK, \ - &&lbl_BC_INST_REG_STACK_LEN, \ - &&lbl_BC_INST_STACK_LEN, \ - &&lbl_BC_INST_DUPLICATE, \ - &&lbl_BC_INST_LOAD, \ - &&lbl_BC_INST_PUSH_VAR, \ - &&lbl_BC_INST_PUSH_TO_VAR, \ - &&lbl_BC_INST_QUIT, \ - &&lbl_BC_INST_NQUIT, \ - &&lbl_BC_INST_EXEC_STACK_LEN, \ - &&lbl_BC_INST_INVALID, \ +#define BC_PROG_LBLS \ + static const void* const bc_program_inst_lbls[] = { \ + &&lbl_BC_INST_NEG, &&lbl_BC_INST_BOOL_NOT, \ + &&lbl_BC_INST_POWER, &&lbl_BC_INST_MULTIPLY, \ + &&lbl_BC_INST_DIVIDE, &&lbl_BC_INST_MODULUS, \ + &&lbl_BC_INST_PLUS, &&lbl_BC_INST_MINUS, \ + &&lbl_BC_INST_REL_EQ, &&lbl_BC_INST_REL_LE, \ + &&lbl_BC_INST_REL_GE, &&lbl_BC_INST_REL_NE, \ + &&lbl_BC_INST_REL_LT, &&lbl_BC_INST_REL_GT, \ + &&lbl_BC_INST_BOOL_OR, &&lbl_BC_INST_BOOL_AND, \ + &&lbl_BC_INST_ASSIGN_NO_VAL, &&lbl_BC_INST_NUM, \ + &&lbl_BC_INST_VAR, &&lbl_BC_INST_ARRAY_ELEM, \ + &&lbl_BC_INST_ARRAY, &&lbl_BC_INST_ZERO, \ + &&lbl_BC_INST_ONE, &&lbl_BC_INST_IBASE, \ + &&lbl_BC_INST_OBASE, &&lbl_BC_INST_SCALE, \ + &&lbl_BC_INST_LENGTH, &&lbl_BC_INST_SCALE_FUNC, \ + &&lbl_BC_INST_SQRT, &&lbl_BC_INST_ABS, \ + &&lbl_BC_INST_IS_NUMBER, &&lbl_BC_INST_IS_STRING, \ + &&lbl_BC_INST_ASCIIFY, &&lbl_BC_INST_READ, \ + &&lbl_BC_INST_MAXIBASE, &&lbl_BC_INST_MAXOBASE, \ + &&lbl_BC_INST_MAXSCALE, &&lbl_BC_INST_LINE_LENGTH, \ + &&lbl_BC_INST_LEADING_ZERO, &&lbl_BC_INST_PRINT, \ + &&lbl_BC_INST_PRINT_POP, &&lbl_BC_INST_STR, \ + &&lbl_BC_INST_POP, &&lbl_BC_INST_SWAP, \ + &&lbl_BC_INST_MODEXP, &&lbl_BC_INST_DIVMOD, \ + &&lbl_BC_INST_PRINT_STREAM, &&lbl_BC_INST_EXTENDED_REGISTERS, \ + &&lbl_BC_INST_POP_EXEC, &&lbl_BC_INST_EXECUTE, \ + &&lbl_BC_INST_EXEC_COND, &&lbl_BC_INST_PRINT_STACK, \ + &&lbl_BC_INST_CLEAR_STACK, &&lbl_BC_INST_REG_STACK_LEN, \ + &&lbl_BC_INST_STACK_LEN, &&lbl_BC_INST_DUPLICATE, \ + &&lbl_BC_INST_LOAD, &&lbl_BC_INST_PUSH_VAR, \ + &&lbl_BC_INST_PUSH_TO_VAR, &&lbl_BC_INST_QUIT, \ + &&lbl_BC_INST_NQUIT, &&lbl_BC_INST_EXEC_STACK_LEN, \ + &&lbl_BC_INST_INVALID, \ } #endif // BC_ENABLE_EXTRA_MATH diff --git a/include/version.h b/include/version.h index f5e345b3b18..3745ed9b5f7 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.3.1 +#define VERSION 6.4.0 #endif // BC_VERSION_H diff --git a/include/vm.h b/include/vm.h index dd21d43f526..c56cc8e7370 100644 --- a/include/vm.h +++ b/include/vm.h @@ -560,9 +560,13 @@ typedef struct BcVm /// The vector for creating strings to pass to the client. BcVec out; +#if BC_ENABLE_EXTRA_MATH + /// The PRNG. BcRNG rng; +#endif // BC_ENABLE_EXTRA_MATH + /// The current error. BclError err; diff --git a/manuals/bcl.3 b/manuals/bcl.3 index 5c3731a141e..cb65a2b8b99 100644 --- a/manuals/bcl.3 +++ b/manuals/bcl.3 @@ -139,9 +139,14 @@ integers. .PP \f[B]char* bcl_string(BclNumber\f[R] \f[I]n\f[R]\f[B]);\f[R] .PP +\f[B]char* bcl_string_keep(BclNumber\f[R] \f[I]n\f[R]\f[B]);\f[R] +.PP \f[B]BclError bcl_bigdig(BclNumber\f[R] \f[I]n\f[R]\f[B], BclBigDig *\f[R]\f[I]result\f[R]\f[B]);\f[R] .PP +\f[B]BclError bcl_bigdig_keep(BclNumber\f[R] \f[I]n\f[R]\f[B], BclBigDig +*\f[R]\f[I]result\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_bigdig2num(BclBigDig\f[R] \f[I]val\f[R]\f[B]);\f[R] .SS Math .PP @@ -150,35 +155,68 @@ These items allow clients to run math on numbers. \f[B]BclNumber bcl_add(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_add_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_sub(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_sub_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_mul(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_mul_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_div(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_div_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_mod(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_mod_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_pow(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_pow_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_lshift(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_lshift_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_rshift(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_rshift_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_sqrt(BclNumber\f[R] \f[I]a\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_sqrt_keep(BclNumber\f[R] \f[I]a\f[R]\f[B]);\f[R] +.PP \f[B]BclError bcl_divmod(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber *\f[R]\f[I]c\f[R]\f[B], BclNumber *\f[R]\f[I]d\f[R]\f[B]);\f[R] .PP +\f[B]BclError bcl_divmod_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber *\f[R]\f[I]c\f[R]\f[B], +BclNumber *\f[R]\f[I]d\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_modexp(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber\f[R] \f[I]c\f[R]\f[B]);\f[R] +.PP +\f[B]BclNumber bcl_modexp_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber\f[R] \f[I]c\f[R]\f[B]);\f[R] .SS Miscellaneous .PP These items are miscellaneous. @@ -209,14 +247,22 @@ generator in bcl(3). .PP \f[B]BclNumber bcl_irand(BclNumber\f[R] \f[I]a\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_irand_keep(BclNumber\f[R] \f[I]a\f[R]\f[B]);\f[R] +.PP \f[B]BclNumber bcl_frand(size_t\f[R] \f[I]places\f[R]\f[B]);\f[R] .PP \f[B]BclNumber bcl_ifrand(BclNumber\f[R] \f[I]a\f[R]\f[B], size_t\f[R] \f[I]places\f[R]\f[B]);\f[R] .PP +\f[B]BclNumber bcl_ifrand_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], +size_t\f[R] \f[I]places\f[R]\f[B]);\f[R] +.PP \f[B]BclError bcl_rand_seedWithNum(BclNumber\f[R] \f[I]n\f[R]\f[B]);\f[R] .PP +\f[B]BclError bcl_rand_seedWithNum_keep(BclNumber\f[R] +\f[I]n\f[R]\f[B]);\f[R] +.PP \f[B]BclError bcl_rand_seed(unsigned char\f[R] \f[I]seed\f[R]\f[B][\f[R]\f[I]BCL_SEED_SIZE\f[R]\f[B]]);\f[R] .PP @@ -608,8 +654,9 @@ Returns the number of \f[I]significant decimal digits\f[R] in .PP All procedures in this section require a valid current context. .PP -All procedures in this section consume the given \f[B]BclNumber\f[R] -arguments that are not given to pointer arguments. +All procedures in this section without the \f[B]_keep\f[R] suffix in +their name consume the given \f[B]BclNumber\f[R] arguments that are not +given to pointer arguments. See the \f[B]Consumption and Propagation\f[R] subsection below. .TP \f[B]BclNumber bcl_parse(const char *restrict\f[R] \f[I]val\f[R]\f[B])\f[R] @@ -644,6 +691,11 @@ The string is dynamically allocated and must be freed by the caller. See the \f[B]Consumption and Propagation\f[R] subsection below. .RE .TP +\f[B]char* bcl_string_keep(BclNumber\f[R] \f[I]n\f[R]\f[B])\f[R] +Returns a string representation of \f[I]n\f[R] according the the current +context\[cq]s \f[B]ibase\f[R]. +The string is dynamically allocated and must be freed by the caller. +.TP \f[B]BclError bcl_bigdig(BclNumber\f[R] \f[I]n\f[R]\f[B], BclBigDig *\f[R]\f[I]result\f[R]\f[B])\f[R] Converts \f[I]n\f[R] into a \f[B]BclBigDig\f[R] and returns the result in the space pointed to by \f[I]result\f[R]. @@ -665,6 +717,24 @@ Otherwise, this function can return: See the \f[B]Consumption and Propagation\f[R] subsection below. .RE .TP +\f[B]BclError bcl_bigdig_keep(BclNumber\f[R] \f[I]n\f[R]\f[B], BclBigDig *\f[R]\f[I]result\f[R]\f[B])\f[R] +Converts \f[I]n\f[R] into a \f[B]BclBigDig\f[R] and returns the result +in the space pointed to by \f[I]result\f[R]. +.RS +.PP +\f[I]a\f[R] must be smaller than \f[B]BC_OVERFLOW_MAX\f[R]. +See the \f[B]LIMITS\f[R] section. +.PP +If there was no error, \f[B]BCL_ERROR_NONE\f[R] is returned. +Otherwise, this function can return: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_OVERFLOW\f[R] +.RE +.TP \f[B]BclNumber bcl_bigdig2num(BclBigDig\f[R] \f[I]val\f[R]\f[B])\f[R] Creates a \f[B]BclNumber\f[R] from \f[I]val\f[R]. .RS @@ -681,6 +751,11 @@ Possible errors include: .PP All procedures in this section require a valid current context. .PP +All procedures in this section without the \f[B]_keep\f[R] suffix in +their name consume the given \f[B]BclNumber\f[R] arguments that are not +given to pointer arguments. +See the \f[B]Consumption and Propagation\f[R] subsection below. +.PP All procedures in this section can return the following errors: .IP \[bu] 2 \f[B]BCL_ERROR_INVALID_NUM\f[R] @@ -712,6 +787,25 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_add_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Adds \f[I]a\f[R] and \f[I]b\f[R] and returns the result. +The \f[I]scale\f[R] of the result is the max of the \f[I]scale\f[R]s of +\f[I]a\f[R] and \f[I]b\f[R]. +.RS +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_sub(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Subtracts \f[I]b\f[R] from \f[I]a\f[R] and returns the result. The \f[I]scale\f[R] of the result is the max of the \f[I]scale\f[R]s of @@ -735,6 +829,25 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_sub_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Subtracts \f[I]b\f[R] from \f[I]a\f[R] and returns the result. +The \f[I]scale\f[R] of the result is the max of the \f[I]scale\f[R]s of +\f[I]a\f[R] and \f[I]b\f[R]. +.RS +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_mul(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Multiplies \f[I]a\f[R] and \f[I]b\f[R] and returns the result. If \f[I]ascale\f[R] is the \f[I]scale\f[R] of \f[I]a\f[R] and @@ -761,6 +874,28 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_mul_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Multiplies \f[I]a\f[R] and \f[I]b\f[R] and returns the result. +If \f[I]ascale\f[R] is the \f[I]scale\f[R] of \f[I]a\f[R] and +\f[I]bscale\f[R] is the \f[I]scale\f[R] of \f[I]b\f[R], the +\f[I]scale\f[R] of the result is equal to +\f[B]min(ascale+bscale,max(scale,ascale,bscale))\f[R], where +\f[B]min()\f[R] and \f[B]max()\f[R] return the obvious values. +.RS +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_div(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Divides \f[I]a\f[R] by \f[I]b\f[R] and returns the result. The \f[I]scale\f[R] of the result is the \f[I]scale\f[R] of the current @@ -788,6 +923,29 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_div_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Divides \f[I]a\f[R] by \f[I]b\f[R] and returns the result. +The \f[I]scale\f[R] of the result is the \f[I]scale\f[R] of the current +context. +.RS +.PP +\f[I]b\f[R] cannot be \f[B]0\f[R]. +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_DIVIDE_BY_ZERO\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_mod(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Divides \f[I]a\f[R] by \f[I]b\f[R] to the \f[I]scale\f[R] of the current context, computes the modulus \f[B]a-(a/b)*b\f[R], and returns the @@ -815,6 +973,29 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_mod_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Divides \f[I]a\f[R] by \f[I]b\f[R] to the \f[I]scale\f[R] of the current +context, computes the modulus \f[B]a-(a/b)*b\f[R], and returns the +modulus. +.RS +.PP +\f[I]b\f[R] cannot be \f[B]0\f[R]. +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_DIVIDE_BY_ZERO\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_pow(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Calculates \f[I]a\f[R] to the power of \f[I]b\f[R] to the \f[I]scale\f[R] of the current context. @@ -851,6 +1032,38 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_pow_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Calculates \f[I]a\f[R] to the power of \f[I]b\f[R] to the +\f[I]scale\f[R] of the current context. +\f[I]b\f[R] must be an integer, but can be negative. +If it is negative, \f[I]a\f[R] must be non-zero. +.RS +.PP +\f[I]b\f[R] must be an integer. +If \f[I]b\f[R] is negative, \f[I]a\f[R] must not be \f[B]0\f[R]. +.PP +\f[I]a\f[R] must be smaller than \f[B]BC_OVERFLOW_MAX\f[R]. +See the \f[B]LIMITS\f[R] section. +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NON_INTEGER\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_OVERFLOW\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_DIVIDE_BY_ZERO\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_lshift(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Shifts \f[I]a\f[R] left (moves the radix right) by \f[I]b\f[R] places and returns the result. @@ -879,6 +1092,30 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_lshift_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Shifts \f[I]a\f[R] left (moves the radix right) by \f[I]b\f[R] places +and returns the result. +This is done in decimal. +\f[I]b\f[R] must be an integer. +.RS +.PP +\f[I]b\f[R] must be an integer. +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NON_INTEGER\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_rshift(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Shifts \f[I]a\f[R] right (moves the radix left) by \f[I]b\f[R] places and returns the result. @@ -907,6 +1144,30 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_rshift_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] +Shifts \f[I]a\f[R] right (moves the radix left) by \f[I]b\f[R] places +and returns the result. +This is done in decimal. +\f[I]b\f[R] must be an integer. +.RS +.PP +\f[I]b\f[R] must be an integer. +.PP +\f[I]a\f[R] and \f[I]b\f[R] can be the same number. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NON_INTEGER\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_sqrt(BclNumber\f[R] \f[I]a\f[R]\f[B])\f[R] Calculates the square root of \f[I]a\f[R] and returns the result. The \f[I]scale\f[R] of the result is equal to the \f[B]scale\f[R] of the @@ -931,6 +1192,27 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_sqrt_keep(BclNumber\f[R] \f[I]a\f[R]\f[B])\f[R] +Calculates the square root of \f[I]a\f[R] and returns the result. +The \f[I]scale\f[R] of the result is equal to the \f[B]scale\f[R] of the +current context. +.RS +.PP +\f[I]a\f[R] cannot be negative. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NEGATIVE\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclError bcl_divmod(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber *\f[R]\f[I]c\f[R]\f[B], BclNumber *\f[R]\f[I]d\f[R]\f[B])\f[R] Divides \f[I]a\f[R] by \f[I]b\f[R] and returns the quotient in a new number which is put into the space pointed to by \f[I]c\f[R], and puts @@ -959,6 +1241,30 @@ Otherwise, this function can return: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclError bcl_divmod_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber *\f[R]\f[I]c\f[R]\f[B], BclNumber *\f[R]\f[I]d\f[R]\f[B])\f[R] +Divides \f[I]a\f[R] by \f[I]b\f[R] and returns the quotient in a new +number which is put into the space pointed to by \f[I]c\f[R], and puts +the modulus in a new number which is put into the space pointed to by +\f[I]d\f[R]. +.RS +.PP +\f[I]b\f[R] cannot be \f[B]0\f[R]. +.PP +\f[I]c\f[R] and \f[I]d\f[R] cannot point to the same place, nor can they +point to the space occupied by \f[I]a\f[R] or \f[I]b\f[R]. +.PP +If there was no error, \f[B]BCL_ERROR_NONE\f[R] is returned. +Otherwise, this function can return: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_DIVIDE_BY_ZERO\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_modexp(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber\f[R] \f[I]c\f[R]\f[B])\f[R] Computes a modular exponentiation where \f[I]a\f[R] is the base, \f[I]b\f[R] is the exponent, and \f[I]c\f[R] is the modulus, and returns @@ -991,6 +1297,35 @@ Possible errors include: .IP \[bu] 2 \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE +.TP +\f[B]BclNumber bcl_modexp_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber\f[R] \f[I]c\f[R]\f[B])\f[R] +Computes a modular exponentiation where \f[I]a\f[R] is the base, +\f[I]b\f[R] is the exponent, and \f[I]c\f[R] is the modulus, and returns +the result. +The \f[I]scale\f[R] of the result is equal to the \f[B]scale\f[R] of the +current context. +.RS +.PP +\f[I]a\f[R], \f[I]b\f[R], and \f[I]c\f[R] must be integers. +\f[I]c\f[R] must not be \f[B]0\f[R]. +\f[I]b\f[R] must not be negative. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NEGATIVE\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NON_INTEGER\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_DIVIDE_BY_ZERO\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE .SS Miscellaneous .TP \f[B]void bcl_zero(BclNumber\f[R] \f[I]n\f[R]\f[B])\f[R] @@ -1060,6 +1395,11 @@ char[\f[R]\f[I]BCL_SEED_SIZE\f[R]\f[B]])\f[R] .IP \[bu] 2 \f[B]bcl_rand_reseed(\f[R]\f[I]void\f[R]\f[B])\f[R] .PP +All procedures in this section without the \f[B]_keep\f[R] suffix in +their name consume the given \f[B]BclNumber\f[R] arguments that are not +given to pointer arguments. +See the \f[B]Consumption and Propagation\f[R] subsection below. +.PP The following items allow clients to use the pseudo-random number generator. All procedures require a valid current context. @@ -1112,6 +1452,36 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_irand_keep(BclNumber\f[R] \f[I]a\f[R]\f[B])\f[R] +Returns a random number that is not larger than \f[I]a\f[R] in a new +number. +If \f[I]a\f[R] is \f[B]0\f[R] or \f[B]1\f[R], the new number is equal to +\f[B]0\f[R]. +The bound is unlimited, so it is not bound to the size of +\f[B]BclRandInt\f[R]. +This is done by generating as many random numbers as necessary, +multiplying them by certain exponents, and adding them all together. +.RS +.PP +\f[I]a\f[R] must be an integer and non-negative. +.PP +This procedure requires a valid current context. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NEGATIVE\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NON_INTEGER\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclNumber bcl_frand(size_t\f[R] \f[I]places\f[R]\f[B])\f[R] Returns a random number between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) that has \f[I]places\f[R] decimal digits after the radix @@ -1158,11 +1528,55 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .TP +\f[B]BclNumber bcl_ifrand_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], size_t\f[R] \f[I]places\f[R]\f[B])\f[R] +Returns a random number less than \f[I]a\f[R] with \f[I]places\f[R] +decimal digits after the radix (decimal point). +There are no limits on \f[I]a\f[R] or \f[I]places\f[R]. +.RS +.PP +\f[I]a\f[R] must be an integer and non-negative. +.PP +This procedure requires a valid current context. +.PP +bcl(3) will encode an error in the return value, if there was one. +The error can be queried with \f[B]bcl_err(BclNumber)\f[R]. +Possible errors include: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NEGATIVE\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_MATH_NON_INTEGER\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] +.RE +.TP \f[B]BclError bcl_rand_seedWithNum(BclNumber\f[R] \f[I]n\f[R]\f[B])\f[R] Seeds the PRNG with \f[I]n\f[R]. .RS .PP -\f[I]n\f[R] is \f[I]not\f[R] consumed. +\f[I]n\f[R] is consumed. +.PP +This procedure requires a valid current context. +.PP +If there was no error, \f[B]BCL_ERROR_NONE\f[R] is returned. +Otherwise, this function can return: +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_NUM\f[R] +.IP \[bu] 2 +\f[B]BCL_ERROR_INVALID_CONTEXT\f[R] +.PP +Note that if \f[B]bcl_rand_seed2num(\f[R]\f[I]void\f[R]\f[B])\f[R] or +\f[B]bcl_rand_seed2num_err(BclNumber)\f[R] are called right after this +function, they are not guaranteed to return a number equal to +\f[I]n\f[R]. +.RE +.TP +\f[B]BclError bcl_rand_seedWithNum_keep(BclNumber\f[R] \f[I]n\f[R]\f[B])\f[R] +Seeds the PRNG with \f[I]n\f[R]. +.RS .PP This procedure requires a valid current context. .PP @@ -1253,7 +1667,7 @@ so the example above should properly be: .nf \f[C] BclNumber n = bcl_num_add(bcl_num_mul(a, b), bcl_num_div(c, d)); -if (bc_num_err(n) != BCL_ERROR_NONE) { +if (bcl_err(n) != BCL_ERROR_NONE) { // Handle the error. } \f[R] diff --git a/manuals/bcl.3.md b/manuals/bcl.3.md index 6c6967b4477..fa566d161c4 100644 --- a/manuals/bcl.3.md +++ b/manuals/bcl.3.md @@ -136,8 +136,12 @@ These items allow clients to convert numbers into and from strings and integers. **char\* bcl_string(BclNumber** _n_**);** +**char\* bcl_string_keep(BclNumber** _n_**);** + **BclError bcl_bigdig(BclNumber** _n_**, BclBigDig \***_result_**);** +**BclError bcl_bigdig_keep(BclNumber** _n_**, BclBigDig \***_result_**);** + **BclNumber bcl_bigdig2num(BclBigDig** _val_**);** ## Math @@ -146,26 +150,48 @@ These items allow clients to run math on numbers. **BclNumber bcl_add(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_add_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_sub(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_sub_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_mul(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_mul_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_div(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_div_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_mod(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_mod_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_pow(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_pow_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_lshift(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_lshift_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_rshift(BclNumber** _a_**, BclNumber** _b_**);** +**BclNumber bcl_rshift_keep(BclNumber** _a_**, BclNumber** _b_**);** + **BclNumber bcl_sqrt(BclNumber** _a_**);** +**BclNumber bcl_sqrt_keep(BclNumber** _a_**);** + **BclError bcl_divmod(BclNumber** _a_**, BclNumber** _b_**, BclNumber \***_c_**, BclNumber \***_d_**);** +**BclError bcl_divmod_keep(BclNumber** _a_**, BclNumber** _b_**, BclNumber \***_c_**, BclNumber \***_d_**);** + **BclNumber bcl_modexp(BclNumber** _a_**, BclNumber** _b_**, BclNumber** _c_**);** +**BclNumber bcl_modexp_keep(BclNumber** _a_**, BclNumber** _b_**, BclNumber** _c_**);** + ## Miscellaneous These items are miscellaneous. @@ -195,12 +221,18 @@ generator in bcl(3). **BclNumber bcl_irand(BclNumber** _a_**);** +**BclNumber bcl_irand_keep(BclNumber** _a_**);** + **BclNumber bcl_frand(size_t** _places_**);** **BclNumber bcl_ifrand(BclNumber** _a_**, size_t** _places_**);** +**BclNumber bcl_ifrand_keep(BclNumber** _a_**, size_t** _places_**);** + **BclError bcl_rand_seedWithNum(BclNumber** _n_**);** +**BclError bcl_rand_seedWithNum_keep(BclNumber** _n_**);** + **BclError bcl_rand_seed(unsigned char** _seed_**[**_BCL_SEED_SIZE_**]);** **void bcl_rand_reseed(**_void_**);** @@ -548,9 +580,9 @@ All procedures in this section require a valid current context. All procedures in this section require a valid current context. -All procedures in this section consume the given **BclNumber** arguments that -are not given to pointer arguments. See the **Consumption and Propagation** -subsection below. +All procedures in this section without the **_keep** suffix in their name +consume the given **BclNumber** arguments that are not given to pointer +arguments. See the **Consumption and Propagation** subsection below. **BclNumber bcl_parse(const char \*restrict** _val_**)** @@ -578,6 +610,12 @@ subsection below. *n* is consumed; it cannot be used after the call. See the **Consumption and Propagation** subsection below. +**char\* bcl_string_keep(BclNumber** _n_**)** + +: Returns a string representation of *n* according the the current context's + **ibase**. The string is dynamically allocated and must be freed by the + caller. + **BclError bcl_bigdig(BclNumber** _n_**, BclBigDig \***_result_**)** : Converts *n* into a **BclBigDig** and returns the result in the space @@ -595,6 +633,20 @@ subsection below. *n* is consumed; it cannot be used after the call. See the **Consumption and Propagation** subsection below. +**BclError bcl_bigdig_keep(BclNumber** _n_**, BclBigDig \***_result_**)** + +: Converts *n* into a **BclBigDig** and returns the result in the space + pointed to by *result*. + + *a* must be smaller than **BC_OVERFLOW_MAX**. See the **LIMITS** section. + + If there was no error, **BCL_ERROR_NONE** is returned. Otherwise, this + function can return: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_OVERFLOW** + **BclNumber bcl_bigdig2num(BclBigDig** _val_**)** : Creates a **BclNumber** from *val*. @@ -609,6 +661,10 @@ subsection below. All procedures in this section require a valid current context. +All procedures in this section without the **_keep** suffix in their name +consume the given **BclNumber** arguments that are not given to pointer +arguments. See the **Consumption and Propagation** subsection below. + All procedures in this section can return the following errors: * **BCL_ERROR_INVALID_NUM** @@ -632,6 +688,20 @@ All procedures in this section can return the following errors: * **BCL_ERROR_INVALID_CONTEXT** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_add_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Adds *a* and *b* and returns the result. The *scale* of the result is the + max of the *scale*s of *a* and *b*. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_sub(BclNumber** _a_**, BclNumber** _b_**)** : Subtracts *b* from *a* and returns the result. The *scale* of the result is @@ -649,6 +719,20 @@ All procedures in this section can return the following errors: * **BCL_ERROR_INVALID_CONTEXT** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_sub_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Subtracts *b* from *a* and returns the result. The *scale* of the result is + the max of the *scale*s of *a* and *b*. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_mul(BclNumber** _a_**, BclNumber** _b_**)** : Multiplies *a* and *b* and returns the result. If *ascale* is the *scale* of @@ -668,6 +752,22 @@ All procedures in this section can return the following errors: * **BCL_ERROR_INVALID_CONTEXT** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_mul_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Multiplies *a* and *b* and returns the result. If *ascale* is the *scale* of + *a* and *bscale* is the *scale* of *b*, the *scale* of the result is equal + to **min(ascale+bscale,max(scale,ascale,bscale))**, where **min()** and + **max()** return the obvious values. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_div(BclNumber** _a_**, BclNumber** _b_**)** : Divides *a* by *b* and returns the result. The *scale* of the result is the @@ -688,6 +788,23 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_div_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Divides *a* by *b* and returns the result. The *scale* of the result is the + *scale* of the current context. + + *b* cannot be **0**. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_mod(BclNumber** _a_**, BclNumber** _b_**)** : Divides *a* by *b* to the *scale* of the current context, computes the @@ -708,6 +825,23 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_mod_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Divides *a* by *b* to the *scale* of the current context, computes the + modulus **a-(a/b)\*b**, and returns the modulus. + + *b* cannot be **0**. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_pow(BclNumber** _a_**, BclNumber** _b_**)** : Calculates *a* to the power of *b* to the *scale* of the current context. @@ -733,6 +867,28 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_pow_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Calculates *a* to the power of *b* to the *scale* of the current context. + *b* must be an integer, but can be negative. If it is negative, *a* must + be non-zero. + + *b* must be an integer. If *b* is negative, *a* must not be **0**. + + *a* must be smaller than **BC_OVERFLOW_MAX**. See the **LIMITS** section. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_NON_INTEGER** + * **BCL_ERROR_MATH_OVERFLOW** + * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_lshift(BclNumber** _a_**, BclNumber** _b_**)** : Shifts *a* left (moves the radix right) by *b* places and returns the @@ -753,6 +909,23 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_NON_INTEGER** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_lshift_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Shifts *a* left (moves the radix right) by *b* places and returns the + result. This is done in decimal. *b* must be an integer. + + *b* must be an integer. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_NON_INTEGER** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_rshift(BclNumber** _a_**, BclNumber** _b_**)** : Shifts *a* right (moves the radix left) by *b* places and returns the @@ -773,6 +946,23 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_NON_INTEGER** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_rshift_keep(BclNumber** _a_**, BclNumber** _b_**)** + +: Shifts *a* right (moves the radix left) by *b* places and returns the + result. This is done in decimal. *b* must be an integer. + + *b* must be an integer. + + *a* and *b* can be the same number. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_NON_INTEGER** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_sqrt(BclNumber** _a_**)** : Calculates the square root of *a* and returns the result. The *scale* of the @@ -791,6 +981,21 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_NEGATIVE** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_sqrt_keep(BclNumber** _a_**)** + +: Calculates the square root of *a* and returns the result. The *scale* of the + result is equal to the **scale** of the current context. + + *a* cannot be negative. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_NEGATIVE** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclError bcl_divmod(BclNumber** _a_**, BclNumber** _b_**, BclNumber \***_c_**, BclNumber \***_d_**)** : Divides *a* by *b* and returns the quotient in a new number which is put @@ -813,6 +1018,25 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclError bcl_divmod_keep(BclNumber** _a_**, BclNumber** _b_**, BclNumber \***_c_**, BclNumber \***_d_**)** + +: Divides *a* by *b* and returns the quotient in a new number which is put + into the space pointed to by *c*, and puts the modulus in a new number which + is put into the space pointed to by *d*. + + *b* cannot be **0**. + + *c* and *d* cannot point to the same place, nor can they point to the space + occupied by *a* or *b*. + + If there was no error, **BCL_ERROR_NONE** is returned. Otherwise, this + function can return: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** + * **BCL_ERROR_FATAL_ALLOC_ERR** + **BclNumber bcl_modexp(BclNumber** _a_**, BclNumber** _b_**, BclNumber** _c_**)** : Computes a modular exponentiation where *a* is the base, *b* is the @@ -835,6 +1059,25 @@ All procedures in this section can return the following errors: * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** * **BCL_ERROR_FATAL_ALLOC_ERR** +**BclNumber bcl_modexp_keep(BclNumber** _a_**, BclNumber** _b_**, BclNumber** _c_**)** + +: Computes a modular exponentiation where *a* is the base, *b* is the + exponent, and *c* is the modulus, and returns the result. The *scale* of the + result is equal to the **scale** of the current context. + + *a*, *b*, and *c* must be integers. *c* must not be **0**. *b* must not be + negative. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_NEGATIVE** + * **BCL_ERROR_MATH_NON_INTEGER** + * **BCL_ERROR_MATH_DIVIDE_BY_ZERO** + * **BCL_ERROR_FATAL_ALLOC_ERR** + ## Miscellaneous **void bcl_zero(BclNumber** _n_**)** @@ -891,6 +1134,10 @@ If necessary, the PRNG can be reseeded with one of the following functions: * **bcl_rand_seed(unsigned char[**_BCL_SEED_SIZE_**])** * **bcl_rand_reseed(**_void_**)** +All procedures in this section without the **_keep** suffix in their name +consume the given **BclNumber** arguments that are not given to pointer +arguments. See the **Consumption and Propagation** subsection below. + The following items allow clients to use the pseudo-random number generator. All procedures require a valid current context. @@ -921,8 +1168,29 @@ procedures require a valid current context. *a* must be an integer and non-negative. - *a* is consumed; it cannot be used after the call. See the - **Consumption and Propagation** subsection below. + *a* is consumed; it cannot be used after the call. See the **Consumption and + Propagation** subsection below. + + This procedure requires a valid current context. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_NEGATIVE** + * **BCL_ERROR_MATH_NON_INTEGER** + * **BCL_ERROR_FATAL_ALLOC_ERR** + +**BclNumber bcl_irand_keep(BclNumber** _a_**)** + +: Returns a random number that is not larger than *a* in a new number. If *a* + is **0** or **1**, the new number is equal to **0**. The bound is unlimited, + so it is not bound to the size of **BclRandInt**. This is done by generating + as many random numbers as necessary, multiplying them by certain exponents, + and adding them all together. + + *a* must be an integer and non-negative. This procedure requires a valid current context. @@ -956,8 +1224,26 @@ procedures require a valid current context. *a* must be an integer and non-negative. - *a* is consumed; it cannot be used after the call. See the - **Consumption and Propagation** subsection below. + *a* is consumed; it cannot be used after the call. See the **Consumption and + Propagation** subsection below. + + This procedure requires a valid current context. + + bcl(3) will encode an error in the return value, if there was one. The error + can be queried with **bcl_err(BclNumber)**. Possible errors include: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + * **BCL_ERROR_MATH_NEGATIVE** + * **BCL_ERROR_MATH_NON_INTEGER** + * **BCL_ERROR_FATAL_ALLOC_ERR** + +**BclNumber bcl_ifrand_keep(BclNumber** _a_**, size_t** _places_**)** + +: Returns a random number less than *a* with *places* decimal digits after the + radix (decimal point). There are no limits on *a* or *places*. + + *a* must be an integer and non-negative. This procedure requires a valid current context. @@ -974,7 +1260,23 @@ procedures require a valid current context. : Seeds the PRNG with *n*. - *n* is *not* consumed. + *n* is consumed. + + This procedure requires a valid current context. + + If there was no error, **BCL_ERROR_NONE** is returned. Otherwise, this + function can return: + + * **BCL_ERROR_INVALID_NUM** + * **BCL_ERROR_INVALID_CONTEXT** + + Note that if **bcl_rand_seed2num(**_void_**)** or + **bcl_rand_seed2num_err(BclNumber)** are called right after this function, + they are not guaranteed to return a number equal to *n*. + +**BclError bcl_rand_seedWithNum_keep(BclNumber** _n_**)** + +: Seeds the PRNG with *n*. This procedure requires a valid current context. @@ -1046,7 +1348,7 @@ checked with **bcl_err(BclNumber)**, so the example above should properly be: BclNumber n = bcl_num_add(bcl_num_mul(a, b), bcl_num_div(c, d)); - if (bc_num_err(n) != BCL_ERROR_NONE) { + if (bcl_err(n) != BCL_ERROR_NONE) { // Handle the error. } diff --git a/src/data.c b/src/data.c index abaf3b8e39a..b57e1fc4c02 100644 --- a/src/data.c +++ b/src/data.c @@ -1151,47 +1151,60 @@ const uchar dc_parse_insts[] = { #if BC_ENABLE_EXTRA_MATH BC_INST_TRUNC, #endif // BC_ENABLE_EXTRA_MATH - BC_INST_POWER, BC_INST_MULTIPLY, BC_INST_DIVIDE, - BC_INST_MODULUS, BC_INST_PLUS, BC_INST_MINUS, + BC_INST_POWER, BC_INST_MULTIPLY, + BC_INST_DIVIDE, BC_INST_MODULUS, + BC_INST_PLUS, BC_INST_MINUS, #if BC_ENABLE_EXTRA_MATH - BC_INST_PLACES, BC_INST_LSHIFT, BC_INST_RSHIFT, + BC_INST_PLACES, BC_INST_LSHIFT, + BC_INST_RSHIFT, #endif // BC_ENABLE_EXTRA_MATH - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, BC_INST_BOOL_OR, BC_INST_BOOL_AND, #if BC_ENABLED - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, #if BC_ENABLE_EXTRA_MATH - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, #endif // BC_ENABLE_EXTRA_MATH #endif // BC_ENABLED - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, - BC_INST_REL_GT, BC_INST_REL_LT, BC_INST_INVALID, - BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GE, - BC_INST_INVALID, BC_INST_REL_LE, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_REL_GT, + BC_INST_REL_LT, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_REL_GE, BC_INST_INVALID, + BC_INST_REL_LE, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, #if BC_ENABLED - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, #endif // BC_ENABLED - BC_INST_IBASE, BC_INST_OBASE, BC_INST_SCALE, + BC_INST_IBASE, BC_INST_OBASE, + BC_INST_SCALE, #if BC_ENABLE_EXTRA_MATH BC_INST_SEED, #endif // BC_ENABLE_EXTRA_MATH - BC_INST_LENGTH, BC_INST_PRINT, BC_INST_SQRT, - BC_INST_ABS, BC_INST_IS_NUMBER, BC_INST_IS_STRING, + BC_INST_LENGTH, BC_INST_PRINT, + BC_INST_SQRT, BC_INST_ABS, + BC_INST_IS_NUMBER, BC_INST_IS_STRING, #if BC_ENABLE_EXTRA_MATH BC_INST_IRAND, #endif // BC_ENABLE_EXTRA_MATH - BC_INST_ASCIIFY, BC_INST_MODEXP, BC_INST_DIVMOD, - BC_INST_QUIT, BC_INST_INVALID, + BC_INST_ASCIIFY, BC_INST_MODEXP, + BC_INST_DIVMOD, BC_INST_QUIT, + BC_INST_INVALID, #if BC_ENABLE_EXTRA_MATH BC_INST_RAND, #endif // BC_ENABLE_EXTRA_MATH - BC_INST_MAXIBASE, BC_INST_MAXOBASE, BC_INST_MAXSCALE, + BC_INST_MAXIBASE, BC_INST_MAXOBASE, + BC_INST_MAXSCALE, #if BC_ENABLE_EXTRA_MATH BC_INST_MAXRAND, #endif // BC_ENABLE_EXTRA_MATH @@ -1199,17 +1212,21 @@ const uchar dc_parse_insts[] = { #if BC_ENABLED BC_INST_INVALID, #endif // BC_ENABLED - BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM, BC_INST_INVALID, - BC_INST_EXTENDED_REGISTERS, BC_INST_REL_EQ, BC_INST_INVALID, - BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK, - BC_INST_INVALID, BC_INST_STACK_LEN, BC_INST_DUPLICATE, - BC_INST_SWAP, BC_INST_POP, BC_INST_INVALID, - BC_INST_INVALID, BC_INST_INVALID, + BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM, + BC_INST_INVALID, BC_INST_EXTENDED_REGISTERS, + BC_INST_REL_EQ, BC_INST_INVALID, + BC_INST_EXECUTE, BC_INST_PRINT_STACK, + BC_INST_CLEAR_STACK, BC_INST_INVALID, + BC_INST_STACK_LEN, BC_INST_DUPLICATE, + BC_INST_SWAP, BC_INST_POP, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, #if BC_ENABLE_EXTRA_MATH BC_INST_INVALID, #endif // BC_ENABLE_EXTRA_MATH - BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, - BC_INST_PRINT_POP, BC_INST_NQUIT, BC_INST_EXEC_STACK_LEN, + BC_INST_INVALID, BC_INST_INVALID, + BC_INST_INVALID, BC_INST_PRINT_POP, + BC_INST_NQUIT, BC_INST_EXEC_STACK_LEN, BC_INST_SCALE_FUNC, BC_INST_INVALID, }; #endif // DC_ENABLED diff --git a/src/library.c b/src/library.c index 6283d198139..cc32a3a3a98 100644 --- a/src/library.c +++ b/src/library.c @@ -60,6 +60,28 @@ // cannot assume that allocation failures are fatal. So we have to reset the // jumps every time to ensure that the locals will be correct after jumping. +#if BC_ENABLE_MEMCHECK + +BC_NORETURN void +bcl_invalidGeneration(void) +{ + abort(); +} + +BC_NORETURN void +bcl_nonexistentNum(void) +{ + abort(); +} + +BC_NORETURN void +bcl_numIdxOutOfRange(void) +{ + abort(); +} + +#endif // BC_ENABLE_MEMCHECK + static BclTls* tls = NULL; static BclTls tls_real; @@ -195,10 +217,14 @@ bcl_init(void) bc_vec_init(&vm->ctxts, sizeof(BclContext), BC_DTOR_NONE); bc_vec_init(&vm->out, sizeof(uchar), BC_DTOR_NONE); - // We need to seed this in case /dev/random and /dev/urandm don't work. +#if BC_ENABLE_EXTRA_MATH + + // We need to seed this in case /dev/random and /dev/urandom don't work. srand((unsigned int) time(NULL)); bc_rand_init(&vm->rng); +#endif // BC_ENABLE_EXTRA_MATH + err: BC_FUNC_FOOTER(vm, e); @@ -227,6 +253,7 @@ bcl_pushContext(BclContext ctxt) bc_vec_push(&vm->ctxts, &ctxt); err: + BC_FUNC_FOOTER(vm, e); return e; } @@ -262,7 +289,9 @@ bcl_free(void) vm->refs -= 1; if (vm->refs) return; +#if BC_ENABLE_EXTRA_MATH bc_rand_free(&vm->rng); +#endif // BC_ENABLE_EXTRA_MATH bc_vec_free(&vm->out); for (i = 0; i < vm->ctxts.len; ++i) @@ -363,7 +392,7 @@ bcl_ctxt_create(void) // malloc() is appropriate here. ctxt = bc_vm_malloc(sizeof(BclCtxt)); - bc_vec_init(&ctxt->nums, sizeof(BcNum), BC_DTOR_BCL_NUM); + bc_vec_init(&ctxt->nums, sizeof(BclNum), BC_DTOR_BCL_NUM); bc_vec_init(&ctxt->free_nums, sizeof(BclNumber), BC_DTOR_NONE); ctxt->scale = 0; @@ -445,6 +474,10 @@ bcl_err(BclNumber n) BC_CHECK_CTXT_ERR(vm, ctxt); + // We need to clear the top byte in memcheck mode. We can do this because + // the parameter is a copy. + BCL_CLEAR_GEN(n); + // Errors are encoded as (0 - error_code). If the index is in that range, it // is an encoded error. if (n.i >= ctxt->nums.len) @@ -462,14 +495,14 @@ bcl_err(BclNumber n) * @return The resulting BclNumber from the insert. */ static BclNumber -bcl_num_insert(BclContext ctxt, BcNum* restrict n) +bcl_num_insert(BclContext ctxt, BclNum* restrict n) { BclNumber idx; // If there is a free spot... if (ctxt->free_nums.len) { - BcNum* ptr; + BclNum* ptr; // Get the index of the free spot and remove it. idx = *((BclNumber*) bc_vec_top(&ctxt->free_nums)); @@ -477,11 +510,30 @@ bcl_num_insert(BclContext ctxt, BcNum* restrict n) // Copy the number into the spot. ptr = bc_vec_item(&ctxt->nums, idx.i); - memcpy(ptr, n, sizeof(BcNum)); + + memcpy(BCL_NUM_NUM(ptr), n, sizeof(BcNum)); + +#if BC_ENABLE_MEMCHECK + + ptr->gen_idx += 1; + + if (ptr->gen_idx == UCHAR_MAX) + { + ptr->gen_idx = 0; + } + + idx.i |= (ptr->gen_idx << ((sizeof(size_t) - 1) * CHAR_BIT)); + +#endif // BC_ENABLE_MEMCHECK } else { - // Just push the number onto the vector. +#if BC_ENABLE_MEMCHECK + n->gen_idx = 0; +#endif // BC_ENABLE_MEMCHECK + + // Just push the number onto the vector because the generation index is + // 0. idx.i = ctxt->nums.len; bc_vec_push(&ctxt->nums, n); } @@ -493,7 +545,7 @@ BclNumber bcl_num_create(void) { BclError e = BCL_ERROR_NONE; - BcNum n; + BclNum n; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -502,11 +554,12 @@ bcl_num_create(void) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - bc_num_init(&n, BC_NUM_DEF_SIZE); + bc_num_init(BCL_NUM_NUM_NP(n), BC_NUM_DEF_SIZE); err: + BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, n, idx); @@ -520,26 +573,34 @@ bcl_num_create(void) * @param num The number to destroy. */ static void -bcl_num_dtor(BclContext ctxt, BclNumber n, BcNum* restrict num) +bcl_num_dtor(BclContext ctxt, BclNumber n, BclNum* restrict num) { - assert(num != NULL && num->num != NULL); + assert(num != NULL && BCL_NUM_ARRAY(num) != NULL); + + BCL_CLEAR_GEN(n); bcl_num_destruct(num); bc_vec_push(&ctxt->free_nums, &n); + +#if BC_ENABLE_MEMCHECK + num->n.num = NULL; +#endif // BC_ENABLE_MEMCHECK } void bcl_num_free(BclNumber n) { - BcNum* num; + BclNum* num; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(n.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, n); - num = BC_NUM(ctxt, n); + assert(BCL_NO_GEN(n) < ctxt->nums.len); + + num = BCL_NUM(ctxt, n); bcl_num_dtor(ctxt, n, num); } @@ -548,26 +609,31 @@ BclError bcl_copy(BclNumber d, BclNumber s) { BclError e = BCL_ERROR_NONE; - BcNum* dest; - BcNum* src; + BclNum* dest; + BclNum* src; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ERR(vm, ctxt); + BCL_CHECK_NUM_VALID(ctxt, d); + BCL_CHECK_NUM_VALID(ctxt, s); + BC_FUNC_HEADER(vm, err); - assert(d.i < ctxt->nums.len && s.i < ctxt->nums.len); + assert(BCL_NO_GEN(d) < ctxt->nums.len); + assert(BCL_NO_GEN(s) < ctxt->nums.len); - dest = BC_NUM(ctxt, d); - src = BC_NUM(ctxt, s); + dest = BCL_NUM(ctxt, d); + src = BCL_NUM(ctxt, s); assert(dest != NULL && src != NULL); - assert(dest->num != NULL && src->num != NULL); + assert(BCL_NUM_ARRAY(dest) != NULL && BCL_NUM_ARRAY(src) != NULL); - bc_num_copy(dest, src); + bc_num_copy(BCL_NUM_NUM(dest), BCL_NUM_NUM(src)); err: + BC_FUNC_FOOTER(vm, e); return e; @@ -577,28 +643,31 @@ BclNumber bcl_dup(BclNumber s) { BclError e = BCL_ERROR_NONE; - BcNum *src, dest; + BclNum *src, dest; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT(vm, ctxt); + BCL_CHECK_NUM_VALID(ctxt, s); + BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - assert(s.i < ctxt->nums.len); + assert(BCL_NO_GEN(s) < ctxt->nums.len); - src = BC_NUM(ctxt, s); + src = BCL_NUM(ctxt, s); - assert(src != NULL && src->num != NULL); + assert(src != NULL && BCL_NUM_NUM(src) != NULL); // Copy the number. - bc_num_clear(&dest); - bc_num_createCopy(&dest, src); + bc_num_clear(BCL_NUM_NUM(&dest)); + bc_num_createCopy(BCL_NUM_NUM(&dest), BCL_NUM_NUM(src)); err: + BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, dest, idx); @@ -608,75 +677,81 @@ bcl_dup(BclNumber s) void bcl_num_destruct(void* num) { - BcNum* n = (BcNum*) num; + BclNum* n = (BclNum*) num; assert(n != NULL); - if (n->num == NULL) return; + if (BCL_NUM_ARRAY(n) == NULL) return; - bc_num_free(num); - bc_num_clear(num); + bc_num_free(BCL_NUM_NUM(n)); + bc_num_clear(BCL_NUM_NUM(n)); } bool bcl_num_neg(BclNumber n) { - BcNum* num; + BclNum* num; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(n.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, n); - num = BC_NUM(ctxt, n); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - assert(num != NULL && num->num != NULL); + num = BCL_NUM(ctxt, n); - return BC_NUM_NEG(num) != 0; + assert(num != NULL && BCL_NUM_ARRAY(num) != NULL); + + return BC_NUM_NEG(BCL_NUM_NUM(num)) != 0; } void bcl_num_setNeg(BclNumber n, bool neg) { - BcNum* num; + BclNum* num; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(n.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, n); - num = BC_NUM(ctxt, n); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - assert(num != NULL && num->num != NULL); + num = BCL_NUM(ctxt, n); - num->rdx = BC_NUM_NEG_VAL(num, neg); + assert(num != NULL && BCL_NUM_ARRAY(num) != NULL); + + BCL_NUM_NUM(num)->rdx = BC_NUM_NEG_VAL(BCL_NUM_NUM(num), neg); } size_t bcl_num_scale(BclNumber n) { - BcNum* num; + BclNum* num; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(n.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, n); - num = BC_NUM(ctxt, n); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - assert(num != NULL && num->num != NULL); + num = BCL_NUM(ctxt, n); - return bc_num_scale(num); + assert(num != NULL && BCL_NUM_ARRAY(num) != NULL); + + return bc_num_scale(BCL_NUM_NUM(num)); } BclError bcl_num_setScale(BclNumber n, size_t scale) { BclError e = BCL_ERROR_NONE; - BcNum* nptr; + BclNum* nptr; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -684,18 +759,27 @@ bcl_num_setScale(BclNumber n, size_t scale) BC_CHECK_NUM_ERR(ctxt, n); + BCL_CHECK_NUM_VALID(ctxt, n); + BC_FUNC_HEADER(vm, err); - assert(n.i < ctxt->nums.len); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - nptr = BC_NUM(ctxt, n); + nptr = BCL_NUM(ctxt, n); - assert(nptr != NULL && nptr->num != NULL); + assert(nptr != NULL && BCL_NUM_ARRAY(nptr) != NULL); - if (scale > nptr->scale) bc_num_extend(nptr, scale - nptr->scale); - else if (scale < nptr->scale) bc_num_truncate(nptr, nptr->scale - scale); + if (scale > BCL_NUM_NUM(nptr)->scale) + { + bc_num_extend(BCL_NUM_NUM(nptr), scale - BCL_NUM_NUM(nptr)->scale); + } + else if (scale < BCL_NUM_NUM(nptr)->scale) + { + bc_num_truncate(BCL_NUM_NUM(nptr), BCL_NUM_NUM(nptr)->scale - scale); + } err: + BC_FUNC_FOOTER(vm, e); return e; @@ -704,54 +788,75 @@ bcl_num_setScale(BclNumber n, size_t scale) size_t bcl_num_len(BclNumber n) { - BcNum* num; + BclNum* num; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(n.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, n); - num = BC_NUM(ctxt, n); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - assert(num != NULL && num->num != NULL); + num = BCL_NUM(ctxt, n); - return bc_num_len(num); + assert(num != NULL && BCL_NUM_ARRAY(num) != NULL); + + return bc_num_len(BCL_NUM_NUM(num)); } -BclError -bcl_bigdig(BclNumber n, BclBigDig* result) +static BclError +bcl_bigdig_helper(BclNumber n, BclBigDig* result, bool destruct) { BclError e = BCL_ERROR_NONE; - BcNum* num; + BclNum* num; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ERR(vm, ctxt); + BCL_CHECK_NUM_VALID(ctxt, n); + BC_FUNC_HEADER(vm, err); - assert(n.i < ctxt->nums.len); + assert(BCL_NO_GEN(n) < ctxt->nums.len); assert(result != NULL); - num = BC_NUM(ctxt, n); + num = BCL_NUM(ctxt, n); - assert(num != NULL && num->num != NULL); + assert(num != NULL && BCL_NUM_ARRAY(num) != NULL); - *result = bc_num_bigdig(num); + *result = bc_num_bigdig(BCL_NUM_NUM(num)); err: - bcl_num_dtor(ctxt, n, num); + + if (destruct) + { + bcl_num_dtor(ctxt, n, num); + } + BC_FUNC_FOOTER(vm, e); return e; } +BclError +bcl_bigdig(BclNumber n, BclBigDig* result) +{ + return bcl_bigdig_helper(n, result, true); +} + +BclError +bcl_bigdig_keep(BclNumber n, BclBigDig* result) +{ + return bcl_bigdig_helper(n, result, false); +} + BclNumber bcl_bigdig2num(BclBigDig val) { BclError e = BCL_ERROR_NONE; - BcNum n; + BclNum n; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -760,11 +865,12 @@ bcl_bigdig2num(BclBigDig val) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - bc_num_createFromBigdig(&n, val); + bc_num_createFromBigdig(BCL_NUM_NUM_NP(n), val); err: + BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, n, idx); @@ -773,20 +879,22 @@ bcl_bigdig2num(BclBigDig val) /** * Sets up and executes a binary operator operation. - * @param a The first operand. - * @param b The second operand. - * @param op The operation. - * @param req The function to get the size of the result for preallocation. - * @return The result of the operation. + * @param a The first operand. + * @param b The second operand. + * @param op The operation. + * @param req The function to get the size of the result for + * preallocation. + * @param destruct True if the parameters should be consumed, false otherwise. + * @return The result of the operation. */ static BclNumber bcl_binary(BclNumber a, BclNumber b, const BcNumBinaryOp op, - const BcNumBinaryOpReq req) + const BcNumBinaryOpReq req, bool destruct) { BclError e = BCL_ERROR_NONE; - BcNum* aptr; - BcNum* bptr; - BcNum c; + BclNum* aptr; + BclNum* bptr; + BclNum c; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -798,27 +906,31 @@ bcl_binary(BclNumber a, BclNumber b, const BcNumBinaryOp op, BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len); + assert(BCL_NO_GEN(a) < ctxt->nums.len && BCL_NO_GEN(b) < ctxt->nums.len); - aptr = BC_NUM(ctxt, a); - bptr = BC_NUM(ctxt, b); + aptr = BCL_NUM(ctxt, a); + bptr = BCL_NUM(ctxt, b); assert(aptr != NULL && bptr != NULL); - assert(aptr->num != NULL && bptr->num != NULL); + assert(BCL_NUM_ARRAY(aptr) != NULL && BCL_NUM_ARRAY(bptr) != NULL); // Clear and initialize the result. - bc_num_clear(&c); - bc_num_init(&c, req(aptr, bptr, ctxt->scale)); + bc_num_clear(BCL_NUM_NUM_NP(c)); + bc_num_init(BCL_NUM_NUM_NP(c), + req(BCL_NUM_NUM(aptr), BCL_NUM_NUM(bptr), ctxt->scale)); - op(aptr, bptr, &c, ctxt->scale); + op(BCL_NUM_NUM(aptr), BCL_NUM_NUM(bptr), BCL_NUM_NUM_NP(c), ctxt->scale); err: - // Eat the operands. - bcl_num_dtor(ctxt, a, aptr); - if (b.i != a.i) bcl_num_dtor(ctxt, b, bptr); + if (destruct) + { + // Eat the operands. + bcl_num_dtor(ctxt, a, aptr); + if (b.i != a.i) bcl_num_dtor(ctxt, b, bptr); + } BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, c, idx); @@ -829,57 +941,105 @@ bcl_binary(BclNumber a, BclNumber b, const BcNumBinaryOp op, BclNumber bcl_add(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_add, bc_num_addReq); + return bcl_binary(a, b, bc_num_add, bc_num_addReq, true); +} + +BclNumber +bcl_add_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_add, bc_num_addReq, false); } BclNumber bcl_sub(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_sub, bc_num_addReq); + return bcl_binary(a, b, bc_num_sub, bc_num_addReq, true); +} + +BclNumber +bcl_sub_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_sub, bc_num_addReq, false); } BclNumber bcl_mul(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_mul, bc_num_mulReq); + return bcl_binary(a, b, bc_num_mul, bc_num_mulReq, true); +} + +BclNumber +bcl_mul_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_mul, bc_num_mulReq, false); } BclNumber bcl_div(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_div, bc_num_divReq); + return bcl_binary(a, b, bc_num_div, bc_num_divReq, true); +} + +BclNumber +bcl_div_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_div, bc_num_divReq, false); } BclNumber bcl_mod(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_mod, bc_num_divReq); + return bcl_binary(a, b, bc_num_mod, bc_num_divReq, true); +} + +BclNumber +bcl_mod_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_mod, bc_num_divReq, false); } BclNumber bcl_pow(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_pow, bc_num_powReq); + return bcl_binary(a, b, bc_num_pow, bc_num_powReq, true); +} + +BclNumber +bcl_pow_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_pow, bc_num_powReq, false); } BclNumber bcl_lshift(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_lshift, bc_num_placesReq); + return bcl_binary(a, b, bc_num_lshift, bc_num_placesReq, true); +} + +BclNumber +bcl_lshift_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_lshift, bc_num_placesReq, false); } BclNumber bcl_rshift(BclNumber a, BclNumber b) { - return bcl_binary(a, b, bc_num_rshift, bc_num_placesReq); + return bcl_binary(a, b, bc_num_rshift, bc_num_placesReq, true); } BclNumber -bcl_sqrt(BclNumber a) +bcl_rshift_keep(BclNumber a, BclNumber b) +{ + return bcl_binary(a, b, bc_num_rshift, bc_num_placesReq, false); +} + +static BclNumber +bcl_sqrt_helper(BclNumber a, bool destruct) { BclError e = BCL_ERROR_NONE; - BcNum* aptr; - BcNum b; + BclNum* aptr; + BclNum b; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -890,30 +1050,48 @@ bcl_sqrt(BclNumber a) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - assert(a.i < ctxt->nums.len); + assert(BCL_NO_GEN(a) < ctxt->nums.len); - aptr = BC_NUM(ctxt, a); + aptr = BCL_NUM(ctxt, a); - bc_num_sqrt(aptr, &b, ctxt->scale); + bc_num_sqrt(BCL_NUM_NUM(aptr), BCL_NUM_NUM_NP(b), ctxt->scale); err: - bcl_num_dtor(ctxt, a, aptr); + + if (destruct) + { + bcl_num_dtor(ctxt, a, aptr); + } + BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, b, idx); return idx; } -BclError -bcl_divmod(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d) +BclNumber +bcl_sqrt(BclNumber a) +{ + return bcl_sqrt_helper(a, true); +} + +BclNumber +bcl_sqrt_keep(BclNumber a) +{ + return bcl_sqrt_helper(a, false); +} + +static BclError +bcl_divmod_helper(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d, + bool destruct) { BclError e = BCL_ERROR_NONE; size_t req; - BcNum* aptr; - BcNum* bptr; - BcNum cnum, dnum; + BclNum* aptr; + BclNum* bptr; + BclNum cnum, dnum; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -924,41 +1102,45 @@ bcl_divmod(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 2); + BCL_GROW_NUMS(ctxt); assert(c != NULL && d != NULL); - aptr = BC_NUM(ctxt, a); - bptr = BC_NUM(ctxt, b); + aptr = BCL_NUM(ctxt, a); + bptr = BCL_NUM(ctxt, b); assert(aptr != NULL && bptr != NULL); - assert(aptr->num != NULL && bptr->num != NULL); + assert(BCL_NUM_ARRAY(aptr) != NULL && BCL_NUM_ARRAY(bptr) != NULL); - bc_num_clear(&cnum); - bc_num_clear(&dnum); + bc_num_clear(BCL_NUM_NUM_NP(cnum)); + bc_num_clear(BCL_NUM_NUM_NP(dnum)); - req = bc_num_divReq(aptr, bptr, ctxt->scale); + req = bc_num_divReq(BCL_NUM_NUM(aptr), BCL_NUM_NUM(bptr), ctxt->scale); // Initialize the numbers. - bc_num_init(&cnum, req); + bc_num_init(BCL_NUM_NUM_NP(cnum), req); BC_UNSETJMP(vm); BC_SETJMP(vm, err); - bc_num_init(&dnum, req); + bc_num_init(BCL_NUM_NUM_NP(dnum), req); - bc_num_divmod(aptr, bptr, &cnum, &dnum, ctxt->scale); + bc_num_divmod(BCL_NUM_NUM(aptr), BCL_NUM_NUM(bptr), BCL_NUM_NUM_NP(cnum), + BCL_NUM_NUM_NP(dnum), ctxt->scale); err: - // Eat the operands. - bcl_num_dtor(ctxt, a, aptr); - if (b.i != a.i) bcl_num_dtor(ctxt, b, bptr); + if (destruct) + { + // Eat the operands. + bcl_num_dtor(ctxt, a, aptr); + if (b.i != a.i) bcl_num_dtor(ctxt, b, bptr); + } // If there was an error... if (BC_ERR(vm->err)) { // Free the results. - if (cnum.num != NULL) bc_num_free(&cnum); - if (dnum.num != NULL) bc_num_free(&dnum); + if (BCL_NUM_ARRAY_NP(cnum) != NULL) bc_num_free(&cnum); + if (BCL_NUM_ARRAY_NP(cnum) != NULL) bc_num_free(&dnum); // Make sure the return values are invalid. c->i = 0 - (size_t) BCL_ERROR_INVALID_NUM; @@ -978,15 +1160,27 @@ bcl_divmod(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d) return e; } -BclNumber -bcl_modexp(BclNumber a, BclNumber b, BclNumber c) +BclError +bcl_divmod(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d) +{ + return bcl_divmod_helper(a, b, c, d, true); +} + +BclError +bcl_divmod_keep(BclNumber a, BclNumber b, BclNumber* c, BclNumber* d) +{ + return bcl_divmod_helper(a, b, c, d, false); +} + +static BclNumber +bcl_modexp_helper(BclNumber a, BclNumber b, BclNumber c, bool destruct) { BclError e = BCL_ERROR_NONE; size_t req; - BcNum* aptr; - BcNum* bptr; - BcNum* cptr; - BcNum d; + BclNum* aptr; + BclNum* bptr; + BclNum* cptr; + BclNum d; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -999,34 +1193,39 @@ bcl_modexp(BclNumber a, BclNumber b, BclNumber c) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len); - assert(c.i < ctxt->nums.len); + assert(BCL_NO_GEN(a) < ctxt->nums.len && BCL_NO_GEN(b) < ctxt->nums.len); + assert(BCL_NO_GEN(c) < ctxt->nums.len); - aptr = BC_NUM(ctxt, a); - bptr = BC_NUM(ctxt, b); - cptr = BC_NUM(ctxt, c); + aptr = BCL_NUM(ctxt, a); + bptr = BCL_NUM(ctxt, b); + cptr = BCL_NUM(ctxt, c); assert(aptr != NULL && bptr != NULL && cptr != NULL); - assert(aptr->num != NULL && bptr->num != NULL && cptr->num != NULL); + assert(BCL_NUM_NUM(aptr) != NULL && BCL_NUM_NUM(bptr) != NULL && + BCL_NUM_NUM(cptr) != NULL); // Prepare the result. - bc_num_clear(&d); + bc_num_clear(BCL_NUM_NUM_NP(d)); - req = bc_num_divReq(aptr, cptr, 0); + req = bc_num_divReq(BCL_NUM_NUM(aptr), BCL_NUM_NUM(cptr), 0); // Initialize the result. - bc_num_init(&d, req); + bc_num_init(BCL_NUM_NUM_NP(d), req); - bc_num_modexp(aptr, bptr, cptr, &d); + bc_num_modexp(BCL_NUM_NUM(aptr), BCL_NUM_NUM(bptr), BCL_NUM_NUM(cptr), + BCL_NUM_NUM_NP(d)); err: - // Eat the operands. - bcl_num_dtor(ctxt, a, aptr); - if (b.i != a.i) bcl_num_dtor(ctxt, b, bptr); - if (c.i != a.i && c.i != b.i) bcl_num_dtor(ctxt, c, cptr); + if (destruct) + { + // Eat the operands. + bcl_num_dtor(ctxt, a, aptr); + if (b.i != a.i) bcl_num_dtor(ctxt, b, bptr); + if (c.i != a.i && c.i != b.i) bcl_num_dtor(ctxt, c, cptr); + } BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, d, idx); @@ -1034,68 +1233,87 @@ bcl_modexp(BclNumber a, BclNumber b, BclNumber c) return idx; } +BclNumber +bcl_modexp(BclNumber a, BclNumber b, BclNumber c) +{ + return bcl_modexp_helper(a, b, c, true); +} + +BclNumber +bcl_modexp_keep(BclNumber a, BclNumber b, BclNumber c) +{ + return bcl_modexp_helper(a, b, c, false); +} + ssize_t bcl_cmp(BclNumber a, BclNumber b) { - BcNum* aptr; - BcNum* bptr; + BclNum* aptr; + BclNum* bptr; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(a.i < ctxt->nums.len && b.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, a); + BCL_CHECK_NUM_VALID(ctxt, b); - aptr = BC_NUM(ctxt, a); - bptr = BC_NUM(ctxt, b); + assert(BCL_NO_GEN(a) < ctxt->nums.len && BCL_NO_GEN(b) < ctxt->nums.len); + + aptr = BCL_NUM(ctxt, a); + bptr = BCL_NUM(ctxt, b); assert(aptr != NULL && bptr != NULL); - assert(aptr->num != NULL && bptr->num != NULL); + assert(BCL_NUM_NUM(aptr) != NULL && BCL_NUM_NUM(bptr)); - return bc_num_cmp(aptr, bptr); + return bc_num_cmp(BCL_NUM_NUM(aptr), BCL_NUM_NUM(bptr)); } void bcl_zero(BclNumber n) { - BcNum* nptr; + BclNum* nptr; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(n.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, n); - nptr = BC_NUM(ctxt, n); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - assert(nptr != NULL && nptr->num != NULL); + nptr = BCL_NUM(ctxt, n); - bc_num_zero(nptr); + assert(nptr != NULL && BCL_NUM_NUM(nptr) != NULL); + + bc_num_zero(BCL_NUM_NUM(nptr)); } void bcl_one(BclNumber n) { - BcNum* nptr; + BclNum* nptr; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - assert(n.i < ctxt->nums.len); + BCL_CHECK_NUM_VALID(ctxt, n); - nptr = BC_NUM(ctxt, n); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - assert(nptr != NULL && nptr->num != NULL); + nptr = BCL_NUM(ctxt, n); - bc_num_one(nptr); + assert(nptr != NULL && BCL_NUM_NUM(nptr) != NULL); + + bc_num_one(BCL_NUM_NUM(nptr)); } BclNumber bcl_parse(const char* restrict val) { BclError e = BCL_ERROR_NONE; - BcNum n; + BclNum n; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -1105,7 +1323,7 @@ bcl_parse(const char* restrict val) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); assert(val != NULL); @@ -1122,46 +1340,53 @@ bcl_parse(const char* restrict val) } // Clear and initialize the number. - bc_num_clear(&n); - bc_num_init(&n, BC_NUM_DEF_SIZE); + bc_num_clear(BCL_NUM_NUM_NP(n)); + bc_num_init(BCL_NUM_NUM_NP(n), BC_NUM_DEF_SIZE); - bc_num_parse(&n, val, (BcBigDig) ctxt->ibase); + bc_num_parse(BCL_NUM_NUM_NP(n), val, (BcBigDig) ctxt->ibase); // Set the negative. +#if BC_ENABLE_MEMCHECK + n.n.rdx = BC_NUM_NEG_VAL(BCL_NUM_NUM_NP(n), neg); +#else // BC_ENABLE_MEMCHECK n.rdx = BC_NUM_NEG_VAL_NP(n, neg); +#endif // BC_ENABLE_MEMCHECK err: + BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, n, idx); return idx; } -char* -bcl_string(BclNumber n) +static char* +bcl_string_helper(BclNumber n, bool destruct) { - BcNum* nptr; + BclNum* nptr; char* str = NULL; BclContext ctxt; BcVm* vm = bcl_getspecific(); BC_CHECK_CTXT_ASSERT(vm, ctxt); - if (BC_ERR(n.i >= ctxt->nums.len)) return str; + BCL_CHECK_NUM_VALID(ctxt, n); + + if (BC_ERR(BCL_NO_GEN(n) >= ctxt->nums.len)) return str; BC_FUNC_HEADER(vm, err); - assert(n.i < ctxt->nums.len); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - nptr = BC_NUM(ctxt, n); + nptr = BCL_NUM(ctxt, n); - assert(nptr != NULL && nptr->num != NULL); + assert(nptr != NULL && BCL_NUM_NUM(nptr) != NULL); // Clear the buffer. bc_vec_popAll(&vm->out); // Print to the buffer. - bc_num_print(nptr, (BcBigDig) ctxt->obase, false); + bc_num_print(BCL_NUM_NUM(nptr), (BcBigDig) ctxt->obase, false); bc_vec_pushByte(&vm->out, '\0'); // Just dup the string; the caller is responsible for it. @@ -1169,20 +1394,37 @@ bcl_string(BclNumber n) err: - // Eat the operand. - bcl_num_dtor(ctxt, n, nptr); + if (destruct) + { + // Eat the operand. + bcl_num_dtor(ctxt, n, nptr); + } BC_FUNC_FOOTER_NO_ERR(vm); return str; } -BclNumber -bcl_irand(BclNumber a) +char* +bcl_string(BclNumber n) +{ + return bcl_string_helper(n, true); +} + +char* +bcl_string_keep(BclNumber n) +{ + return bcl_string_helper(n, false); +} + +#if BC_ENABLE_EXTRA_MATH + +static BclNumber +bcl_irand_helper(BclNumber a, bool destruct) { BclError e = BCL_ERROR_NONE; - BcNum* aptr; - BcNum b; + BclNum* aptr; + BclNum b; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -1193,24 +1435,27 @@ bcl_irand(BclNumber a) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - assert(a.i < ctxt->nums.len); + assert(BCL_NO_GEN(a) < ctxt->nums.len); - aptr = BC_NUM(ctxt, a); + aptr = BCL_NUM(ctxt, a); - assert(aptr != NULL && aptr->num != NULL); + assert(aptr != NULL && BCL_NUM_NUM(aptr) != NULL); // Clear and initialize the result. - bc_num_clear(&b); - bc_num_init(&b, BC_NUM_DEF_SIZE); + bc_num_clear(BCL_NUM_NUM_NP(b)); + bc_num_init(BCL_NUM_NUM_NP(b), BC_NUM_DEF_SIZE); - bc_num_irand(aptr, &b, &vm->rng); + bc_num_irand(BCL_NUM_NUM(aptr), BCL_NUM_NUM_NP(b), &vm->rng); err: - // Eat the operand. - bcl_num_dtor(ctxt, a, aptr); + if (destruct) + { + // Eat the operand. + bcl_num_dtor(ctxt, a, aptr); + } BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, b, idx); @@ -1218,6 +1463,18 @@ bcl_irand(BclNumber a) return idx; } +BclNumber +bcl_irand(BclNumber a) +{ + return bcl_irand_helper(a, true); +} + +BclNumber +bcl_irand_keep(BclNumber a) +{ + return bcl_irand_helper(a, false); +} + /** * Helps bcl_frand(). This is separate because the error handling is easier that * way. It is also easier to do ifrand that way. @@ -1257,6 +1514,7 @@ bcl_frandHelper(BcNum* restrict b, size_t places) bc_num_shiftRight(b, places); err: + bc_num_free(&pow); BC_LONGJMP_CONT(vm); } @@ -1265,7 +1523,7 @@ BclNumber bcl_frand(size_t places) { BclError e = BCL_ERROR_NONE; - BcNum n; + BclNum n; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -1274,13 +1532,13 @@ bcl_frand(size_t places) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); // Clear and initialize the number. - bc_num_clear(&n); - bc_num_init(&n, BC_NUM_DEF_SIZE); + bc_num_clear(BCL_NUM_NUM_NP(n)); + bc_num_init(BCL_NUM_NUM_NP(n), BC_NUM_DEF_SIZE); - bcl_frandHelper(&n, places); + bcl_frandHelper(BCL_NUM_NUM_NP(n), places); err: @@ -1319,17 +1577,18 @@ bcl_ifrandHelper(BcNum* restrict a, BcNum* restrict b, size_t places) bc_num_add(&ir, &fr, b, 0); err: + bc_num_free(&fr); bc_num_free(&ir); BC_LONGJMP_CONT(vm); } -BclNumber -bcl_ifrand(BclNumber a, size_t places) +static BclNumber +bcl_ifrand_helper(BclNumber a, size_t places, bool destruct) { BclError e = BCL_ERROR_NONE; - BcNum* aptr; - BcNum b; + BclNum* aptr; + BclNum b; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -1339,24 +1598,27 @@ bcl_ifrand(BclNumber a, size_t places) BC_FUNC_HEADER(vm, err); - bc_vec_grow(&ctxt->nums, 1); + BCL_GROW_NUMS(ctxt); - assert(a.i < ctxt->nums.len); + assert(BCL_NO_GEN(a) < ctxt->nums.len); - aptr = BC_NUM(ctxt, a); + aptr = BCL_NUM(ctxt, a); - assert(aptr != NULL && aptr->num != NULL); + assert(aptr != NULL && BCL_NUM_NUM(aptr) != NULL); // Clear and initialize the number. - bc_num_clear(&b); - bc_num_init(&b, BC_NUM_DEF_SIZE); + bc_num_clear(BCL_NUM_NUM_NP(b)); + bc_num_init(BCL_NUM_NUM_NP(b), BC_NUM_DEF_SIZE); - bcl_ifrandHelper(aptr, &b, places); + bcl_ifrandHelper(BCL_NUM_NUM(aptr), BCL_NUM_NUM_NP(b), places); err: - // Eat the oprand. - bcl_num_dtor(ctxt, a, aptr); + if (destruct) + { + // Eat the oprand. + bcl_num_dtor(ctxt, a, aptr); + } BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, b, idx); @@ -1364,11 +1626,23 @@ bcl_ifrand(BclNumber a, size_t places) return idx; } -BclError -bcl_rand_seedWithNum(BclNumber n) +BclNumber +bcl_ifrand(BclNumber a, size_t places) +{ + return bcl_ifrand_helper(a, places, true); +} + +BclNumber +bcl_ifrand_keep(BclNumber a, size_t places) +{ + return bcl_ifrand_helper(a, places, false); +} + +static BclError +bcl_rand_seedWithNum_helper(BclNumber n, bool destruct) { BclError e = BCL_ERROR_NONE; - BcNum* nptr; + BclNum* nptr; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -1377,19 +1651,39 @@ bcl_rand_seedWithNum(BclNumber n) BC_FUNC_HEADER(vm, err); - assert(n.i < ctxt->nums.len); + assert(BCL_NO_GEN(n) < ctxt->nums.len); - nptr = BC_NUM(ctxt, n); + nptr = BCL_NUM(ctxt, n); - assert(nptr != NULL && nptr->num != NULL); + assert(nptr != NULL && BCL_NUM_NUM(nptr) != NULL); - bc_num_rng(nptr, &vm->rng); + bc_num_rng(BCL_NUM_NUM(nptr), &vm->rng); err: + + if (destruct) + { + // Eat the oprand. + bcl_num_dtor(ctxt, n, nptr); + } + BC_FUNC_FOOTER(vm, e); + return e; } +BclError +bcl_rand_seedWithNum(BclNumber n) +{ + return bcl_rand_seedWithNum_helper(n, true); +} + +BclError +bcl_rand_seedWithNum_keep(BclNumber n) +{ + return bcl_rand_seedWithNum_helper(n, false); +} + BclError bcl_rand_seed(unsigned char seed[BCL_SEED_SIZE]) { @@ -1411,7 +1705,9 @@ bcl_rand_seed(unsigned char seed[BCL_SEED_SIZE]) bc_rand_seed(&vm->rng, vals[0], vals[1], vals[2], vals[3]); err: + BC_FUNC_FOOTER(vm, e); + return e; } @@ -1427,7 +1723,7 @@ BclNumber bcl_rand_seed2num(void) { BclError e = BCL_ERROR_NONE; - BcNum n; + BclNum n; BclNumber idx; BclContext ctxt; BcVm* vm = bcl_getspecific(); @@ -1437,12 +1733,13 @@ bcl_rand_seed2num(void) BC_FUNC_HEADER(vm, err); // Clear and initialize the number. - bc_num_clear(&n); - bc_num_init(&n, BC_NUM_DEF_SIZE); + bc_num_clear(BCL_NUM_NUM_NP(n)); + bc_num_init(BCL_NUM_NUM_NP(n), BC_NUM_DEF_SIZE); - bc_num_createFromRNG(&n, &vm->rng); + bc_num_createFromRNG(BCL_NUM_NUM_NP(n), &vm->rng); err: + BC_FUNC_FOOTER(vm, e); BC_MAYBE_SETUP(ctxt, e, n, idx); @@ -1466,4 +1763,6 @@ bcl_rand_bounded(BclRandInt bound) return (BclRandInt) bc_rand_bounded(&vm->rng, (BcRand) bound); } +#endif // BC_ENABLE_EXTRA_MATH + #endif // BC_ENABLE_LIBRARY diff --git a/src/program.c b/src/program.c index b6fac12c7d6..243f827fe98 100644 --- a/src/program.c +++ b/src/program.c @@ -757,9 +757,16 @@ bc_program_read(BcProgram* p) // struct. bc_vec_init(&vm->read_buf, sizeof(char), BC_DTOR_NONE); } - // This needs to be updated because the parser could have been used - // somewhere else - else bc_parse_updateFunc(&vm->read_prs, BC_PROG_READ); + else + { + // This needs to be updated because the parser could have been used + // somewhere else. + bc_parse_updateFunc(&vm->read_prs, BC_PROG_READ); + + // The read buffer also needs to be emptied or else it will still + // contain previous read expressions. + bc_vec_empty(&vm->read_buf); + } BC_SETJMP_LOCKED(vm, exec_err); diff --git a/src/vm.c b/src/vm.c index 3a7913e30c8..29c2715d027 100644 --- a/src/vm.c +++ b/src/vm.c @@ -643,12 +643,14 @@ bc_vm_shutdown(void) if (vm->catalog != BC_VM_INVALID_CATALOG) catclose(vm->catalog); #endif // BC_ENABLE_NLS +#if !BC_ENABLE_LIBRARY #if BC_ENABLE_HISTORY // This must always run to ensure that the terminal is back to normal, i.e., // has raw mode disabled. But we should only do it if we did not have a bad // terminal because history was not initialized if it is a bad terminal. if (BC_TTY && !vm->history.badTerm) bc_history_free(&vm->history); #endif // BC_ENABLE_HISTORY +#endif // !BC_ENABLE_LIBRARY #if BC_DEBUG #if !BC_ENABLE_LIBRARY diff --git a/tests/bcl.c b/tests/bcl.c index cea63f457cd..5bb50c29a75 100644 --- a/tests/bcl.c +++ b/tests/bcl.c @@ -55,7 +55,7 @@ main(void) BclError e; BclContext ctxt; size_t scale; - BclNumber n, n2, n3, n4, n5, n6; + BclNumber n, n2, n3, n4, n5, n6, n7; char* res; BclBigDig b = 0; @@ -123,16 +123,42 @@ main(void) // parse numbers as negative. if (!bcl_num_neg(n4)) err(BCL_ERROR_FATAL_UNKNOWN_ERR); + // Add them and check the result. + n5 = bcl_add_keep(n3, n4); + err(bcl_err(n5)); + res = bcl_string(n5); + if (res == NULL) err(BCL_ERROR_FATAL_ALLOC_ERR); + if (strcmp(res, "-25452.9108273")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); + + // We want to ensure all memory gets freed because we run this under + // Valgrind. + free(res); + // Add them and check the result. n3 = bcl_add(n3, n4); err(bcl_err(n3)); - res = bcl_string(bcl_dup(n3)); + res = bcl_string_keep(n3); + if (res == NULL) err(BCL_ERROR_FATAL_ALLOC_ERR); if (strcmp(res, "-25452.9108273")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); // We want to ensure all memory gets freed because we run this under // Valgrind. free(res); + // Ensure that divmod, a special case, works. + n4 = bcl_parse("8937458902.2890347"); + err(bcl_err(n4)); + e = bcl_divmod_keep(n4, n3, &n5, &n6); + err(e); + + res = bcl_string(n5); + if (strcmp(res, "-351137.0060159482")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); + free(res); + + res = bcl_string(n6); + if (strcmp(res, ".00000152374405414")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); + free(res); + // Ensure that divmod, a special case, works. n4 = bcl_parse("8937458902.2890347"); err(bcl_err(n4)); @@ -140,15 +166,11 @@ main(void) err(e); res = bcl_string(n5); - if (strcmp(res, "-351137.0060159482")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); - free(res); res = bcl_string(n6); - if (strcmp(res, ".00000152374405414")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); - free(res); // Ensure that sqrt works. This is also a special case. The reason is @@ -213,10 +235,18 @@ main(void) n3 = bcl_irand(n4); err(bcl_err(n3)); + // Repeat. + n2 = bcl_ifrand_keep(n3, 10); + err(bcl_err(n2)); + // Repeat. n2 = bcl_ifrand(bcl_dup(n3), 10); err(bcl_err(n2)); + // Still checking asserts. + e = bcl_rand_seedWithNum_keep(n3); + err(e); + // Still checking asserts. e = bcl_rand_seedWithNum(n3); err(e); @@ -229,9 +259,12 @@ main(void) n5 = bcl_parse("10"); err(bcl_err(n5)); - n6 = bcl_modexp(bcl_dup(n5), bcl_dup(n5), bcl_dup(n5)); + n6 = bcl_modexp_keep(n5, n5, n5); err(bcl_err(n6)); + n7 = bcl_modexp(bcl_dup(n5), bcl_dup(n5), bcl_dup(n5)); + err(bcl_err(n7)); + // Clean up. bcl_num_free(n); @@ -250,6 +283,11 @@ main(void) n4 = bcl_parse("-1.01"); err(bcl_err(n4)); + res = bcl_string_keep(n); + if (strcmp(res, ".01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); + + free(res); + res = bcl_string(bcl_dup(n)); if (strcmp(res, ".01")) err(BCL_ERROR_FATAL_UNKNOWN_ERR); diff --git a/tests/read.sh b/tests/read.sh index d7be18fdcec..4881c10db58 100755 --- a/tests/read.sh +++ b/tests/read.sh @@ -74,6 +74,7 @@ results="$testdir/$d/read_results.txt" errors="$testdir/$d/read_errors.txt" out="$outputdir/${d}_outputs/read_results.txt" +multiple_res="$outputdir/${d}_outputs/read_multiple_results.txt" outdir=$(dirname "$out") # Make sure the directory exists. @@ -89,11 +90,13 @@ if [ "$d" = "bc" ]; then halt="halt" read_call="read()" read_expr="${read_call}\n5+5;" + read_multiple=$(printf '%s\n%s\n%s\n' "3" "2" "1") else options="-x" halt="q" read_call="?" read_expr="${read_call}" + read_multiple=$(printf '%spR\n%spR\n%spR\n' "3" "2" "1") fi # I use these, so unset them to make the tests work. @@ -116,6 +119,16 @@ done < "$name" printf 'pass\n' +printf 'Running %s read multiple...' "$d" + +printf '3\n2\n1\n' > "$multiple_res" + +# Run multiple read() calls. +printf '%s\n' "$read_multiple" | "$exe" "$@" "$options" -e "$read_call" -e "$read_call" -e "$read_call" > "$out" +checktest "$d" "$?" 'read multiple' "$multiple_res" "$out" + +printf 'pass\n' + printf 'Running %s read errors...' "$d" # Run read on every line. From 438a1101dc1f687928cdbe02cd7817a88a24f42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Sun, 30 Apr 2023 19:53:26 +0200 Subject: [PATCH 04/14] contrib/bc: import version 6.5.0 This release that fixes an infinite loop bug in the (non-standard) extended math library functions root() and cbrt(), fixes a bug with BC_LINE_LENGTH=0, and adds the fib() function to the extended math library to calculate Fibonacci numbers. --- NEWS.md | 6 + gen/lib2.bc | 24 +++- include/version.h | 2 +- src/vm.c | 8 +- tests/bc/all.txt | 1 + tests/bc/fib.txt | 31 +++++ tests/bc/fib_results.txt | 31 +++++ tests/bc/scripts/all.txt | 1 + tests/bc/scripts/cbrt.txt | 100 +++++++++++++++ tests/bc/scripts/root.bc | 19 +++ tests/bc/scripts/root.txt | 255 ++++++++++++++++++++++++++++++++++++++ tests/extra_required.txt | 1 + tests/script.sh | 2 +- 13 files changed, 473 insertions(+), 8 deletions(-) create mode 100644 tests/bc/fib.txt create mode 100644 tests/bc/fib_results.txt create mode 100644 tests/bc/scripts/cbrt.txt create mode 100644 tests/bc/scripts/root.bc create mode 100644 tests/bc/scripts/root.txt diff --git a/NEWS.md b/NEWS.md index 6dff6822fb1..44b17b060f5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,11 @@ # News +## 6.5.0 + +This is a production release that fixes an infinite loop bug in `root()` and +`cbrt()`, fixes a bug with `BC_LINE_LENGTH=0`, and adds the `fib()` function to +the extended math library to calculate Fibonacci numbers. + ## 6.4.0 This is a production release that fixes a `read()`/`?` bug and adds features to diff --git a/gen/lib2.bc b/gen/lib2.bc index 2811430d534..ba3f76b1803 100644 --- a/gen/lib2.bc +++ b/gen/lib2.bc @@ -93,6 +93,18 @@ define comb(n,r){ scale=s return f } +define fib(n){ + auto i,t,p,r + if(!n)return 0 + n=abs(n)$ + t=1 + for (i=1;i= UINT16_MAX) len = BC_NUM_PRINT_WIDTH; + len = (size_t) strtol(lenv, NULL, 10); + if (len != 0) + { + len -= 1; + if (len < 2 || len >= UINT16_MAX) len = BC_NUM_PRINT_WIDTH; + } } // Set the default. else len = BC_NUM_PRINT_WIDTH; diff --git a/tests/bc/all.txt b/tests/bc/all.txt index af5eaaa42fb..3d0ea05ba7c 100644 --- a/tests/bc/all.txt +++ b/tests/bc/all.txt @@ -34,6 +34,7 @@ arctangent sine cosine bessel +fib arrays misc misc1 diff --git a/tests/bc/fib.txt b/tests/bc/fib.txt new file mode 100644 index 00000000000..2fa2eea143e --- /dev/null +++ b/tests/bc/fib.txt @@ -0,0 +1,31 @@ +fib(0) +fib(1) +fib(2) +fib(3) +fib(4) +fib(5) +fib(6) +fib(7) +fib(8) +fib(9) +fib(10) +fib(11) +fib(12) +fib(13) +fib(14) +fib(15) +fib(16) +fib(17) +fib(18) +fib(19) +fib(20) +fib(21) +fib(22) +fib(23) +fib(24) +fib(25) +fib(26) +fib(27) +fib(28) +fib(29) +fib(30) diff --git a/tests/bc/fib_results.txt b/tests/bc/fib_results.txt new file mode 100644 index 00000000000..1837f6b7414 --- /dev/null +++ b/tests/bc/fib_results.txt @@ -0,0 +1,31 @@ +0 +1 +1 +2 +3 +5 +8 +13 +21 +34 +55 +89 +144 +233 +377 +610 +987 +1597 +2584 +4181 +6765 +10946 +17711 +28657 +46368 +75025 +121393 +196418 +317811 +514229 +832040 diff --git a/tests/bc/scripts/all.txt b/tests/bc/scripts/all.txt index e2d2aa320c6..a226bed5423 100644 --- a/tests/bc/scripts/all.txt +++ b/tests/bc/scripts/all.txt @@ -4,6 +4,7 @@ subtract.bc add.bc print.bc parse.bc +root.bc array.bc array2.bc atan.bc diff --git a/tests/bc/scripts/cbrt.txt b/tests/bc/scripts/cbrt.txt new file mode 100644 index 00000000000..bae7f3af057 --- /dev/null +++ b/tests/bc/scripts/cbrt.txt @@ -0,0 +1,100 @@ +.464158883361277889241007635091 +.215443469003188372175929356651 +.100000000000000000000000000000 +.046415888336127788924100763509 +.021544346900318837217592935665 +.010000000000000000000000000000 +.004641588833612778892410076350 +.002154434690031883721759293566 +.001000000000000000000000000000 +.000464158883361277889241007635 +.000215443469003188372175929356 +.000100000000000000000000000000 +.000046415888336127788924100763 +.000021544346900318837217592935 +.000010000000000000000000000000 +.000004641588833612778892410076 +.000002154434690031883721759293 +.000001000000000000000000000000 +.000000464158883361277889241007 +.000000215443469003188372175929 +.000000100000000000000000000000 +.000000046415888336127788924100 +.000000021544346900318837217592 +.000000010000000000000000000000 +.000000004641588833612778892410 +.000000002154434690031883721759 +.000000001000000000000000000000 +.000000000464158883361277889241 +.000000000215443469003188372175 +.000000000100000000000000000000 +.000000000046415888336127788924 +.000000000021544346900318837217 +.000000000010000000000000000000 +.000000000004641588833612778892 +.000000000002154434690031883721 +.000000000001000000000000000000 +.000000000000464158883361277889 +.000000000000215443469003188372 +.000000000000100000000000000000 +.000000000000046415888336127788 +.000000000000021544346900318837 +.000000000000010000000000000000 +.000000000000004641588833612778 +.000000000000002154434690031883 +.000000000000001000000000000000 +.000000000000000464158883361277 +.000000000000000215443469003188 +.000000000000000100000000000000 +.000000000000000046415888336127 +.000000000000000021544346900318 +.000000000000000010000000000000 +.000000000000000004641588833612 +.000000000000000002154434690031 +.000000000000000001000000000000 +.000000000000000000464158883361 +.000000000000000000215443469003 +.000000000000000000100000000000 +.000000000000000000046415888336 +.000000000000000000021544346900 +.000000000000000000010000000000 +.000000000000000000004641588833 +.000000000000000000002154434690 +.000000000000000000001000000000 +.000000000000000000000464158883 +.000000000000000000000215443469 +.000000000000000000000100000000 +.000000000000000000000046415888 +.000000000000000000000021544346 +.000000000000000000000010000000 +.000000000000000000000004641588 +.000000000000000000000002154434 +.000000000000000000000001000000 +.000000000000000000000000464158 +.000000000000000000000000215443 +.000000000000000000000000100000 +.000000000000000000000000046415 +.000000000000000000000000021544 +.000000000000000000000000010000 +.000000000000000000000000004641 +.000000000000000000000000002154 +.000000000000000000000000001000 +.000000000000000000000000000464 +.000000000000000000000000000215 +.000000000000000000000000000100 +.000000000000000000000000000046 +.000000000000000000000000000021 +.000000000000000000000000000010 +.000000000000000000000000000004 +.000000000000000000000000000002 +.000000000000000000000000000001 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/tests/bc/scripts/root.bc b/tests/bc/scripts/root.bc new file mode 100644 index 00000000000..95210fe290e --- /dev/null +++ b/tests/bc/scripts/root.bc @@ -0,0 +1,19 @@ +scale = 30 + +s = 1 >> 1 + +for (i = 0; i < 100; ++i) +{ + cbrt(s) + s >>= 1 +} + +s = 1 >> 1 + +for (i = 0; i < 155; ++i) +{ + root(s, 5) + s >>= 1 +} + +halt diff --git a/tests/bc/scripts/root.txt b/tests/bc/scripts/root.txt new file mode 100644 index 00000000000..b720eb5de75 --- /dev/null +++ b/tests/bc/scripts/root.txt @@ -0,0 +1,255 @@ +.464158883361277889241007635091 +.215443469003188372175929356651 +.100000000000000000000000000000 +.046415888336127788924100763509 +.021544346900318837217592935665 +.010000000000000000000000000000 +.004641588833612778892410076350 +.002154434690031883721759293566 +.001000000000000000000000000000 +.000464158883361277889241007635 +.000215443469003188372175929356 +.000100000000000000000000000000 +.000046415888336127788924100763 +.000021544346900318837217592935 +.000010000000000000000000000000 +.000004641588833612778892410076 +.000002154434690031883721759293 +.000001000000000000000000000000 +.000000464158883361277889241007 +.000000215443469003188372175929 +.000000100000000000000000000000 +.000000046415888336127788924100 +.000000021544346900318837217592 +.000000010000000000000000000000 +.000000004641588833612778892410 +.000000002154434690031883721759 +.000000001000000000000000000000 +.000000000464158883361277889241 +.000000000215443469003188372175 +.000000000100000000000000000000 +.000000000046415888336127788924 +.000000000021544346900318837217 +.000000000010000000000000000000 +.000000000004641588833612778892 +.000000000002154434690031883721 +.000000000001000000000000000000 +.000000000000464158883361277889 +.000000000000215443469003188372 +.000000000000100000000000000000 +.000000000000046415888336127788 +.000000000000021544346900318837 +.000000000000010000000000000000 +.000000000000004641588833612778 +.000000000000002154434690031883 +.000000000000001000000000000000 +.000000000000000464158883361277 +.000000000000000215443469003188 +.000000000000000100000000000000 +.000000000000000046415888336127 +.000000000000000021544346900318 +.000000000000000010000000000000 +.000000000000000004641588833612 +.000000000000000002154434690031 +.000000000000000001000000000000 +.000000000000000000464158883361 +.000000000000000000215443469003 +.000000000000000000100000000000 +.000000000000000000046415888336 +.000000000000000000021544346900 +.000000000000000000010000000000 +.000000000000000000004641588833 +.000000000000000000002154434690 +.000000000000000000001000000000 +.000000000000000000000464158883 +.000000000000000000000215443469 +.000000000000000000000100000000 +.000000000000000000000046415888 +.000000000000000000000021544346 +.000000000000000000000010000000 +.000000000000000000000004641588 +.000000000000000000000002154434 +.000000000000000000000001000000 +.000000000000000000000000464158 +.000000000000000000000000215443 +.000000000000000000000000100000 +.000000000000000000000000046415 +.000000000000000000000000021544 +.000000000000000000000000010000 +.000000000000000000000000004641 +.000000000000000000000000002154 +.000000000000000000000000001000 +.000000000000000000000000000464 +.000000000000000000000000000215 +.000000000000000000000000000100 +.000000000000000000000000000046 +.000000000000000000000000000021 +.000000000000000000000000000010 +.000000000000000000000000000004 +.000000000000000000000000000002 +.000000000000000000000000000001 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +.630957344480193249434360136622 +.398107170553497250770252305087 +.251188643150958011108503206779 +.158489319246111348520210137339 +.100000000000000000000000000000 +.063095734448019324943436013662 +.039810717055349725077025230508 +.025118864315095801110850320677 +.015848931924611134852021013733 +.010000000000000000000000000000 +.006309573444801932494343601366 +.003981071705534972507702523050 +.002511886431509580111085032067 +.001584893192461113485202101373 +.001000000000000000000000000000 +.000630957344480193249434360136 +.000398107170553497250770252305 +.000251188643150958011108503206 +.000158489319246111348520210137 +.000100000000000000000000000000 +.000063095734448019324943436013 +.000039810717055349725077025230 +.000025118864315095801110850320 +.000015848931924611134852021013 +.000010000000000000000000000000 +.000006309573444801932494343601 +.000003981071705534972507702523 +.000002511886431509580111085032 +.000001584893192461113485202101 +.000001000000000000000000000000 +.000000630957344480193249434360 +.000000398107170553497250770252 +.000000251188643150958011108503 +.000000158489319246111348520210 +.000000100000000000000000000000 +.000000063095734448019324943436 +.000000039810717055349725077025 +.000000025118864315095801110850 +.000000015848931924611134852021 +.000000010000000000000000000000 +.000000006309573444801932494343 +.000000003981071705534972507702 +.000000002511886431509580111085 +.000000001584893192461113485202 +.000000001000000000000000000000 +.000000000630957344480193249434 +.000000000398107170553497250770 +.000000000251188643150958011108 +.000000000158489319246111348520 +.000000000100000000000000000000 +.000000000063095734448019324943 +.000000000039810717055349725077 +.000000000025118864315095801110 +.000000000015848931924611134852 +.000000000010000000000000000000 +.000000000006309573444801932494 +.000000000003981071705534972507 +.000000000002511886431509580111 +.000000000001584893192461113485 +.000000000001000000000000000000 +.000000000000630957344480193249 +.000000000000398107170553497250 +.000000000000251188643150958011 +.000000000000158489319246111348 +.000000000000100000000000000000 +.000000000000063095734448019324 +.000000000000039810717055349725 +.000000000000025118864315095801 +.000000000000015848931924611134 +.000000000000010000000000000000 +.000000000000006309573444801932 +.000000000000003981071705534972 +.000000000000002511886431509580 +.000000000000001584893192461113 +.000000000000001000000000000000 +.000000000000000630957344480193 +.000000000000000398107170553497 +.000000000000000251188643150958 +.000000000000000158489319246111 +.000000000000000100000000000000 +.000000000000000063095734448019 +.000000000000000039810717055349 +.000000000000000025118864315095 +.000000000000000015848931924611 +.000000000000000010000000000000 +.000000000000000006309573444801 +.000000000000000003981071705534 +.000000000000000002511886431509 +.000000000000000001584893192461 +.000000000000000001000000000000 +.000000000000000000630957344480 +.000000000000000000398107170553 +.000000000000000000251188643150 +.000000000000000000158489319246 +.000000000000000000100000000000 +.000000000000000000063095734448 +.000000000000000000039810717055 +.000000000000000000025118864315 +.000000000000000000015848931924 +.000000000000000000010000000000 +.000000000000000000006309573444 +.000000000000000000003981071705 +.000000000000000000002511886431 +.000000000000000000001584893192 +.000000000000000000001000000000 +.000000000000000000000630957344 +.000000000000000000000398107170 +.000000000000000000000251188643 +.000000000000000000000158489319 +.000000000000000000000100000000 +.000000000000000000000063095734 +.000000000000000000000039810717 +.000000000000000000000025118864 +.000000000000000000000015848931 +.000000000000000000000010000000 +.000000000000000000000006309573 +.000000000000000000000003981071 +.000000000000000000000002511886 +.000000000000000000000001584893 +.000000000000000000000001000000 +.000000000000000000000000630957 +.000000000000000000000000398107 +.000000000000000000000000251188 +.000000000000000000000000158489 +.000000000000000000000000100000 +.000000000000000000000000063095 +.000000000000000000000000039810 +.000000000000000000000000025118 +.000000000000000000000000015848 +.000000000000000000000000010000 +.000000000000000000000000006309 +.000000000000000000000000003981 +.000000000000000000000000002511 +.000000000000000000000000001584 +.000000000000000000000000001000 +.000000000000000000000000000630 +.000000000000000000000000000398 +.000000000000000000000000000251 +.000000000000000000000000000158 +.000000000000000000000000000100 +.000000000000000000000000000063 +.000000000000000000000000000039 +.000000000000000000000000000025 +.000000000000000000000000000015 +.000000000000000000000000000010 +.000000000000000000000000000006 +.000000000000000000000000000003 +.000000000000000000000000000002 +.000000000000000000000000000001 +.000000000000000000000000000001 +0 +0 +0 +0 +0 diff --git a/tests/extra_required.txt b/tests/extra_required.txt index e36d95a1305..c498802ffae 100644 --- a/tests/extra_required.txt +++ b/tests/extra_required.txt @@ -1,5 +1,6 @@ engineering lib2 +fib places rand scientific diff --git a/tests/script.sh b/tests/script.sh index 438af17c79c..fef0c529061 100755 --- a/tests/script.sh +++ b/tests/script.sh @@ -132,7 +132,7 @@ fi # Skip the tests that require extra math if we don't have it. if [ "$run_extra_tests" -eq 0 ]; then - if [ "$f" = "rand.bc" ]; then + if [ "$f" = "rand.bc" ] || [ "$f" = "root.bc" ]; then printf 'Skipping %s script: %s\n' "$d" "$f" exit 0 fi From 8b83ef067441f6d3a4a55e92d1738724954a057c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Wed, 24 May 2023 13:56:26 +0200 Subject: [PATCH 05/14] vendor/bc: upgrade to version 6.6.0 This update removes printing of a leading zero in scientific or engineering output modes (which are an extended feature of this implementation). --- LICENSE.md | 2 +- Makefile.in | 2 +- NEWS.md | 12 ++ README.md | 18 +- configure.sh | 32 +++- include/num.h | 8 + include/status.h | 7 + include/version.h | 2 +- src/num.c | 85 +++++++-- src/program.c | 15 +- src/rand.c | 5 +- tests/bc/all.txt | 1 + tests/bc/rand_limits.txt | 284 +++++++++++++++++++++++++++++++ tests/bc/rand_limits_results.txt | 222 ++++++++++++++++++++++++ tests/extra_required.txt | 1 + tests/script.sh | 14 +- 16 files changed, 675 insertions(+), 35 deletions(-) create mode 100644 tests/bc/rand_limits.txt create mode 100644 tests/bc/rand_limits_results.txt diff --git a/LICENSE.md b/LICENSE.md index b65095edc26..74441065df3 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -59,7 +59,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The files `src/rand.c` and `include/rand.h` are under the following copyrights and license: -Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors +Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors
Copyright (c) 2018-2023 Gavin D. Howard Permission is hereby granted, free of charge, to any person obtaining a copy of diff --git a/Makefile.in b/Makefile.in index f936fc2c6de..55e2e4a6270 100644 --- a/Makefile.in +++ b/Makefile.in @@ -205,7 +205,7 @@ DC_DEFS = $(DC_DEFS1) $(DC_DEFS2) $(DC_DEFS3) $(DC_DEFS4) $(DC_DEFS5) CPPFLAGS1 = -D$(BC_ENABLED_NAME)=$(BC_ENABLED) -D$(DC_ENABLED_NAME)=$(DC_ENABLED) CPPFLAGS2 = $(CPPFLAGS1) -I$(INCDIR)/ -DBUILD_TYPE=$(BC_BUILD_TYPE) %%LONG_BIT_DEFINE%% CPPFLAGS3 = $(CPPFLAGS2) -DEXECPREFIX=$(EXEC_PREFIX) -DMAINEXEC=$(MAIN_EXEC) -CPPFLAGS4 = $(CPPFLAGS3) %%BSD%% +CPPFLAGS4 = $(CPPFLAGS3) %%BSD%% %%APPLE%% CPPFLAGS5 = $(CPPFLAGS4) -DBC_NUM_KARATSUBA_LEN=$(BC_NUM_KARATSUBA_LEN) CPPFLAGS6 = $(CPPFLAGS5) -DBC_ENABLE_NLS=$(BC_ENABLE_NLS) CPPFLAGS7 = $(CPPFLAGS6) -D$(BC_ENABLE_EXTRA_MATH_NAME)=$(BC_ENABLE_EXTRA_MATH) diff --git a/NEWS.md b/NEWS.md index 44b17b060f5..de3b35026fe 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,17 @@ # News +## 6.6.0 + +This is a production release with two bug fixes and one change. + +The first bug fix is to fix the build on Mac OSX. + +The second bug was to remove printing a leading zero in scientific or +engineering output modes. + +The change was that the implementation of `irand()` was improved to call the +PRNG less. + ## 6.5.0 This is a production release that fixes an infinite loop bug in `root()` and diff --git a/README.md b/README.md index 9d395f74718..943ca89eee2 100644 --- a/README.md +++ b/README.md @@ -422,13 +422,23 @@ Other projects based on this bc are: * [busybox `bc`][8]. The busybox maintainers have made their own changes, so any bugs in the busybox `bc` should be reported to them. - * [toybox `bc`][9]. The maintainer has also made his own changes, so bugs in the toybox `bc` should be reported there. - * [FreeBSD `bc`][23]. While the `bc` in FreeBSD is kept up-to-date, it is better to [report bugs there][24], as well as [submit patches][25], and the maintainers of the package will contact me if necessary. +* [Mac OSX `bc`][35]. Any bugs in that `bc` should be reported to me, but do + expect bugs because the version is old. +* [Android Open Source `bc`][32]. Any bugs in that `bc` can be reported here. + +This is a non-comprehensive list of Linux distros that use this `bc` as the +system `bc`: + +* [Gentoo][33]; it is a first-class alternative to GNU `bc`, but not exclusive. +* [Linux from Scratch][34]. + +Other Linux distros package it as a second-class alternative, usually as `bc-gh` +or `howard-bc`. ## Language @@ -500,3 +510,7 @@ Folders: [29]: https://github.com/gavinhoward/bc [30]: ./manuals/bc/A.1.md#extended-library [31]: ./manuals/build.md#settings +[32]: https://android.googlesource.com/platform/external/bc/ +[33]: https://github.com/gentoo/gentoo/blob/master/app-alternatives/bc/bc-0.ebuild#L8 +[34]: https://www.linuxfromscratch.org/lfs/view/stable/chapter08/bc.html +[35]: https://github.com/apple-oss-distributions/bc/tree/main/bc diff --git a/configure.sh b/configure.sh index 021d30807ff..4ba957131d5 100755 --- a/configure.sh +++ b/configure.sh @@ -772,7 +772,7 @@ predefined_build() { dc_default_digit_clamp=0;; GDH) - CFLAGS="-flto -Weverything -Wno-padded -Werror -pedantic -std=c11" + CFLAGS="-flto -Weverything -Wno-padded -Wno-unsafe-buffer-usage -Werror -pedantic -std=c11" bc_only=0 dc_only=0 coverage=0 @@ -806,7 +806,7 @@ predefined_build() { dc_default_digit_clamp=1;; DBG) - CFLAGS="-Weverything -Wno-padded -Werror -pedantic -std=c11" + CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Werror -pedantic -std=c11" bc_only=0 dc_only=0 coverage=0 @@ -1653,12 +1653,12 @@ else # We are also setting the CFLAGS and LDFLAGS here. if [ "$editline" -ne 0 ]; then LDFLAGS="$LDFLAGS -ledit" - CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=1 -DBC_ENABLE_READLINE=0" + CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=1 -DBC_ENABLE_READLINE=0" elif [ "$readline" -ne 0 ]; then LDFLAGS="$LDFLAGS -lreadline" - CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=1" + CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=1" else - CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0" + CPPFLAGS="$CPPFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0" fi fi @@ -1682,6 +1682,24 @@ else CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" fi +# Test Mac OSX. This is not in an if statement because regardless of whatever +# the user says, we need to know if we are on Mac OSX. If we are, we have to set +# _DARWIN_C_SOURCE. +printf 'Testing for Mac OSX...\n' + +flags="-DBC_TEST_APPLE -DBC_ENABLE_AFL=0" +"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/src/vm.c" > /dev/null 2>&1 + +err="$?" + +if [ "$err" -ne 0 ]; then + printf 'On Mac OSX. Using _DARWIN_C_SOURCE.\n\n' + apple="-D_DARWIN_C_SOURCE" +else + printf 'Not on Mac OSX.\n\n' + apple="" +fi + # Test OpenBSD. This is not in an if statement because regardless of whatever # the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE. # No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC @@ -1690,7 +1708,6 @@ fi # we have to set it because we also set _POSIX_C_SOURCE, which OpenBSD headers # detect, and when they detect it, they turn off _BSD_SOURCE unless it is # specifically requested. -set +e printf 'Testing for OpenBSD...\n' flags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0" @@ -1713,6 +1730,8 @@ else bsd="" fi +set -e + if [ "$library" -eq 1 ]; then bc_lib="" fi @@ -2072,6 +2091,7 @@ contents=$(replace "$contents" "CLEAN_PREREQS" "$CLEAN_PREREQS") contents=$(replace "$contents" "GEN_EMU" "$GEN_EMU") contents=$(replace "$contents" "BSD" "$bsd") +contents=$(replace "$contents" "APPLE" "$apple") contents=$(replace "$contents" "BC_DEFAULT_BANNER" "$bc_default_banner") contents=$(replace "$contents" "BC_DEFAULT_SIGINT_RESET" "$bc_default_sigint_reset") diff --git a/include/num.h b/include/num.h index 8078809250f..d24c206cbe5 100644 --- a/include/num.h +++ b/include/num.h @@ -71,6 +71,10 @@ typedef BclBigDig BcBigDig; /// An alias for portability. #define BC_NUM_BIGDIG_C UINT64_C +/// The max number + 1 that two limbs can hold. This is used for generating +/// numbers because the PRNG can generate a number that will fill two limbs. +#define BC_BASE_RAND_POW (BC_NUM_BIGDIG_C(1000000000000000000)) + /// The actual limb type. typedef int_least32_t BcDig; @@ -88,6 +92,10 @@ typedef int_least32_t BcDig; /// An alias for portability. #define BC_NUM_BIGDIG_C UINT32_C +/// The max number + 1 that two limbs can hold. This is used for generating +/// numbers because the PRNG can generate a number that will fill two limbs. +#define BC_BASE_RAND_POW (UINT64_C(100000000)) + /// The actual limb type. typedef int_least16_t BcDig; diff --git a/include/status.h b/include/status.h index 198cf5704a5..242514edb47 100644 --- a/include/status.h +++ b/include/status.h @@ -60,6 +60,13 @@ #endif // __FreeBSD__ #endif // BC_TEST_FREEBSD +// This is used by configure.sh to test for Mac OSX. +#ifdef BC_TEST_APPLE +#ifdef __APPLE__ +#error On Mac OSX without _DARWIN_C_SOURCE +#endif // __APPLE__ +#endif // BC_TEST_APPLE + // Windows has deprecated isatty() and the rest of these. Or doesn't have them. // So these are just fixes for Windows. #ifdef _WIN32 diff --git a/include/version.h b/include/version.h index daa1977c3cb..a4df383e284 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.5.0 +#define VERSION 6.6.0 #endif // BC_VERSION_H diff --git a/src/num.c b/src/num.c index 8f70c6a409d..0a59707268d 100644 --- a/src/num.c +++ b/src/num.c @@ -3515,8 +3515,9 @@ bc_num_print(BcNum* restrict n, BcBigDig base, bool newline) // Print the sign. if (BC_NUM_NEG(n)) bc_num_putchar('-', true); - // Print the leading zero if necessary. - if (BC_Z && BC_NUM_RDX_VAL(n) == n->len) + // Print the leading zero if necessary. We don't print when using + // scientific or engineering modes. + if (BC_Z && BC_NUM_RDX_VAL(n) == n->len && base != 0 && base != 1) { bc_num_printHex(0, 1, false, !newline); } @@ -3815,7 +3816,7 @@ void bc_num_irand(BcNum* restrict a, BcNum* restrict b, BcRNG* restrict rng) { BcNum atemp; - size_t i, len; + size_t i; assert(a != b); @@ -3835,24 +3836,76 @@ bc_num_irand(BcNum* restrict a, BcNum* restrict b, BcRNG* restrict rng) assert(atemp.num != NULL); assert(atemp.len); - len = atemp.len - 1; - - // Just generate a random number for each limb. - for (i = 0; i < len; ++i) + if (atemp.len > 2) { - b->num[i] = (BcDig) bc_rand_bounded(rng, BC_BASE_POW); + size_t len; + + len = atemp.len - 2; + + // Just generate a random number for each limb. + for (i = 0; i < len; i += 2) + { + BcRand dig; + + dig = bc_rand_bounded(rng, BC_BASE_RAND_POW); + + b->num[i] = (BcDig) (dig % BC_BASE_POW); + b->num[i + 1] = (BcDig) (dig / BC_BASE_POW); + } + } + else + { + // We need this set. + i = 0; } - // Do the last digit explicitly because the bound must be right. But only - // do it if the limb does not equal 1. If it does, we have already hit the - // limit. - if (atemp.num[i] != 1) + // This will be true if there's one full limb after the two limb groups. + if (i == atemp.len - 2) { - b->num[i] = (BcDig) bc_rand_bounded(rng, (BcRand) atemp.num[i]); - b->len = atemp.len; + // Increment this for easy use. + i += 1; + + // If the last digit is not one, we need to set a bound for it + // explicitly. Since there's still an empty limb, we need to fill that. + if (atemp.num[i] != 1) + { + BcRand dig; + BcRand bound; + + // Set the bound to the bound of the last limb times the amount + // needed to fill the second-to-last limb as well. + bound = ((BcRand) atemp.num[i]) * BC_BASE_POW; + + dig = bc_rand_bounded(rng, bound); + + // Fill the last two. + b->num[i - 1] = (BcDig) (dig % BC_BASE_POW); + b->num[i] = (BcDig) (dig / BC_BASE_POW); + + // Ensure that the length will be correct. If the last limb is zero, + // then the length needs to be one less than the bound. + b->len = atemp.len - (b->num[i] == 0); + } + // Here the last limb *is* one, which means the last limb does *not* + // need to be filled. Also, the length needs to be one less because the + // last limb is 0. + else + { + b->num[i - 1] = (BcDig) bc_rand_bounded(rng, BC_BASE_POW); + b->len = atemp.len - 1; + } + } + // Here, there is only one limb to fill. + else + { + // See above for how this works. + if (atemp.num[i] != 1) + { + b->num[i] = (BcDig) bc_rand_bounded(rng, (BcRand) atemp.num[i]); + b->len = atemp.len - (b->num[i] == 0); + } + else b->len = atemp.len - 1; } - // We want 1 less len in the case where we skip the last limb. - else b->len = len; bc_num_clean(b); diff --git a/src/program.c b/src/program.c index 243f827fe98..2f26589166e 100644 --- a/src/program.c +++ b/src/program.c @@ -2703,12 +2703,21 @@ bc_program_globalSetting(BcProgram* p, uchar inst) assert(inst >= BC_INST_LINE_LENGTH && inst <= BC_INST_LEADING_ZERO); #endif // DC_ENABLED - if (inst == BC_INST_LINE_LENGTH) val = (BcBigDig) vm->line_len; + if (inst == BC_INST_LINE_LENGTH) + { + val = (BcBigDig) vm->line_len; + } #if BC_ENABLED - else if (inst == BC_INST_GLOBAL_STACKS) val = (BC_G != 0); + else if (inst == BC_INST_GLOBAL_STACKS) + { + val = (BC_G != 0); + } #endif // BC_ENABLED #if DC_ENABLED - else if (inst == BC_INST_EXTENDED_REGISTERS) val = (DC_X != 0); + else if (inst == BC_INST_EXTENDED_REGISTERS) + { + val = (DC_X != 0); + } #endif // DC_ENABLED else val = (BC_Z != 0); diff --git a/src/rand.c b/src/rand.c index 11c22cd507c..560e494214a 100644 --- a/src/rand.c +++ b/src/rand.c @@ -517,8 +517,11 @@ bc_rand_int(BcRNG* r) BcRand bc_rand_bounded(BcRNG* r, BcRand bound) { + BcRand rand; + BcRand threshold; + // Calculate the threshold below which we have to try again. - BcRand rand, threshold = (0 - bound) % bound; + threshold = (0 - bound) % bound; do { diff --git a/tests/bc/all.txt b/tests/bc/all.txt index 3d0ea05ba7c..c710534aac1 100644 --- a/tests/bc/all.txt +++ b/tests/bc/all.txt @@ -47,6 +47,7 @@ misc7 misc8 void rand +rand_limits recursive_arrays divmod modexp diff --git a/tests/bc/rand_limits.txt b/tests/bc/rand_limits.txt new file mode 100644 index 00000000000..9f6848739e3 --- /dev/null +++ b/tests/bc/rand_limits.txt @@ -0,0 +1,284 @@ +seed = 12183415694832323910165063565742029266.78201143488173352403523006\ + 17939450703787369504276248076613097826033345478457018711188931947\ + 5643844725709641352295875549316406250 + +if (maxrand() >= 2^64 - 1) { + + for (i = 1; i <= 37; ++i) + { + irand(10^i) + } + + 1 + 77 + 914 + 8200 + 44887 + 866441 + 2358358 + 13559535 + 416767986 + 9276295152 + 89383616490 + 954770306600 + 8117340260822 + 90441255304792 + 123091484400148 + 673234816385761 + 33144762500773628 + 741775860680476044 + 4715856253932519349 + 44722685516799788803 + 691627564627043533689 + 3601367765145373281202 + 27535154823004408648947 + 51478009115008961612866 + 4031778740698066425486191 + 95653217339584215257144674 + 426302455455598639876532628 + 1216686741117783240797844143 + 17705719185928989853748208134 + 784851648926334033332776172502 + 3120413811981279690501349408357 + 38214388551463331616358091659583 + 720453131307667144268209805308554 + 8939221360785849706894139937864130 + 10262211588802126422696984407808741 + 267283013443362846268603285132432016 + 2034014520976339794036584994364919660 +} +else { + + 5 + 15 + 701 + 8215 + 98794 + 602366 + 2027255 + 74687524 + 830825144 + 6081336208 + 24314055735 + 838559932276 + 6866719060925 + 36806875401211 + 406827598340727 + 5356006452532004 + 38220052834497507 + 337361587138720056 + 1181974760686154481 + 16008532535003488966 + 951908092544652236970 + 90730737551380302703 + 46492092840194767743061 + 188697840939074129889664 + 3963332393372745718515074 + 78044317381361304314479194 + 257814131633376797403093774 + 5383100889234097635148206308 + 39812361752905775691804497289 + 222434065196674291290714932718 + 4942298796724199168854529657788 + 30804146383811856719866376789543 + 817977187096950760817419359822004 + 922359768927341898905002631901715 + 84002847212517205019842390182209654 + 423700247670879534125867432896848815 + 982360002329187383971171836321012954 + + for (i = 1; i <= 37; ++i) + { + irand(10^i) + } +} + +seed = 12183415694832323910165063565742029266.82951754507405817776622978\ + 09630984098584076072986006731059784797092101840727292180396879039\ + 9608224106486886739730834960937500000 + +if (maxrand() >= 2^64 - 1) { + + for (i = 1; i <= 37; ++i) + { + irand(10^i) + } + + 9 + 84 + 802 + 9765 + 80115 + 246589 + 4463508 + 85992729 + 977135 + 4189279533 + 68755431294 + 107950335674 + 9675253977558 + 87867459318681 + 801765066192715 + 2162649050595056 + 2892195376814570 + 134060417012729962 + 7176764836888537721 + 5273685153052366176 + 461774434438273613889 + 152344588818260411506 + 11709967193759556155964 + 533206453770793013516792 + 2511508581949736433569969 + 1573162243991468106989339 + 215826582488545888127004159 + 1480805837640270183994742134 + 61049958584446767740466194227 + 145231395106326027295263107581 + 7023255505921253691380349839502 + 48606431941187693512006850149822 + 87214859605659588002413450479944 + 7949773868584392220935704452065706 + 4544031206641768922348422844031232 + 37285268346623956247142903563298469 + 696722030777467416877847444483018982 +} +else { + + 9 + 73 + 468 + 1781 + 79556 + 166610 + 9336284 + 96403025 + 23318279 + 1074901232 + 30659049590 + 125915951725 + 3123436435684 + 52610031172756 + 445020218860038 + 87520306151384 + 47213087211849485 + 154045322058555704 + 9488624282418036451 + 12849313140308039019 + 828063328914872193931 + 2956454855398834052902 + 87417046449320418408586 + 165187095179884370295407 + 3602892678245454556711806 + 88079064510429999588220544 + 376741359503002189591164726 + 56633499559885161310029862 + 11172900796387700171428233596 + 473873806840427957175182603343 + 824290276873152640168308384248 + 36092351141101218267245025967581 + 39973475177812910298579659860850 + 7364670182480566996610562443888661 + 51592684301602944329896812066058114 + 951444349069518195584787848316744461 + 3234933598293500107173129970384252570 + + for (i = 1; i <= 37; ++i) + { + irand(10^i) + } +} + +seed = 149423560533592712773538909996244073918.2952752612544959208642520\ + 06505634103779572918483064082477106507620297186161725006312917321\ + 53815843275879160501062870025634765625 + +if (maxrand() >= 2^64 - 1) { + + for (i = 1; i <= 37; ++i) + { + irand(10^i) + } + + 0 + 94 + 825 + 907 + 62512 + 633399 + 3539412 + 65712557 + 329618801 + 9052319971 + 50117657456 + 719515050973 + 396081658001 + 98762199564287 + 537857673363391 + 5701380917944903 + 16144997029797264 + 918603142053856533 + 4437053492025674148 + 76125560050255946142 + 262504846798815931770 + 688599520356200914010 + 77509440962809216890090 + 889672321539369676198789 + 5795540531885308263478299 + 88374255397211092706329509 + 118231692173643319720953958 + 6218036129497143746927154520 + 3236727278542723274070894570 + 72098882691751515204435662053 + 8305331942254135876823981226459 + 33980292322856768815329277766669 + 154632353482145519952015208333866 + 192400848794451940507964192401413 + 69666401739718540927805290639731997 + 545814355378177567662640611917018958 + 4986776343571879972263664198494529846 +} +else { + + 6 + 47 + 709 + 350 + 45155 + 117711 + 6147313 + 26359748 + 56878412 + 930721373 + 47052494689 + 84216331603 + 1874946867051 + 30417072907659 + 157776263741438 + 3325742508233965 + 39500653878059614 + 278676289794009775 + 3342139004245631096 + 63313724143310202591 + 647891168358497623537 + 5925769871143510986759 + 3051401096746445704645 + 761857520743586046415633 + 9077595326394996332524977 + 2159936754163773508122732 + 426809670586105698135317225 + 3294516277260755029991322796 + 14749983115477586453985047494 + 692100641365100970093726483540 + 9502478720578852594268790479747 + 9062487417784678956874793130476 + 352159971921852073191742323073689 + 2270803770328639487517517910897872 + 35166631277333300065883628523569361 + 596441689792333324819903835359197616 + 6933582360405829608479430394981956723 + + for (i = 1; i <= 37; ++i) + { + irand(10^i) + } +} diff --git a/tests/bc/rand_limits_results.txt b/tests/bc/rand_limits_results.txt new file mode 100644 index 00000000000..7950429c5e6 --- /dev/null +++ b/tests/bc/rand_limits_results.txt @@ -0,0 +1,222 @@ +5 +15 +701 +8215 +98794 +602366 +2027255 +74687524 +830825144 +6081336208 +24314055735 +838559932276 +6866719060925 +36806875401211 +406827598340727 +5356006452532004 +38220052834497507 +337361587138720056 +1181974760686154481 +16008532535003488966 +951908092544652236970 +90730737551380302703 +46492092840194767743061 +188697840939074129889664 +3963332393372745718515074 +78044317381361304314479194 +257814131633376797403093774 +5383100889234097635148206308 +39812361752905775691804497289 +222434065196674291290714932718 +4942298796724199168854529657788 +30804146383811856719866376789543 +817977187096950760817419359822004 +922359768927341898905002631901715 +84002847212517205019842390182209654 +423700247670879534125867432896848815 +982360002329187383971171836321012954 +1 +77 +914 +8200 +44887 +866441 +2358358 +13559535 +416767986 +9276295152 +89383616490 +954770306600 +8117340260822 +90441255304792 +123091484400148 +673234816385761 +33144762500773628 +741775860680476044 +4715856253932519349 +44722685516799788803 +691627564627043533689 +3601367765145373281202 +27535154823004408648947 +51478009115008961612866 +4031778740698066425486191 +95653217339584215257144674 +426302455455598639876532628 +1216686741117783240797844143 +17705719185928989853748208134 +784851648926334033332776172502 +3120413811981279690501349408357 +38214388551463331616358091659583 +720453131307667144268209805308554 +8939221360785849706894139937864130 +10262211588802126422696984407808741 +267283013443362846268603285132432016 +2034014520976339794036584994364919660 +9 +73 +468 +1781 +79556 +166610 +9336284 +96403025 +23318279 +1074901232 +30659049590 +125915951725 +3123436435684 +52610031172756 +445020218860038 +87520306151384 +47213087211849485 +154045322058555704 +9488624282418036451 +12849313140308039019 +828063328914872193931 +2956454855398834052902 +87417046449320418408586 +165187095179884370295407 +3602892678245454556711806 +88079064510429999588220544 +376741359503002189591164726 +56633499559885161310029862 +11172900796387700171428233596 +473873806840427957175182603343 +824290276873152640168308384248 +36092351141101218267245025967581 +39973475177812910298579659860850 +7364670182480566996610562443888661 +51592684301602944329896812066058114 +951444349069518195584787848316744461 +3234933598293500107173129970384252570 +9 +84 +802 +9765 +80115 +246589 +4463508 +85992729 +977135 +4189279533 +68755431294 +107950335674 +9675253977558 +87867459318681 +801765066192715 +2162649050595056 +2892195376814570 +134060417012729962 +7176764836888537721 +5273685153052366176 +461774434438273613889 +152344588818260411506 +11709967193759556155964 +533206453770793013516792 +2511508581949736433569969 +1573162243991468106989339 +215826582488545888127004159 +1480805837640270183994742134 +61049958584446767740466194227 +145231395106326027295263107581 +7023255505921253691380349839502 +48606431941187693512006850149822 +87214859605659588002413450479944 +7949773868584392220935704452065706 +4544031206641768922348422844031232 +37285268346623956247142903563298469 +696722030777467416877847444483018982 +6 +47 +709 +350 +45155 +117711 +6147313 +26359748 +56878412 +930721373 +47052494689 +84216331603 +1874946867051 +30417072907659 +157776263741438 +3325742508233965 +39500653878059614 +278676289794009775 +3342139004245631096 +63313724143310202591 +647891168358497623537 +5925769871143510986759 +3051401096746445704645 +761857520743586046415633 +9077595326394996332524977 +2159936754163773508122732 +426809670586105698135317225 +3294516277260755029991322796 +14749983115477586453985047494 +692100641365100970093726483540 +9502478720578852594268790479747 +9062487417784678956874793130476 +352159971921852073191742323073689 +2270803770328639487517517910897872 +35166631277333300065883628523569361 +596441689792333324819903835359197616 +6933582360405829608479430394981956723 +0 +94 +825 +907 +62512 +633399 +3539412 +65712557 +329618801 +9052319971 +50117657456 +719515050973 +396081658001 +98762199564287 +537857673363391 +5701380917944903 +16144997029797264 +918603142053856533 +4437053492025674148 +76125560050255946142 +262504846798815931770 +688599520356200914010 +77509440962809216890090 +889672321539369676198789 +5795540531885308263478299 +88374255397211092706329509 +118231692173643319720953958 +6218036129497143746927154520 +3236727278542723274070894570 +72098882691751515204435662053 +8305331942254135876823981226459 +33980292322856768815329277766669 +154632353482145519952015208333866 +192400848794451940507964192401413 +69666401739718540927805290639731997 +545814355378177567662640611917018958 +4986776343571879972263664198494529846 diff --git a/tests/extra_required.txt b/tests/extra_required.txt index c498802ffae..038e6775d64 100644 --- a/tests/extra_required.txt +++ b/tests/extra_required.txt @@ -3,6 +3,7 @@ lib2 fib places rand +rand_limits scientific shift trunc diff --git a/tests/script.sh b/tests/script.sh index fef0c529061..c38cbabe9ad 100755 --- a/tests/script.sh +++ b/tests/script.sh @@ -190,11 +190,17 @@ else exit 0 fi - # This sed, and the script, are to remove an incompatibility with GNU bc, - # where GNU bc is wrong. See the development manual - # (manuals/development.md#script-tests) for more information. printf 'Generating %s results...' "$f" - printf '%s\n' "$halt" 2> /dev/null | "$d" "$s" | sed -n -f "$testdir/script.sed" > "$results" + + # This particular test needs to be generated straight. + if [ "$d" = "dc" ] && [ "$f" = "stream.dc" ]; then + printf '%s\n' "$halt" 2> /dev/null | "$d" "$s" > "$results" + else + # This sed, and the script, are to remove an incompatibility with GNU + # bc, where GNU bc is wrong. See the development manual + # (manuals/development.md#script-tests) for more information. + printf '%s\n' "$halt" 2> /dev/null | "$d" "$s" | sed -n -f "$testdir/script.sed" > "$results" + fi printf 'done\n' res="$results" fi From 0b4a06ab29a0da80f6cb5c99189054cb8e2f756c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Mon, 30 Oct 2023 10:10:24 +0100 Subject: [PATCH 06/14] vendor/bc: upgrade to version 6.7.2 This update improves the implementation of the power function p() and adds 3 new functions to the extended math library: min(), max(), and i2rand(). --- Makefile.in | 2 +- NEWS.md | 22 + configure.sh | 8 +- gen/lib2.bc | 45 +- include/bcl.h | 3 - include/version.h | 2 +- manuals/algorithms.md | 69 +++ manuals/bc/A.1 | 35 +- manuals/bc/A.1.md | 28 +- manuals/bc/E.1 | 3 +- manuals/bc/E.1.md | 2 +- manuals/bc/EH.1 | 3 +- manuals/bc/EH.1.md | 2 +- manuals/bc/EHN.1 | 3 +- manuals/bc/EHN.1.md | 2 +- manuals/bc/EN.1 | 3 +- manuals/bc/EN.1.md | 2 +- manuals/bc/H.1 | 35 +- manuals/bc/H.1.md | 28 +- manuals/bc/HN.1 | 35 +- manuals/bc/HN.1.md | 28 +- manuals/bc/N.1 | 35 +- manuals/bc/N.1.md | 28 +- src/num.c | 10 +- src/vm.c | 2 +- tests/bc/lib2.txt | 1 + tests/bc/lib2_results.txt | 4 +- tests/bc/scripts/all.txt | 1 + tests/bc/scripts/i2rand.bc | 29 + tests/bc/scripts/i2rand.txt | 1000 +++++++++++++++++++++++++++++++++++ tests/script.sh | 2 +- 31 files changed, 1390 insertions(+), 82 deletions(-) create mode 100644 tests/bc/scripts/i2rand.bc create mode 100644 tests/bc/scripts/i2rand.txt diff --git a/Makefile.in b/Makefile.in index 55e2e4a6270..e1309cd6d6b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -554,7 +554,7 @@ clean_config: clean clean_benchmarks clean_coverage: @printf 'Cleaning coverage files...\n' @$(RM) -f *.gcov - @$(RM) -f *.html + @$(RM) -f *.html *.css @$(RM) -f *.gcda *.gcno @$(RM) -f *.profraw @$(RM) -f $(GCDA) $(GCNO) diff --git a/NEWS.md b/NEWS.md index de3b35026fe..d4b160d74d3 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,27 @@ # News +## 6.7.2 + +This is a production release to remove some debugging code that I accidentally +committed. + +## 6.7.1 + +This is a production release with a bug fix for `SIGINT` only being handled +once. + +## 6.7.0 + +This is a production release with three new functions in the [extended math +library][16]: `min()`, `max()`, and `i2rand()`. + +## 6.6.1 + +This is a production release with an improved `p()` function in the [extended +math library][16]. + +Users who don't care do not need to upgrade. + ## 6.6.0 This is a production release with two bug fixes and one change. diff --git a/configure.sh b/configure.sh index 4ba957131d5..35d55058f8f 100755 --- a/configure.sh +++ b/configure.sh @@ -1364,13 +1364,7 @@ if [ "$debug" -eq 1 ]; then CFLAGS="-O0" fi - ccbase=$(basename "$CC") - - if [ "$ccbase" = "clang" ]; then - CFLAGS="-gdwarf-4 $CFLAGS" - else - CFLAGS="-g $CFLAGS" - fi + CFLAGS="-g $CFLAGS" else diff --git a/gen/lib2.bc b/gen/lib2.bc index ba3f76b1803..df51d0c07a8 100644 --- a/gen/lib2.bc +++ b/gen/lib2.bc @@ -34,10 +34,34 @@ */ define p(x,y){ - auto a + auto a,i,s,z + if(y==0)return 1@scale + if(x==0){ + if(y>0)return 0 + return 1/0 + } a=y$ if(y==a)return(x^a)@scale - return e(y*l(x)) + z=0 + if(x<1){ + y=-y + a=-a + z=x + x=1/x + } + if(y<0){ + return e(y*l(x)) + } + i=x^a + s=scale + scale+=length(i)+5 + if(z){ + x=1/z + i=x^a + } + i*=e((y-a)*l(x)) + scale=s + return i@scale } define r(x,p){ auto t,n @@ -66,6 +90,14 @@ define f(n){ for(r=1;n>1;--n)r*=n return r } +define max(a,b){ + if(a>b)return a + return b +} +define min(a,b){ + if(an)return 0 @@ -242,6 +274,15 @@ define frand(p){ return irand(A^p)>>p } define ifrand(i,p){return irand(abs(i)$)+frand(p)} +define i2rand(a,b){ + auto n,x + a=a$ + b=b$ + if(a==b)return a + n=min(a,b) + x=max(a,b) + return irand(x-n+1)+n +} define srand(x){ if(irand(2))return -x return x diff --git a/include/bcl.h b/include/bcl.h index 0908e215182..d3a9f42cdcf 100644 --- a/include/bcl.h +++ b/include/bcl.h @@ -36,9 +36,6 @@ #ifndef BC_BCL_H #define BC_BCL_H -// TODO: Add a generation index when building with Valgrind to check for -// use-after-free's or double frees. - #include #include #include diff --git a/include/version.h b/include/version.h index a4df383e284..1cd13e9878c 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.6.0 +#define VERSION 6.7.2 #endif // BC_VERSION_H diff --git a/manuals/algorithms.md b/manuals/algorithms.md index 4d7a0edc54c..ce27bf026b6 100644 --- a/manuals/algorithms.md +++ b/manuals/algorithms.md @@ -193,6 +193,74 @@ The algorithm used is to use the formula `e(y*l(x))`. It has a complexity of `O(n^3)` because both `e()` and `l()` do. +However, there are details to this algorithm, described by the author, +TediusTimmy, in GitHub issue [#69][12]. + +First, check if the exponent is 0. If it is, return 1 at the appropriate +`scale`. + +Next, check if the number is 0. If so, check if the exponent is greater than +zero; if it is, return 0. If the exponent is less than 0, error (with a divide +by 0) because that is undefined. + +Next, check if the exponent is actually an integer, and if it is, use the +exponentiation operator. + +At the `z=0` line is the start of the meat of the new code. + +`z` is set to zero as a flag and as a value. What I mean by that will be clear +later. + +Then we check if the number is less than 0. If it is, we negate the exponent +(and the integer version of the exponent, which we calculated earlier to check +if it was an integer). We also save the number in `z`; being non-zero is a flag +for later and a value to be used. Then we store the reciprocal of the number in +itself. + +All of the above paragraph will not make sense unless you remember the +relationship `l(x) == -l(1/x)`; we negated the exponent, which is equivalent to +the negative sign in that relationship, and we took the reciprocal of the +number, which is equivalent to the reciprocal in the relationship. + +But what if the number is negative? We ignore that for now because we eventually +call `l(x)`, which will raise an error if `x` is negative. + +Now, we can keep going. + +If at this point, the exponent is negative, we need to use the original formula +(`e(y * l(x))`) and return that result because the result will go to zero +anyway. + +But if we did *not* return, we know the exponent is *not* negative, so we can +get clever. + +We then compute the integral portion of the power by computing the number to +power of the integral portion of the exponent. + +Then we have the most clever trick: we add the length of that integer power (and +a little extra) to the `scale`. Why? Because this will ensure that the next part +is calculated to at least as many digits as should be in the integer *plus* any +extra `scale` that was wanted. + +Then we check `z`, which, if it is not zero, is the original value of the +number. If it is not zero, we need to take the take the reciprocal *again* +because now we have the correct `scale`. And we *also* have to calculate the +integer portion of the power again. + +Then we need to calculate the fractional portion of the number. We do this by +using the original formula, but we instead of calculating `e(y * l(x))`, we +calculate `e((y - a) * l(x))`, where `a` is the integer portion of `y`. It's +easy to see that `y - a` will be just the fractional portion of `y` (the +exponent), so this makes sense. + +But then we *multiply* it into the integer portion of the power. Why? Because +remember: we're dealing with an exponent and a power; the relationship is +`x^(y+z) == (x^y)*(x^z)`. + +So we multiply it into the integer portion of the power. + +Finally, we set the result to the `scale`. + ### Rounding (`bc` Math Library 2 Only) This is implemented in the function `r(x,p)`. @@ -327,3 +395,4 @@ It has a complexity of `O(n^3)` because of arctangent. [9]: https://en.wikipedia.org/wiki/Root-finding_algorithms#Newton's_method_(and_similar_derivative-based_methods) [10]: https://en.wikipedia.org/wiki/Euclidean_algorithm [11]: https://en.wikipedia.org/wiki/Atan2#Definition_and_computation +[12]: https://github.com/gavinhoward/bc/issues/69 diff --git a/manuals/bc/A.1 b/manuals/bc/A.1 index 5de2d3529bc..fc75b5c70ac 100644 --- a/manuals/bc/A.1 +++ b/manuals/bc/A.1 @@ -1357,8 +1357,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. @@ -1579,6 +1578,14 @@ the rounding mode round away from \f[B]0\f[R] \f[B]f(x)\f[R] Returns the factorial of the truncated absolute value of \f[B]x\f[R]. .TP +\f[B]max(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is greater than \f[B]b\f[R]; +otherwise, returns \f[B]b\f[R]. +.TP +\f[B]min(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is less than \f[B]b\f[R]; otherwise, +returns \f[B]b\f[R]. +.TP \f[B]perm(n, k)\f[R] Returns the permutation of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. @@ -1589,6 +1596,10 @@ Returns the combination of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. If not, it returns \f[B]0\f[R]. .TP +\f[B]fib(n)\f[R] +Returns the Fibonacci number of the truncated absolute value of +\f[B]n\f[R]. +.TP \f[B]l2(x)\f[R] Returns the logarithm base \f[B]2\f[R] of \f[B]x\f[R]. .RS @@ -1759,7 +1770,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random number between \f[B]0\f[R] (inclusive) and +Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1768,14 +1779,22 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random number that is between \f[B]0\f[R] (inclusive) -and the truncated absolute value of \f[B]i\f[R] (exclusive) with the -number of decimal digits after the decimal point equal to the truncated -absolute value of \f[B]p\f[R]. +Generates a pseudo-random integer that is between \f[B]0\f[R] +(inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) +with the number of decimal digits after the decimal point equal to the +truncated absolute value of \f[B]p\f[R]. If the absolute value of \f[B]i\f[R] is greater than or equal to \f[B]2\f[R], and \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will change the value of \f[B]seed\f[R]; otherwise, \f[B]0\f[R] -is returned and \f[B]seed\f[R] is not changed. +is returned, and \f[B]seed\f[R] is not changed. +.TP +\f[B]i2rand(a, b)\f[R] +Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them +as inclusive bounds to enerate a pseudo-random integer. +If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] +is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] +is \f[I]not\f[R] changed. +Otherwise, this function will change the value of \f[B]seed\f[R]. .TP \f[B]srand(x)\f[R] Returns \f[B]x\f[R] with its sign flipped with probability diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md index 3f34f451c9e..3e593e16b48 100644 --- a/manuals/bc/A.1.md +++ b/manuals/bc/A.1.md @@ -1068,7 +1068,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** @@ -1259,6 +1259,14 @@ The extended library is a **non-portable extension**. : Returns the factorial of the truncated absolute value of **x**. +**max(a, b)** + +: Returns **a** if **a** is greater than **b**; otherwise, returns **b**. + +**min(a, b)** + +: Returns **a** if **a** is less than **b**; otherwise, returns **b**. + **perm(n, k)** : Returns the permutation of the truncated absolute value of **n** of the @@ -1269,6 +1277,10 @@ The extended library is a **non-portable extension**. : Returns the combination of the truncated absolute value of **n** of the truncated absolute value of **k**, if **k \<= n**. If not, it returns **0**. +**fib(n)** + +: Returns the Fibonacci number of the truncated absolute value of **n**. + **l2(x)** : Returns the logarithm base **2** of **x**. @@ -1418,7 +1430,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random number between **0** (inclusive) and **1** +: Generates a pseudo-random integer between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1426,12 +1438,20 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random number that is between **0** (inclusive) and the +: Generates a pseudo-random integer that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and **p** is not **0**, then calling this function will change the value of - **seed**; otherwise, **0** is returned and **seed** is not changed. + **seed**; otherwise, **0** is returned, and **seed** is not changed. + +**i2rand(a, b)** + +: Takes the truncated value of **a** and **b** and uses them as inclusive + bounds to enerate a pseudo-random integer. If the difference of the + truncated values of **a** and **b** is **0**, then the truncated value is + returned, and **seed** is *not* changed. Otherwise, this function will + change the value of **seed**. **srand(x)** diff --git a/manuals/bc/E.1 b/manuals/bc/E.1 index ecb8b128712..24f49c701b4 100644 --- a/manuals/bc/E.1 +++ b/manuals/bc/E.1 @@ -1122,8 +1122,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. diff --git a/manuals/bc/E.1.md b/manuals/bc/E.1.md index 5411dcf6cc7..b5d77d2c76b 100644 --- a/manuals/bc/E.1.md +++ b/manuals/bc/E.1.md @@ -892,7 +892,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1 index 507e7f4a9a7..35672fe5c4e 100644 --- a/manuals/bc/EH.1 +++ b/manuals/bc/EH.1 @@ -1122,8 +1122,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. diff --git a/manuals/bc/EH.1.md b/manuals/bc/EH.1.md index 6f4c4326300..a8a42b06be2 100644 --- a/manuals/bc/EH.1.md +++ b/manuals/bc/EH.1.md @@ -892,7 +892,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1 index e00fcd578b1..72790726a4f 100644 --- a/manuals/bc/EHN.1 +++ b/manuals/bc/EHN.1 @@ -1122,8 +1122,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. diff --git a/manuals/bc/EHN.1.md b/manuals/bc/EHN.1.md index 6f7a3321020..a38767eb010 100644 --- a/manuals/bc/EHN.1.md +++ b/manuals/bc/EHN.1.md @@ -892,7 +892,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1 index ea842eac7e9..a972005515a 100644 --- a/manuals/bc/EN.1 +++ b/manuals/bc/EN.1 @@ -1122,8 +1122,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. diff --git a/manuals/bc/EN.1.md b/manuals/bc/EN.1.md index 189193bf2a0..1c8e855e6f5 100644 --- a/manuals/bc/EN.1.md +++ b/manuals/bc/EN.1.md @@ -892,7 +892,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** diff --git a/manuals/bc/H.1 b/manuals/bc/H.1 index d477dc8ab24..a26aee4f2d1 100644 --- a/manuals/bc/H.1 +++ b/manuals/bc/H.1 @@ -1357,8 +1357,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. @@ -1579,6 +1578,14 @@ the rounding mode round away from \f[B]0\f[R] \f[B]f(x)\f[R] Returns the factorial of the truncated absolute value of \f[B]x\f[R]. .TP +\f[B]max(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is greater than \f[B]b\f[R]; +otherwise, returns \f[B]b\f[R]. +.TP +\f[B]min(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is less than \f[B]b\f[R]; otherwise, +returns \f[B]b\f[R]. +.TP \f[B]perm(n, k)\f[R] Returns the permutation of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. @@ -1589,6 +1596,10 @@ Returns the combination of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. If not, it returns \f[B]0\f[R]. .TP +\f[B]fib(n)\f[R] +Returns the Fibonacci number of the truncated absolute value of +\f[B]n\f[R]. +.TP \f[B]l2(x)\f[R] Returns the logarithm base \f[B]2\f[R] of \f[B]x\f[R]. .RS @@ -1759,7 +1770,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random number between \f[B]0\f[R] (inclusive) and +Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1768,14 +1779,22 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random number that is between \f[B]0\f[R] (inclusive) -and the truncated absolute value of \f[B]i\f[R] (exclusive) with the -number of decimal digits after the decimal point equal to the truncated -absolute value of \f[B]p\f[R]. +Generates a pseudo-random integer that is between \f[B]0\f[R] +(inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) +with the number of decimal digits after the decimal point equal to the +truncated absolute value of \f[B]p\f[R]. If the absolute value of \f[B]i\f[R] is greater than or equal to \f[B]2\f[R], and \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will change the value of \f[B]seed\f[R]; otherwise, \f[B]0\f[R] -is returned and \f[B]seed\f[R] is not changed. +is returned, and \f[B]seed\f[R] is not changed. +.TP +\f[B]i2rand(a, b)\f[R] +Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them +as inclusive bounds to enerate a pseudo-random integer. +If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] +is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] +is \f[I]not\f[R] changed. +Otherwise, this function will change the value of \f[B]seed\f[R]. .TP \f[B]srand(x)\f[R] Returns \f[B]x\f[R] with its sign flipped with probability diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md index 2cb0b4eb27c..24cae156d4c 100644 --- a/manuals/bc/H.1.md +++ b/manuals/bc/H.1.md @@ -1068,7 +1068,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** @@ -1259,6 +1259,14 @@ The extended library is a **non-portable extension**. : Returns the factorial of the truncated absolute value of **x**. +**max(a, b)** + +: Returns **a** if **a** is greater than **b**; otherwise, returns **b**. + +**min(a, b)** + +: Returns **a** if **a** is less than **b**; otherwise, returns **b**. + **perm(n, k)** : Returns the permutation of the truncated absolute value of **n** of the @@ -1269,6 +1277,10 @@ The extended library is a **non-portable extension**. : Returns the combination of the truncated absolute value of **n** of the truncated absolute value of **k**, if **k \<= n**. If not, it returns **0**. +**fib(n)** + +: Returns the Fibonacci number of the truncated absolute value of **n**. + **l2(x)** : Returns the logarithm base **2** of **x**. @@ -1418,7 +1430,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random number between **0** (inclusive) and **1** +: Generates a pseudo-random integer between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1426,12 +1438,20 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random number that is between **0** (inclusive) and the +: Generates a pseudo-random integer that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and **p** is not **0**, then calling this function will change the value of - **seed**; otherwise, **0** is returned and **seed** is not changed. + **seed**; otherwise, **0** is returned, and **seed** is not changed. + +**i2rand(a, b)** + +: Takes the truncated value of **a** and **b** and uses them as inclusive + bounds to enerate a pseudo-random integer. If the difference of the + truncated values of **a** and **b** is **0**, then the truncated value is + returned, and **seed** is *not* changed. Otherwise, this function will + change the value of **seed**. **srand(x)** diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1 index 10d9621c42e..3f567180a16 100644 --- a/manuals/bc/HN.1 +++ b/manuals/bc/HN.1 @@ -1357,8 +1357,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. @@ -1579,6 +1578,14 @@ the rounding mode round away from \f[B]0\f[R] \f[B]f(x)\f[R] Returns the factorial of the truncated absolute value of \f[B]x\f[R]. .TP +\f[B]max(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is greater than \f[B]b\f[R]; +otherwise, returns \f[B]b\f[R]. +.TP +\f[B]min(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is less than \f[B]b\f[R]; otherwise, +returns \f[B]b\f[R]. +.TP \f[B]perm(n, k)\f[R] Returns the permutation of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. @@ -1589,6 +1596,10 @@ Returns the combination of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. If not, it returns \f[B]0\f[R]. .TP +\f[B]fib(n)\f[R] +Returns the Fibonacci number of the truncated absolute value of +\f[B]n\f[R]. +.TP \f[B]l2(x)\f[R] Returns the logarithm base \f[B]2\f[R] of \f[B]x\f[R]. .RS @@ -1759,7 +1770,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random number between \f[B]0\f[R] (inclusive) and +Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1768,14 +1779,22 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random number that is between \f[B]0\f[R] (inclusive) -and the truncated absolute value of \f[B]i\f[R] (exclusive) with the -number of decimal digits after the decimal point equal to the truncated -absolute value of \f[B]p\f[R]. +Generates a pseudo-random integer that is between \f[B]0\f[R] +(inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) +with the number of decimal digits after the decimal point equal to the +truncated absolute value of \f[B]p\f[R]. If the absolute value of \f[B]i\f[R] is greater than or equal to \f[B]2\f[R], and \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will change the value of \f[B]seed\f[R]; otherwise, \f[B]0\f[R] -is returned and \f[B]seed\f[R] is not changed. +is returned, and \f[B]seed\f[R] is not changed. +.TP +\f[B]i2rand(a, b)\f[R] +Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them +as inclusive bounds to enerate a pseudo-random integer. +If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] +is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] +is \f[I]not\f[R] changed. +Otherwise, this function will change the value of \f[B]seed\f[R]. .TP \f[B]srand(x)\f[R] Returns \f[B]x\f[R] with its sign flipped with probability diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md index 25f136a21e0..09ea524d95c 100644 --- a/manuals/bc/HN.1.md +++ b/manuals/bc/HN.1.md @@ -1068,7 +1068,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** @@ -1259,6 +1259,14 @@ The extended library is a **non-portable extension**. : Returns the factorial of the truncated absolute value of **x**. +**max(a, b)** + +: Returns **a** if **a** is greater than **b**; otherwise, returns **b**. + +**min(a, b)** + +: Returns **a** if **a** is less than **b**; otherwise, returns **b**. + **perm(n, k)** : Returns the permutation of the truncated absolute value of **n** of the @@ -1269,6 +1277,10 @@ The extended library is a **non-portable extension**. : Returns the combination of the truncated absolute value of **n** of the truncated absolute value of **k**, if **k \<= n**. If not, it returns **0**. +**fib(n)** + +: Returns the Fibonacci number of the truncated absolute value of **n**. + **l2(x)** : Returns the logarithm base **2** of **x**. @@ -1418,7 +1430,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random number between **0** (inclusive) and **1** +: Generates a pseudo-random integer between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1426,12 +1438,20 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random number that is between **0** (inclusive) and the +: Generates a pseudo-random integer that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and **p** is not **0**, then calling this function will change the value of - **seed**; otherwise, **0** is returned and **seed** is not changed. + **seed**; otherwise, **0** is returned, and **seed** is not changed. + +**i2rand(a, b)** + +: Takes the truncated value of **a** and **b** and uses them as inclusive + bounds to enerate a pseudo-random integer. If the difference of the + truncated values of **a** and **b** is **0**, then the truncated value is + returned, and **seed** is *not* changed. Otherwise, this function will + change the value of **seed**. **srand(x)** diff --git a/manuals/bc/N.1 b/manuals/bc/N.1 index f39e51277b6..79e053ec41f 100644 --- a/manuals/bc/N.1 +++ b/manuals/bc/N.1 @@ -1357,8 +1357,7 @@ Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement .PP -The \[lq]expressions in a \f[B]stream\f[R] statement may also be -strings. +The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string as though the string had appeared as its own statement. @@ -1579,6 +1578,14 @@ the rounding mode round away from \f[B]0\f[R] \f[B]f(x)\f[R] Returns the factorial of the truncated absolute value of \f[B]x\f[R]. .TP +\f[B]max(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is greater than \f[B]b\f[R]; +otherwise, returns \f[B]b\f[R]. +.TP +\f[B]min(a, b)\f[R] +Returns \f[B]a\f[R] if \f[B]a\f[R] is less than \f[B]b\f[R]; otherwise, +returns \f[B]b\f[R]. +.TP \f[B]perm(n, k)\f[R] Returns the permutation of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. @@ -1589,6 +1596,10 @@ Returns the combination of the truncated absolute value of \f[B]n\f[R] of the truncated absolute value of \f[B]k\f[R], if \f[B]k <= n\f[R]. If not, it returns \f[B]0\f[R]. .TP +\f[B]fib(n)\f[R] +Returns the Fibonacci number of the truncated absolute value of +\f[B]n\f[R]. +.TP \f[B]l2(x)\f[R] Returns the logarithm base \f[B]2\f[R] of \f[B]x\f[R]. .RS @@ -1759,7 +1770,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random number between \f[B]0\f[R] (inclusive) and +Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1768,14 +1779,22 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random number that is between \f[B]0\f[R] (inclusive) -and the truncated absolute value of \f[B]i\f[R] (exclusive) with the -number of decimal digits after the decimal point equal to the truncated -absolute value of \f[B]p\f[R]. +Generates a pseudo-random integer that is between \f[B]0\f[R] +(inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) +with the number of decimal digits after the decimal point equal to the +truncated absolute value of \f[B]p\f[R]. If the absolute value of \f[B]i\f[R] is greater than or equal to \f[B]2\f[R], and \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will change the value of \f[B]seed\f[R]; otherwise, \f[B]0\f[R] -is returned and \f[B]seed\f[R] is not changed. +is returned, and \f[B]seed\f[R] is not changed. +.TP +\f[B]i2rand(a, b)\f[R] +Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them +as inclusive bounds to enerate a pseudo-random integer. +If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] +is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] +is \f[I]not\f[R] changed. +Otherwise, this function will change the value of \f[B]seed\f[R]. .TP \f[B]srand(x)\f[R] Returns \f[B]x\f[R] with its sign flipped with probability diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md index 56a4b2274d2..d4a08817c95 100644 --- a/manuals/bc/N.1.md +++ b/manuals/bc/N.1.md @@ -1068,7 +1068,7 @@ like any other expression that is printed. ## Stream Statement -The "expressions in a **stream** statement may also be strings. +The expressions in a **stream** statement may also be strings. If a **stream** statement is given a string, it prints the string as though the string had appeared as its own statement. In other words, the **stream** @@ -1259,6 +1259,14 @@ The extended library is a **non-portable extension**. : Returns the factorial of the truncated absolute value of **x**. +**max(a, b)** + +: Returns **a** if **a** is greater than **b**; otherwise, returns **b**. + +**min(a, b)** + +: Returns **a** if **a** is less than **b**; otherwise, returns **b**. + **perm(n, k)** : Returns the permutation of the truncated absolute value of **n** of the @@ -1269,6 +1277,10 @@ The extended library is a **non-portable extension**. : Returns the combination of the truncated absolute value of **n** of the truncated absolute value of **k**, if **k \<= n**. If not, it returns **0**. +**fib(n)** + +: Returns the Fibonacci number of the truncated absolute value of **n**. + **l2(x)** : Returns the logarithm base **2** of **x**. @@ -1418,7 +1430,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random number between **0** (inclusive) and **1** +: Generates a pseudo-random integer between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1426,12 +1438,20 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random number that is between **0** (inclusive) and the +: Generates a pseudo-random integer that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and **p** is not **0**, then calling this function will change the value of - **seed**; otherwise, **0** is returned and **seed** is not changed. + **seed**; otherwise, **0** is returned, and **seed** is not changed. + +**i2rand(a, b)** + +: Takes the truncated value of **a** and **b** and uses them as inclusive + bounds to enerate a pseudo-random integer. If the difference of the + truncated values of **a** and **b** is **0**, then the truncated value is + returned, and **seed** is *not* changed. Otherwise, this function will + change the value of **seed**. **srand(x)** diff --git a/src/num.c b/src/num.c index 0a59707268d..e45aa62ddd0 100644 --- a/src/num.c +++ b/src/num.c @@ -2929,14 +2929,14 @@ bc_num_printExponent(const BcNum* restrict n, bool eng, bool newline) #endif // BC_ENABLE_EXTRA_MATH /** - * Converts a number from limbs with base BC_BASE_POW to base @a pow, where - * @a pow is obase^N. + * Takes a number with limbs with base BC_BASE_POW and converts the limb at the + * given index to base @a pow, where @a pow is obase^N. * @param n The number to convert. * @param rem BC_BASE_POW - @a pow. * @param pow The power of obase we will convert the number to. * @param idx The index of the number to start converting at. Doing the * conversion is O(n^2); we have to sweep through starting at the - * least significant limb + * least significant limb. */ static void bc_num_printFixup(BcNum* restrict n, BcBigDig rem, BcBigDig pow, size_t idx) @@ -2998,8 +2998,8 @@ bc_num_printFixup(BcNum* restrict n, BcBigDig rem, BcBigDig pow, size_t idx) } /** - * Prepares a number for printing in a base that is not a divisor of - * BC_BASE_POW. This basically converts the number from having limbs of base + * Prepares a number for printing in a base that does not have BC_BASE_POW as a + * power. This basically converts the number from having limbs of base * BC_BASE_POW to limbs of pow, where pow is obase^N. * @param n The number to prepare for printing. * @param rem The remainder of BC_BASE_POW when divided by a power of the base. diff --git a/src/vm.c b/src/vm.c index 41da0fd9260..f4cd82e3ee4 100644 --- a/src/vm.c +++ b/src/vm.c @@ -214,7 +214,7 @@ bc_vm_sigaction(void) struct sigaction sa; sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; + sa.sa_flags = BC_ENABLE_EDITLINE ? 0 : SA_NODEFER; // This mess is to silence a warning on Clang with regards to glibc's // sigaction handler, which activates the warning here. diff --git a/tests/bc/lib2.txt b/tests/bc/lib2.txt index 0032da1966f..74e1256d7bb 100644 --- a/tests/bc/lib2.txt +++ b/tests/bc/lib2.txt @@ -1,6 +1,7 @@ p(2, 8.0000) p(2, 8.0001) p(2, -8.0001) +p(1024,32.1) r(0, 0) r(0, 1) r(0, 100) diff --git a/tests/bc/lib2_results.txt b/tests/bc/lib2_results.txt index f0753aff31a..e5ddb51642a 100644 --- a/tests/bc/lib2_results.txt +++ b/tests/bc/lib2_results.txt @@ -1,6 +1,8 @@ 256.00000000000000000000 -256.01774518281640169821 +256.01774518281640171326 .00390597924876622489 +42719740718418201647900434123391042292054090447133055398940832156444\ +39451561281100045924173873151.99999999999999999999 0 0 0 diff --git a/tests/bc/scripts/all.txt b/tests/bc/scripts/all.txt index a226bed5423..0008d70193c 100644 --- a/tests/bc/scripts/all.txt +++ b/tests/bc/scripts/all.txt @@ -19,3 +19,4 @@ strings2.bc ifs.bc ifs2.bc afl1.bc +i2rand.bc diff --git a/tests/bc/scripts/i2rand.bc b/tests/bc/scripts/i2rand.bc new file mode 100644 index 00000000000..4af770dbc9c --- /dev/null +++ b/tests/bc/scripts/i2rand.bc @@ -0,0 +1,29 @@ +#! /usr/bin/bc -lq + +for (i = 0; i < 10; ++i) +{ + if (brand()) { + a = srand(ifrand(101, scale)) + } + else { + a = srand(irand(101)) + } + + if (brand()) { + b = srand(ifrand(101, scale)) + } + else { + b = srand(irand(101)) + } + + min = min(a$, b$) + max = max(a$, b$) + + for (j = 0; j < 100; ++j) + { + r = i2rand(a, b) + r >= min && r <= max + } +} + +halt diff --git a/tests/bc/scripts/i2rand.txt b/tests/bc/scripts/i2rand.txt new file mode 100644 index 00000000000..e2bb702d29f --- /dev/null +++ b/tests/bc/scripts/i2rand.txt @@ -0,0 +1,1000 @@ +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/tests/script.sh b/tests/script.sh index c38cbabe9ad..bd16ce7eb3c 100755 --- a/tests/script.sh +++ b/tests/script.sh @@ -132,7 +132,7 @@ fi # Skip the tests that require extra math if we don't have it. if [ "$run_extra_tests" -eq 0 ]; then - if [ "$f" = "rand.bc" ] || [ "$f" = "root.bc" ]; then + if [ "$f" = "rand.bc" ] || [ "$f" = "root.bc" ] || [ "$f" = "i2rand.bc" ]; then printf 'Skipping %s script: %s\n' "$d" "$f" exit 0 fi From a3f3a7b4dc80d577e4c8fc64dfbbb359d2e24228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Tue, 2 Jan 2024 14:05:20 +0100 Subject: [PATCH 07/14] vendor/bc: upgrade to version 6.7.4 Documentation updates only, no functional changes to the software. --- NEWS.md | 14 ++++- configure.sh | 18 +++--- include/version.h | 2 +- manuals/bc/A.1 | 139 +++++++++++++-------------------------------- manuals/bc/A.1.md | 20 +++---- manuals/bc/E.1 | 112 +++++++++--------------------------- manuals/bc/EH.1 | 110 +++++++++-------------------------- manuals/bc/EHN.1 | 109 +++++++++-------------------------- manuals/bc/EN.1 | 111 +++++++++--------------------------- manuals/bc/H.1 | 137 +++++++++++++------------------------------- manuals/bc/H.1.md | 20 +++---- manuals/bc/HN.1 | 136 +++++++++++++------------------------------- manuals/bc/HN.1.md | 20 +++---- manuals/bc/N.1 | 138 +++++++++++++------------------------------- manuals/bc/N.1.md | 20 +++---- manuals/bcl.3 | 43 +++----------- manuals/dc/A.1 | 49 ++-------------- manuals/dc/E.1 | 48 ++-------------- manuals/dc/EH.1 | 46 ++------------- manuals/dc/EHN.1 | 45 ++------------- manuals/dc/EN.1 | 47 ++------------- manuals/dc/H.1 | 47 ++------------- manuals/dc/HN.1 | 46 ++------------- manuals/dc/N.1 | 48 ++-------------- 24 files changed, 392 insertions(+), 1133 deletions(-) diff --git a/NEWS.md b/NEWS.md index d4b160d74d3..240e02f1138 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,17 @@ # News +## 6.7.4 + +This is a production release to fix problems in the `bc` manual. + +Users only need to update if desired. + +## 6.7.3 + +This is a production release to fix the library build on Mac OSX. + +Users on other platforms do *not* need to update. + ## 6.7.2 This is a production release to remove some debugging code that I accidentally @@ -773,7 +785,7 @@ function, `strdup()`, which is not in POSIX 2001, and it is in the X/Open System Interfaces group 2001. It is, however, in POSIX 2008, and since POSIX 2008 is old enough to be supported anywhere that I care, that should be the requirement. -Second, the BcVm global variable was put into `bss`. This actually slightly +Second, the `BcVm` global variable was put into `bss`. This actually slightly reduces the size of the executable from a massive code shrink, and it will stop `bc` from allocating a large set of memory when `bc` starts. diff --git a/configure.sh b/configure.sh index 35d55058f8f..9292f094bb1 100755 --- a/configure.sh +++ b/configure.sh @@ -461,7 +461,7 @@ find_src_files() { fi - _find_src_files_files=$(find "$scriptdir/src/" -depth -name "*.c" -print | LC_ALL=C sort) + _find_src_files_files=$(find "$scriptdir/src" -depth -name "*.c" -print | LC_ALL=C sort) _find_src_files_result="" @@ -772,7 +772,7 @@ predefined_build() { dc_default_digit_clamp=0;; GDH) - CFLAGS="-flto -Weverything -Wno-padded -Wno-unsafe-buffer-usage -Werror -pedantic -std=c11" + CFLAGS="-flto -Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories -Werror -pedantic -std=c11" bc_only=0 dc_only=0 coverage=0 @@ -806,7 +806,7 @@ predefined_build() { dc_default_digit_clamp=1;; DBG) - CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Werror -pedantic -std=c11" + CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories -Werror -pedantic -std=c11" bc_only=0 dc_only=0 coverage=0 @@ -1367,12 +1367,7 @@ if [ "$debug" -eq 1 ]; then CFLAGS="-g $CFLAGS" else - CPPFLAGS="-DNDEBUG $CPPFLAGS" - - if [ "$strip_bin" -ne 0 ]; then - LDFLAGS="-s $LDFLAGS" - fi fi # Set optimization CFLAGS. @@ -1694,6 +1689,11 @@ else apple="" fi +# We can't use the linker's strip flag on Mac OSX. +if [ "$debug" -eq 0 ] && [ "$apple" == "" ] && [ "$strip_bin" -ne 0 ]; then + LDFLAGS="-s $LDFLAGS" +fi + # Test OpenBSD. This is not in an if statement because regardless of whatever # the user says, we need to know if we are on OpenBSD to activate _BSD_SOURCE. # No, I cannot `#define _BSD_SOURCE` in a header because OpenBSD's patched GCC @@ -1866,6 +1866,8 @@ dc_tests=$(gen_std_test_targets dc) dc_script_tests=$(gen_script_test_targets dc) dc_err_tests=$(gen_err_test_targets dc) +printf 'unneeded: %s\n' "$unneeded" + # Print out the values; this is for debugging. printf 'Version: %s\n' "$version" diff --git a/include/version.h b/include/version.h index 1cd13e9878c..d481cb10abf 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.7.2 +#define VERSION 6.7.4 #endif // BC_VERSION_H diff --git a/manuals/bc/A.1 b/manuals/bc/A.1 index fc75b5c70ac..1810beaf929 100644 --- a/manuals/bc/A.1 +++ b/manuals/bc/A.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -48,7 +46,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -77,7 +74,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -189,19 +185,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -209,8 +202,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -228,12 +220,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], or \f[B]seed\f[R] globally for any @@ -251,11 +241,9 @@ If a function desires to not affect the sequence of pseudo-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP -.nf -\f[C] +.EX seed = seed -\f[R] -.fi +.EE .PP If the behavior of this option is desired for every run of bc(1), then users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this @@ -485,7 +473,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -502,7 +489,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -511,7 +497,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -519,13 +505,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -533,7 +518,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -618,7 +602,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -627,7 +610,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -684,7 +666,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -829,7 +810,6 @@ where a reproducible stream of pseudo-random numbers is \f[I]ESSENTIAL\f[R]. In any other case, use a non-seeded pseudo-random number generator. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -901,7 +881,6 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -1018,9 +997,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -1192,7 +1171,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1270,11 +1248,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1305,7 +1281,6 @@ run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options Printing numbers in scientific notation and/or engineering notation is a \f[B]non-portable extension\f[R]. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1324,7 +1299,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1356,7 +1330,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1370,17 +1343,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1389,28 +1359,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1438,18 +1403,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1465,15 +1427,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1483,7 +1442,6 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line @@ -1491,7 +1449,6 @@ flags are given, except that the extended math library is not available when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1544,7 +1501,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Extended Library -.PP The extended library is \f[I]not\f[R] loaded when the \f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] options are given since they are not part of the library defined by the @@ -1866,7 +1822,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot8(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]8\f[R] binary digits (1 unsigned byte). +though it has \f[B]8\f[R] binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1875,7 +1831,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot16(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]16\f[R] binary digits (2 unsigned bytes). +though it has \f[B]16\f[R] binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1884,7 +1840,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot32(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]32\f[R] binary digits (4 unsigned bytes). +though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1893,7 +1849,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot64(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]64\f[R] binary digits (8 unsigned bytes). +though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1921,7 +1877,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev8(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 8 binary digits (1 unsigned byte). +though it has 8 binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1930,7 +1886,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev16(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 16 binary digits (2 unsigned bytes). +though it has 16 binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1939,7 +1895,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev32(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 32 binary digits (4 unsigned bytes). +though it has 32 binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1948,7 +1904,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev64(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 64 binary digits (8 unsigned bytes). +though it has 64 binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2001,7 +1957,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol32(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]32\f[R]. .RS @@ -2012,7 +1968,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol64(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]64\f[R]. .RS @@ -2457,7 +2413,6 @@ This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -2513,7 +2468,6 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -2534,7 +2488,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -2557,7 +2510,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -2626,7 +2578,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -2765,7 +2716,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -2844,7 +2794,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -2858,7 +2807,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -2882,7 +2830,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the @@ -2890,7 +2837,6 @@ a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -2911,7 +2857,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -2946,7 +2891,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP bc(1) supports interactive command-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -2964,14 +2908,11 @@ the arrow keys. .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH LOCALES -.PP This bc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -2991,13 +2932,13 @@ the value of \f[B]LC_NUMERIC\f[R]. This bc(1) supports error messages for different locales, and thus, it supports \f[B]LC_MESSAGES\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md index 3e593e16b48..77004822f73 100644 --- a/manuals/bc/A.1.md +++ b/manuals/bc/A.1.md @@ -1513,7 +1513,7 @@ The extended library is a **non-portable extension**. **bnot8(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **8** binary digits (1 unsigned byte). + **8** binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1521,7 +1521,7 @@ The extended library is a **non-portable extension**. **bnot16(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **16** binary digits (2 unsigned bytes). + **16** binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1529,7 +1529,7 @@ The extended library is a **non-portable extension**. **bnot32(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **32** binary digits (4 unsigned bytes). + **32** binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1537,7 +1537,7 @@ The extended library is a **non-portable extension**. **bnot64(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **64** binary digits (8 unsigned bytes). + **64** binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1561,7 +1561,7 @@ The extended library is a **non-portable extension**. **brev8(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 8 binary digits (1 unsigned byte). + has 8 binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1569,7 +1569,7 @@ The extended library is a **non-portable extension**. **brev16(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 16 binary digits (2 unsigned bytes). + has 16 binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1577,7 +1577,7 @@ The extended library is a **non-portable extension**. **brev32(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 32 binary digits (4 unsigned bytes). + has 32 binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1585,7 +1585,7 @@ The extended library is a **non-portable extension**. **brev64(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 64 binary digits (8 unsigned bytes). + has 64 binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1632,7 +1632,7 @@ The extended library is a **non-portable extension**. **brol32(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **32** binary digits (**2** unsigned bytes), by the number of + though it has **32** binary digits (**4** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **32**. @@ -1642,7 +1642,7 @@ The extended library is a **non-portable extension**. **brol64(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **64** binary digits (**2** unsigned bytes), by the number of + though it has **64** binary digits (**8** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **64**. diff --git a/manuals/bc/E.1 b/manuals/bc/E.1 index 24f49c701b4..549c1adae8a 100644 --- a/manuals/bc/E.1 +++ b/manuals/bc/E.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -44,7 +42,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -73,7 +70,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -174,19 +170,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -194,8 +187,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -209,12 +201,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], or \f[B]scale\f[R] globally for any other purpose, it @@ -441,7 +431,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -458,7 +447,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -467,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -475,13 +463,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -489,7 +476,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -568,7 +554,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -577,7 +562,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -606,7 +590,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -710,7 +693,6 @@ otherwise. See the \f[B]OPTIONS\f[R] section. This is a \f[B]non-portable extension\f[R]. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -758,7 +740,6 @@ and is meant to provide an easy way to set the current \f[B]ibase\f[R] If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -848,9 +829,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -971,7 +952,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1049,11 +1029,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1070,7 +1048,6 @@ command. .PP An expression by itself is evaluated and printed, followed by a newline. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1089,7 +1066,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1121,7 +1097,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1135,17 +1110,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1154,28 +1126,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1203,18 +1170,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1230,15 +1194,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1248,11 +1209,9 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line flags are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1305,7 +1264,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -1333,7 +1291,6 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1354,7 +1311,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -1377,7 +1333,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -1441,7 +1396,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -1580,7 +1534,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1657,7 +1610,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -1671,7 +1623,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -1695,7 +1646,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the @@ -1703,7 +1653,6 @@ a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1724,7 +1673,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1759,7 +1707,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP bc(1) supports interactive command-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -1777,14 +1724,11 @@ the arrow keys. .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH LOCALES -.PP This bc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -1804,13 +1748,13 @@ the value of \f[B]LC_NUMERIC\f[R]. This bc(1) supports error messages for different locales, and thus, it supports \f[B]LC_MESSAGES\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1 index 35672fe5c4e..e939df81cff 100644 --- a/manuals/bc/EH.1 +++ b/manuals/bc/EH.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -44,7 +42,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -73,7 +70,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -174,19 +170,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -194,8 +187,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -209,12 +201,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], or \f[B]scale\f[R] globally for any other purpose, it @@ -441,7 +431,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -458,7 +447,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -467,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -475,13 +463,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -489,7 +476,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -568,7 +554,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -577,7 +562,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -606,7 +590,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -710,7 +693,6 @@ otherwise. See the \f[B]OPTIONS\f[R] section. This is a \f[B]non-portable extension\f[R]. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -758,7 +740,6 @@ and is meant to provide an easy way to set the current \f[B]ibase\f[R] If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -848,9 +829,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -971,7 +952,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1049,11 +1029,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1070,7 +1048,6 @@ command. .PP An expression by itself is evaluated and printed, followed by a newline. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1089,7 +1066,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1121,7 +1097,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1135,17 +1110,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1154,28 +1126,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1203,18 +1170,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1230,15 +1194,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1248,11 +1209,9 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line flags are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1305,7 +1264,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -1333,7 +1291,6 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1354,7 +1311,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -1377,7 +1333,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -1441,7 +1396,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -1580,7 +1534,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1657,7 +1610,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -1671,7 +1623,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -1695,7 +1646,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1716,7 +1666,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1748,14 +1697,11 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause bc(1) to clean up and exit, and it uses the default handler for all other signals. .SH LOCALES -.PP This bc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -1775,13 +1721,13 @@ the value of \f[B]LC_NUMERIC\f[R]. This bc(1) supports error messages for different locales, and thus, it supports \f[B]LC_MESSAGES\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1 index 72790726a4f..290aec48a6e 100644 --- a/manuals/bc/EHN.1 +++ b/manuals/bc/EHN.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -44,7 +42,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -73,7 +70,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -174,19 +170,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -194,8 +187,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -209,12 +201,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], or \f[B]scale\f[R] globally for any other purpose, it @@ -441,7 +431,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -458,7 +447,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -467,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -475,13 +463,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -489,7 +476,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -568,7 +554,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -577,7 +562,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -606,7 +590,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -710,7 +693,6 @@ otherwise. See the \f[B]OPTIONS\f[R] section. This is a \f[B]non-portable extension\f[R]. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -758,7 +740,6 @@ and is meant to provide an easy way to set the current \f[B]ibase\f[R] If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -848,9 +829,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -971,7 +952,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1049,11 +1029,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1070,7 +1048,6 @@ command. .PP An expression by itself is evaluated and printed, followed by a newline. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1089,7 +1066,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1121,7 +1097,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1135,17 +1110,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1154,28 +1126,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1203,18 +1170,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1230,15 +1194,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1248,11 +1209,9 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line flags are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1305,7 +1264,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -1333,7 +1291,6 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1354,7 +1311,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -1377,7 +1333,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -1441,7 +1396,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -1580,7 +1534,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1657,7 +1610,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -1671,7 +1623,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -1695,7 +1646,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1716,7 +1666,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1748,10 +1697,8 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause bc(1) to clean up and exit, and it uses the default handler for all other signals. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -1768,13 +1715,13 @@ Note that the specification explicitly says that bc(1) only accepts numbers that use a period (\f[B].\f[R]) as a radix point, regardless of the value of \f[B]LC_NUMERIC\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1 index a972005515a..99ccb822ea7 100644 --- a/manuals/bc/EN.1 +++ b/manuals/bc/EN.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -44,7 +42,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -73,7 +70,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -174,19 +170,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -194,8 +187,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -209,12 +201,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], or \f[B]scale\f[R] globally for any other purpose, it @@ -441,7 +431,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -458,7 +447,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -467,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -475,13 +463,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -489,7 +476,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -568,7 +554,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -577,7 +562,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -606,7 +590,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -710,7 +693,6 @@ otherwise. See the \f[B]OPTIONS\f[R] section. This is a \f[B]non-portable extension\f[R]. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -758,7 +740,6 @@ and is meant to provide an easy way to set the current \f[B]ibase\f[R] If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -848,9 +829,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -971,7 +952,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1049,11 +1029,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1070,7 +1048,6 @@ command. .PP An expression by itself is evaluated and printed, followed by a newline. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1089,7 +1066,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1121,7 +1097,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1135,17 +1110,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1154,28 +1126,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1203,18 +1170,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1230,15 +1194,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1248,11 +1209,9 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line flags are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1305,7 +1264,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -1333,7 +1291,6 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1354,7 +1311,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -1377,7 +1333,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -1441,7 +1396,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -1580,7 +1534,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1657,7 +1610,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -1671,7 +1623,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -1695,7 +1646,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the @@ -1703,7 +1653,6 @@ a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1724,7 +1673,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1759,7 +1707,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP bc(1) supports interactive command-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -1777,10 +1724,8 @@ the arrow keys. .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -1797,13 +1742,13 @@ Note that the specification explicitly says that bc(1) only accepts numbers that use a period (\f[B].\f[R]) as a radix point, regardless of the value of \f[B]LC_NUMERIC\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/H.1 b/manuals/bc/H.1 index a26aee4f2d1..13b2caf84e1 100644 --- a/manuals/bc/H.1 +++ b/manuals/bc/H.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -48,7 +46,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -77,7 +74,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -189,19 +185,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -209,8 +202,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -228,12 +220,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], or \f[B]seed\f[R] globally for any @@ -251,11 +241,9 @@ If a function desires to not affect the sequence of pseudo-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP -.nf -\f[C] +.EX seed = seed -\f[R] -.fi +.EE .PP If the behavior of this option is desired for every run of bc(1), then users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this @@ -485,7 +473,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -502,7 +489,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -511,7 +497,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -519,13 +505,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -533,7 +518,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -618,7 +602,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -627,7 +610,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -684,7 +666,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -829,7 +810,6 @@ where a reproducible stream of pseudo-random numbers is \f[I]ESSENTIAL\f[R]. In any other case, use a non-seeded pseudo-random number generator. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -901,7 +881,6 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -1018,9 +997,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -1192,7 +1171,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1270,11 +1248,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1305,7 +1281,6 @@ run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options Printing numbers in scientific notation and/or engineering notation is a \f[B]non-portable extension\f[R]. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1324,7 +1299,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1356,7 +1330,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1370,17 +1343,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1389,28 +1359,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1438,18 +1403,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1465,15 +1427,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1483,7 +1442,6 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line @@ -1491,7 +1449,6 @@ flags are given, except that the extended math library is not available when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1544,7 +1501,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Extended Library -.PP The extended library is \f[I]not\f[R] loaded when the \f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] options are given since they are not part of the library defined by the @@ -1866,7 +1822,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot8(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]8\f[R] binary digits (1 unsigned byte). +though it has \f[B]8\f[R] binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1875,7 +1831,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot16(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]16\f[R] binary digits (2 unsigned bytes). +though it has \f[B]16\f[R] binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1884,7 +1840,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot32(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]32\f[R] binary digits (4 unsigned bytes). +though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1893,7 +1849,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot64(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]64\f[R] binary digits (8 unsigned bytes). +though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1921,7 +1877,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev8(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 8 binary digits (1 unsigned byte). +though it has 8 binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1930,7 +1886,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev16(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 16 binary digits (2 unsigned bytes). +though it has 16 binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1939,7 +1895,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev32(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 32 binary digits (4 unsigned bytes). +though it has 32 binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1948,7 +1904,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev64(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 64 binary digits (8 unsigned bytes). +though it has 64 binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2001,7 +1957,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol32(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]32\f[R]. .RS @@ -2012,7 +1968,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol64(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]64\f[R]. .RS @@ -2457,7 +2413,6 @@ This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -2513,7 +2468,6 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -2534,7 +2488,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -2557,7 +2510,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -2626,7 +2578,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -2765,7 +2716,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -2844,7 +2794,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -2858,7 +2807,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -2882,7 +2830,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -2903,7 +2850,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -2935,14 +2881,11 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause bc(1) to clean up and exit, and it uses the default handler for all other signals. .SH LOCALES -.PP This bc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -2962,13 +2905,13 @@ the value of \f[B]LC_NUMERIC\f[R]. This bc(1) supports error messages for different locales, and thus, it supports \f[B]LC_MESSAGES\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md index 24cae156d4c..970fc5e584a 100644 --- a/manuals/bc/H.1.md +++ b/manuals/bc/H.1.md @@ -1513,7 +1513,7 @@ The extended library is a **non-portable extension**. **bnot8(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **8** binary digits (1 unsigned byte). + **8** binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1521,7 +1521,7 @@ The extended library is a **non-portable extension**. **bnot16(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **16** binary digits (2 unsigned bytes). + **16** binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1529,7 +1529,7 @@ The extended library is a **non-portable extension**. **bnot32(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **32** binary digits (4 unsigned bytes). + **32** binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1537,7 +1537,7 @@ The extended library is a **non-portable extension**. **bnot64(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **64** binary digits (8 unsigned bytes). + **64** binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1561,7 +1561,7 @@ The extended library is a **non-portable extension**. **brev8(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 8 binary digits (1 unsigned byte). + has 8 binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1569,7 +1569,7 @@ The extended library is a **non-portable extension**. **brev16(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 16 binary digits (2 unsigned bytes). + has 16 binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1577,7 +1577,7 @@ The extended library is a **non-portable extension**. **brev32(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 32 binary digits (4 unsigned bytes). + has 32 binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1585,7 +1585,7 @@ The extended library is a **non-portable extension**. **brev64(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 64 binary digits (8 unsigned bytes). + has 64 binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1632,7 +1632,7 @@ The extended library is a **non-portable extension**. **brol32(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **32** binary digits (**2** unsigned bytes), by the number of + though it has **32** binary digits (**4** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **32**. @@ -1642,7 +1642,7 @@ The extended library is a **non-portable extension**. **brol64(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **64** binary digits (**2** unsigned bytes), by the number of + though it has **64** binary digits (**8** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **64**. diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1 index 3f567180a16..3373fd9ac8c 100644 --- a/manuals/bc/HN.1 +++ b/manuals/bc/HN.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -48,7 +46,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -77,7 +74,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -189,19 +185,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -209,8 +202,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -228,12 +220,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], or \f[B]seed\f[R] globally for any @@ -251,11 +241,9 @@ If a function desires to not affect the sequence of pseudo-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP -.nf -\f[C] +.EX seed = seed -\f[R] -.fi +.EE .PP If the behavior of this option is desired for every run of bc(1), then users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this @@ -485,7 +473,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -502,7 +489,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -511,7 +497,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -519,13 +505,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -533,7 +518,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -618,7 +602,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -627,7 +610,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -684,7 +666,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -829,7 +810,6 @@ where a reproducible stream of pseudo-random numbers is \f[I]ESSENTIAL\f[R]. In any other case, use a non-seeded pseudo-random number generator. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -901,7 +881,6 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -1018,9 +997,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -1192,7 +1171,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1270,11 +1248,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1305,7 +1281,6 @@ run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options Printing numbers in scientific notation and/or engineering notation is a \f[B]non-portable extension\f[R]. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1324,7 +1299,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1356,7 +1330,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1370,17 +1343,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1389,28 +1359,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1438,18 +1403,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1465,15 +1427,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1483,7 +1442,6 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line @@ -1491,7 +1449,6 @@ flags are given, except that the extended math library is not available when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1544,7 +1501,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Extended Library -.PP The extended library is \f[I]not\f[R] loaded when the \f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] options are given since they are not part of the library defined by the @@ -1866,7 +1822,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot8(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]8\f[R] binary digits (1 unsigned byte). +though it has \f[B]8\f[R] binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1875,7 +1831,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot16(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]16\f[R] binary digits (2 unsigned bytes). +though it has \f[B]16\f[R] binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1884,7 +1840,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot32(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]32\f[R] binary digits (4 unsigned bytes). +though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1893,7 +1849,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot64(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]64\f[R] binary digits (8 unsigned bytes). +though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1921,7 +1877,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev8(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 8 binary digits (1 unsigned byte). +though it has 8 binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1930,7 +1886,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev16(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 16 binary digits (2 unsigned bytes). +though it has 16 binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1939,7 +1895,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev32(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 32 binary digits (4 unsigned bytes). +though it has 32 binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1948,7 +1904,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev64(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 64 binary digits (8 unsigned bytes). +though it has 64 binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2001,7 +1957,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol32(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]32\f[R]. .RS @@ -2012,7 +1968,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol64(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]64\f[R]. .RS @@ -2457,7 +2413,6 @@ This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -2513,7 +2468,6 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -2534,7 +2488,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -2557,7 +2510,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -2626,7 +2578,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -2765,7 +2716,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -2844,7 +2794,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -2858,7 +2807,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -2882,7 +2830,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -2903,7 +2850,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -2935,10 +2881,8 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause bc(1) to clean up and exit, and it uses the default handler for all other signals. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -2955,13 +2899,13 @@ Note that the specification explicitly says that bc(1) only accepts numbers that use a period (\f[B].\f[R]) as a radix point, regardless of the value of \f[B]LC_NUMERIC\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md index 09ea524d95c..2b3b0d6aa3e 100644 --- a/manuals/bc/HN.1.md +++ b/manuals/bc/HN.1.md @@ -1513,7 +1513,7 @@ The extended library is a **non-portable extension**. **bnot8(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **8** binary digits (1 unsigned byte). + **8** binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1521,7 +1521,7 @@ The extended library is a **non-portable extension**. **bnot16(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **16** binary digits (2 unsigned bytes). + **16** binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1529,7 +1529,7 @@ The extended library is a **non-portable extension**. **bnot32(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **32** binary digits (4 unsigned bytes). + **32** binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1537,7 +1537,7 @@ The extended library is a **non-portable extension**. **bnot64(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **64** binary digits (8 unsigned bytes). + **64** binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1561,7 +1561,7 @@ The extended library is a **non-portable extension**. **brev8(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 8 binary digits (1 unsigned byte). + has 8 binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1569,7 +1569,7 @@ The extended library is a **non-portable extension**. **brev16(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 16 binary digits (2 unsigned bytes). + has 16 binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1577,7 +1577,7 @@ The extended library is a **non-portable extension**. **brev32(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 32 binary digits (4 unsigned bytes). + has 32 binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1585,7 +1585,7 @@ The extended library is a **non-portable extension**. **brev64(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 64 binary digits (8 unsigned bytes). + has 64 binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1632,7 +1632,7 @@ The extended library is a **non-portable extension**. **brol32(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **32** binary digits (**2** unsigned bytes), by the number of + though it has **32** binary digits (**4** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **32**. @@ -1642,7 +1642,7 @@ The extended library is a **non-portable extension**. **brol64(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **64** binary digits (**2** unsigned bytes), by the number of + though it has **64** binary digits (**8** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **64**. diff --git a/manuals/bc/N.1 b/manuals/bc/N.1 index 79e053ec41f..7628c50cb4f 100644 --- a/manuals/bc/N.1 +++ b/manuals/bc/N.1 @@ -25,14 +25,12 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -.PP bc - arbitrary-precision decimal arithmetic language and calculator .SH SYNOPSIS -.PP \f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] [\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] @@ -48,7 +46,6 @@ bc - arbitrary-precision decimal arithmetic language and calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) @@ -77,7 +74,6 @@ If parsing scripts meant for other bc(1) implementations still does not work, that is a bug and should be reported. See the \f[B]BUGS\f[R] section. .SH OPTIONS -.PP The following are the options that bc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -189,19 +185,16 @@ without worrying that the change will affect other functions. Thus, a hypothetical function named \f[B]output(x,b)\f[R] that simply printed \f[B]x\f[R] in base \f[B]b\f[R] could be written like this: .IP -.nf -\f[C] +.EX define void output(x, b) { obase=b x } -\f[R] -.fi +.EE .PP instead of like this: .IP -.nf -\f[C] +.EX define void output(x, b) { auto c c=obase @@ -209,8 +202,7 @@ define void output(x, b) { x obase=c } -\f[R] -.fi +.EE .PP This makes writing functions much easier. .PP @@ -228,12 +220,10 @@ converter, it is possible to replace that capability with various shell aliases. Examples: .IP -.nf -\f[C] +.EX alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] -\f[R] -.fi +.EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], or \f[B]seed\f[R] globally for any @@ -251,11 +241,9 @@ If a function desires to not affect the sequence of pseudo-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP -.nf -\f[C] +.EX seed = seed -\f[R] -.fi +.EE .PP If the behavior of this option is desired for every run of bc(1), then users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this @@ -485,7 +473,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then bc(1) reads from \f[B]stdin\f[R]. @@ -502,7 +489,6 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -511,7 +497,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -519,13 +505,12 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -533,7 +518,6 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP The syntax for bc(1) programs is mostly C-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this @@ -618,7 +602,6 @@ These are \f[B]non-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments -.PP There are two kinds of comments: .IP "1." 3 Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. @@ -627,7 +610,6 @@ Line comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SS Named Expressions -.PP The following are named expressions in bc(1): .IP "1." 3 Variables: \f[B]I\f[R] @@ -684,7 +666,6 @@ Named expressions are required as the operand of of \f[B]assignment\f[R] operators (see the \f[I]Operators\f[R] subsection). .SS Operands -.PP The following are valid operands in bc(1): .IP " 1." 4 Numbers (see the \f[I]Numbers\f[R] subsection below). @@ -829,7 +810,6 @@ where a reproducible stream of pseudo-random numbers is \f[I]ESSENTIAL\f[R]. In any other case, use a non-seeded pseudo-random number generator. .SS Numbers -.PP Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]BC_NUM_MAX\f[R] digits. @@ -901,7 +881,6 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SS Operators -.PP The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. @@ -1018,9 +997,9 @@ The operators will be described in more detail below. .TP \f[B]++\f[R] \f[B]--\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] -operators behave exactly like they would in C. -They require a named expression (see the \f[I]Named Expressions\f[R] -subsection) as an operand. +operators behave exactly like they would in C. They require a named +expression (see the \f[I]Named Expressions\f[R] subsection) as an +operand. .RS .PP The prefix versions of these operators are more efficient; use them @@ -1192,7 +1171,6 @@ This is \f[I]not\f[R] a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Statements -.PP The following items are statements: .IP " 1." 4 \f[B]E\f[R] @@ -1270,11 +1248,9 @@ occur before the \f[B]quit\f[R] statement before exiting. .PP In other words, for the bc(1) code below: .IP -.nf -\f[C] +.EX for (i = 0; i < 3; ++i) i; quit -\f[R] -.fi +.EE .PP Other bc(1) implementations will print nothing, and this bc(1) will print \f[B]0\f[R], \f[B]1\f[R], and \f[B]2\f[R] on successive lines @@ -1305,7 +1281,6 @@ run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options Printing numbers in scientific notation and/or engineering notation is a \f[B]non-portable extension\f[R]. .SS Strings -.PP If strings appear as a statement by themselves, they are printed without a trailing newline. .PP @@ -1324,7 +1299,6 @@ resets (see the \f[B]RESET\f[R] section). Assigning strings to variables and array elements and passing them to functions are \f[B]non-portable extensions\f[R]. .SS Print Statement -.PP The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. If they are, there are backslash escape sequences that are interpreted @@ -1356,7 +1330,6 @@ character to be printed as-is. Any non-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement -.PP The expressions in a \f[B]stream\f[R] statement may also be strings. .PP If a \f[B]stream\f[R] statement is given a string, it prints the string @@ -1370,17 +1343,14 @@ The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each digit is interpreted as an 8-bit ASCII character, making it a byte stream. .SS Order of Evaluation -.PP All expressions in a statment are evaluated left to right, except as necessary to maintain order of operations. This means, for example, assuming that \f[B]i\f[R] is equal to \f[B]0\f[R], in the expression .IP -.nf -\f[C] +.EX a[i++] = i++ -\f[R] -.fi +.EE .PP the first (or 0th) element of \f[B]a\f[R] is set to \f[B]1\f[R], and \f[B]i\f[R] is equal to \f[B]2\f[R] at the end of the expression. @@ -1389,28 +1359,23 @@ This includes function arguments. Thus, assuming \f[B]i\f[R] is equal to \f[B]0\f[R], this means that in the expression .IP -.nf -\f[C] +.EX x(i++, i++) -\f[R] -.fi +.EE .PP the first argument passed to \f[B]x()\f[R] is \f[B]0\f[R], and the second argument is \f[B]1\f[R], while \f[B]i\f[R] is equal to \f[B]2\f[R] before the function starts executing. .SH FUNCTIONS -.PP Function definitions are as follows: .IP -.nf -\f[C] +.EX define I(I,...,I){ auto I,...,I S;...;S return(E) } -\f[R] -.fi +.EE .PP Any \f[B]I\f[R] in the parameter list or \f[B]auto\f[R] list may be replaced with \f[B]I[]\f[R] to make a parameter or \f[B]auto\f[R] var an @@ -1438,18 +1403,15 @@ equivalent to \f[B]return (0)\f[R], unless the function is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection below). .SS Void Functions -.PP Functions can also be \f[B]void\f[R] functions, defined as follows: .IP -.nf -\f[C] +.EX define void I(I,...,I){ auto I,...,I S;...;S return } -\f[R] -.fi +.EE .PP They can only be used as standalone expressions, where such an expression would be printed alone, except in a print statement. @@ -1465,15 +1427,12 @@ The word \[lq]void\[rq] is only treated specially right after the .PP This is a \f[B]non-portable extension\f[R]. .SS Array References -.PP For any array in the parameter list, if the array is declared in the form .IP -.nf -\f[C] +.EX *I[] -\f[R] -.fi +.EE .PP it is a \f[B]reference\f[R]. Any changes to the array in the function are reflected, when the @@ -1483,7 +1442,6 @@ Other than this, all function arguments are passed by value. .PP This is a \f[B]non-portable extension\f[R]. .SH LIBRARY -.PP All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line @@ -1491,7 +1449,6 @@ flags are given, except that the extended math library is not available when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents are given. .SS Standard Library -.PP The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: .TP @@ -1544,7 +1501,6 @@ This is a transcendental function (see the \f[I]Transcendental Functions\f[R] subsection below). .RE .SS Extended Library -.PP The extended library is \f[I]not\f[R] loaded when the \f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] options are given since they are not part of the library defined by the @@ -1866,7 +1822,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot8(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]8\f[R] binary digits (1 unsigned byte). +though it has \f[B]8\f[R] binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1875,7 +1831,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot16(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]16\f[R] binary digits (2 unsigned bytes). +though it has \f[B]16\f[R] binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1884,7 +1840,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot32(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]32\f[R] binary digits (4 unsigned bytes). +though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1893,7 +1849,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]bnot64(x)\f[R] Does a bitwise not of the truncated absolute value of \f[B]x\f[R] as -though it has \f[B]64\f[R] binary digits (8 unsigned bytes). +though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1921,7 +1877,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev8(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 8 binary digits (1 unsigned byte). +though it has 8 binary digits (\f[B]1\f[R] unsigned byte). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1930,7 +1886,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev16(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 16 binary digits (2 unsigned bytes). +though it has 16 binary digits (\f[B]2\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1939,7 +1895,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev32(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 32 binary digits (4 unsigned bytes). +though it has 32 binary digits (\f[B]4\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1948,7 +1904,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brev64(x)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has 64 binary digits (8 unsigned bytes). +though it has 64 binary digits (\f[B]8\f[R] unsigned bytes). .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2001,7 +1957,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol32(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]32\f[R] binary digits (\f[B]4\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]32\f[R]. .RS @@ -2012,7 +1968,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brol64(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]2\f[R] +\f[B]x\f[R], as though it has \f[B]64\f[R] binary digits (\f[B]8\f[R] unsigned bytes), by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by \f[B]2\f[R] to the power of \f[B]64\f[R]. .RS @@ -2457,7 +2413,6 @@ This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). .RE .SS Transcendental Functions -.PP All transcendental functions can return slightly inaccurate results, up to 1 ULP (https://en.wikipedia.org/wiki/Unit_in_the_last_place). This is unavoidable, and the article at @@ -2513,7 +2468,6 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -.PP When bc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -2534,7 +2488,6 @@ Note that this reset behavior is different from the GNU bc(1), which attempts to start executing the statement right after the one that caused an error. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This bc(1) does something different. @@ -2557,7 +2510,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bc(1): .TP \f[B]BC_LONG_BIT\f[R] @@ -2626,7 +2578,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP @@ -2765,7 +2716,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP bc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -2844,7 +2794,6 @@ These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] @@ -2858,7 +2807,6 @@ bc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, bc(1) can turn on TTY mode, subject to some @@ -2882,7 +2830,6 @@ required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the @@ -2890,7 +2837,6 @@ a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -2911,7 +2857,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause bc(1) to do one of two things. .PP If bc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -2946,7 +2891,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP bc(1) supports interactive command-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -2964,10 +2908,8 @@ the arrow keys. .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH SEE ALSO -.PP dc(1) .SH STANDARDS -.PP bc(1) is compliant with the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . @@ -2984,13 +2926,13 @@ Note that the specification explicitly says that bc(1) only accepts numbers that use a period (\f[B].\f[R]) as a radix point, regardless of the value of \f[B]LC_NUMERIC\f[R]. .SH BUGS -.PP Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md index d4a08817c95..5d5334c70d7 100644 --- a/manuals/bc/N.1.md +++ b/manuals/bc/N.1.md @@ -1513,7 +1513,7 @@ The extended library is a **non-portable extension**. **bnot8(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **8** binary digits (1 unsigned byte). + **8** binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1521,7 +1521,7 @@ The extended library is a **non-portable extension**. **bnot16(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **16** binary digits (2 unsigned bytes). + **16** binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1529,7 +1529,7 @@ The extended library is a **non-portable extension**. **bnot32(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **32** binary digits (4 unsigned bytes). + **32** binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1537,7 +1537,7 @@ The extended library is a **non-portable extension**. **bnot64(x)** : Does a bitwise not of the truncated absolute value of **x** as though it has - **64** binary digits (8 unsigned bytes). + **64** binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1561,7 +1561,7 @@ The extended library is a **non-portable extension**. **brev8(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 8 binary digits (1 unsigned byte). + has 8 binary digits (**1** unsigned byte). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1569,7 +1569,7 @@ The extended library is a **non-portable extension**. **brev16(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 16 binary digits (2 unsigned bytes). + has 16 binary digits (**2** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1577,7 +1577,7 @@ The extended library is a **non-portable extension**. **brev32(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 32 binary digits (4 unsigned bytes). + has 32 binary digits (**4** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1585,7 +1585,7 @@ The extended library is a **non-portable extension**. **brev64(x)** : Runs a bit reversal on the truncated absolute value of **x** as though it - has 64 binary digits (8 unsigned bytes). + has 64 binary digits (**8** unsigned bytes). If you want to a use signed two's complement argument, use **s2u(x)** to convert. @@ -1632,7 +1632,7 @@ The extended library is a **non-portable extension**. **brol32(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **32** binary digits (**2** unsigned bytes), by the number of + though it has **32** binary digits (**4** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **32**. @@ -1642,7 +1642,7 @@ The extended library is a **non-portable extension**. **brol64(x, p)** : Does a left bitwise rotatation of the truncated absolute value of **x**, as - though it has **64** binary digits (**2** unsigned bytes), by the number of + though it has **64** binary digits (**8** unsigned bytes), by the number of places equal to the truncated absolute value of **p** modded by **2** to the power of **64**. diff --git a/manuals/bcl.3 b/manuals/bcl.3 index cb65a2b8b99..09e5de74597 100644 --- a/manuals/bcl.3 +++ b/manuals/bcl.3 @@ -29,17 +29,14 @@ .nh .ad l .SH NAME -.PP bcl - library of arbitrary precision decimal arithmetic .SH SYNOPSIS .SS Use -.PP \f[I]#include \f[R] .PP Link with \f[I]-lbcl\f[R], and on POSIX systems, \f[I]-lpthread\f[R] is also required. .SS Setup -.PP These items allow clients to set up bcl(3). .PP \f[B]BclError bcl_start(\f[R]\f[I]void\f[R]\f[B]);\f[R] @@ -65,7 +62,6 @@ These items allow clients to set up bcl(3). .PP \f[B]void bcl_setDigitClamp(bool\f[R] \f[I]digitClamp\f[R]\f[B]);\f[R] .SS Contexts -.PP These items will allow clients to handle contexts, which are isolated from each other. This allows more than one client to use bcl(3) in the same program. @@ -101,14 +97,12 @@ size_t\f[R] \f[I]ibase\f[R]\f[B]);\f[R] \f[B]void bcl_ctxt_setObase(BclContext\f[R] \f[I]ctxt\f[R]\f[B], size_t\f[R] \f[I]obase\f[R]\f[B]);\f[R] .SS Errors -.PP These items allow clients to handle errors. .PP \f[B]typedef enum BclError BclError;\f[R] .PP \f[B]BclError bcl_err(BclNumber\f[R] \f[I]n\f[R]\f[B]);\f[R] .SS Numbers -.PP These items allow clients to manipulate and query the arbitrary-precision numbers managed by bcl(3). .PP @@ -130,7 +124,6 @@ size_t\f[R] \f[I]scale\f[R]\f[B]);\f[R] .PP \f[B]size_t bcl_num_len(BclNumber\f[R] \f[I]n\f[R]\f[B]);\f[R] .SS Conversion -.PP These items allow clients to convert numbers into and from strings and integers. .PP @@ -149,7 +142,6 @@ integers. .PP \f[B]BclNumber bcl_bigdig2num(BclBigDig\f[R] \f[I]val\f[R]\f[B]);\f[R] .SS Math -.PP These items allow clients to run math on numbers. .PP \f[B]BclNumber bcl_add(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] @@ -218,7 +210,6 @@ BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber\f[R] \f[I]c\f[R]\f[B]);\f[R] \f[B]BclNumber bcl_modexp_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B], BclNumber\f[R] \f[I]c\f[R]\f[B]);\f[R] .SS Miscellaneous -.PP These items are miscellaneous. .PP \f[B]void bcl_zero(BclNumber\f[R] \f[I]n\f[R]\f[B]);\f[R] @@ -233,7 +224,6 @@ These items are miscellaneous. .PP \f[B]BclNumber bcl_dup(BclNumber\f[R] \f[I]s\f[R]\f[B]);\f[R] .SS Pseudo-Random Number Generator -.PP These items allow clients to manipulate the seeded pseudo-random number generator in bcl(3). .PP @@ -275,7 +265,6 @@ size_t\f[R] \f[I]places\f[R]\f[B]);\f[R] \f[B]BclRandInt bcl_rand_bounded(BclRandInt\f[R] \f[I]bound\f[R]\f[B]);\f[R] .SH DESCRIPTION -.PP bcl(3) is a library that implements arbitrary-precision decimal math, as standardized by POSIX (https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html) in @@ -459,7 +448,6 @@ Garbage collects cached instances of arbitrary-precision numbers. This only frees the memory of numbers that are \f[I]not\f[R] in use, so it is safe to call at any time. .SS Contexts -.PP All procedures that take a \f[B]BclContext\f[R] parameter a require a valid context as an argument. .TP @@ -587,7 +575,6 @@ If there was no error, it will return \f[B]BCL_ERROR_NONE\f[R]. There must be a valid current context. .RE .SS Numbers -.PP All procedures in this section require a valid current context. .TP \f[B]BclNumber\f[R] @@ -651,7 +638,6 @@ Otherwise, this function can return: Returns the number of \f[I]significant decimal digits\f[R] in \f[I]n\f[R]. .SS Conversion -.PP All procedures in this section require a valid current context. .PP All procedures in this section without the \f[B]_keep\f[R] suffix in @@ -748,7 +734,6 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .SS Math -.PP All procedures in this section require a valid current context. .PP All procedures in this section without the \f[B]_keep\f[R] suffix in @@ -1370,7 +1355,6 @@ Possible errors include: \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE .SS Pseudo-Random Number Generator -.PP The pseudo-random number generator in bcl(3) is a \f[I]seeded\f[R] PRNG. Given the same seed twice, it will produce the same sequence of pseudo-random numbers twice. @@ -1644,18 +1628,15 @@ Bias is removed before returning the integer. This procedure cannot fail. .RE .SS Consumption and Propagation -.PP Some functions are listed as consuming some or all of their arguments. This means that the arguments are freed, regardless of if there were errors or not. .PP This is to enable compact code like the following: .IP -.nf -\f[C] +.EX BclNumber n = bcl_num_add(bcl_num_mul(a, b), bcl_num_div(c, d)); -\f[R] -.fi +.EE .PP If arguments to those functions were not consumed, memory would be leaked until reclaimed with \f[B]bcl_ctxt_freeNums(BclContext)\f[R]. @@ -1664,16 +1645,13 @@ When errors occur, they are propagated through. The result should always be checked with \f[B]bcl_err(BclNumber)\f[R], so the example above should properly be: .IP -.nf -\f[C] +.EX BclNumber n = bcl_num_add(bcl_num_mul(a, b), bcl_num_div(c, d)); if (bcl_err(n) != BCL_ERROR_NONE) { // Handle the error. } -\f[R] -.fi +.EE .SH ERRORS -.PP Most functions in bcl(3) return, directly or indirectly, any one of the error codes defined in \f[B]BclError\f[R]. The complete list of codes is the following: @@ -1761,7 +1739,6 @@ It is highly recommended that client libraries do \f[I]not\f[R] activate this behavior. .RE .SH ATTRIBUTES -.PP bcl(3) is \f[I]MT-Safe\f[R]: it is safe to call any functions from more than one thread. However, is is \f[I]not\f[R] safe to pass any data between threads @@ -1773,7 +1750,6 @@ safe with multiple threads. If it is necessary to be able to interrupt bcl(3), spawn a separate thread to run the calculation. .SH PERFORMANCE -.PP Most bc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. bcl(3) does something different. @@ -1793,7 +1769,6 @@ checking. This integer type depends on the value of \f[B]BC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on bcl(3): .TP \f[B]BC_LONG_BIT\f[R] @@ -1844,10 +1819,8 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH SEE ALSO -.PP bc(1) and dc(1) .SH STANDARDS -.PP bcl(3) is compliant with the arithmetic defined in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html for @@ -1858,10 +1831,10 @@ numbers that use a period (\f[B].\f[R]) as a radix point, regardless of the value of \f[B]LC_NUMERIC\f[R]. This is also true of bcl(3). .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc. .SH AUTHORS -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/A.1 b/manuals/dc/A.1 index bef54876d7f..7de20035f43 100644 --- a/manuals/dc/A.1 +++ b/manuals/dc/A.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -47,7 +45,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -64,7 +61,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -276,7 +272,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -289,7 +284,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -298,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -306,13 +300,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -320,7 +313,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -393,11 +385,9 @@ In any other case, use a non-seeded pseudo-random number generator. The pseudo-random number generator, \f[B]seed\f[R], and all associated operations are \f[B]non-portable extensions\f[R]. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -464,10 +454,8 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .PP Note that both scientific notation and engineering notation are @@ -515,7 +503,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -747,7 +734,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Pseudo-Random Number Generator -.PP dc(1) has a built-in pseudo-random number generator. These commands query the pseudo-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that @@ -791,7 +777,6 @@ limitations of the pseudo-random number generator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -807,7 +792,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -829,7 +813,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -941,7 +924,6 @@ Pushes the maximum (inclusive) integer that can be generated with the This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -1158,7 +1140,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1219,7 +1200,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1239,7 +1219,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1262,7 +1241,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1278,7 +1256,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1293,7 +1270,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1310,7 +1286,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1330,7 +1305,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1397,7 +1371,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1520,7 +1493,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1589,7 +1561,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1602,7 +1573,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1626,7 +1596,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the @@ -1634,7 +1603,6 @@ a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1655,7 +1623,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1690,7 +1657,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP dc(1) supports interactive command-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -1705,23 +1671,20 @@ section). .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH LOCALES -.PP This dc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/E.1 b/manuals/dc/E.1 index 41de5e08f74..bc8d66eb3f9 100644 --- a/manuals/dc/E.1 +++ b/manuals/dc/E.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -43,7 +41,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -60,7 +57,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -261,7 +257,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -274,7 +269,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -283,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -291,13 +285,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -305,7 +298,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -340,11 +332,9 @@ precision of any operations (with exceptions). The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -391,10 +381,8 @@ value of \f[B]ibase\f[R]. If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .TP \f[B]p\f[R] @@ -431,7 +419,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -621,7 +608,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -637,7 +623,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -659,7 +644,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -726,7 +710,6 @@ stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -943,7 +926,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1004,7 +986,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1024,7 +1005,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1047,7 +1027,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1063,7 +1042,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1078,7 +1056,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1095,7 +1072,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1115,7 +1091,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1177,7 +1152,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1300,7 +1274,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1367,7 +1340,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1380,7 +1352,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1404,7 +1375,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the @@ -1412,7 +1382,6 @@ a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1433,7 +1402,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1468,7 +1436,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP dc(1) supports interactive command-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -1483,23 +1450,20 @@ section). .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH LOCALES -.PP This dc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/EH.1 b/manuals/dc/EH.1 index 08cb483dc92..83b62e24b91 100644 --- a/manuals/dc/EH.1 +++ b/manuals/dc/EH.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -43,7 +41,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -60,7 +57,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -261,7 +257,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -274,7 +269,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -283,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -291,13 +285,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -305,7 +298,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -340,11 +332,9 @@ precision of any operations (with exceptions). The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -391,10 +381,8 @@ value of \f[B]ibase\f[R]. If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .TP \f[B]p\f[R] @@ -431,7 +419,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -621,7 +608,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -637,7 +623,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -659,7 +644,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -726,7 +710,6 @@ stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -943,7 +926,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1004,7 +986,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1024,7 +1005,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1047,7 +1027,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1063,7 +1042,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1078,7 +1056,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1095,7 +1072,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1115,7 +1091,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1177,7 +1152,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1300,7 +1274,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1367,7 +1340,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1380,7 +1352,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1404,7 +1375,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1425,7 +1395,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1457,23 +1426,20 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause dc(1) to clean up and exit, and it uses the default handler for all other signals. .SH LOCALES -.PP This dc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/EHN.1 b/manuals/dc/EHN.1 index efeb0bbaecf..5df155cf525 100644 --- a/manuals/dc/EHN.1 +++ b/manuals/dc/EHN.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -43,7 +41,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -60,7 +57,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -261,7 +257,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -274,7 +269,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -283,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -291,13 +285,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -305,7 +298,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -340,11 +332,9 @@ precision of any operations (with exceptions). The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -391,10 +381,8 @@ value of \f[B]ibase\f[R]. If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .TP \f[B]p\f[R] @@ -431,7 +419,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -621,7 +608,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -637,7 +623,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -659,7 +644,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -726,7 +710,6 @@ stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -943,7 +926,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1004,7 +986,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1024,7 +1005,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1047,7 +1027,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1063,7 +1042,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1078,7 +1056,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1095,7 +1072,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1115,7 +1091,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1177,7 +1152,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1300,7 +1274,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1367,7 +1340,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1380,7 +1352,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1404,7 +1375,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1425,7 +1395,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1457,19 +1426,17 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause dc(1) to clean up and exit, and it uses the default handler for all other signals. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/EN.1 b/manuals/dc/EN.1 index ce1e6b9be79..8cdefc2b352 100644 --- a/manuals/dc/EN.1 +++ b/manuals/dc/EN.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -43,7 +41,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]--file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -60,7 +57,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -261,7 +257,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -274,7 +269,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -283,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -291,13 +285,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -305,7 +298,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -340,11 +332,9 @@ precision of any operations (with exceptions). The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -391,10 +381,8 @@ value of \f[B]ibase\f[R]. If clamping is on, and the clamped value of a character is needed, use a leading zero, i.e., for \f[B]A\f[R], use \f[B]0A\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .TP \f[B]p\f[R] @@ -431,7 +419,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -621,7 +608,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -637,7 +623,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -659,7 +644,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -726,7 +710,6 @@ stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -943,7 +926,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1004,7 +986,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1024,7 +1005,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1047,7 +1027,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1063,7 +1042,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1078,7 +1056,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1095,7 +1072,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1115,7 +1091,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1177,7 +1152,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1300,7 +1274,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1367,7 +1340,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1380,7 +1352,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1404,7 +1375,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the @@ -1412,7 +1382,6 @@ a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1433,7 +1402,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1468,7 +1436,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP dc(1) supports interactive command-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -1483,19 +1450,17 @@ section). .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/H.1 b/manuals/dc/H.1 index 8baa0b74316..caa81645add 100644 --- a/manuals/dc/H.1 +++ b/manuals/dc/H.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -47,7 +45,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -64,7 +61,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -276,7 +272,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -289,7 +284,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -298,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -306,13 +300,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -320,7 +313,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -393,11 +385,9 @@ In any other case, use a non-seeded pseudo-random number generator. The pseudo-random number generator, \f[B]seed\f[R], and all associated operations are \f[B]non-portable extensions\f[R]. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -464,10 +454,8 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .PP Note that both scientific notation and engineering notation are @@ -515,7 +503,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -747,7 +734,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Pseudo-Random Number Generator -.PP dc(1) has a built-in pseudo-random number generator. These commands query the pseudo-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that @@ -791,7 +777,6 @@ limitations of the pseudo-random number generator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -807,7 +792,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -829,7 +813,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -941,7 +924,6 @@ Pushes the maximum (inclusive) integer that can be generated with the This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -1158,7 +1140,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1219,7 +1200,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1239,7 +1219,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1262,7 +1241,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1278,7 +1256,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1293,7 +1270,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1310,7 +1286,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1330,7 +1305,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1397,7 +1371,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1520,7 +1493,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1589,7 +1561,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1602,7 +1573,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1626,7 +1596,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1647,7 +1616,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1679,23 +1647,20 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause dc(1) to clean up and exit, and it uses the default handler for all other signals. .SH LOCALES -.PP This dc(1) ships with support for adding error messages for different locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/HN.1 b/manuals/dc/HN.1 index 2a392630986..cdfa4ad8261 100644 --- a/manuals/dc/HN.1 +++ b/manuals/dc/HN.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -47,7 +45,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -64,7 +61,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -276,7 +272,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -289,7 +284,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -298,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -306,13 +300,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -320,7 +313,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -393,11 +385,9 @@ In any other case, use a non-seeded pseudo-random number generator. The pseudo-random number generator, \f[B]seed\f[R], and all associated operations are \f[B]non-portable extensions\f[R]. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -464,10 +454,8 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .PP Note that both scientific notation and engineering notation are @@ -515,7 +503,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -747,7 +734,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Pseudo-Random Number Generator -.PP dc(1) has a built-in pseudo-random number generator. These commands query the pseudo-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that @@ -791,7 +777,6 @@ limitations of the pseudo-random number generator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -807,7 +792,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -829,7 +813,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -941,7 +924,6 @@ Pushes the maximum (inclusive) integer that can be generated with the This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -1158,7 +1140,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1219,7 +1200,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1239,7 +1219,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1262,7 +1241,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1278,7 +1256,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1293,7 +1270,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1310,7 +1286,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1330,7 +1305,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1397,7 +1371,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1520,7 +1493,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1589,7 +1561,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1602,7 +1573,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1626,7 +1596,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1647,7 +1616,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1679,19 +1647,17 @@ the user to continue. \f[B]SIGTERM\f[R] and \f[B]SIGQUIT\f[R] cause dc(1) to clean up and exit, and it uses the default handler for all other signals. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. diff --git a/manuals/dc/N.1 b/manuals/dc/N.1 index b7b501fbed1..5bb0dff18e0 100644 --- a/manuals/dc/N.1 +++ b/manuals/dc/N.1 @@ -29,10 +29,8 @@ .nh .ad l .SH Name -.PP dc - arbitrary-precision decimal reverse-Polish notation calculator .SH SYNOPSIS -.PP \f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] [\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] [\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] @@ -47,7 +45,6 @@ dc - arbitrary-precision decimal reverse-Polish notation calculator [\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] [\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -.PP dc(1) is an arbitrary-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. @@ -64,7 +61,6 @@ For example, if a user wants the \f[B]scale\f[R] always set to \f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS -.PP The following are the options that dc(1) accepts. .TP \f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] @@ -276,7 +272,6 @@ This is a \f[B]non-portable extension\f[R]. .PP All long options are \f[B]non-portable extensions\f[R]. .SH STDIN -.PP If no files are given on the command-line and no files or expressions are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. @@ -289,7 +284,6 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -.PP Any non-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output @@ -298,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -306,13 +300,12 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stdout\f[R] to \f[B]/dev/null\f[R]. .SH STDERR -.PP Any error output is written to \f[B]stderr\f[R]. .PP \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -320,7 +313,6 @@ If there are scripts that depend on the behavior of other dc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -.PP Each item in the input source code, either a number (see the \f[B]NUMBERS\f[R] section) or a command (see the \f[B]COMMANDS\f[R] section), is processed and executed, in order. @@ -393,11 +385,9 @@ In any other case, use a non-seeded pseudo-random number generator. The pseudo-random number generator, \f[B]seed\f[R], and all associated operations are \f[B]non-portable extensions\f[R]. .SS Comments -.PP Comments go from \f[B]#\f[R] until, and not including, the next newline. This is a \f[B]non-portable extension\f[R]. .SH NUMBERS -.PP Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. Numbers can have up to \f[B]DC_NUM_MAX\f[R] digits. @@ -464,10 +454,8 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be Accepting input as scientific notation is a \f[B]non-portable extension\f[R]. .SH COMMANDS -.PP The valid commands are listed below. .SS Printing -.PP These commands are used for printing. .PP Note that both scientific notation and engineering notation are @@ -515,7 +503,6 @@ without altering anything. Users should use this command when they get lost. .RE .SS Arithmetic -.PP These are the commands used for arithmetic. .TP \f[B]+\f[R] @@ -747,7 +734,6 @@ a short-circuit operator. This is a \f[B]non-portable extension\f[R]. .RE .SS Pseudo-Random Number Generator -.PP dc(1) has a built-in pseudo-random number generator. These commands query the pseudo-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that @@ -791,7 +777,6 @@ limitations of the pseudo-random number generator. This is a \f[B]non-portable extension\f[R]. .RE .SS Stack Control -.PP These commands control the stack. .TP \f[B]c\f[R] @@ -807,7 +792,6 @@ Swaps (\[lq]reverses\[rq]) the two top items on the stack. \f[B]R\f[R] Pops (\[lq]removes\[rq]) the top value from the stack. .SS Register Control -.PP These commands control registers (see the \f[B]REGISTERS\f[R] section). .TP \f[B]s\f[R]\f[I]r\f[R] @@ -829,7 +813,6 @@ push it onto the main stack. The previous value in the stack for register \f[I]r\f[R], if any, is now accessible via the \f[B]l\f[R]\f[I]r\f[R] command. .SS Parameters -.PP These commands control the values of \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R]. Also see the \f[B]SYNTAX\f[R] section. @@ -941,7 +924,6 @@ Pushes the maximum (inclusive) integer that can be generated with the This is a \f[B]non-portable extension\f[R]. .RE .SS Strings -.PP The following commands control strings. .PP dc(1) can work with both numbers and strings, and registers (see the @@ -1158,7 +1140,6 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence This is a \f[B]non-portable extension\f[R]. .RE .SS Status -.PP These commands query status of the stack or its top value. .TP \f[B]Z\f[R] @@ -1219,7 +1200,6 @@ This means that this command will never push \f[B]0\f[R]. This is a \f[B]non-portable extension\f[R]. .RE .SS Arrays -.PP These commands manipulate arrays. .TP \f[B]:\f[R]\f[I]r\f[R] @@ -1239,7 +1219,6 @@ Pushes the length of the array \f[I]r\f[R] onto the stack. This is a \f[B]non-portable extension\f[R]. .RE .SS Global Settings -.PP These commands retrieve global settings. These are the only commands that require multiple specific characters, and all of them begin with the letter \f[B]g\f[R]. @@ -1262,7 +1241,6 @@ Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options (see the \f[B]OPTIONS\f[R] section), non-zero otherwise. .SH REGISTERS -.PP Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) .PP @@ -1278,7 +1256,6 @@ The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left bracket to be used as a register name. .SS Extended Register Mode -.PP Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP @@ -1293,7 +1270,6 @@ In that case, the register name is found according to the regex \f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse error if the next non-space characters do not match that regex. .SH RESET -.PP When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. @@ -1310,7 +1286,6 @@ Then, if it is interactive mode, and the error was not a fatal error (see the \f[B]EXIT STATUS\f[R] section), it asks for more input; otherwise, it exits with the appropriate return code. .SH PERFORMANCE -.PP Most dc(1) implementations use \f[B]char\f[R] types to calculate the value of \f[B]1\f[R] decimal digit at a time, but that can be slow. This dc(1) does something different. @@ -1330,7 +1305,6 @@ checking. This integer type depends on the value of \f[B]DC_LONG_BIT\f[R], but is always at least twice as large as the integer type used to store digits. .SH LIMITS -.PP The following are the limits on dc(1): .TP \f[B]DC_LONG_BIT\f[R] @@ -1397,7 +1371,6 @@ large (at least on 64-bit machines) that there should not be any point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -.PP As \f[B]non-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP @@ -1520,7 +1493,6 @@ This environment variable overrides the default, which can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. .RE .SH EXIT STATUS -.PP dc(1) returns the following exit statuses: .TP \f[B]0\f[R] @@ -1589,7 +1561,6 @@ These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the \f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. .SH INTERACTIVE MODE -.PP Like bc(1), dc(1) has an interactive mode and a non-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag @@ -1602,7 +1573,6 @@ dc(1) may also reset on \f[B]SIGINT\f[R] instead of exit, depending on the contents of, or default for, the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .SH TTY MODE -.PP If \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY, then \[lq]TTY mode\[rq] is considered to be available, and thus, dc(1) can turn on TTY mode, subject to some @@ -1626,7 +1596,6 @@ required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. .SS Command-Line History -.PP Command-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the @@ -1634,7 +1603,6 @@ a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the TTY mode. See the \f[B]COMMAND LINE HISTORY\f[R] section for more information. .SS Prompt -.PP If TTY mode is available, then a prompt can be enabled. Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] @@ -1655,7 +1623,6 @@ and \f[B]--no-read-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING -.PP Sending a \f[B]SIGINT\f[R] will cause dc(1) to do one of two things. .PP If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R] @@ -1690,7 +1657,6 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -.PP dc(1) supports interactive command-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), @@ -1705,19 +1671,17 @@ section). .PP \f[B]Note\f[R]: tabs are converted to 8 spaces. .SH SEE ALSO -.PP bc(1) .SH STANDARDS -.PP The dc(1) utility operators and some behavior are compliant with the operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS -.PP None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . .SH AUTHOR -.PP -Gavin D. -Howard and contributors. +Gavin D. Howard \c +.MT gavin@gavinhoward.com +.ME \c +\ and contributors. From 52a5ec1b178fd07651446c7e31b1512794a04dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Fri, 5 Jan 2024 00:07:46 +0100 Subject: [PATCH 08/14] vendor/bc: upgrade to version 6.7.5 This update fixes a bug that line breaks in printed numbers may not match the line length set by the user. The value is printed correctly, just not split as specified in some situations. --- NEWS.md | 9 + include/bc.h | 2 +- include/history.h | 4 - include/num.h | 6 +- include/version.h | 2 +- scripts/sqrt_frac_guess.bc | 126 +++++++ scripts/sqrt_int_guess.bc | 94 ++++++ scripts/sqrt_random.bc | 129 +++++++ scripts/sqrt_random.sh | 77 +++++ src/num.c | 41 ++- src/program.c | 4 +- tests/bc/scripts/all.txt | 1 + tests/bc/scripts/print2.bc | 63 ++++ tests/bc/scripts/print2.txt | 650 ++++++++++++++++++++++++++++++++++++ tests/bc/sqrt.txt | 2 + tests/bc/sqrt_results.txt | 2 + vs/bc.vcxproj | 4 + vs/bcl.vcxproj | 6 + 18 files changed, 1200 insertions(+), 22 deletions(-) create mode 100644 scripts/sqrt_frac_guess.bc create mode 100644 scripts/sqrt_int_guess.bc create mode 100644 scripts/sqrt_random.bc create mode 100755 scripts/sqrt_random.sh create mode 100644 tests/bc/scripts/print2.bc create mode 100644 tests/bc/scripts/print2.txt diff --git a/NEWS.md b/NEWS.md index 240e02f1138..32e74de3123 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,14 @@ # News +## 6.7.5 + +This is a production release to fix one small bug. + +The bug is that sometimes numbers are printed to incorrect line lengths. The +number is always correct; the line is just longer than the limit. + +Users who do not care do not need to update. + ## 6.7.4 This is a production release to fix problems in the `bc` manual. diff --git a/include/bc.h b/include/bc.h index 73a85aa406a..17fd0b9d171 100644 --- a/include/bc.h +++ b/include/bc.h @@ -276,7 +276,7 @@ bc_lex_token(BcLex* l); * @return True if i is an expression token, false otherwise. */ #define BC_PARSE_EXPR(i) \ - (bc_parse_exprs[(((i) & (uchar) ~(0x07)) >> 3)] & (1 << (7 - ((i) &0x07)))) + (bc_parse_exprs[(((i) & (uchar) ~(0x07)) >> 3)] & (1 << (7 - ((i) & 0x07)))) /** * Returns the operator (by lex token) that is at the top of the operator diff --git a/include/history.h b/include/history.h index 19c5a0fe27f..64402c4dffa 100644 --- a/include/history.h +++ b/include/history.h @@ -173,10 +173,6 @@ typedef struct BcHistory #include #include -#if BC_DEBUG_CODE -#include -#endif // BC_DEBUG_CODE - /// Default columns. #define BC_HIST_DEF_COLS (80) diff --git a/include/num.h b/include/num.h index d24c206cbe5..6c9dee107f2 100644 --- a/include/num.h +++ b/include/num.h @@ -211,9 +211,9 @@ struct BcRNG; #define BC_NUM_KARATSUBA_ALLOCS (6) /** - * Rounds @a s (scale) up to the next power of BC_BASE_DIGS. This also check for - * overflow and gives a fatal error if that happens because we just can't go - * over the limits we have imposed. + * Rounds @a s (scale) up to the next power of BC_BASE_DIGS. This will also + * check for overflow and gives a fatal error if that happens because we just + * can't go over the limits we have imposed. * @param s The scale to round up. * @return @a s rounded up to the next power of BC_BASE_DIGS. */ diff --git a/include/version.h b/include/version.h index d481cb10abf..e2576269345 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.7.4 +#define VERSION 6.7.5 #endif // BC_VERSION_H diff --git a/scripts/sqrt_frac_guess.bc b/scripts/sqrt_frac_guess.bc new file mode 100644 index 00000000000..5938cfcc7cb --- /dev/null +++ b/scripts/sqrt_frac_guess.bc @@ -0,0 +1,126 @@ +#! /usr/bin/bc +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +scale = 20 + +# Adjust this number to try ranges below different powers of 10. +shift = 4 + +# Adjust this to try extra digits. For example, a value of one means that one +# digit is checked (such as 0.09 through 0.01), a value of two means that two +# digits are checked (0.090 through 0.010), etc. +max = shift + 2 + +n = (9 >> shift) +inc = (1 >> max) +stop = (1 >> shift) + +# Uncomment this to test the high part of the ranges. +#n += (1 - (1 >> max + 5)) >> shift + +for (i = n; i >= stop; i -= inc) +{ + # This is the lower limit. + t1 = sqrt(1/(3*i)) + + # Start with the inverse. + t2 = (1/i) + + # And take half its length of course. + l = length(t2$)/2 + + temp = i + odd = 0 + + # We go by powers of 10 below, but there is a degenerate case: an exact + # power of 10, for which length() will return one digit more. So we check + # for that and fix it. + while (temp < 1) + { + temp <<= 1 + odd = !odd + } + + if (temp == 1) + { + odd = !odd + } + + print "i: ", i, "\n" + print "t2: ", t2, "\n" + #print "l: ", l, "\n" + print "odd: ", odd, "\n" + + if (odd) + { + # Limit between 6 and 7.5. + limit1 = 6.7 >> (l$ * 2 + 1) + + # Limit between 1.5 and 1.83-ish. + limit2 = 1.7 >> (l$ * 2 + 1) + print "limit1: ", limit1, "\n" + print "limit2: ", limit2, "\n" + + if (i >= limit1) + { + t2 = (t2 >> l$) + } + else if (i >= limit2) + { + t2 = (t2 >> l$) / 2 + } + else + { + t2 = (t2 >> l$) / 4 + } + } + else + { + # Limit between 2.4 and 3. + limit = 2.7 >> (l$ * 2) + print "limit: ", limit, "\n" + + if (i >= limit) + { + t2 = (t2 >> l$) * 2 + } + else + { + t2 = (t2 >> l$) + } + } + #t2 = 1 + t3 = sqrt(5/(3*i)) + good = (t1 < t2 && t2 < t3) + + print t1, " < ", t2, " < ", t3, ": ", good, "\n\n" + if (!good) sqrt(-1) +} + +halt diff --git a/scripts/sqrt_int_guess.bc b/scripts/sqrt_int_guess.bc new file mode 100644 index 00000000000..551a06eb2e6 --- /dev/null +++ b/scripts/sqrt_int_guess.bc @@ -0,0 +1,94 @@ +#! /usr/bin/bc -l +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +# Adjust this number to try ranges above different powers of 10. +max = 0 + +n = (1 << max) + +# Uncomment this to test the high part of the ranges. +#n += (1 - (1 >> 10)) + +n + +# Loop from the start number to the next power of 10. +for (i = n; i < (n$ << 1); i += 1) +{ + # This is the lower limit. + t1 = sqrt(1/(3*i)) + + l = length(i$)/2 + + print "i: ", i, "\n" + #print "l: ", l, "\n" + + if (l$ != l) + { + # Limit between 2.4 and 3. + limit = 2.7 << (l$ * 2) + #print "limit: ", limit, "\n" + + if (i >= limit) + { + t2 = 1/(i >> (l$)) * 2 + } + else + { + t2 = 1/(i >> (l$)) + } + } + else + { + # Limit between 3.8-ish and 4.8 + limit = 4.3 << (l$ * 2 - 1) + #print "limit: ", limit, "\n" + + if (i >= limit) + { + t2 = 1/(i >> (l$ - 1)) * 8 + } + else + { + t2 = 1/(i >> (l$ - 1)) * 4 + } + } + + # This is the upper limit. + t3 = sqrt(5/(3*i)) + + # This is true when the guess is in between the limits. + good = (t1 < t2 && t2 < t3) + + print t1, " < ", t2, " < ", t3, ": ", good, "\n" + + # Error if we have a problem. + if (!good) sqrt(-1) +} + +halt diff --git a/scripts/sqrt_random.bc b/scripts/sqrt_random.bc new file mode 100644 index 00000000000..ff08348f497 --- /dev/null +++ b/scripts/sqrt_random.bc @@ -0,0 +1,129 @@ +#! /usr/bin/bc +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +scale = 0 + +bits = rand() + +# This extracts a bit and takes it out of the original value. +# +# Here, I am getting a bit to say whether we should have a value that is less +# than 1. +bits = divmod(bits, 2, negpow[]) + +# Get a bit that will say whether the value should be an exact square. +bits = divmod(bits, 2, square[]) + +# See below. This is to help bias toward small numbers. +pow = 4 + +# I want to bias toward small numbers, so let's give a 50 percent chance to +# values below 16 or so. +bits = divmod(bits, 2, small[]) + +# Let's keep raising the power limit by 2^4 when the bit is zero. +while (!small[0]) +{ + pow += 4 + bits = divmod(bits, 2, small[]) +} + +limit = 2^pow + +# Okay, this is the starting number. +num = irand(limit) + 1 + +# Figure out if we should have (more) fractional digits. +bits = divmod(bits, 2, extra_digits[]) + +if (square[0]) +{ + # Okay, I lied. If we need a perfect square, square now. + num *= num + + # If we need extra digits, we need to multiply by an even power of 10. + if (extra_digits[0]) + { + extra = (irand(8) + 1) * 2 + } + else + { + extra = 0 + } + + # If we need a number less than 1, just take the inverse, which will still + # be a perfect square. + if (negpow[0]) + { + scale = length(num) + 5 + num = 1/num + scale = 0 + + num >>= extra + } + else + { + num <<= extra + } +} +else +{ + # Get this for later. + l = length(num) + + # If we need extra digits. + if (extra_digits[0]) + { + # Add up to 32 decimal places. + num += frand(irand(32) + 1) + } + + # If we need a value less than 1... + if (negpow[0]) + { + # Move right until the number is + num >>= l + } +} + +bits = divmod(bits, 2, zero_scale[]) + +# Do we want a zero scale? +if (zero_scale[0]) +{ + print "scale = 0\n" +} +else +{ + print "scale = 20\n" +} + +print "sqrt(", num, ")\n" + +halt diff --git a/scripts/sqrt_random.sh b/scripts/sqrt_random.sh new file mode 100755 index 00000000000..694c7200319 --- /dev/null +++ b/scripts/sqrt_random.sh @@ -0,0 +1,77 @@ +#! /bin/sh +# +# SPDX-License-Identifier: BSD-2-Clause +# +# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +scriptdir=$(dirname "$0") + +gnu=/usr/bin/bc +gdh=/usr/local/bin/bc + +if [ "$#" -lt 1 ]; then + printf 'err: must provide path to new bc\n' + exit 1 +fi + +new="$1" +shift + +unset BC_LINE_LENGTH && unset BC_ENV_ARGS + +gdh_fail_file="sqrt_fails.bc" +new_fail_file="new_sqrt_fails.bc" + +rm -rf "$gdh_fail_file" +rm -rf "$new_fail_file" + +while [ true ]; do + + tst=$("$gdh" -l "$scriptdir/sqrt_random.bc") + err=$? + + if [ "$err" -ne 0 ]; then + printf 'err: failed to create test\n' + exit 2 + fi + + good=$(printf '%s\n' "$tst" | "$gnu" -l) + + gdh_out=$(printf '%s\n' "$tst" | "$gdh" -l) + new_out=$(printf '%s\n' "$tst" | "$new" -l) + + gdh_good=$(printf '%s == %s\n' "$good" "$gdh_out" | "$gnu") + new_good=$(printf '%s == %s\n' "$good" "$new_out" | "$gnu") + + if [ "$gdh_good" -eq 0 ]; then + printf '%s\n' "$tst" >> "$gdh_fail_file" + fi + + if [ "$new_good" -eq 0 ]; then + printf '%s\n' "$tst" >> "$new_fail_file" + fi + +done diff --git a/src/num.c b/src/num.c index e45aa62ddd0..ac0f828008f 100644 --- a/src/num.c +++ b/src/num.c @@ -3207,12 +3207,30 @@ bc_num_printNum(BcNum* restrict n, BcBigDig base, size_t len, assert(ptr != NULL); // While the first three arguments should be self-explanatory, the last - // needs explaining. I don't want to print a newline when the last digit - // to be printed could take the place of the backslash rather than being - // pushed, as a single character, to the next line. That's what that - // last argument does for bc. + // needs explaining. I don't want to print a backslash+newline when the + // last digit to be printed could take the place of the backslash rather + // than being pushed, as a single character, to the next line. That's + // what that last argument does for bc. + // + // First, it needs to check if newlines are completely disabled. If they + // are not disabled, it needs to check the next part. + // + // If the number has a scale, then because we are printing just the + // integer part, there will be at least two more characters (a radix + // point plus at least one digit). So if there is a scale, a backslash + // is necessary. + // + // Finally, the last condition checks to see if we are at the end of the + // stack. If we are *not* (i.e., the index is not one less than the + // stack length), then a backslash is necessary because there is at + // least one more character for at least one more digit). Otherwise, if + // the index is equal to one less than the stack length, we want to + // disable backslash printing. + // + // The function that prints bases 17 and above will take care of not + // printing a backslash in the right case. print(*ptr, len, false, - !newline || (n->scale != 0 || i == stack.len - 1)); + !newline || (n->scale != 0 || i < stack.len - 1)); } // We are done if there is no fractional part. @@ -4091,13 +4109,14 @@ bc_num_sqrt(BcNum* restrict a, BcNum* restrict b, size_t scale) // Square root needs half of the length of the parameter. req = bc_vm_growSize(BC_MAX(rdx, BC_NUM_RDX_VAL(a)), len >> 1); + req = bc_vm_growSize(req, 1); BC_SIG_LOCK; // Unlike the binary operators, this function is the only single parameter // function and is expected to initialize the result. This means that it // expects that b is *NOT* preallocated. We allocate it here. - bc_num_init(b, bc_vm_growSize(req, 1)); + bc_num_init(b, req); BC_SIG_UNLOCK; @@ -4130,13 +4149,12 @@ bc_num_sqrt(BcNum* restrict a, BcNum* restrict b, size_t scale) bc_num_init(&num2, len); bc_num_setup(&half, half_digs, sizeof(half_digs) / sizeof(BcDig)); - // There is a division by two in the formula. We setup a number that's 1/2 + // There is a division by two in the formula. We set up a number that's 1/2 // so that we can use multiplication instead of heavy division. - bc_num_one(&half); + bc_num_setToZero(&half, 1); half.num[0] = BC_BASE_POW / 2; half.len = 1; BC_NUM_RDX_SET_NP(half, 1); - half.scale = 1; bc_num_init(&f, len); bc_num_init(&fprime, len); @@ -4156,8 +4174,9 @@ bc_num_sqrt(BcNum* restrict a, BcNum* restrict b, size_t scale) pow = bc_num_intDigits(a); // The code in this if statement calculates the initial estimate. First, if - // a is less than 0, then 0 is a good estimate. Otherwise, we want something - // in the same ballpark. That ballpark is pow. + // a is less than 1, then 0 is a good estimate. Otherwise, we want something + // in the same ballpark. That ballpark is half of pow because the result + // will have half the digits. if (pow) { // An odd number is served by starting with 2^((pow-1)/2), and an even diff --git a/src/program.c b/src/program.c index 2f26589166e..c9d268dfde8 100644 --- a/src/program.c +++ b/src/program.c @@ -3780,7 +3780,7 @@ bc_program_printStr(const BcProgram* p, const char* restrict code, size_t idx = bc_program_index(code, bgn); char* s; - s = *((char**) bc_vec_item(p->strs, idx)); + s = *((char**) bc_vec_item(&p->strs, idx)); bc_vm_printf(" (\"%s\") ", s); } @@ -3803,7 +3803,7 @@ bc_program_printInst(const BcProgram* p, const char* restrict code, else if (inst == BC_INST_NUM) { size_t idx = bc_program_index(code, bgn); - BcConst* c = bc_vec_item(p->consts, idx); + BcConst* c = bc_vec_item(&p->consts, idx); bc_vm_printf("(%s)", c->val); } else if (inst == BC_INST_CALL || diff --git a/tests/bc/scripts/all.txt b/tests/bc/scripts/all.txt index 0008d70193c..7b49f7c4e77 100644 --- a/tests/bc/scripts/all.txt +++ b/tests/bc/scripts/all.txt @@ -3,6 +3,7 @@ divide.bc subtract.bc add.bc print.bc +print2.bc parse.bc root.bc array.bc diff --git a/tests/bc/scripts/print2.bc b/tests/bc/scripts/print2.bc new file mode 100644 index 00000000000..5f3466929f7 --- /dev/null +++ b/tests/bc/scripts/print2.bc @@ -0,0 +1,63 @@ +#! /usr/bin/bc -q + +l = line_length() + +max = 128 +scale = 0 + +obase=2 +2^99 +2^100 +2^105 + +for (i = 2; i < max; ++i) +{ + obase=i + if (obase < 17) + { + 1 * i^(l - 1) + 1 * i^l + 1 * i^(l + 1) + } + else if (obase >= 17 && obase <= 100) + { + l2 = l/3 + 1 * i^(l2 - 1) + 1 * i^l2 + 1 * i^(l2 + 1) + } + else + { + l2 = l/4 + 1 * i^(l2 - 1) + 1 * i^l2 + 1 * i^(l2 + 1) + } +} + +if (maxobase() > 2^18) +{ + obase=2^18 + 1 * i^(100) + 1 * i^(101) + 1 * i^(103) +} +else +{ + print " 065536 000000 000000 000000 000000 000000 000000 000000 000000 0000\\\n" + print "00 000000 000000 000000 000000 000000 000000 000000 000000 000000 00\\\n" + print "0000 000000 000000 000000 000000 000000 000000 000000 000000 000000 \\\n" + print "000000 000000 000000 000000 000000 000000 000000 000000 000000 000000\n" + print " 000032 000000 000000 000000 000000 000000 000000 000000 000000 0000\\\n" + print "00 000000 000000 000000 000000 000000 000000 000000 000000 000000 00\\\n" + print "0000 000000 000000 000000 000000 000000 000000 000000 000000 000000 \\\n" + print "000000 000000 000000 000000 000000 000000 000000 000000 000000 00000\\\n" + print "0 000000\n" + print " 000002 000000 000000 000000 000000 000000 000000 000000 000000 0000\\\n" + print "00 000000 000000 000000 000000 000000 000000 000000 000000 000000 00\\\n" + print "0000 000000 000000 000000 000000 000000 000000 000000 000000 000000 \\\n" + print "000000 000000 000000 000000 000000 000000 000000 000000 000000 00000\\\n" + print "0 000000 000000\n" +} + +halt diff --git a/tests/bc/scripts/print2.txt b/tests/bc/scripts/print2.txt new file mode 100644 index 00000000000..208f0ed2e47 --- /dev/null +++ b/tests/bc/scripts/print2.txt @@ -0,0 +1,650 @@ +10000000000000000000000000000000000000000000000000000000000000000000\ +00000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00000000000000000000000000000000000000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 +100000000000000000000000000000000000000000000000000000000000000000000 +10000000000000000000000000000000000000000000000000000000000000000000\ +00 +10000000000000000000000000000000000000000000000000000000000000000000\ +000 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 + 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0\ +0 00 00 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 + 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\ + 000 000 + 065536 000000 000000 000000 000000 000000 000000 000000 000000 0000\ +00 000000 000000 000000 000000 000000 000000 000000 000000 000000 00\ +0000 000000 000000 000000 000000 000000 000000 000000 000000 000000 \ +000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 + 000032 000000 000000 000000 000000 000000 000000 000000 000000 0000\ +00 000000 000000 000000 000000 000000 000000 000000 000000 000000 00\ +0000 000000 000000 000000 000000 000000 000000 000000 000000 000000 \ +000000 000000 000000 000000 000000 000000 000000 000000 000000 00000\ +0 000000 + 000002 000000 000000 000000 000000 000000 000000 000000 000000 0000\ +00 000000 000000 000000 000000 000000 000000 000000 000000 000000 00\ +0000 000000 000000 000000 000000 000000 000000 000000 000000 000000 \ +000000 000000 000000 000000 000000 000000 000000 000000 000000 00000\ +0 000000 000000 diff --git a/tests/bc/sqrt.txt b/tests/bc/sqrt.txt index afd87ff0f6e..f0d79a18829 100644 --- a/tests/bc/sqrt.txt +++ b/tests/bc/sqrt.txt @@ -1,5 +1,7 @@ scale = 20 sqrt(0) +sqrt(1) +sqrt(1.00000000000) sqrt(2) sqrt(4) sqrt(9) diff --git a/tests/bc/sqrt_results.txt b/tests/bc/sqrt_results.txt index 10a4fa95d5a..8ce821f1fb4 100644 --- a/tests/bc/sqrt_results.txt +++ b/tests/bc/sqrt_results.txt @@ -1,4 +1,6 @@ 0 +1.00000000000000000000 +1.00000000000000000000 1.41421356237309504880 2.00000000000000000000 3.00000000000000000000 diff --git a/vs/bc.vcxproj b/vs/bc.vcxproj index 312af50e8a6..377eb8645a7 100644 --- a/vs/bc.vcxproj +++ b/vs/bc.vcxproj @@ -100,6 +100,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) @@ -119,6 +120,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true true @@ -142,6 +144,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) @@ -161,6 +164,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true true diff --git a/vs/bcl.vcxproj b/vs/bcl.vcxproj index a8de10e9f10..f838cac7cbd 100644 --- a/vs/bcl.vcxproj +++ b/vs/bcl.vcxproj @@ -130,6 +130,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) @@ -143,6 +144,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true true @@ -160,6 +162,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true true @@ -178,6 +181,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) @@ -191,6 +195,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true true @@ -208,6 +213,7 @@ + /std:c17 /MP $(AdditionalOptions) Level3 true true From 898b46e930119f988aa96b8946e4937edbdc1982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Mon, 8 Jul 2024 19:39:17 +0200 Subject: [PATCH 09/14] vendor/bc: upgrade to version 6.7.6 This update fixes a potential issue when flushing stdout on exit fails: longjmp could use an uninitialized target address variable. Most files are included in this commit due to a changed date in the copyright note. --- LICENSE.md | 4 +- MEMORY_BUGS.md | 7 + Makefile.in | 2 +- NEWS.md | 7 + NOTICE.md | 2 +- README.md | 6 +- compile_flags.txt | 15 + configure.sh | 20 +- gen/bc_help.txt | 2 +- gen/dc_help.txt | 2 +- gen/lib.bc | 2 +- gen/lib2.bc | 2 +- gen/strgen.c | 4 +- gen/strgen.sh | 4 +- include/args.h | 2 +- include/bc.h | 21 +- include/bcl.h | 2 +- include/dc.h | 5 +- include/file.h | 26 +- include/history.h | 2 +- include/lang.h | 2 +- include/lex.h | 2 +- include/library.h | 2 +- include/num.h | 2 +- include/opt.h | 2 +- include/parse.h | 2 +- include/program.h | 2 +- include/rand.h | 7 +- include/read.h | 2 +- include/status.h | 6 +- include/vector.h | 2 +- include/version.h | 4 +- include/vm.h | 12 +- locales/de_DE.ISO8859-1.msg | 2 +- locales/de_DE.UTF-8.msg | 2 +- locales/en_US.msg | 2 +- locales/es_ES.ISO8859-1.msg | 2 +- locales/es_ES.UTF-8.msg | 2 +- locales/fr_FR.ISO8859-1.msg | 2 +- locales/fr_FR.UTF-8.msg | 2 +- locales/ja_JP.UTF-8.msg | 2 +- locales/ja_JP.eucJP.msg | 2 +- locales/nl_NL.ISO8859-1.msg | 2 +- locales/nl_NL.UTF-8.msg | 2 +- locales/pl_PL.ISO8859-2.msg | 2 +- locales/pl_PL.UTF-8.msg | 2 +- locales/pt_PT.ISO8859-1.msg | 2 +- locales/pt_PT.UTF-8.msg | 2 +- locales/ru_RU.CP1251.msg | 2 +- locales/ru_RU.CP866.msg | 2 +- locales/ru_RU.ISO8859-5.msg | 2 +- locales/ru_RU.KOI8-R.msg | 2 +- locales/ru_RU.UTF-8.msg | 2 +- locales/zh_CN.GB18030.msg | 2 +- locales/zh_CN.GB2312.msg | 2 +- locales/zh_CN.GBK.msg | 2 +- locales/zh_CN.UTF-8.msg | 2 +- locales/zh_CN.eucCN.msg | 2 +- manuals/bc/A.1 | 681 ++++++++++++++++++------------------ manuals/bc/A.1.md | 5 +- manuals/bc/E.1 | 480 ++++++++++++------------- manuals/bc/E.1.md | 5 +- manuals/bc/EH.1 | 472 +++++++++++++------------ manuals/bc/EH.1.md | 5 +- manuals/bc/EHN.1 | 472 +++++++++++++------------ manuals/bc/EHN.1.md | 5 +- manuals/bc/EN.1 | 480 ++++++++++++------------- manuals/bc/EN.1.md | 5 +- manuals/bc/H.1 | 673 +++++++++++++++++------------------ manuals/bc/H.1.md | 5 +- manuals/bc/HN.1 | 673 +++++++++++++++++------------------ manuals/bc/HN.1.md | 5 +- manuals/bc/N.1 | 681 ++++++++++++++++++------------------ manuals/bc/N.1.md | 5 +- manuals/bcl.3 | 95 ++--- manuals/bcl.3.md | 2 +- manuals/dc/A.1 | 478 ++++++++++++------------- manuals/dc/A.1.md | 2 +- manuals/dc/E.1 | 376 ++++++++++---------- manuals/dc/E.1.md | 2 +- manuals/dc/EH.1 | 368 +++++++++---------- manuals/dc/EH.1.md | 2 +- manuals/dc/EHN.1 | 368 +++++++++---------- manuals/dc/EHN.1.md | 2 +- manuals/dc/EN.1 | 376 ++++++++++---------- manuals/dc/EN.1.md | 2 +- manuals/dc/H.1 | 470 ++++++++++++------------- manuals/dc/H.1.md | 2 +- manuals/dc/HN.1 | 470 ++++++++++++------------- manuals/dc/HN.1.md | 2 +- manuals/dc/N.1 | 478 ++++++++++++------------- manuals/dc/N.1.md | 2 +- scripts/exec-install.sh | 2 +- scripts/format.sh | 2 +- scripts/functions.sh | 2 +- scripts/karatsuba.py | 2 +- scripts/link.sh | 2 +- scripts/lint.sh | 2 +- scripts/locale_install.sh | 2 +- scripts/locale_uninstall.sh | 2 +- scripts/sqrt_frac_guess.bc | 2 +- scripts/sqrt_int_guess.bc | 2 +- scripts/sqrt_random.bc | 2 +- scripts/sqrt_random.sh | 2 +- src/args.c | 2 +- src/bc.c | 6 +- src/bc_lex.c | 2 +- src/bc_parse.c | 2 +- src/data.c | 4 +- src/dc.c | 6 +- src/dc_lex.c | 2 +- src/dc_parse.c | 2 +- src/file.c | 34 +- src/history.c | 2 +- src/lang.c | 2 +- src/lex.c | 2 +- src/library.c | 2 +- src/main.c | 16 +- src/num.c | 76 +++- src/opt.c | 2 +- src/parse.c | 2 +- src/program.c | 2 +- src/rand.c | 2 +- src/read.c | 2 +- src/vector.c | 2 +- src/vm.c | 62 +++- tests/all.sh | 2 +- tests/bc/timeconst.sh | 2 +- tests/bcl.c | 2 +- tests/dc/scripts/easter.sh | 2 +- tests/error.sh | 2 +- tests/errors.sh | 2 +- tests/history.py | 6 +- tests/history.sh | 2 +- tests/other.sh | 6 +- tests/read.sh | 2 +- tests/script.sh | 2 +- tests/scripts.sh | 2 +- tests/stdin.sh | 2 +- tests/test.sh | 2 +- 140 files changed, 4445 insertions(+), 4232 deletions(-) create mode 100644 compile_flags.txt diff --git a/LICENSE.md b/LICENSE.md index 74441065df3..c8f6758e6d4 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License -Copyright (c) 2018-2023 Gavin D. Howard +Copyright (c) 2018-2024 Gavin D. Howard Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -60,7 +60,7 @@ The files `src/rand.c` and `include/rand.h` are under the following copyrights and license: Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors
-Copyright (c) 2018-2023 Gavin D. Howard +Copyright (c) 2018-2024 Gavin D. Howard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/MEMORY_BUGS.md b/MEMORY_BUGS.md index 12e0b854e9d..2e41ad3d75c 100644 --- a/MEMORY_BUGS.md +++ b/MEMORY_BUGS.md @@ -23,6 +23,13 @@ existed in. The first version without this bug is `6.0.2`. +* In versions `3.0.0` until `6.7.5` (inclusive) of `bc` and `dc`, there is a + possible out-of-bounds read when there is an error flushing `stdout` on exit + because such an error would cause `bc` and `dc` to attempt to use a `jmp_buf` + when none exists. + + The first version without this bug is `6.7.6`. + * In versions `5.0.0` until `6.0.4` (inclusive) of `bc`, there is an out-of-bounds access if a non-local (non-`auto`) variable is set to a string with `asciify()`, then the function is redefined with a use of the same diff --git a/Makefile.in b/Makefile.in index e1309cd6d6b..4adb76ddaa1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/NEWS.md b/NEWS.md index 32e74de3123..95de7e5182c 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,12 @@ # News +## 6.7.6 + +This is a production release to fix one bug. + +The bug was that `bc` attempted to jump out when flushing `stdout` on exit, but +there is no jump buf at that point. + ## 6.7.5 This is a production release to fix one small bug. diff --git a/NOTICE.md b/NOTICE.md index c0d3ded5797..35536b2c27d 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -1,6 +1,6 @@ # Notice -Copyright 2018-2023 Gavin D. Howard and contributors. +Copyright 2018-2024 Gavin D. Howard and contributors. ## Contributors diff --git a/README.md b/README.md index 943ca89eee2..696e6186b8b 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ POSIX-compatible systems that are known to work: * FreeBSD * OpenBSD * NetBSD -* Mac OSX +* macOS * Solaris* (as long as the Solaris version supports POSIX 2008) * AIX * HP-UX* (except for history) @@ -347,6 +347,8 @@ that is because it is more robust. See the [benchmarks][19]. Below is a non-comprehensive list of extensions that this `bc` and `dc` have that all others do not. +* **The `!` operator has higher precedence than the `!` operator in other `bc` + implementations.** * An extended math library. (See [here][30] for more information.) * A command-line prompt. * Turning on and off digit clamping. (Digit clamping is about how to treat @@ -427,7 +429,7 @@ Other projects based on this bc are: * [FreeBSD `bc`][23]. While the `bc` in FreeBSD is kept up-to-date, it is better to [report bugs there][24], as well as [submit patches][25], and the maintainers of the package will contact me if necessary. -* [Mac OSX `bc`][35]. Any bugs in that `bc` should be reported to me, but do +* [macOS `bc`][35]. Any bugs in that `bc` should be reported to me, but do expect bugs because the version is old. * [Android Open Source `bc`][32]. Any bugs in that `bc` can be reported here. diff --git a/compile_flags.txt b/compile_flags.txt new file mode 100644 index 00000000000..7a08c87f387 --- /dev/null +++ b/compile_flags.txt @@ -0,0 +1,15 @@ +-Weverything +-pedantic +-Wno-unsafe-buffer-usage +-D_POSIX_C_SOURCE=200809L +-D_XOPEN_SOURCE=700 +-D_BSD_SOURCE +-D_GNU_SOURCE +-D_DEFAULT_SOURCE +-Iinclude/ +-DBC_DEBUG=1 +-DBC_ENABLED=1 +-DDC_ENABLED=1 +-DBC_ENABLE_EXTRA_MATH=1 +-DBC_ENABLE_HISTORY=1 +-DBC_ENABLE_NLS=1 diff --git a/configure.sh b/configure.sh index 9292f094bb1..43bb502ea81 100755 --- a/configure.sh +++ b/configure.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -127,7 +127,7 @@ usage() { printf ' If this option is given along with -e and -r, the last occurrence of\n' printf ' all of the three is used.\n' printf ' -k KARATSUBA_LEN, --karatsuba-len KARATSUBA_LEN\n' - printf ' Set the karatsuba length to KARATSUBA_LEN (default is 64).\n' + printf ' Set the karatsuba length to KARATSUBA_LEN (default is 32).\n' printf ' It is an error if KARATSUBA_LEN is not a number or is less than 16.\n' printf ' -l, --install-all-locales\n' printf ' Installs all locales, regardless of how many are on the system. This\n' @@ -163,7 +163,7 @@ usage() { printf ' Enable the use of libreadline/readline. This is meant for those users\n' printf ' that want vi-like or Emacs-like behavior in history. This option is\n' printf ' ignored if history is disabled. If this option is given along with -e\n' - printf ' and -r, the last occurrence of all of the three is used.\n' + printf ' and -i, the last occurrence of all of the three is used.\n' printf ' -s SETTING, --set-default-on SETTING\n' printf ' Set the default named by SETTING to on. See below for possible values\n' printf ' for SETTING. For multiple instances of the -s or -S for the the same\n' @@ -1671,10 +1671,10 @@ else CPPFLAGS="$CPPFLAGS -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" fi -# Test Mac OSX. This is not in an if statement because regardless of whatever -# the user says, we need to know if we are on Mac OSX. If we are, we have to set +# Test macOS. This is not in an if statement because regardless of whatever the +# user says, we need to know if we are on macOS. If we are, we have to set # _DARWIN_C_SOURCE. -printf 'Testing for Mac OSX...\n' +printf 'Testing for macOS...\n' flags="-DBC_TEST_APPLE -DBC_ENABLE_AFL=0" "$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/src/vm.c" > /dev/null 2>&1 @@ -1682,15 +1682,15 @@ flags="-DBC_TEST_APPLE -DBC_ENABLE_AFL=0" err="$?" if [ "$err" -ne 0 ]; then - printf 'On Mac OSX. Using _DARWIN_C_SOURCE.\n\n' + printf 'On macOS. Using _DARWIN_C_SOURCE.\n\n' apple="-D_DARWIN_C_SOURCE" else - printf 'Not on Mac OSX.\n\n' + printf 'Not on macOS.\n\n' apple="" fi -# We can't use the linker's strip flag on Mac OSX. -if [ "$debug" -eq 0 ] && [ "$apple" == "" ] && [ "$strip_bin" -ne 0 ]; then +# We can't use the linker's strip flag on macOS. +if [ "$debug" -eq 0 ] && [ "$apple" = "" ] && [ "$strip_bin" -ne 0 ]; then LDFLAGS="-s $LDFLAGS" fi diff --git a/gen/bc_help.txt b/gen/bc_help.txt index c51ba186db1..489b54a185f 100644 --- a/gen/bc_help.txt +++ b/gen/bc_help.txt @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/gen/dc_help.txt b/gen/dc_help.txt index 7d9e7ec28d2..df4ede1583a 100644 --- a/gen/dc_help.txt +++ b/gen/dc_help.txt @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/gen/lib.bc b/gen/lib.bc index b12b2317679..0c9389b8510 100644 --- a/gen/lib.bc +++ b/gen/lib.bc @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/gen/lib2.bc b/gen/lib2.bc index df51d0c07a8..d6d9f70fe06 100644 --- a/gen/lib2.bc +++ b/gen/lib2.bc @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/gen/strgen.c b/gen/strgen.c index 2cb3ed9e847..1394a05c4a7 100644 --- a/gen/strgen.c +++ b/gen/strgen.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -68,7 +68,7 @@ static const char* const bc_gen_ex_end = "{{ end }}"; // This is exactly what it looks like. It just slaps a simple license header on // the generated C source file. static const char* const bc_gen_header = - "// Copyright (c) 2018-2023 Gavin D. Howard and contributors.\n" + "// Copyright (c) 2018-2024 Gavin D. Howard and contributors.\n" "// Licensed under the 2-clause BSD license.\n" "// *** AUTOMATICALLY GENERATED FROM %s. DO NOT MODIFY. ***\n\n"; // clang-format on diff --git a/gen/strgen.sh b/gen/strgen.sh index 2b8927b5528..8542bd40ee8 100755 --- a/gen/strgen.sh +++ b/gen/strgen.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -96,7 +96,7 @@ if [ -n "$remove_tabs" ]; then fi cat<data & ~(BC_LEX_CHAR_MSB(1)))) /// A macro to easily build a keyword entry. See bc_lex_kws in src/data.c. -#define BC_LEX_KW_ENTRY(a, b, c) \ - { \ - .data = ((b) & ~(BC_LEX_CHAR_MSB(1))) | BC_LEX_CHAR_MSB(c), .name = a \ - } +#define BC_LEX_KW_ENTRY(a, b, c) \ + { .data = ((b) & ~(BC_LEX_CHAR_MSB(1))) | BC_LEX_CHAR_MSB(c), .name = a } #if BC_ENABLE_EXTRA_MATH @@ -234,7 +233,7 @@ bc_lex_token(BcLex* l); * @param t The token to return operator data for. * @return The operator data for @a t. */ -#define BC_PARSE_OP_DATA(t) bc_parse_ops[((t) -BC_LEX_OP_INC)] +#define BC_PARSE_OP_DATA(t) bc_parse_ops[((t) - BC_LEX_OP_INC)] /** * Returns non-zero if operator @a op is left associative, zero otherwise. @@ -341,7 +340,7 @@ bc_lex_token(BcLex* l); * @param t The token to turn into an instruction. * @return The token as an instruction. */ -#define BC_PARSE_TOKEN_INST(t) ((uchar) ((t) -BC_LEX_NEG + BC_INST_NEG)) +#define BC_PARSE_TOKEN_INST(t) ((uchar) ((t) - BC_LEX_NEG + BC_INST_NEG)) /** * Returns true if the token is a bc keyword. @@ -372,10 +371,8 @@ typedef struct BcParseNext /// A macro to generate a BcParseNext literal from BcParseNext data. See /// src/data.c for examples. -#define BC_PARSE_NEXT(a, ...) \ - { \ - .len = (uchar) (a), BC_PARSE_NEXT_TOKENS(__VA_ARGS__) \ - } +#define BC_PARSE_NEXT(a, ...) \ + { .len = (uchar) (a), BC_PARSE_NEXT_TOKENS(__VA_ARGS__) } /// A status returned by @a bc_parse_expr_err(). It can either return success or /// an error indicating an empty expression. diff --git a/include/bcl.h b/include/bcl.h index d3a9f42cdcf..8e762b694f4 100644 --- a/include/bcl.h +++ b/include/bcl.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/dc.h b/include/dc.h index 9a603c26d1a..1328f1c63b3 100644 --- a/include/dc.h +++ b/include/dc.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -45,8 +45,9 @@ /** * The main function for dc. It just sets variables and passes its arguments * through to @a bc_vm_boot(). + * @return A status. */ -void +BcStatus dc_main(int argc, char* argv[]); // A reference to the dc help text. diff --git a/include/file.h b/include/file.h index 95cfa861a73..86f368db11c 100644 --- a/include/file.h +++ b/include/file.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -54,6 +54,9 @@ typedef struct BcFile // with the existing code as possible. FILE* f; + // True if errors should be fatal, false otherwise. + bool errors_fatal; + } BcFile; #else // BC_ENABLE_LINE_LIB @@ -64,6 +67,9 @@ typedef struct BcFile // The actual file descriptor. int fd; + // True if errors should be fatal, false otherwise. + bool errors_fatal; + // The buffer for the file. char* buf; @@ -123,23 +129,25 @@ typedef enum BcFlushType /** * Initialize a file. - * @param f The file to initialize. - * @param file The stdio file. + * @param f The file to initialize. + * @param file The stdio file. + * @param errors_fatal True if errors should be fatal, false otherwise. */ void -bc_file_init(BcFile* f, FILE* file); +bc_file_init(BcFile* f, FILE* file, bool errors_fatal); #else // BC_ENABLE_LINE_LIB /** * Initialize a file. - * @param f The file to initialize. - * @param fd The file descriptor. - * @param buf The buffer for the file. - * @param cap The capacity of the buffer. + * @param f The file to initialize. + * @param fd The file descriptor. + * @param buf The buffer for the file. + * @param cap The capacity of the buffer. + * @param errors_fatal True if errors should be fatal, false otherwise. */ void -bc_file_init(BcFile* f, int fd, char* buf, size_t cap); +bc_file_init(BcFile* f, int fd, char* buf, size_t cap, bool errors_fatal); #endif // BC_ENABLE_LINE_LIB diff --git a/include/history.h b/include/history.h index 64402c4dffa..460524bd7b8 100644 --- a/include/history.h +++ b/include/history.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/lang.h b/include/lang.h index 97aeeaa98da..6c824513971 100644 --- a/include/lang.h +++ b/include/lang.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/lex.h b/include/lex.h index ac9b7b6ea69..d2be3c7526e 100644 --- a/include/lex.h +++ b/include/lex.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/library.h b/include/library.h index 1edd3757444..9942705a5f3 100644 --- a/include/library.h +++ b/include/library.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/num.h b/include/num.h index 6c9dee107f2..6cead6eb382 100644 --- a/include/num.h +++ b/include/num.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/opt.h b/include/opt.h index 28d9d99a785..e60328994d8 100644 --- a/include/opt.h +++ b/include/opt.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/parse.h b/include/parse.h index ece413e7bd7..7f0f8768b0d 100644 --- a/include/parse.h +++ b/include/parse.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/program.h b/include/program.h index 1df753afad2..e16e5c079d7 100644 --- a/include/program.h +++ b/include/program.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/rand.h b/include/rand.h index e516295d7c5..aee63b866cf 100644 --- a/include/rand.h +++ b/include/rand.h @@ -13,7 +13,7 @@ * This code is under the following license: * * Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -241,10 +241,7 @@ typedef struct BcRandState * @param l The low 64 bits. * @return The constant built from @a h and @a l. */ -#define BC_RAND_CONSTANT(h, l) \ - { \ - .lo = (l), .hi = (h) \ - } +#define BC_RAND_CONSTANT(h, l) { .lo = (l), .hi = (h) } /** * Truncates a PCG state to the number of bits in a random integer. diff --git a/include/read.h b/include/read.h index 867dcd7433a..62e6897635a 100644 --- a/include/read.h +++ b/include/read.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/status.h b/include/status.h index 242514edb47..f579df8c649 100644 --- a/include/status.h +++ b/include/status.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -60,10 +60,10 @@ #endif // __FreeBSD__ #endif // BC_TEST_FREEBSD -// This is used by configure.sh to test for Mac OSX. +// This is used by configure.sh to test for macOS. #ifdef BC_TEST_APPLE #ifdef __APPLE__ -#error On Mac OSX without _DARWIN_C_SOURCE +#error On macOS without _DARWIN_C_SOURCE #endif // __APPLE__ #endif // BC_TEST_APPLE diff --git a/include/vector.h b/include/vector.h index b86be142453..cad5fc2aa7c 100644 --- a/include/vector.h +++ b/include/vector.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/version.h b/include/version.h index e2576269345..586691a6e7e 100644 --- a/include/version.h +++ b/include/version.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.7.5 +#define VERSION 6.7.6 #endif // BC_VERSION_H diff --git a/include/vm.h b/include/vm.h index c56cc8e7370..052c1d14c23 100644 --- a/include/vm.h +++ b/include/vm.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -493,7 +493,7 @@ #define BC_VM_SAFE_RESULT(r) ((r)->t >= BC_RESULT_TEMP) /// The invalid locale catalog return value. -#define BC_VM_INVALID_CATALOG ((nl_catd) -1) +#define BC_VM_INVALID_CATALOG ((nl_catd) - 1) /** * Returns true if the *unsigned* multiplication overflows. @@ -791,8 +791,9 @@ bc_vm_info(const char* const help); * The entrance point for bc/dc together. * @param argc The count of arguments. * @param argv The argument array. + * @return A status. */ -void +BcStatus bc_vm_boot(int argc, char* argv[]); /** @@ -1045,8 +1046,9 @@ bc_vm_fatalError(BcErr e); * A function to call at exit. * @param status The exit status. */ -int -bc_vm_atexit(int status); +BcStatus +bc_vm_atexit(BcStatus status); + #endif // BC_ENABLE_LIBRARY /// A reference to the copyright header. diff --git a/locales/de_DE.ISO8859-1.msg b/locales/de_DE.ISO8859-1.msg index 858a3946e8f..9700ab070b2 100644 --- a/locales/de_DE.ISO8859-1.msg +++ b/locales/de_DE.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/de_DE.UTF-8.msg b/locales/de_DE.UTF-8.msg index 25be4fd79cb..7b918fc6d1c 100644 --- a/locales/de_DE.UTF-8.msg +++ b/locales/de_DE.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/en_US.msg b/locales/en_US.msg index 5610496d6e7..4afcbcd1f81 100644 --- a/locales/en_US.msg +++ b/locales/en_US.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/es_ES.ISO8859-1.msg b/locales/es_ES.ISO8859-1.msg index 3bf70753559..4d022d9bf66 100644 --- a/locales/es_ES.ISO8859-1.msg +++ b/locales/es_ES.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/es_ES.UTF-8.msg b/locales/es_ES.UTF-8.msg index 0a5cf26d162..364cff6ee57 100644 --- a/locales/es_ES.UTF-8.msg +++ b/locales/es_ES.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/fr_FR.ISO8859-1.msg b/locales/fr_FR.ISO8859-1.msg index f2e07e02b2d..b4b39866c96 100644 --- a/locales/fr_FR.ISO8859-1.msg +++ b/locales/fr_FR.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/fr_FR.UTF-8.msg b/locales/fr_FR.UTF-8.msg index 1e9e900746a..c3387e31ae9 100644 --- a/locales/fr_FR.UTF-8.msg +++ b/locales/fr_FR.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ja_JP.UTF-8.msg b/locales/ja_JP.UTF-8.msg index d871e9bf6ad..21640eb9f1c 100644 --- a/locales/ja_JP.UTF-8.msg +++ b/locales/ja_JP.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ja_JP.eucJP.msg b/locales/ja_JP.eucJP.msg index e8baef5b498..3e3b73d20f4 100644 --- a/locales/ja_JP.eucJP.msg +++ b/locales/ja_JP.eucJP.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/nl_NL.ISO8859-1.msg b/locales/nl_NL.ISO8859-1.msg index cca79a04091..aaf41c65b04 100644 --- a/locales/nl_NL.ISO8859-1.msg +++ b/locales/nl_NL.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/nl_NL.UTF-8.msg b/locales/nl_NL.UTF-8.msg index 7becb1b880f..0ab0b9c3dc6 100644 --- a/locales/nl_NL.UTF-8.msg +++ b/locales/nl_NL.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pl_PL.ISO8859-2.msg b/locales/pl_PL.ISO8859-2.msg index e3bd25a59a1..5b427c808fd 100644 --- a/locales/pl_PL.ISO8859-2.msg +++ b/locales/pl_PL.ISO8859-2.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pl_PL.UTF-8.msg b/locales/pl_PL.UTF-8.msg index c6766e2f4e9..fd0f85b5f76 100644 --- a/locales/pl_PL.UTF-8.msg +++ b/locales/pl_PL.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pt_PT.ISO8859-1.msg b/locales/pt_PT.ISO8859-1.msg index 0a02064248c..9b365b4a7bd 100644 --- a/locales/pt_PT.ISO8859-1.msg +++ b/locales/pt_PT.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pt_PT.UTF-8.msg b/locales/pt_PT.UTF-8.msg index 36c3b692129..f5054a178cf 100644 --- a/locales/pt_PT.UTF-8.msg +++ b/locales/pt_PT.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.CP1251.msg b/locales/ru_RU.CP1251.msg index 644470eb657..ac8957cc6aa 100644 --- a/locales/ru_RU.CP1251.msg +++ b/locales/ru_RU.CP1251.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.CP866.msg b/locales/ru_RU.CP866.msg index ee49a2a4542..763fd55a365 100644 --- a/locales/ru_RU.CP866.msg +++ b/locales/ru_RU.CP866.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.ISO8859-5.msg b/locales/ru_RU.ISO8859-5.msg index a2921a0465e..bbb1f418c3a 100644 --- a/locales/ru_RU.ISO8859-5.msg +++ b/locales/ru_RU.ISO8859-5.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.KOI8-R.msg b/locales/ru_RU.KOI8-R.msg index a5ee84751f1..d1e2bdc014d 100644 --- a/locales/ru_RU.KOI8-R.msg +++ b/locales/ru_RU.KOI8-R.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.UTF-8.msg b/locales/ru_RU.UTF-8.msg index cd95ad24e66..b45b3634a76 100644 --- a/locales/ru_RU.UTF-8.msg +++ b/locales/ru_RU.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.GB18030.msg b/locales/zh_CN.GB18030.msg index 0ec91394c92..3625c5b40fd 100644 --- a/locales/zh_CN.GB18030.msg +++ b/locales/zh_CN.GB18030.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.GB2312.msg b/locales/zh_CN.GB2312.msg index 0ec91394c92..3625c5b40fd 100644 --- a/locales/zh_CN.GB2312.msg +++ b/locales/zh_CN.GB2312.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.GBK.msg b/locales/zh_CN.GBK.msg index 0ec91394c92..3625c5b40fd 100644 --- a/locales/zh_CN.GBK.msg +++ b/locales/zh_CN.GBK.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.UTF-8.msg b/locales/zh_CN.UTF-8.msg index 1fbb16d1cfd..95813f41169 100644 --- a/locales/zh_CN.UTF-8.msg +++ b/locales/zh_CN.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.eucCN.msg b/locales/zh_CN.eucCN.msg index 0ec91394c92..3625c5b40fd 100644 --- a/locales/zh_CN.eucCN.msg +++ b/locales/zh_CN.eucCN.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2023 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/manuals/bc/A.1 b/manuals/bc/A.1 index 1810beaf929..4750598b55f 100644 --- a/manuals/bc/A.1 +++ b/manuals/bc/A.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,38 +25,38 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -65,9 +65,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -76,7 +76,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -86,17 +86,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -107,17 +107,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -125,54 +125,54 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R] into stacks. .RS @@ -221,8 +221,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -233,11 +233,12 @@ desired value for a global. .PP For functions that set \f[B]seed\f[R], the value assigned to \f[B]seed\f[R] is not propagated to parent functions. -This means that the sequence of pseudo-random numbers that they see will -not be the same sequence of pseudo-random numbers that any parent sees. +This means that the sequence of pseudo\-random numbers that they see +will not be the same sequence of pseudo\-random numbers that any parent +sees. This is only the case once \f[B]seed\f[R] has been set. .PP -If a function desires to not affect the sequence of pseudo-random +If a function desires to not affect the sequence of pseudo\-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP @@ -250,16 +251,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -267,28 +268,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library and the extended math library before running any code, including any expressions or files specified on the @@ -298,7 +299,7 @@ command line. To learn what is in the libraries, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -306,10 +307,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -322,26 +323,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -354,16 +355,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -424,7 +425,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -432,35 +433,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -468,14 +469,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -489,7 +490,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -497,7 +498,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -510,7 +511,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -518,7 +519,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -529,32 +530,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]0\f[R]. If \f[B]obase\f[R] is \f[B]0\f[R], values are output in scientific @@ -562,8 +563,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -573,7 +574,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -598,7 +599,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -608,7 +609,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -626,26 +627,26 @@ Array Elements: \f[B]I[E]\f[R] .IP "7." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Numbers 6 and 7 are \f[B]non-portable extensions\f[R]. +Numbers 6 and 7 are \f[B]non\-portable extensions\f[R]. .PP -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .PP The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is assigned to \f[B]seed\f[R] -and used again, the pseudo-random number generator is guaranteed to -produce the same sequence of pseudo-random numbers as it did when the +and used again, the pseudo\-random number generator is guaranteed to +produce the same sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if \f[B]seed\f[R] is queried again immediately. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will -\f[I]not\f[R] produce unique sequences of pseudo-random numbers. +\f[I]not\f[R] produce unique sequences of pseudo\-random numbers. The value of \f[B]seed\f[R] will change after any use of the \f[B]rand()\f[R] and \f[B]irand(E)\f[R] operands (see the \f[I]Operands\f[R] subsection below), except if the parameter passed to @@ -675,61 +676,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -741,47 +742,47 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "23." 4 -\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]rand()\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive). Using this operand will change the value of \f[B]seed\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "24." 4 -\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]irand(E)\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and the value of \f[B]E\f[R] (exclusive). -If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s +If \f[B]E\f[R] is negative or is a non\-integer (\f[B]E\f[R]\[cq]s \f[I]scale\f[R] is not \f[B]0\f[R]), an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If \f[B]E\f[R] is larger than \f[B]BC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]BC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this operand is @@ -790,25 +791,25 @@ Using this operand will change the value of \f[B]seed\f[R], unless the value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R]. In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "25." 4 \f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .PP The integers generated by \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to be as unbiased as possible, subject to the limitations of -the pseudo-random number generator. +the pseudo\-random number generator. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to \f[I]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from bc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from bc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -820,12 +821,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -843,7 +844,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -862,11 +863,11 @@ These have the form \f[B]e\f[R]. The exponent (the portion after the \f[B]e\f[R]) must be an integer. An example is \f[B]1.89237e9\f[R], which is equal to \f[B]1892370000\f[R]. -Negative exponents are also allowed, so \f[B]4.2890e-3\f[R] is equal to +Negative exponents are also allowed, so \f[B]4.2890e\-3\f[R] is equal to \f[B]0.0042890\f[R]. .PP -Using scientific notation is an error or warning if the \f[B]-s\f[R] or -\f[B]-w\f[R], respectively, command-line options (or equivalents) are +Using scientific notation is an error or warning if the \f[B]\-s\f[R] or +\f[B]\-w\f[R], respectively, command\-line options (or equivalents) are given. .PP \f[B]WARNING\f[R]: Both the number and the exponent in scientific @@ -876,16 +877,16 @@ of the current \f[B]ibase\f[R]. For example, if \f[B]ibase\f[R] is \f[B]16\f[R] and bc(1) is given the number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if bc(1) is given the number string -\f[B]10e-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. +\f[B]10e\-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SS Operators The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -894,7 +895,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -939,7 +940,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -957,7 +958,7 @@ Associativity: Left Description: \f[B]shift left\f[R], \f[B]shift right\f[R] .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] Type: Binary .RS .PP @@ -995,7 +996,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -1006,7 +1007,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -1016,7 +1017,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -1024,7 +1029,7 @@ The \f[B]truncation\f[R] operator returns a copy of the given expression with all of its \f[I]scale\f[R] removed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -1038,9 +1043,9 @@ more). .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -1051,7 +1056,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -1069,18 +1074,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -1088,7 +1093,7 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. @@ -1100,9 +1105,9 @@ decimal point moved \f[B]b\f[R] places to the right. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]>>\f[R] @@ -1112,12 +1117,12 @@ decimal point moved \f[B]b\f[R] places to the left. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -1130,7 +1135,7 @@ the corresponding arithmetic operator and the result is assigned to \f[B]a\f[R]. .PP The \f[B]assignment\f[R] operators that correspond to operators that are -extensions are themselves \f[B]non-portable extensions\f[R]. +extensions are themselves \f[B]non\-portable extensions\f[R]. .RE .TP \f[B]==\f[R] \f[B]<=\f[R] \f[B]>=\f[R] \f[B]!=\f[R] \f[B]<\f[R] \f[B]>\f[R] @@ -1147,28 +1152,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -1217,10 +1222,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1237,7 +1242,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1262,7 +1267,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1275,11 +1280,11 @@ Scientific notation is activated by assigning \f[B]0\f[R] to To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Scientific notation and engineering notation are disabled if bc(1) is -run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options +run with either the \f[B]\-s\f[R] or \f[B]\-w\f[R] command\-line options (or equivalents). .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .SS Strings If strings appear as a statement by themselves, they are printed without a trailing newline. @@ -1297,7 +1302,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1325,9 +1330,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1340,7 +1345,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1386,10 +1391,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1425,7 +1430,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1440,13 +1445,13 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are -available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line +available when the \f[B]\-l\f[R] or \f[B]\-\-mathlib\f[R] command\-line flags are given, except that the extended math library is not available -when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents +when the \f[B]\-s\f[R] option, the \f[B]\-w\f[R] option, or equivalents are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following @@ -1502,11 +1507,11 @@ Functions\f[R] subsection below). .RE .SS Extended Library The extended library is \f[I]not\f[R] loaded when the -\f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] +\f[B]\-s\f[R]/\f[B]\-\-standard\f[R] or \f[B]\-w\f[R]/\f[B]\-\-warn\f[R] options are given since they are not part of the library defined by the standard (see the \f[B]STANDARDS\f[R] section). .PP -The extended library is a \f[B]non-portable extension\f[R]. +The extended library is a \f[B]non\-portable extension\f[R]. .TP \f[B]p(x, y)\f[R] Calculates \f[B]x\f[R] to the power of \f[B]y\f[R], even if \f[B]y\f[R] @@ -1627,11 +1632,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1665,7 +1670,7 @@ Functions\f[R] subsection below). Returns the tangent of \f[B]x\f[R], which is assumed to be in radians. .RS .PP -If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]-1\f[R], this raises an +If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]\-1\f[R], this raises an error and causes bc(1) to reset (see the \f[B]RESET\f[R] section). .PP This is an alias of \f[B]t(x)\f[R]. @@ -1693,11 +1698,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1726,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1735,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random integer that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. @@ -1746,7 +1751,7 @@ is returned, and \f[B]seed\f[R] is not changed. .TP \f[B]i2rand(a, b)\f[R] Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them -as inclusive bounds to enerate a pseudo-random integer. +as inclusive bounds to enerate a pseudo\-random integer. If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. @@ -1792,8 +1797,8 @@ If you want to use signed two\[cq]s complement arguments, use .TP \f[B]bshl(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] -and calculates and returns the result of \f[B]a\f[R] bit-shifted left by -\f[B]b\f[R] places. +and calculates and returns the result of \f[B]a\f[R] bit\-shifted left +by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1803,7 +1808,7 @@ If you want to use signed two\[cq]s complement arguments, use \f[B]bshr(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] and calculates and returns the truncated result of \f[B]a\f[R] -bit-shifted right by \f[B]b\f[R] places. +bit\-shifted right by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1867,7 +1872,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brevn(x, n)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has the same number of 8-bit bytes as the truncated absolute +though it has the same number of 8\-bit bytes as the truncated absolute value of \f[B]n\f[R]. .RS .PP @@ -1922,11 +1927,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]broln(x, p, n)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1980,9 +1985,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]brol(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1991,11 +1996,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brorn(x, p, n)\f[R] Does a right bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2049,9 +2054,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]bror(x, p)\f[R] Does a right bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2105,7 +2110,7 @@ If you want to a use signed two\[cq]s complement argument, use .RE .TP \f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise-reversed number with an extra set bit +Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit one place more significant than the real most significant bit (which was the least significant bit in the original number). This number is reversed and returned without the extra set bit. @@ -2116,29 +2121,29 @@ meant to be used by users, but it can be. .RE .TP \f[B]plz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and without a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]plznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and with a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline. .RE .TP \f[B]pnlz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP @@ -2146,9 +2151,9 @@ Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]pnlznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP @@ -2160,22 +2165,22 @@ Returns the numbers of unsigned integer bytes required to hold the truncated absolute value of \f[B]x\f[R]. .TP \f[B]sbytes(x)\f[R] -Returns the numbers of signed, two\[cq]s-complement integer bytes +Returns the numbers of signed, two\[cq]s\-complement integer bytes required to hold the truncated value of \f[B]x\f[R]. .TP \f[B]s2u(x)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer and returns the non-negative +be as a 2\[cq]s\-complement signed integer and returns the non\-negative integer that would have the same representation in binary. .TP \f[B]s2un(x,n)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer with \f[B]n\f[R] bytes and -returns the non-negative integer that would have the same representation -in binary. -If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s-complement signed +be as a 2\[cq]s\-complement signed integer with \f[B]n\f[R] bytes and +returns the non\-negative integer that would have the same +representation in binary. +If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s\-complement signed bytes, it is truncated to fit. .TP \f[B]hex(x)\f[R] @@ -2219,7 +2224,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in as few power of two bytes as +a signed, two\[cq]s\-complement integer in as few power of two bytes as possible. Both outputs are split into bytes separated by spaces. .RS @@ -2247,7 +2252,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]intn(x, n)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]n\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]n\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2275,7 +2280,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int8(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]1\f[R] byte. +a signed, two\[cq]s\-complement integer in \f[B]1\f[R] byte. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2303,7 +2308,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int16(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]2\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]2\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2331,7 +2336,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int32(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]4\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]4\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2359,7 +2364,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int64(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]8\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]8\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2406,7 +2411,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). \f[B]output_byte(x, i)\f[R] Outputs byte \f[B]i\f[R] of the truncated absolute value of \f[B]x\f[R], where \f[B]0\f[R] is the least significant byte and \f[B]number_of_bytes -- 1\f[R] is the most significant byte. +\- 1\f[R] is the most significant byte. .RS .PP This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] @@ -2468,7 +2473,7 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -2539,29 +2544,29 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]rand()\f[R] operand. -Set at \f[B]2\[ha]BC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]BC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -2569,28 +2574,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -2611,14 +2616,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -2630,7 +2635,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -2639,7 +2644,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -2649,13 +2654,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -2664,11 +2669,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -2677,43 +2682,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -2729,10 +2735,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -2754,7 +2760,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -2777,7 +2783,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -2788,17 +2794,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -2814,23 +2821,23 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -2842,18 +2849,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -2865,7 +2872,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -2891,11 +2898,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -bc(1) supports interactive command-line editing. +bc(1) supports interactive command\-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -2913,10 +2920,10 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md index 77004822f73..56f7c52fb2c 100644 --- a/manuals/bc/A.1.md +++ b/manuals/bc/A.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -811,6 +811,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\$** diff --git a/manuals/bc/E.1 b/manuals/bc/E.1 index 549c1adae8a..62b18165fe9 100644 --- a/manuals/bc/E.1 +++ b/manuals/bc/E.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,34 +25,34 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -61,9 +61,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -72,7 +72,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -82,17 +82,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -103,61 +103,61 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R] into stacks. .RS @@ -202,8 +202,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -217,16 +217,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -234,28 +234,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library before running any code, including any expressions or files specified on the command line. @@ -264,7 +264,7 @@ any expressions or files specified on the command line. To learn what is in the library, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -272,10 +272,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -288,26 +288,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -320,16 +320,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -382,7 +382,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -390,35 +390,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -426,14 +426,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -447,7 +447,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -455,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -468,7 +468,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -476,7 +476,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -487,32 +487,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]2\f[R]. Values are output in the specified base. @@ -525,7 +525,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -550,7 +550,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -560,7 +560,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -576,7 +576,7 @@ Array Elements: \f[B]I[E]\f[R] .IP "6." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Number 6 is a \f[B]non-portable extension\f[R]. +Number 6 is a \f[B]non\-portable extension\f[R]. .PP Variables and arrays do not interfere; users can have arrays named the same as variables. @@ -599,61 +599,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -665,33 +665,33 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -703,12 +703,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -726,7 +726,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -744,7 +744,7 @@ The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -753,7 +753,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -780,7 +780,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -789,7 +789,7 @@ Associativity: Left Description: \f[B]add\f[R], \f[B]subtract\f[R] .RE .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] Type: Binary .RS .PP @@ -827,7 +827,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -838,7 +838,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -848,7 +848,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -859,7 +863,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -877,18 +881,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -896,12 +900,12 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -928,28 +932,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -998,10 +1002,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1018,7 +1022,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1043,7 +1047,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1064,7 +1068,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1092,9 +1096,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1107,7 +1111,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1153,10 +1157,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1192,7 +1196,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1207,10 +1211,10 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY -All of the functions below are available when the \f[B]-l\f[R] or -\f[B]--mathlib\f[R] command-line flags are given. +All of the functions below are available when the \f[B]\-l\f[R] or +\f[B]\-\-mathlib\f[R] command\-line flags are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: @@ -1291,7 +1295,7 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1362,24 +1366,24 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1387,28 +1391,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -1429,14 +1433,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -1448,7 +1452,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -1457,7 +1461,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -1467,13 +1471,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -1482,11 +1486,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -1495,43 +1499,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -1549,7 +1554,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator and the corresponding assignment @@ -1570,7 +1575,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -1593,7 +1598,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -1604,17 +1609,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1630,23 +1636,23 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -1658,18 +1664,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1681,7 +1687,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1707,11 +1713,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -bc(1) supports interactive command-line editing. +bc(1) supports interactive command\-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -1729,10 +1735,10 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/E.1.md b/manuals/bc/E.1.md index b5d77d2c76b..0082caea840 100644 --- a/manuals/bc/E.1.md +++ b/manuals/bc/E.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -688,6 +688,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\^** diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1 index e939df81cff..69f28e87599 100644 --- a/manuals/bc/EH.1 +++ b/manuals/bc/EH.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,34 +25,34 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -61,9 +61,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -72,7 +72,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -82,17 +82,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -103,61 +103,61 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R] into stacks. .RS @@ -202,8 +202,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -217,16 +217,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -234,28 +234,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library before running any code, including any expressions or files specified on the command line. @@ -264,7 +264,7 @@ any expressions or files specified on the command line. To learn what is in the library, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -272,10 +272,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -288,26 +288,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -320,16 +320,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -382,7 +382,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -390,35 +390,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -426,14 +426,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -447,7 +447,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -455,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -468,7 +468,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -476,7 +476,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -487,32 +487,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]2\f[R]. Values are output in the specified base. @@ -525,7 +525,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -550,7 +550,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -560,7 +560,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -576,7 +576,7 @@ Array Elements: \f[B]I[E]\f[R] .IP "6." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Number 6 is a \f[B]non-portable extension\f[R]. +Number 6 is a \f[B]non\-portable extension\f[R]. .PP Variables and arrays do not interfere; users can have arrays named the same as variables. @@ -599,61 +599,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -665,33 +665,33 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -703,12 +703,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -726,7 +726,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -744,7 +744,7 @@ The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -753,7 +753,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -780,7 +780,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -789,7 +789,7 @@ Associativity: Left Description: \f[B]add\f[R], \f[B]subtract\f[R] .RE .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] Type: Binary .RS .PP @@ -827,7 +827,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -838,7 +838,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -848,7 +848,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -859,7 +863,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -877,18 +881,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -896,12 +900,12 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -928,28 +932,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -998,10 +1002,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1018,7 +1022,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1043,7 +1047,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1064,7 +1068,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1092,9 +1096,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1107,7 +1111,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1153,10 +1157,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1192,7 +1196,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1207,10 +1211,10 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY -All of the functions below are available when the \f[B]-l\f[R] or -\f[B]--mathlib\f[R] command-line flags are given. +All of the functions below are available when the \f[B]\-l\f[R] or +\f[B]\-\-mathlib\f[R] command\-line flags are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: @@ -1291,7 +1295,7 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1362,24 +1366,24 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1387,28 +1391,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -1429,14 +1433,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -1448,7 +1452,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -1457,7 +1461,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -1467,13 +1471,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -1482,11 +1486,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -1495,43 +1499,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -1549,7 +1554,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator and the corresponding assignment @@ -1570,7 +1575,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -1593,7 +1598,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -1604,17 +1609,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1630,16 +1636,16 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), @@ -1651,18 +1657,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1674,7 +1680,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1702,10 +1708,10 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/EH.1.md b/manuals/bc/EH.1.md index a8a42b06be2..7e682058234 100644 --- a/manuals/bc/EH.1.md +++ b/manuals/bc/EH.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -688,6 +688,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\^** diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1 index 290aec48a6e..fb453b05363 100644 --- a/manuals/bc/EHN.1 +++ b/manuals/bc/EHN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,34 +25,34 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -61,9 +61,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -72,7 +72,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -82,17 +82,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -103,61 +103,61 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R] into stacks. .RS @@ -202,8 +202,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -217,16 +217,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -234,28 +234,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library before running any code, including any expressions or files specified on the command line. @@ -264,7 +264,7 @@ any expressions or files specified on the command line. To learn what is in the library, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -272,10 +272,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -288,26 +288,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -320,16 +320,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -382,7 +382,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -390,35 +390,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -426,14 +426,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -447,7 +447,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -455,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -468,7 +468,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -476,7 +476,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -487,32 +487,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]2\f[R]. Values are output in the specified base. @@ -525,7 +525,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -550,7 +550,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -560,7 +560,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -576,7 +576,7 @@ Array Elements: \f[B]I[E]\f[R] .IP "6." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Number 6 is a \f[B]non-portable extension\f[R]. +Number 6 is a \f[B]non\-portable extension\f[R]. .PP Variables and arrays do not interfere; users can have arrays named the same as variables. @@ -599,61 +599,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -665,33 +665,33 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -703,12 +703,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -726,7 +726,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -744,7 +744,7 @@ The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -753,7 +753,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -780,7 +780,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -789,7 +789,7 @@ Associativity: Left Description: \f[B]add\f[R], \f[B]subtract\f[R] .RE .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] Type: Binary .RS .PP @@ -827,7 +827,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -838,7 +838,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -848,7 +848,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -859,7 +863,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -877,18 +881,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -896,12 +900,12 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -928,28 +932,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -998,10 +1002,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1018,7 +1022,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1043,7 +1047,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1064,7 +1068,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1092,9 +1096,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1107,7 +1111,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1153,10 +1157,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1192,7 +1196,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1207,10 +1211,10 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY -All of the functions below are available when the \f[B]-l\f[R] or -\f[B]--mathlib\f[R] command-line flags are given. +All of the functions below are available when the \f[B]\-l\f[R] or +\f[B]\-\-mathlib\f[R] command\-line flags are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: @@ -1291,7 +1295,7 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1362,24 +1366,24 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1387,28 +1391,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -1429,14 +1433,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -1448,7 +1452,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -1457,7 +1461,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -1467,13 +1471,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -1482,11 +1486,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -1495,43 +1499,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -1549,7 +1554,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator and the corresponding assignment @@ -1570,7 +1575,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -1593,7 +1598,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -1604,17 +1609,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1630,16 +1636,16 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), @@ -1651,18 +1657,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1674,7 +1680,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1699,10 +1705,10 @@ exit, and it uses the default handler for all other signals. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/EHN.1.md b/manuals/bc/EHN.1.md index a38767eb010..9578d2ab772 100644 --- a/manuals/bc/EHN.1.md +++ b/manuals/bc/EHN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -688,6 +688,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\^** diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1 index 99ccb822ea7..4833e3e70dd 100644 --- a/manuals/bc/EN.1 +++ b/manuals/bc/EN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,34 +25,34 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -61,9 +61,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -72,7 +72,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -82,17 +82,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -103,61 +103,61 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], and \f[B]scale\f[R] into stacks. .RS @@ -202,8 +202,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -217,16 +217,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -234,28 +234,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library before running any code, including any expressions or files specified on the command line. @@ -264,7 +264,7 @@ any expressions or files specified on the command line. To learn what is in the library, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -272,10 +272,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -288,26 +288,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -320,16 +320,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -382,7 +382,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -390,35 +390,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -426,14 +426,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -447,7 +447,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -455,7 +455,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -468,7 +468,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -476,7 +476,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -487,32 +487,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]2\f[R]. Values are output in the specified base. @@ -525,7 +525,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -550,7 +550,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -560,7 +560,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -576,7 +576,7 @@ Array Elements: \f[B]I[E]\f[R] .IP "6." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Number 6 is a \f[B]non-portable extension\f[R]. +Number 6 is a \f[B]non\-portable extension\f[R]. .PP Variables and arrays do not interfere; users can have arrays named the same as variables. @@ -599,61 +599,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -665,33 +665,33 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -703,12 +703,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -726,7 +726,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -744,7 +744,7 @@ The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -753,7 +753,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -780,7 +780,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -789,7 +789,7 @@ Associativity: Left Description: \f[B]add\f[R], \f[B]subtract\f[R] .RE .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] Type: Binary .RS .PP @@ -827,7 +827,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -838,7 +838,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -848,7 +848,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -859,7 +863,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -877,18 +881,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -896,12 +900,12 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] +\f[B]=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -928,28 +932,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -998,10 +1002,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1018,7 +1022,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1043,7 +1047,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1064,7 +1068,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1092,9 +1096,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1107,7 +1111,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1153,10 +1157,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1192,7 +1196,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1207,10 +1211,10 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY -All of the functions below are available when the \f[B]-l\f[R] or -\f[B]--mathlib\f[R] command-line flags are given. +All of the functions below are available when the \f[B]\-l\f[R] or +\f[B]\-\-mathlib\f[R] command\-line flags are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following functions for the math library: @@ -1291,7 +1295,7 @@ The transcendental functions in the standard math library are: .IP \[bu] 2 \f[B]j(x, n)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1362,24 +1366,24 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1387,28 +1391,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -1429,14 +1433,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -1448,7 +1452,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -1457,7 +1461,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -1467,13 +1471,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -1482,11 +1486,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -1495,43 +1499,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -1549,7 +1554,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator and the corresponding assignment @@ -1570,7 +1575,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -1593,7 +1598,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -1604,17 +1609,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1630,23 +1636,23 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -1658,18 +1664,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1681,7 +1687,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1707,11 +1713,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -bc(1) supports interactive command-line editing. +bc(1) supports interactive command\-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -1726,10 +1732,10 @@ the arrow keys. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/EN.1.md b/manuals/bc/EN.1.md index 1c8e855e6f5..f6ad0093090 100644 --- a/manuals/bc/EN.1.md +++ b/manuals/bc/EN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -688,6 +688,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\^** diff --git a/manuals/bc/H.1 b/manuals/bc/H.1 index 13b2caf84e1..4787435ae05 100644 --- a/manuals/bc/H.1 +++ b/manuals/bc/H.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,38 +25,38 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -65,9 +65,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -76,7 +76,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -86,17 +86,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -107,17 +107,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -125,54 +125,54 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R] into stacks. .RS @@ -221,8 +221,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -233,11 +233,12 @@ desired value for a global. .PP For functions that set \f[B]seed\f[R], the value assigned to \f[B]seed\f[R] is not propagated to parent functions. -This means that the sequence of pseudo-random numbers that they see will -not be the same sequence of pseudo-random numbers that any parent sees. +This means that the sequence of pseudo\-random numbers that they see +will not be the same sequence of pseudo\-random numbers that any parent +sees. This is only the case once \f[B]seed\f[R] has been set. .PP -If a function desires to not affect the sequence of pseudo-random +If a function desires to not affect the sequence of pseudo\-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP @@ -250,16 +251,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -267,28 +268,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library and the extended math library before running any code, including any expressions or files specified on the @@ -298,7 +299,7 @@ command line. To learn what is in the libraries, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -306,10 +307,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -322,26 +323,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -354,16 +355,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -424,7 +425,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -432,35 +433,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -468,14 +469,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -489,7 +490,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -497,7 +498,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -510,7 +511,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -518,7 +519,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -529,32 +530,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]0\f[R]. If \f[B]obase\f[R] is \f[B]0\f[R], values are output in scientific @@ -562,8 +563,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -573,7 +574,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -598,7 +599,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -608,7 +609,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -626,26 +627,26 @@ Array Elements: \f[B]I[E]\f[R] .IP "7." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Numbers 6 and 7 are \f[B]non-portable extensions\f[R]. +Numbers 6 and 7 are \f[B]non\-portable extensions\f[R]. .PP -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .PP The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is assigned to \f[B]seed\f[R] -and used again, the pseudo-random number generator is guaranteed to -produce the same sequence of pseudo-random numbers as it did when the +and used again, the pseudo\-random number generator is guaranteed to +produce the same sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if \f[B]seed\f[R] is queried again immediately. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will -\f[I]not\f[R] produce unique sequences of pseudo-random numbers. +\f[I]not\f[R] produce unique sequences of pseudo\-random numbers. The value of \f[B]seed\f[R] will change after any use of the \f[B]rand()\f[R] and \f[B]irand(E)\f[R] operands (see the \f[I]Operands\f[R] subsection below), except if the parameter passed to @@ -675,61 +676,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -741,47 +742,47 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "23." 4 -\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]rand()\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive). Using this operand will change the value of \f[B]seed\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "24." 4 -\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]irand(E)\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and the value of \f[B]E\f[R] (exclusive). -If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s +If \f[B]E\f[R] is negative or is a non\-integer (\f[B]E\f[R]\[cq]s \f[I]scale\f[R] is not \f[B]0\f[R]), an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If \f[B]E\f[R] is larger than \f[B]BC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]BC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this operand is @@ -790,25 +791,25 @@ Using this operand will change the value of \f[B]seed\f[R], unless the value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R]. In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "25." 4 \f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .PP The integers generated by \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to be as unbiased as possible, subject to the limitations of -the pseudo-random number generator. +the pseudo\-random number generator. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to \f[I]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from bc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from bc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -820,12 +821,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -843,7 +844,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -862,11 +863,11 @@ These have the form \f[B]e\f[R]. The exponent (the portion after the \f[B]e\f[R]) must be an integer. An example is \f[B]1.89237e9\f[R], which is equal to \f[B]1892370000\f[R]. -Negative exponents are also allowed, so \f[B]4.2890e-3\f[R] is equal to +Negative exponents are also allowed, so \f[B]4.2890e\-3\f[R] is equal to \f[B]0.0042890\f[R]. .PP -Using scientific notation is an error or warning if the \f[B]-s\f[R] or -\f[B]-w\f[R], respectively, command-line options (or equivalents) are +Using scientific notation is an error or warning if the \f[B]\-s\f[R] or +\f[B]\-w\f[R], respectively, command\-line options (or equivalents) are given. .PP \f[B]WARNING\f[R]: Both the number and the exponent in scientific @@ -876,16 +877,16 @@ of the current \f[B]ibase\f[R]. For example, if \f[B]ibase\f[R] is \f[B]16\f[R] and bc(1) is given the number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if bc(1) is given the number string -\f[B]10e-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. +\f[B]10e\-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SS Operators The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -894,7 +895,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -939,7 +940,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -957,7 +958,7 @@ Associativity: Left Description: \f[B]shift left\f[R], \f[B]shift right\f[R] .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] Type: Binary .RS .PP @@ -995,7 +996,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -1006,7 +1007,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -1016,7 +1017,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -1024,7 +1029,7 @@ The \f[B]truncation\f[R] operator returns a copy of the given expression with all of its \f[I]scale\f[R] removed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -1038,9 +1043,9 @@ more). .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -1051,7 +1056,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -1069,18 +1074,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -1088,7 +1093,7 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. @@ -1100,9 +1105,9 @@ decimal point moved \f[B]b\f[R] places to the right. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]>>\f[R] @@ -1112,12 +1117,12 @@ decimal point moved \f[B]b\f[R] places to the left. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -1130,7 +1135,7 @@ the corresponding arithmetic operator and the result is assigned to \f[B]a\f[R]. .PP The \f[B]assignment\f[R] operators that correspond to operators that are -extensions are themselves \f[B]non-portable extensions\f[R]. +extensions are themselves \f[B]non\-portable extensions\f[R]. .RE .TP \f[B]==\f[R] \f[B]<=\f[R] \f[B]>=\f[R] \f[B]!=\f[R] \f[B]<\f[R] \f[B]>\f[R] @@ -1147,28 +1152,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -1217,10 +1222,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1237,7 +1242,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1262,7 +1267,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1275,11 +1280,11 @@ Scientific notation is activated by assigning \f[B]0\f[R] to To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Scientific notation and engineering notation are disabled if bc(1) is -run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options +run with either the \f[B]\-s\f[R] or \f[B]\-w\f[R] command\-line options (or equivalents). .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .SS Strings If strings appear as a statement by themselves, they are printed without a trailing newline. @@ -1297,7 +1302,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1325,9 +1330,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1340,7 +1345,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1386,10 +1391,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1425,7 +1430,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1440,13 +1445,13 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are -available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line +available when the \f[B]\-l\f[R] or \f[B]\-\-mathlib\f[R] command\-line flags are given, except that the extended math library is not available -when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents +when the \f[B]\-s\f[R] option, the \f[B]\-w\f[R] option, or equivalents are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following @@ -1502,11 +1507,11 @@ Functions\f[R] subsection below). .RE .SS Extended Library The extended library is \f[I]not\f[R] loaded when the -\f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] +\f[B]\-s\f[R]/\f[B]\-\-standard\f[R] or \f[B]\-w\f[R]/\f[B]\-\-warn\f[R] options are given since they are not part of the library defined by the standard (see the \f[B]STANDARDS\f[R] section). .PP -The extended library is a \f[B]non-portable extension\f[R]. +The extended library is a \f[B]non\-portable extension\f[R]. .TP \f[B]p(x, y)\f[R] Calculates \f[B]x\f[R] to the power of \f[B]y\f[R], even if \f[B]y\f[R] @@ -1627,11 +1632,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1665,7 +1670,7 @@ Functions\f[R] subsection below). Returns the tangent of \f[B]x\f[R], which is assumed to be in radians. .RS .PP -If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]-1\f[R], this raises an +If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]\-1\f[R], this raises an error and causes bc(1) to reset (see the \f[B]RESET\f[R] section). .PP This is an alias of \f[B]t(x)\f[R]. @@ -1693,11 +1698,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1726,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1735,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random integer that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. @@ -1746,7 +1751,7 @@ is returned, and \f[B]seed\f[R] is not changed. .TP \f[B]i2rand(a, b)\f[R] Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them -as inclusive bounds to enerate a pseudo-random integer. +as inclusive bounds to enerate a pseudo\-random integer. If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. @@ -1792,8 +1797,8 @@ If you want to use signed two\[cq]s complement arguments, use .TP \f[B]bshl(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] -and calculates and returns the result of \f[B]a\f[R] bit-shifted left by -\f[B]b\f[R] places. +and calculates and returns the result of \f[B]a\f[R] bit\-shifted left +by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1803,7 +1808,7 @@ If you want to use signed two\[cq]s complement arguments, use \f[B]bshr(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] and calculates and returns the truncated result of \f[B]a\f[R] -bit-shifted right by \f[B]b\f[R] places. +bit\-shifted right by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1867,7 +1872,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brevn(x, n)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has the same number of 8-bit bytes as the truncated absolute +though it has the same number of 8\-bit bytes as the truncated absolute value of \f[B]n\f[R]. .RS .PP @@ -1922,11 +1927,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]broln(x, p, n)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1980,9 +1985,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]brol(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1991,11 +1996,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brorn(x, p, n)\f[R] Does a right bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2049,9 +2054,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]bror(x, p)\f[R] Does a right bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2105,7 +2110,7 @@ If you want to a use signed two\[cq]s complement argument, use .RE .TP \f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise-reversed number with an extra set bit +Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit one place more significant than the real most significant bit (which was the least significant bit in the original number). This number is reversed and returned without the extra set bit. @@ -2116,29 +2121,29 @@ meant to be used by users, but it can be. .RE .TP \f[B]plz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and without a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]plznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and with a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline. .RE .TP \f[B]pnlz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP @@ -2146,9 +2151,9 @@ Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]pnlznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP @@ -2160,22 +2165,22 @@ Returns the numbers of unsigned integer bytes required to hold the truncated absolute value of \f[B]x\f[R]. .TP \f[B]sbytes(x)\f[R] -Returns the numbers of signed, two\[cq]s-complement integer bytes +Returns the numbers of signed, two\[cq]s\-complement integer bytes required to hold the truncated value of \f[B]x\f[R]. .TP \f[B]s2u(x)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer and returns the non-negative +be as a 2\[cq]s\-complement signed integer and returns the non\-negative integer that would have the same representation in binary. .TP \f[B]s2un(x,n)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer with \f[B]n\f[R] bytes and -returns the non-negative integer that would have the same representation -in binary. -If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s-complement signed +be as a 2\[cq]s\-complement signed integer with \f[B]n\f[R] bytes and +returns the non\-negative integer that would have the same +representation in binary. +If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s\-complement signed bytes, it is truncated to fit. .TP \f[B]hex(x)\f[R] @@ -2219,7 +2224,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in as few power of two bytes as +a signed, two\[cq]s\-complement integer in as few power of two bytes as possible. Both outputs are split into bytes separated by spaces. .RS @@ -2247,7 +2252,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]intn(x, n)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]n\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]n\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2275,7 +2280,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int8(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]1\f[R] byte. +a signed, two\[cq]s\-complement integer in \f[B]1\f[R] byte. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2303,7 +2308,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int16(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]2\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]2\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2331,7 +2336,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int32(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]4\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]4\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2359,7 +2364,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int64(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]8\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]8\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2406,7 +2411,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). \f[B]output_byte(x, i)\f[R] Outputs byte \f[B]i\f[R] of the truncated absolute value of \f[B]x\f[R], where \f[B]0\f[R] is the least significant byte and \f[B]number_of_bytes -- 1\f[R] is the most significant byte. +\- 1\f[R] is the most significant byte. .RS .PP This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] @@ -2468,7 +2473,7 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -2539,29 +2544,29 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]rand()\f[R] operand. -Set at \f[B]2\[ha]BC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]BC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -2569,28 +2574,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -2611,14 +2616,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -2630,7 +2635,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -2639,7 +2644,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -2649,13 +2654,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -2664,11 +2669,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -2677,43 +2682,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -2729,10 +2735,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -2754,7 +2760,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -2777,7 +2783,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -2788,17 +2794,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -2814,16 +2821,16 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), @@ -2835,18 +2842,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -2858,7 +2865,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -2886,10 +2893,10 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md index 970fc5e584a..aa313cd14b6 100644 --- a/manuals/bc/H.1.md +++ b/manuals/bc/H.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -811,6 +811,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\$** diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1 index 3373fd9ac8c..73c243310d5 100644 --- a/manuals/bc/HN.1 +++ b/manuals/bc/HN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,38 +25,38 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -65,9 +65,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -76,7 +76,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -86,17 +86,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -107,17 +107,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -125,54 +125,54 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R] into stacks. .RS @@ -221,8 +221,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -233,11 +233,12 @@ desired value for a global. .PP For functions that set \f[B]seed\f[R], the value assigned to \f[B]seed\f[R] is not propagated to parent functions. -This means that the sequence of pseudo-random numbers that they see will -not be the same sequence of pseudo-random numbers that any parent sees. +This means that the sequence of pseudo\-random numbers that they see +will not be the same sequence of pseudo\-random numbers that any parent +sees. This is only the case once \f[B]seed\f[R] has been set. .PP -If a function desires to not affect the sequence of pseudo-random +If a function desires to not affect the sequence of pseudo\-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP @@ -250,16 +251,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -267,28 +268,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library and the extended math library before running any code, including any expressions or files specified on the @@ -298,7 +299,7 @@ command line. To learn what is in the libraries, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -306,10 +307,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -322,26 +323,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -354,16 +355,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -424,7 +425,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -432,35 +433,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -468,14 +469,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -489,7 +490,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -497,7 +498,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -510,7 +511,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -518,7 +519,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -529,32 +530,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]0\f[R]. If \f[B]obase\f[R] is \f[B]0\f[R], values are output in scientific @@ -562,8 +563,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -573,7 +574,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -598,7 +599,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -608,7 +609,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -626,26 +627,26 @@ Array Elements: \f[B]I[E]\f[R] .IP "7." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Numbers 6 and 7 are \f[B]non-portable extensions\f[R]. +Numbers 6 and 7 are \f[B]non\-portable extensions\f[R]. .PP -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .PP The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is assigned to \f[B]seed\f[R] -and used again, the pseudo-random number generator is guaranteed to -produce the same sequence of pseudo-random numbers as it did when the +and used again, the pseudo\-random number generator is guaranteed to +produce the same sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if \f[B]seed\f[R] is queried again immediately. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will -\f[I]not\f[R] produce unique sequences of pseudo-random numbers. +\f[I]not\f[R] produce unique sequences of pseudo\-random numbers. The value of \f[B]seed\f[R] will change after any use of the \f[B]rand()\f[R] and \f[B]irand(E)\f[R] operands (see the \f[I]Operands\f[R] subsection below), except if the parameter passed to @@ -675,61 +676,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -741,47 +742,47 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "23." 4 -\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]rand()\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive). Using this operand will change the value of \f[B]seed\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "24." 4 -\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]irand(E)\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and the value of \f[B]E\f[R] (exclusive). -If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s +If \f[B]E\f[R] is negative or is a non\-integer (\f[B]E\f[R]\[cq]s \f[I]scale\f[R] is not \f[B]0\f[R]), an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If \f[B]E\f[R] is larger than \f[B]BC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]BC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this operand is @@ -790,25 +791,25 @@ Using this operand will change the value of \f[B]seed\f[R], unless the value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R]. In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "25." 4 \f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .PP The integers generated by \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to be as unbiased as possible, subject to the limitations of -the pseudo-random number generator. +the pseudo\-random number generator. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to \f[I]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from bc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from bc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -820,12 +821,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -843,7 +844,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -862,11 +863,11 @@ These have the form \f[B]e\f[R]. The exponent (the portion after the \f[B]e\f[R]) must be an integer. An example is \f[B]1.89237e9\f[R], which is equal to \f[B]1892370000\f[R]. -Negative exponents are also allowed, so \f[B]4.2890e-3\f[R] is equal to +Negative exponents are also allowed, so \f[B]4.2890e\-3\f[R] is equal to \f[B]0.0042890\f[R]. .PP -Using scientific notation is an error or warning if the \f[B]-s\f[R] or -\f[B]-w\f[R], respectively, command-line options (or equivalents) are +Using scientific notation is an error or warning if the \f[B]\-s\f[R] or +\f[B]\-w\f[R], respectively, command\-line options (or equivalents) are given. .PP \f[B]WARNING\f[R]: Both the number and the exponent in scientific @@ -876,16 +877,16 @@ of the current \f[B]ibase\f[R]. For example, if \f[B]ibase\f[R] is \f[B]16\f[R] and bc(1) is given the number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if bc(1) is given the number string -\f[B]10e-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. +\f[B]10e\-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SS Operators The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -894,7 +895,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -939,7 +940,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -957,7 +958,7 @@ Associativity: Left Description: \f[B]shift left\f[R], \f[B]shift right\f[R] .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] Type: Binary .RS .PP @@ -995,7 +996,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -1006,7 +1007,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -1016,7 +1017,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -1024,7 +1029,7 @@ The \f[B]truncation\f[R] operator returns a copy of the given expression with all of its \f[I]scale\f[R] removed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -1038,9 +1043,9 @@ more). .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -1051,7 +1056,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -1069,18 +1074,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -1088,7 +1093,7 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. @@ -1100,9 +1105,9 @@ decimal point moved \f[B]b\f[R] places to the right. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]>>\f[R] @@ -1112,12 +1117,12 @@ decimal point moved \f[B]b\f[R] places to the left. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -1130,7 +1135,7 @@ the corresponding arithmetic operator and the result is assigned to \f[B]a\f[R]. .PP The \f[B]assignment\f[R] operators that correspond to operators that are -extensions are themselves \f[B]non-portable extensions\f[R]. +extensions are themselves \f[B]non\-portable extensions\f[R]. .RE .TP \f[B]==\f[R] \f[B]<=\f[R] \f[B]>=\f[R] \f[B]!=\f[R] \f[B]<\f[R] \f[B]>\f[R] @@ -1147,28 +1152,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -1217,10 +1222,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1237,7 +1242,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1262,7 +1267,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1275,11 +1280,11 @@ Scientific notation is activated by assigning \f[B]0\f[R] to To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Scientific notation and engineering notation are disabled if bc(1) is -run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options +run with either the \f[B]\-s\f[R] or \f[B]\-w\f[R] command\-line options (or equivalents). .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .SS Strings If strings appear as a statement by themselves, they are printed without a trailing newline. @@ -1297,7 +1302,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1325,9 +1330,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1340,7 +1345,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1386,10 +1391,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1425,7 +1430,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1440,13 +1445,13 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are -available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line +available when the \f[B]\-l\f[R] or \f[B]\-\-mathlib\f[R] command\-line flags are given, except that the extended math library is not available -when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents +when the \f[B]\-s\f[R] option, the \f[B]\-w\f[R] option, or equivalents are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following @@ -1502,11 +1507,11 @@ Functions\f[R] subsection below). .RE .SS Extended Library The extended library is \f[I]not\f[R] loaded when the -\f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] +\f[B]\-s\f[R]/\f[B]\-\-standard\f[R] or \f[B]\-w\f[R]/\f[B]\-\-warn\f[R] options are given since they are not part of the library defined by the standard (see the \f[B]STANDARDS\f[R] section). .PP -The extended library is a \f[B]non-portable extension\f[R]. +The extended library is a \f[B]non\-portable extension\f[R]. .TP \f[B]p(x, y)\f[R] Calculates \f[B]x\f[R] to the power of \f[B]y\f[R], even if \f[B]y\f[R] @@ -1627,11 +1632,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1665,7 +1670,7 @@ Functions\f[R] subsection below). Returns the tangent of \f[B]x\f[R], which is assumed to be in radians. .RS .PP -If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]-1\f[R], this raises an +If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]\-1\f[R], this raises an error and causes bc(1) to reset (see the \f[B]RESET\f[R] section). .PP This is an alias of \f[B]t(x)\f[R]. @@ -1693,11 +1698,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1726,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1735,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random integer that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. @@ -1746,7 +1751,7 @@ is returned, and \f[B]seed\f[R] is not changed. .TP \f[B]i2rand(a, b)\f[R] Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them -as inclusive bounds to enerate a pseudo-random integer. +as inclusive bounds to enerate a pseudo\-random integer. If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. @@ -1792,8 +1797,8 @@ If you want to use signed two\[cq]s complement arguments, use .TP \f[B]bshl(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] -and calculates and returns the result of \f[B]a\f[R] bit-shifted left by -\f[B]b\f[R] places. +and calculates and returns the result of \f[B]a\f[R] bit\-shifted left +by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1803,7 +1808,7 @@ If you want to use signed two\[cq]s complement arguments, use \f[B]bshr(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] and calculates and returns the truncated result of \f[B]a\f[R] -bit-shifted right by \f[B]b\f[R] places. +bit\-shifted right by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1867,7 +1872,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brevn(x, n)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has the same number of 8-bit bytes as the truncated absolute +though it has the same number of 8\-bit bytes as the truncated absolute value of \f[B]n\f[R]. .RS .PP @@ -1922,11 +1927,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]broln(x, p, n)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1980,9 +1985,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]brol(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1991,11 +1996,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brorn(x, p, n)\f[R] Does a right bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2049,9 +2054,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]bror(x, p)\f[R] Does a right bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2105,7 +2110,7 @@ If you want to a use signed two\[cq]s complement argument, use .RE .TP \f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise-reversed number with an extra set bit +Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit one place more significant than the real most significant bit (which was the least significant bit in the original number). This number is reversed and returned without the extra set bit. @@ -2116,29 +2121,29 @@ meant to be used by users, but it can be. .RE .TP \f[B]plz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and without a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]plznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and with a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline. .RE .TP \f[B]pnlz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP @@ -2146,9 +2151,9 @@ Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]pnlznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP @@ -2160,22 +2165,22 @@ Returns the numbers of unsigned integer bytes required to hold the truncated absolute value of \f[B]x\f[R]. .TP \f[B]sbytes(x)\f[R] -Returns the numbers of signed, two\[cq]s-complement integer bytes +Returns the numbers of signed, two\[cq]s\-complement integer bytes required to hold the truncated value of \f[B]x\f[R]. .TP \f[B]s2u(x)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer and returns the non-negative +be as a 2\[cq]s\-complement signed integer and returns the non\-negative integer that would have the same representation in binary. .TP \f[B]s2un(x,n)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer with \f[B]n\f[R] bytes and -returns the non-negative integer that would have the same representation -in binary. -If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s-complement signed +be as a 2\[cq]s\-complement signed integer with \f[B]n\f[R] bytes and +returns the non\-negative integer that would have the same +representation in binary. +If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s\-complement signed bytes, it is truncated to fit. .TP \f[B]hex(x)\f[R] @@ -2219,7 +2224,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in as few power of two bytes as +a signed, two\[cq]s\-complement integer in as few power of two bytes as possible. Both outputs are split into bytes separated by spaces. .RS @@ -2247,7 +2252,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]intn(x, n)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]n\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]n\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2275,7 +2280,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int8(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]1\f[R] byte. +a signed, two\[cq]s\-complement integer in \f[B]1\f[R] byte. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2303,7 +2308,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int16(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]2\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]2\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2331,7 +2336,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int32(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]4\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]4\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2359,7 +2364,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int64(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]8\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]8\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2406,7 +2411,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). \f[B]output_byte(x, i)\f[R] Outputs byte \f[B]i\f[R] of the truncated absolute value of \f[B]x\f[R], where \f[B]0\f[R] is the least significant byte and \f[B]number_of_bytes -- 1\f[R] is the most significant byte. +\- 1\f[R] is the most significant byte. .RS .PP This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] @@ -2468,7 +2473,7 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -2539,29 +2544,29 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]rand()\f[R] operand. -Set at \f[B]2\[ha]BC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]BC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -2569,28 +2574,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -2611,14 +2616,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -2630,7 +2635,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -2639,7 +2644,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -2649,13 +2654,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -2664,11 +2669,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -2677,43 +2682,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -2729,10 +2735,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -2754,7 +2760,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -2777,7 +2783,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -2788,17 +2794,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -2814,16 +2821,16 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), @@ -2835,18 +2842,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -2858,7 +2865,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -2883,10 +2890,10 @@ exit, and it uses the default handler for all other signals. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md index 2b3b0d6aa3e..dc537ffe4cf 100644 --- a/manuals/bc/HN.1.md +++ b/manuals/bc/HN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -811,6 +811,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\$** diff --git a/manuals/bc/N.1 b/manuals/bc/N.1 index 7628c50cb4f..f66ae06d9c3 100644 --- a/manuals/bc/N.1 +++ b/manuals/bc/N.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,38 +25,38 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "November 2023" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME -bc - arbitrary-precision decimal arithmetic language and calculator +bc \- arbitrary\-precision decimal arithmetic language and calculator .SH SYNOPSIS -\f[B]bc\f[R] [\f[B]-cCghilPqRsvVw\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--global-stacks\f[R]] -[\f[B]--help\f[R]] [\f[B]--interactive\f[R]] [\f[B]--mathlib\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] [\f[B]--quiet\f[R]] -[\f[B]--standard\f[R]] [\f[B]--warn\f[R]] [\f[B]--version\f[R]] -[\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]bc\f[R] [\f[B]\-cCghilPqRsvVw\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-global\-stacks\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-interactive\f[R]] [\f[B]\-\-mathlib\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-quiet\f[R]] [\f[B]\-\-standard\f[R]] [\f[B]\-\-warn\f[R]] +[\f[B]\-\-version\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION bc(1) is an interactive processor for a language first standardized in 1991 by POSIX. (See the \f[B]STANDARDS\f[R] section.) The language provides unlimited precision decimal arithmetic and is -somewhat C-like, but there are differences. +somewhat C\-like, but there are differences. Such differences will be noted in this document. .PP After parsing and handling options, this bc(1) reads any files given on the command line and executes them before reading from \f[B]stdin\f[R]. .PP -This bc(1) is a drop-in replacement for \f[I]any\f[R] bc(1), including +This bc(1) is a drop\-in replacement for \f[I]any\f[R] bc(1), including (and especially) the GNU bc(1). It also has many extensions and extra features beyond other implementations. @@ -65,9 +65,9 @@ implementations. another bc(1) gives a parse error, it is probably because a word this bc(1) reserves as a keyword is used as the name of a function, variable, or array. -To fix that, use the command-line option \f[B]-r\f[R] \f[I]keyword\f[R], -where \f[I]keyword\f[R] is the keyword that is used as a name in the -script. +To fix that, use the command\-line option \f[B]\-r\f[R] +\f[I]keyword\f[R], where \f[I]keyword\f[R] is the keyword that is used +as a name in the script. For more information, see the \f[B]OPTIONS\f[R] section. .PP If parsing scripts meant for other bc(1) implementations still does not @@ -76,7 +76,7 @@ See the \f[B]BUGS\f[R] section. .SH OPTIONS The following are the options that bc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -86,17 +86,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -107,17 +107,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -125,54 +125,54 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. -If files are given as well (see the \f[B]-f\f[R] and \f[B]--file\f[R] +If files are given as well (see the \f[B]\-f\f[R] and \f[B]\-\-file\f[R] options), the expressions and files are evaluated in the order given. This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]BC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. -If expressions are also given (see the \f[B]-e\f[R] and -\f[B]--expression\f[R] options), the expressions are evaluated in the +If expressions are also given (see the \f[B]\-e\f[R] and +\f[B]\-\-expression\f[R] options), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]BC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, bc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, bc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, bc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-g\f[R], \f[B]--global-stacks\f[R] +\f[B]\-g\f[R], \f[B]\-\-global\-stacks\f[R] Turns the globals \f[B]ibase\f[R], \f[B]obase\f[R], \f[B]scale\f[R], and \f[B]seed\f[R] into stacks. .RS @@ -221,8 +221,8 @@ aliases. Examples: .IP .EX -alias d2o=\[dq]bc -e ibase=A -e obase=8\[dq] -alias h2b=\[dq]bc -e ibase=G -e obase=2\[dq] +alias d2o=\[dq]bc \-e ibase=A \-e obase=8\[dq] +alias h2b=\[dq]bc \-e ibase=G \-e obase=2\[dq] .EE .PP Second, if the purpose of a function is to set \f[B]ibase\f[R], @@ -233,11 +233,12 @@ desired value for a global. .PP For functions that set \f[B]seed\f[R], the value assigned to \f[B]seed\f[R] is not propagated to parent functions. -This means that the sequence of pseudo-random numbers that they see will -not be the same sequence of pseudo-random numbers that any parent sees. +This means that the sequence of pseudo\-random numbers that they see +will not be the same sequence of pseudo\-random numbers that any parent +sees. This is only the case once \f[B]seed\f[R] has been set. .PP -If a function desires to not affect the sequence of pseudo-random +If a function desires to not affect the sequence of pseudo\-random numbers of its parents, but wants to use the same \f[B]seed\f[R], it can use the following line: .IP @@ -250,16 +251,16 @@ users could make sure to define \f[B]BC_ENV_ARGS\f[R] and include this option (see the \f[B]ENVIRONMENT VARIABLES\f[R] section for more details). .PP -If \f[B]-s\f[R], \f[B]-w\f[R], or any equivalents are used, this option -is ignored. +If \f[B]\-s\f[R], \f[B]\-w\f[R], or any equivalents are used, this +option is ignored. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -267,28 +268,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-l\f[R], \f[B]--mathlib\f[R] +\f[B]\-l\f[R], \f[B]\-\-mathlib\f[R] Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R] and loads the included math library and the extended math library before running any code, including any expressions or files specified on the @@ -298,7 +299,7 @@ command line. To learn what is in the libraries, see the \f[B]LIBRARY\f[R] section. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -306,10 +307,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -322,26 +323,26 @@ Most of those users would want to put this option in These options override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-q\f[R], \f[B]--quiet\f[R] +\f[B]\-q\f[R], \f[B]\-\-quiet\f[R] This option is for compatibility with the GNU bc(1) -(https://www.gnu.org/software/bc/); it is a no-op. +(https://www.gnu.org/software/bc/); it is a no\-op. Without this option, GNU bc(1) prints a copyright header. This bc(1) only prints the copyright header if one or more of the -\f[B]-v\f[R], \f[B]-V\f[R], or \f[B]--version\f[R] options are given +\f[B]\-v\f[R], \f[B]\-V\f[R], or \f[B]\-\-version\f[R] options are given unless the \f[B]BC_BANNER\f[R] environment variable is set and contains -a non-zero integer or if this bc(1) was built with the header displayed +a non\-zero integer or if this bc(1) was built with the header displayed by default. If \f[I]any\f[R] of that is the case, then this option \f[I]does\f[R] prevent bc(1) from printing the header. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -354,16 +355,16 @@ prompt for user input. .RS .PP This option does not disable the regular prompt because the read prompt -is only used when the \f[B]read()\f[R] built-in function is called. +is only used when the \f[B]read()\f[R] built\-in function is called. .PP These options \f[I]do\f[R] override the \f[B]BC_PROMPT\f[R] and \f[B]BC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-r\f[R] \f[I]keyword\f[R], \f[B]--redefine\f[R]=\f[I]keyword\f[R] +\f[B]\-r\f[R] \f[I]keyword\f[R], \f[B]\-\-redefine\f[R]=\f[I]keyword\f[R] Redefines \f[I]keyword\f[R] in order to allow it to be used as a function, variable, or array name. This is useful when this bc(1) gives parse errors when parsing scripts @@ -424,7 +425,7 @@ It is a fatal error to attempt to redefine words that this bc(1) does not reserve as keywords. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -432,35 +433,35 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-s\f[R], \f[B]--standard\f[R] +\f[B]\-s\f[R], \f[B]\-\-standard\f[R] Process exactly the language defined by the standard (see the \f[B]STANDARDS\f[R] section) and error if any extensions are used. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-w\f[R], \f[B]--warn\f[R] -Like \f[B]-s\f[R] and \f[B]--standard\f[R], except that warnings (and -not errors) are printed for non-standard extensions and execution +\f[B]\-w\f[R], \f[B]\-\-warn\f[R] +Like \f[B]\-s\f[R] and \f[B]\-\-standard\f[R], except that warnings (and +not errors) are printed for non\-standard extensions and execution continues normally. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes bc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP @@ -468,14 +469,14 @@ This can be set for individual numbers with the \f[B]plz(x)\f[R], \f[B]plznl(x)\f[R], \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the extended math library (see the \f[B]LIBRARY\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files or expressions are given by the \f[B]-f\f[R], -\f[B]--file\f[R], \f[B]-e\f[R], or \f[B]--expression\f[R] options, then -bc(1) reads from \f[B]stdin\f[R]. +If no files or expressions are given by the \f[B]\-f\f[R], +\f[B]\-\-file\f[R], \f[B]\-e\f[R], or \f[B]\-\-expression\f[R] options, +then bc(1) reads from \f[B]stdin\f[R]. .PP However, there are a few caveats to this. .PP @@ -489,7 +490,7 @@ Second, after an \f[B]if\f[R] statement, bc(1) doesn\[cq]t know if an \f[B]else\f[R] statement will follow, so it will not execute until it knows there will not be an \f[B]else\f[R] statement. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -497,7 +498,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]bc >&-\f[R], it will quit with an error. +\f[B]bc >&\-\f[R], it will quit with an error. This is done so that bc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -510,7 +511,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other bc(1) implementations, this bc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]bc 2>&-\f[R], it will quit with an error. +\f[B]bc 2>&\-\f[R], it will quit with an error. This is done so that bc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -518,7 +519,7 @@ If there are scripts that depend on the behavior of other bc(1) implementations, it is recommended that those scripts be changed to redirect \f[B]stderr\f[R] to \f[B]/dev/null\f[R]. .SH SYNTAX -The syntax for bc(1) programs is mostly C-like, with some differences. +The syntax for bc(1) programs is mostly C\-like, with some differences. This bc(1) follows the POSIX standard (see the \f[B]STANDARDS\f[R] section), which is a much more thorough resource for the language this bc(1) accepts. @@ -529,32 +530,32 @@ In the sections below, \f[B]E\f[R] means expression, \f[B]S\f[R] means statement, and \f[B]I\f[R] means identifier. .PP Identifiers (\f[B]I\f[R]) start with a lowercase letter and can be -followed by any number (up to \f[B]BC_NAME_MAX-1\f[R]) of lowercase -letters (\f[B]a-z\f[R]), digits (\f[B]0-9\f[R]), and underscores +followed by any number (up to \f[B]BC_NAME_MAX\-1\f[R]) of lowercase +letters (\f[B]a\-z\f[R]), digits (\f[B]0\-9\f[R]), and underscores (\f[B]_\f[R]). -The regex is \f[B][a-z][a-z0-9_]*\f[R]. +The regex is \f[B][a\-z][a\-z0\-9_]*\f[R]. Identifiers with more than one character (letter) are a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .PP \f[B]ibase\f[R] is a global variable determining how to interpret constant numbers. It is the \[lq]input\[rq] base, or the number base used for interpreting input numbers. \f[B]ibase\f[R] is initially \f[B]10\f[R]. -If the \f[B]-s\f[R] (\f[B]--standard\f[R]) and \f[B]-w\f[R] -(\f[B]--warn\f[R]) flags were not given on the command line, the max +If the \f[B]\-s\f[R] (\f[B]\-\-standard\f[R]) and \f[B]\-w\f[R] +(\f[B]\-\-warn\f[R]) flags were not given on the command line, the max allowable value for \f[B]ibase\f[R] is \f[B]36\f[R]. Otherwise, it is \f[B]16\f[R]. The min allowable value for \f[B]ibase\f[R] is \f[B]2\f[R]. The max allowable value for \f[B]ibase\f[R] can be queried in bc(1) -programs with the \f[B]maxibase()\f[R] built-in function. +programs with the \f[B]maxibase()\f[R] built\-in function. .PP \f[B]obase\f[R] is a global variable determining how to output results. It is the \[lq]output\[rq] base, or the number base used for outputting numbers. \f[B]obase\f[R] is initially \f[B]10\f[R]. The max allowable value for \f[B]obase\f[R] is \f[B]BC_BASE_MAX\f[R] and -can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built-in +can be queried in bc(1) programs with the \f[B]maxobase()\f[R] built\-in function. The min allowable value for \f[B]obase\f[R] is \f[B]0\f[R]. If \f[B]obase\f[R] is \f[B]0\f[R], values are output in scientific @@ -562,8 +563,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -573,7 +574,7 @@ exceptions. \f[B]scale\f[R] cannot be negative. The max allowable value for \f[B]scale\f[R] is \f[B]BC_SCALE_MAX\f[R] and can be queried in bc(1) programs with the \f[B]maxscale()\f[R] -built-in function. +built\-in function. .PP bc(1) has both \f[I]global\f[R] variables and \f[I]local\f[R] variables. All \f[I]local\f[R] variables are local to the function; they are @@ -598,7 +599,7 @@ The value that is printed is also assigned to the special variable \f[B]last\f[R]. A single dot (\f[B].\f[R]) may also be used as a synonym for \f[B]last\f[R]. -These are \f[B]non-portable extensions\f[R]. +These are \f[B]non\-portable extensions\f[R]. .PP Either semicolons or newlines may separate statements. .SS Comments @@ -608,7 +609,7 @@ Block comments are enclosed in \f[B]/*\f[R] and \f[B]*/\f[R]. .IP "2." 3 Line comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Named Expressions The following are named expressions in bc(1): .IP "1." 3 @@ -626,26 +627,26 @@ Array Elements: \f[B]I[E]\f[R] .IP "7." 3 \f[B]last\f[R] or a single dot (\f[B].\f[R]) .PP -Numbers 6 and 7 are \f[B]non-portable extensions\f[R]. +Numbers 6 and 7 are \f[B]non\-portable extensions\f[R]. .PP -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .PP The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is assigned to \f[B]seed\f[R] -and used again, the pseudo-random number generator is guaranteed to -produce the same sequence of pseudo-random numbers as it did when the +and used again, the pseudo\-random number generator is guaranteed to +produce the same sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if \f[B]seed\f[R] is queried again immediately. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will -\f[I]not\f[R] produce unique sequences of pseudo-random numbers. +\f[I]not\f[R] produce unique sequences of pseudo\-random numbers. The value of \f[B]seed\f[R] will change after any use of the \f[B]rand()\f[R] and \f[B]irand(E)\f[R] operands (see the \f[I]Operands\f[R] subsection below), except if the parameter passed to @@ -675,61 +676,61 @@ Array indices (\f[B]I[E]\f[R]). \f[B](E)\f[R]: The value of \f[B]E\f[R] (used to change precedence). .IP " 4." 4 \f[B]sqrt(E)\f[R]: The square root of \f[B]E\f[R]. -\f[B]E\f[R] must be non-negative. +\f[B]E\f[R] must be non\-negative. .IP " 5." 4 \f[B]length(E)\f[R]: The number of significant decimal digits in \f[B]E\f[R]. Returns \f[B]1\f[R] for \f[B]0\f[R] with no decimal places. If given a string, the length of the string is returned. -Passing a string to \f[B]length(E)\f[R] is a \f[B]non-portable +Passing a string to \f[B]length(E)\f[R] is a \f[B]non\-portable extension\f[R]. .IP " 6." 4 \f[B]length(I[])\f[R]: The number of elements in the array \f[B]I\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 7." 4 \f[B]scale(E)\f[R]: The \f[I]scale\f[R] of \f[B]E\f[R]. .IP " 8." 4 \f[B]abs(E)\f[R]: The absolute value of \f[B]E\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP " 9." 4 \f[B]is_number(E)\f[R]: \f[B]1\f[R] if the given argument is a number, \f[B]0\f[R] if it is a string. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "10." 4 \f[B]is_string(E)\f[R]: \f[B]1\f[R] if the given argument is a string, \f[B]0\f[R] if it is a number. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "11." 4 \f[B]modexp(E, E, E)\f[R]: Modular exponentiation, where the first expression is the base, the second is the exponent, and the third is the modulus. All three values must be integers. -The second argument must be non-negative. -The third argument must be non-zero. -This is a \f[B]non-portable extension\f[R]. +The second argument must be non\-negative. +The third argument must be non\-zero. +This is a \f[B]non\-portable extension\f[R]. .IP "12." 4 \f[B]divmod(E, E, I[])\f[R]: Division and modulus in one operation. This is for optimization. The first expression is the dividend, and the second is the divisor, -which must be non-zero. +which must be non\-zero. The return value is the quotient, and the modulus is stored in index \f[B]0\f[R] of the provided array (the last argument). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "13." 4 \f[B]asciify(E)\f[R]: If \f[B]E\f[R] is a string, returns a string that is the first letter of its argument. If it is a number, calculates the number mod \f[B]256\f[R] and returns -that number as a one-character string. -This is a \f[B]non-portable extension\f[R]. +that number as a one\-character string. +This is a \f[B]non\-portable extension\f[R]. .IP "14." 4 \f[B]asciify(I[])\f[R]: A string that is made up of the characters that would result from running \f[B]asciify(E)\f[R] on each element of the array identified by the argument. -This allows creating multi-character strings and storing them. -This is a \f[B]non-portable extension\f[R]. +This allows creating multi\-character strings and storing them. +This is a \f[B]non\-portable extension\f[R]. .IP "15." 4 \f[B]I()\f[R], \f[B]I(E)\f[R], \f[B]I(E, E)\f[R], and so on, where -\f[B]I\f[R] is an identifier for a non-\f[B]void\f[R] function (see the +\f[B]I\f[R] is an identifier for a non\-\f[B]void\f[R] function (see the \f[I]Void Functions\f[R] subsection of the \f[B]FUNCTIONS\f[R] section). The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]I[]\f[R], which will automatically be turned into array references @@ -741,47 +742,47 @@ function definition is an array reference. expression. The result of that expression is the result of the \f[B]read()\f[R] operand. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "17." 4 \f[B]maxibase()\f[R]: The max allowable \f[B]ibase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "18." 4 \f[B]maxobase()\f[R]: The max allowable \f[B]obase\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "19." 4 \f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "20." 4 \f[B]line_length()\f[R]: The line length set with \f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "21." 4 \f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled -with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero -otherwise. +with the \f[B]\-g\f[R] or \f[B]\-\-global\-stacks\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "22." 4 \f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled -with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero -otherwise. +with the \f[B]\-z\f[R] or \f[B]\[en]leading\-zeroes\f[R] options, +non\-zero otherwise. See the \f[B]OPTIONS\f[R] section. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "23." 4 -\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]rand()\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive). Using this operand will change the value of \f[B]seed\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "24." 4 -\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R] +\f[B]irand(E)\f[R]: A pseudo\-random integer between \f[B]0\f[R] (inclusive) and the value of \f[B]E\f[R] (exclusive). -If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s +If \f[B]E\f[R] is negative or is a non\-integer (\f[B]E\f[R]\[cq]s \f[I]scale\f[R] is not \f[B]0\f[R]), an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If \f[B]E\f[R] is larger than \f[B]BC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]BC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this operand is @@ -790,25 +791,25 @@ Using this operand will change the value of \f[B]seed\f[R], unless the value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R]. In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .IP "25." 4 \f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R]. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .PP The integers generated by \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to be as unbiased as possible, subject to the limitations of -the pseudo-random number generator. +the pseudo\-random number generator. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with \f[B]rand()\f[R] and \f[B]irand(E)\f[R] are guaranteed to \f[I]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from bc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from bc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .SS Numbers Numbers are strings made up of digits, uppercase letters, and at most \f[B]1\f[R] period for a radix. @@ -820,12 +821,12 @@ alphabet, starting from \f[B]1\f[R] (i.e., \f[B]A\f[R] equals If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]BC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -843,7 +844,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -862,11 +863,11 @@ These have the form \f[B]e\f[R]. The exponent (the portion after the \f[B]e\f[R]) must be an integer. An example is \f[B]1.89237e9\f[R], which is equal to \f[B]1892370000\f[R]. -Negative exponents are also allowed, so \f[B]4.2890e-3\f[R] is equal to +Negative exponents are also allowed, so \f[B]4.2890e\-3\f[R] is equal to \f[B]0.0042890\f[R]. .PP -Using scientific notation is an error or warning if the \f[B]-s\f[R] or -\f[B]-w\f[R], respectively, command-line options (or equivalents) are +Using scientific notation is an error or warning if the \f[B]\-s\f[R] or +\f[B]\-w\f[R], respectively, command\-line options (or equivalents) are given. .PP \f[B]WARNING\f[R]: Both the number and the exponent in scientific @@ -876,16 +877,16 @@ of the current \f[B]ibase\f[R]. For example, if \f[B]ibase\f[R] is \f[B]16\f[R] and bc(1) is given the number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if bc(1) is given the number string -\f[B]10e-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. +\f[B]10e\-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SS Operators The following arithmetic and logical operators can be used. They are listed in order of decreasing precedence. Operators in the same group have the same precedence. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] Type: Prefix and Postfix .RS .PP @@ -894,7 +895,7 @@ Associativity: None Description: \f[B]increment\f[R], \f[B]decrement\f[R] .RE .TP -\f[B]-\f[R] \f[B]!\f[R] +\f[B]\-\f[R] \f[B]!\f[R] Type: Prefix .RS .PP @@ -939,7 +940,7 @@ Associativity: Left Description: \f[B]multiply\f[R], \f[B]divide\f[R], \f[B]modulus\f[R] .RE .TP -\f[B]+\f[R] \f[B]-\f[R] +\f[B]+\f[R] \f[B]\-\f[R] Type: Binary .RS .PP @@ -957,7 +958,7 @@ Associativity: Left Description: \f[B]shift left\f[R], \f[B]shift right\f[R] .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] Type: Binary .RS .PP @@ -995,7 +996,7 @@ Description: \f[B]boolean or\f[R] .PP The operators will be described in more detail below. .TP -\f[B]++\f[R] \f[B]--\f[R] +\f[B]++\f[R] \f[B]\-\-\f[R] The prefix and postfix \f[B]increment\f[R] and \f[B]decrement\f[R] operators behave exactly like they would in C. They require a named expression (see the \f[I]Named Expressions\f[R] subsection) as an @@ -1006,7 +1007,7 @@ The prefix versions of these operators are more efficient; use them where possible. .RE .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]negation\f[R] operator returns \f[B]0\f[R] if a user attempts to negate any expression with the value \f[B]0\f[R]. Otherwise, a copy of the expression with its sign flipped is returned. @@ -1016,7 +1017,11 @@ The \f[B]boolean not\f[R] operator returns \f[B]1\f[R] if the expression is \f[B]0\f[R], or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +\f[B]Warning\f[R]: This operator has a \f[B]different precedence\f[R] +than the equivalent operator in GNU bc(1) and other bc(1) +implementations! +.PP +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -1024,7 +1029,7 @@ The \f[B]truncation\f[R] operator returns a copy of the given expression with all of its \f[I]scale\f[R] removed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -1038,9 +1043,9 @@ more). .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -1051,7 +1056,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]), and if it -is negative, the first value must be non-zero. +is negative, the first value must be non\-zero. .RE .TP \f[B]*\f[R] @@ -1069,18 +1074,18 @@ returns the quotient. The \f[I]scale\f[R] of the result shall be the value of \f[B]scale\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]%\f[R] The \f[B]modulus\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and evaluates them by 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R] and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .RS .PP -The second expression must be non-zero. +The second expression must be non\-zero. .RE .TP \f[B]+\f[R] @@ -1088,7 +1093,7 @@ The \f[B]add\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the sum, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The \f[B]subtract\f[R] operator takes two expressions, \f[B]a\f[R] and \f[B]b\f[R], and returns the difference, with a \f[I]scale\f[R] equal to the max of the \f[I]scale\f[R]s of \f[B]a\f[R] and \f[B]b\f[R]. @@ -1100,9 +1105,9 @@ decimal point moved \f[B]b\f[R] places to the right. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]>>\f[R] @@ -1112,12 +1117,12 @@ decimal point moved \f[B]b\f[R] places to the left. .RS .PP The second expression must be an integer (no \f[I]scale\f[R]) and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] +\f[B]=\f[R] \f[B]<<=\f[R] \f[B]>>=\f[R] \f[B]+=\f[R] \f[B]\-=\f[R] \f[B]*=\f[R] \f[B]/=\f[R] \f[B]%=\f[R] \f[B]\[ha]=\f[R] \f[B]\[at]=\f[R] The \f[B]assignment\f[R] operators take two expressions, \f[B]a\f[R] and \f[B]b\f[R] where \f[B]a\f[R] is a named expression (see the \f[I]Named Expressions\f[R] subsection). @@ -1130,7 +1135,7 @@ the corresponding arithmetic operator and the result is assigned to \f[B]a\f[R]. .PP The \f[B]assignment\f[R] operators that correspond to operators that are -extensions are themselves \f[B]non-portable extensions\f[R]. +extensions are themselves \f[B]non\-portable extensions\f[R]. .RE .TP \f[B]==\f[R] \f[B]<=\f[R] \f[B]>=\f[R] \f[B]!=\f[R] \f[B]<\f[R] \f[B]>\f[R] @@ -1147,28 +1152,28 @@ interpreted as \f[B](a=b)>c\f[R]. Also, unlike the standard (see the \f[B]STANDARDS\f[R] section) requires, these operators can appear anywhere any other expressions can be used. -This allowance is a \f[B]non-portable extension\f[R]. +This allowance is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]&&\f[R] The \f[B]boolean and\f[R] operator takes two expressions and returns -\f[B]1\f[R] if both expressions are non-zero, \f[B]0\f[R] otherwise. +\f[B]1\f[R] if both expressions are non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]||\f[R] The \f[B]boolean or\f[R] operator takes two expressions and returns -\f[B]1\f[R] if one of the expressions is non-zero, \f[B]0\f[R] +\f[B]1\f[R] if one of the expressions is non\-zero, \f[B]0\f[R] otherwise. .RS .PP -This is \f[I]not\f[R] a short-circuit operator. +This is \f[I]not\f[R] a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Statements The following items are statements: @@ -1217,10 +1222,10 @@ The \f[B]E\f[R] argument(s) may also be arrays of the form \f[B]FUNCTIONS\f[R] section) if the corresponding parameter in the function definition is an array reference. .PP -Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non-portable +Numbers 4, 9, 11, 12, 14, 15, and 16 are \f[B]non\-portable extensions\f[R]. .PP -Also, as a \f[B]non-portable extension\f[R], any or all of the +Also, as a \f[B]non\-portable extension\f[R], any or all of the expressions in the header of a for loop may be omitted. If the condition (second expression) is omitted, it is assumed to be a constant \f[B]1\f[R]. @@ -1237,7 +1242,7 @@ This is only allowed in loops. The \f[B]if\f[R] \f[B]else\f[R] statement does the same thing as in C. .PP The \f[B]quit\f[R] statement causes bc(1) to quit, even if it is on a -branch that will not be executed (it is a compile-time command). +branch that will not be executed (it is a compile\-time command). .PP \f[B]Warning\f[R]: The behavior of this bc(1) on \f[B]quit\f[R] is slightly different from other bc(1) implementations. @@ -1262,7 +1267,7 @@ that is not executed, bc(1) does not quit.) .PP The \f[B]limits\f[R] statement prints the limits that this bc(1) is subject to. -This is like the \f[B]quit\f[R] statement in that it is a compile-time +This is like the \f[B]quit\f[R] statement in that it is a compile\-time command. .PP An expression by itself is evaluated and printed, followed by a newline. @@ -1275,11 +1280,11 @@ Scientific notation is activated by assigning \f[B]0\f[R] to To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Scientific notation and engineering notation are disabled if bc(1) is -run with either the \f[B]-s\f[R] or \f[B]-w\f[R] command-line options +run with either the \f[B]\-s\f[R] or \f[B]\-w\f[R] command\-line options (or equivalents). .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .SS Strings If strings appear as a statement by themselves, they are printed without a trailing newline. @@ -1297,7 +1302,7 @@ element that has been assigned a string, an error is raised, and bc(1) resets (see the \f[B]RESET\f[R] section). .PP Assigning strings to variables and array elements and passing them to -functions are \f[B]non-portable extensions\f[R]. +functions are \f[B]non\-portable extensions\f[R]. .SS Print Statement The \[lq]expressions\[rq] in a \f[B]print\f[R] statement may also be strings. @@ -1325,9 +1330,9 @@ below: \f[B]\[rs]t\f[R]: \f[B]\[rs]t\f[R] .PP Any other character following a backslash causes the backslash and -character to be printed as-is. +character to be printed as\-is. .PP -Any non-string expression in a print statement shall be assigned to +Any non\-string expression in a print statement shall be assigned to \f[B]last\f[R], like any other expression that is printed. .SS Stream Statement The expressions in a \f[B]stream\f[R] statement may also be strings. @@ -1340,7 +1345,7 @@ without a newline. If a \f[B]stream\f[R] statement is given a number, a copy of it is truncated and its absolute value is calculated. The result is then printed as though \f[B]obase\f[R] is \f[B]256\f[R] -and each digit is interpreted as an 8-bit ASCII character, making it a +and each digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .SS Order of Evaluation All expressions in a statment are evaluated left to right, except as @@ -1386,10 +1391,10 @@ asterisk in the call; they must be called with just \f[B]I[]\f[R] like normal array parameters and will be automatically converted into references. .PP -As a \f[B]non-portable extension\f[R], the opening brace of a +As a \f[B]non\-portable extension\f[R], the opening brace of a \f[B]define\f[R] statement may appear on the next line. .PP -As a \f[B]non-portable extension\f[R], the return statement may also be +As a \f[B]non\-portable extension\f[R], the return statement may also be in one of the following forms: .IP "1." 3 \f[B]return\f[R] @@ -1425,7 +1430,7 @@ possible to have variables, arrays, and functions named \f[B]void\f[R]. The word \[lq]void\[rq] is only treated specially right after the \f[B]define\f[R] keyword. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SS Array References For any array in the parameter list, if the array is declared in the form @@ -1440,13 +1445,13 @@ function returns, to the array that was passed in. .PP Other than this, all function arguments are passed by value. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH LIBRARY All of the functions below, including the functions in the extended math library (see the \f[I]Extended Library\f[R] subsection below), are -available when the \f[B]-l\f[R] or \f[B]--mathlib\f[R] command-line +available when the \f[B]\-l\f[R] or \f[B]\-\-mathlib\f[R] command\-line flags are given, except that the extended math library is not available -when the \f[B]-s\f[R] option, the \f[B]-w\f[R] option, or equivalents +when the \f[B]\-s\f[R] option, the \f[B]\-w\f[R] option, or equivalents are given. .SS Standard Library The standard (see the \f[B]STANDARDS\f[R] section) defines the following @@ -1502,11 +1507,11 @@ Functions\f[R] subsection below). .RE .SS Extended Library The extended library is \f[I]not\f[R] loaded when the -\f[B]-s\f[R]/\f[B]--standard\f[R] or \f[B]-w\f[R]/\f[B]--warn\f[R] +\f[B]\-s\f[R]/\f[B]\-\-standard\f[R] or \f[B]\-w\f[R]/\f[B]\-\-warn\f[R] options are given since they are not part of the library defined by the standard (see the \f[B]STANDARDS\f[R] section). .PP -The extended library is a \f[B]non-portable extension\f[R]. +The extended library is a \f[B]non\-portable extension\f[R]. .TP \f[B]p(x, y)\f[R] Calculates \f[B]x\f[R] to the power of \f[B]y\f[R], even if \f[B]y\f[R] @@ -1627,11 +1632,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1665,7 +1670,7 @@ Functions\f[R] subsection below). Returns the tangent of \f[B]x\f[R], which is assumed to be in radians. .RS .PP -If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]-1\f[R], this raises an +If \f[B]x\f[R] is equal to \f[B]1\f[R] or \f[B]\-1\f[R], this raises an error and causes bc(1) to reset (see the \f[B]RESET\f[R] section). .PP This is an alias of \f[B]t(x)\f[R]. @@ -1693,11 +1698,11 @@ Otherwise, if \f[B]x\f[R] is greater than \f[B]0\f[R], it returns If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is greater than or equal to \f[B]0\f[R], it returns \f[B]a(y/x)+pi\f[R]. If \f[B]x\f[R] is less than \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]a(y/x)-pi\f[R]. +\f[B]0\f[R], it returns \f[B]a(y/x)\-pi\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is greater than \f[B]0\f[R], it returns \f[B]pi/2\f[R]. If \f[B]x\f[R] is equal to \f[B]0\f[R], and \f[B]y\f[R] is less than -\f[B]0\f[R], it returns \f[B]-pi/2\f[R]. +\f[B]0\f[R], it returns \f[B]\-pi/2\f[R]. .RS .PP This function is the same as the \f[B]atan2()\f[R] function in many @@ -1726,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1735,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random integer that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. @@ -1746,7 +1751,7 @@ is returned, and \f[B]seed\f[R] is not changed. .TP \f[B]i2rand(a, b)\f[R] Takes the truncated value of \f[B]a\f[R] and \f[B]b\f[R] and uses them -as inclusive bounds to enerate a pseudo-random integer. +as inclusive bounds to enerate a pseudo\-random integer. If the difference of the truncated values of \f[B]a\f[R] and \f[B]b\f[R] is \f[B]0\f[R], then the truncated value is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. @@ -1792,8 +1797,8 @@ If you want to use signed two\[cq]s complement arguments, use .TP \f[B]bshl(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] -and calculates and returns the result of \f[B]a\f[R] bit-shifted left by -\f[B]b\f[R] places. +and calculates and returns the result of \f[B]a\f[R] bit\-shifted left +by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1803,7 +1808,7 @@ If you want to use signed two\[cq]s complement arguments, use \f[B]bshr(a, b)\f[R] Takes the truncated absolute value of both \f[B]a\f[R] and \f[B]b\f[R] and calculates and returns the truncated result of \f[B]a\f[R] -bit-shifted right by \f[B]b\f[R] places. +bit\-shifted right by \f[B]b\f[R] places. .RS .PP If you want to use signed two\[cq]s complement arguments, use @@ -1867,7 +1872,7 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brevn(x, n)\f[R] Runs a bit reversal on the truncated absolute value of \f[B]x\f[R] as -though it has the same number of 8-bit bytes as the truncated absolute +though it has the same number of 8\-bit bytes as the truncated absolute value of \f[B]n\f[R]. .RS .PP @@ -1922,11 +1927,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]broln(x, p, n)\f[R] Does a left bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1980,9 +1985,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]brol(x, p)\f[R] Does a left bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -1991,11 +1996,11 @@ If you want to a use signed two\[cq]s complement argument, use .TP \f[B]brorn(x, p, n)\f[R] Does a right bitwise rotatation of the truncated absolute value of -\f[B]x\f[R], as though it has the same number of unsigned 8-bit bytes as -the truncated absolute value of \f[B]n\f[R], by the number of places +\f[B]x\f[R], as though it has the same number of unsigned 8\-bit bytes +as the truncated absolute value of \f[B]n\f[R], by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by the \f[B]2\f[R] to the power of the number of binary digits in \f[B]n\f[R] -8-bit bytes. +8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2049,9 +2054,9 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]bror(x, p)\f[R] Does a right bitwise rotatation of the truncated absolute value of \f[B]x\f[R], as though it has the minimum number of power of two -unsigned 8-bit bytes, by the number of places equal to the truncated +unsigned 8\-bit bytes, by the number of places equal to the truncated absolute value of \f[B]p\f[R] modded by 2 to the power of the number of -binary digits in the minimum number of 8-bit bytes. +binary digits in the minimum number of 8\-bit bytes. .RS .PP If you want to a use signed two\[cq]s complement argument, use @@ -2105,7 +2110,7 @@ If you want to a use signed two\[cq]s complement argument, use .RE .TP \f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise-reversed number with an extra set bit +Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit one place more significant than the real most significant bit (which was the least significant bit in the original number). This number is reversed and returned without the extra set bit. @@ -2116,29 +2121,29 @@ meant to be used by users, but it can be. .RE .TP \f[B]plz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and without a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]plznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed with a leading zero, regardless -of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R] -section) and with a trailing newline. +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the +\f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline. .RE .TP \f[B]pnlz(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and without a trailing newline. .RS .PP @@ -2146,9 +2151,9 @@ Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline. .RE .TP \f[B]pnlznl(x)\f[R] -If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R] -and less than \f[B]1\f[R], it is printed without a leading zero, -regardless of the use of the \f[B]-z\f[R] option (see the +If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that +\f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed without a leading +zero, regardless of the use of the \f[B]\-z\f[R] option (see the \f[B]OPTIONS\f[R] section) and with a trailing newline. .RS .PP @@ -2160,22 +2165,22 @@ Returns the numbers of unsigned integer bytes required to hold the truncated absolute value of \f[B]x\f[R]. .TP \f[B]sbytes(x)\f[R] -Returns the numbers of signed, two\[cq]s-complement integer bytes +Returns the numbers of signed, two\[cq]s\-complement integer bytes required to hold the truncated value of \f[B]x\f[R]. .TP \f[B]s2u(x)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer and returns the non-negative +be as a 2\[cq]s\-complement signed integer and returns the non\-negative integer that would have the same representation in binary. .TP \f[B]s2un(x,n)\f[R] -Returns \f[B]x\f[R] if it is non-negative. +Returns \f[B]x\f[R] if it is non\-negative. If it \f[I]is\f[R] negative, then it calculates what \f[B]x\f[R] would -be as a 2\[cq]s-complement signed integer with \f[B]n\f[R] bytes and -returns the non-negative integer that would have the same representation -in binary. -If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s-complement signed +be as a 2\[cq]s\-complement signed integer with \f[B]n\f[R] bytes and +returns the non\-negative integer that would have the same +representation in binary. +If \f[B]x\f[R] cannot fit into \f[B]n\f[R] 2\[cq]s\-complement signed bytes, it is truncated to fit. .TP \f[B]hex(x)\f[R] @@ -2219,7 +2224,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in as few power of two bytes as +a signed, two\[cq]s\-complement integer in as few power of two bytes as possible. Both outputs are split into bytes separated by spaces. .RS @@ -2247,7 +2252,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]intn(x, n)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]n\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]n\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2275,7 +2280,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int8(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]1\f[R] byte. +a signed, two\[cq]s\-complement integer in \f[B]1\f[R] byte. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2303,7 +2308,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int16(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]2\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]2\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2331,7 +2336,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int32(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]4\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]4\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2359,7 +2364,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). .TP \f[B]int64(x)\f[R] Outputs the representation, in binary and hexadecimal, of \f[B]x\f[R] as -a signed, two\[cq]s-complement integer in \f[B]8\f[R] bytes. +a signed, two\[cq]s\-complement integer in \f[B]8\f[R] bytes. Both outputs are split into bytes separated by spaces. .RS .PP @@ -2406,7 +2411,7 @@ subsection of the \f[B]FUNCTIONS\f[R] section). \f[B]output_byte(x, i)\f[R] Outputs byte \f[B]i\f[R] of the truncated absolute value of \f[B]x\f[R], where \f[B]0\f[R] is the least significant byte and \f[B]number_of_bytes -- 1\f[R] is the most significant byte. +\- 1\f[R] is the most significant byte. .RS .PP This is a \f[B]void\f[R] function (see the \f[I]Void Functions\f[R] @@ -2468,7 +2473,7 @@ The transcendental functions in the extended math library are: .IP \[bu] 2 \f[B]d2r(x)\f[R] .SH RESET -When bc(1) encounters an error or a signal that it has a non-default +When bc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -2539,29 +2544,29 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]rand()\f[R] operand. -Set at \f[B]2\[ha]BC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]BC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -2569,28 +2574,28 @@ Set at \f[B]BC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP The actual values can be queried with the \f[B]limits\f[R] statement. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], bc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], bc(1) recognizes the following environment variables: .TP \f[B]POSIXLY_CORRECT\f[R] If this variable exists (no matter the contents), bc(1) behaves as if -the \f[B]-s\f[R] option was given. +the \f[B]\-s\f[R] option was given. .TP \f[B]BC_ENV_ARGS\f[R] -This is another way to give command-line arguments to bc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to bc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]BC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful @@ -2611,14 +2616,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]BC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]BC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), bc(1) will output lines to that length, including the backslash (\f[B]\[rs]\f[R]). The default line length is \f[B]70\f[R]. .RS @@ -2630,7 +2635,7 @@ newlines. .TP \f[B]BC_BANNER\f[R] If this environment variable exists and contains an integer, then a -non-zero value activates the copyright banner when bc(1) is in +non\-zero value activates the copyright banner when bc(1) is in interactive mode, while zero deactivates it. .RS .PP @@ -2639,7 +2644,7 @@ section), then this environment variable has no effect because bc(1) does not print the banner when not in interactive mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_SIGINT_RESET\f[R] @@ -2649,13 +2654,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when bc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes bc(1) +variable exists and contains an integer, a non\-zero value makes bc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes bc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then bc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_TTY_MODE\f[R] @@ -2664,11 +2669,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes bc(1) use +exists and contains an integer, then a non\-zero value makes bc(1) use TTY mode, and zero makes bc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_PROMPT\f[R] @@ -2677,43 +2682,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes bc(1) use a -prompt, and zero or a non-integer makes bc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes bc(1) use a +prompt, and zero or a non\-integer makes bc(1) not use a prompt. If this environment variable does not exist and \f[B]BC_TTY_MODE\f[R] does, then the value of the \f[B]BC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]BC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes bc(1) exit after executing the -expressions and expression files, and a zero value makes bc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes bc(1) exit after executing +the expressions and expression files, and a zero value makes bc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]BC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes bc(1) clamp digits that are +contains an integer, a non\-zero value makes bc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the standard (see the -\f[B]STANDARDS\f[R] section). +This never applies to single\-digit numbers, as per the standard (see +the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS bc(1) returns the following exit statuses: @@ -2729,10 +2735,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -2754,7 +2760,7 @@ giving an invalid \f[B]auto\f[R] list, having a duplicate \f[B]auto\f[R]/function parameter, failing to find the end of a code block, attempting to return a value from a \f[B]void\f[R] function, attempting to use a variable as a reference, and using any extensions -when the option \f[B]-s\f[R] or any equivalents were given. +when the option \f[B]\-s\f[R] or any equivalents were given. .RE .TP \f[B]3\f[R] @@ -2777,7 +2783,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (bc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, bc(1) @@ -2788,17 +2794,18 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since bc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow bc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE Per the standard (see the \f[B]STANDARDS\f[R] section), bc(1) has an -interactive mode and a non-interactive mode. +interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, bc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -2814,23 +2821,23 @@ settings. .PP If there is the environment variable \f[B]BC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, bc(1) will turn +that environment variable contains a non\-zero integer, bc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]BC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then bc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then bc(1) will not turn TTY mode on. .PP If the environment variable \f[B]BC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) standard (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]BC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -2842,18 +2849,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]BC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]BC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]BC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]BC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]BC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -2865,7 +2872,7 @@ section), or the \f[B]BC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, bc(1) will exit. .PP However, if bc(1) is in interactive mode, and the -\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]BC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then bc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -2891,11 +2898,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when bc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause bc(1) to clean up and exit. .SH COMMAND LINE HISTORY -bc(1) supports interactive command-line editing. +bc(1) supports interactive command\-line editing. .PP If bc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -2910,10 +2917,10 @@ the arrow keys. .SH SEE ALSO dc(1) .SH STANDARDS -bc(1) is compliant with the IEEE Std 1003.1-2017 -(\[lq]POSIX.1-2017\[rq]) specification at +bc(1) is compliant with the IEEE Std 1003.1\-2017 +(\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . -The flags \f[B]-efghiqsvVw\f[R], all long options, and the extensions +The flags \f[B]\-efghiqsvVw\f[R], all long options, and the extensions noted above are extensions to that specification. .PP In addition, the behavior of the \f[B]quit\f[R] implements an diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md index 5d5334c70d7..ad1e603392a 100644 --- a/manuals/bc/N.1.md +++ b/manuals/bc/N.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -811,6 +811,9 @@ The operators will be described in more detail below. : The **boolean not** operator returns **1** if the expression is **0**, or **0** otherwise. + **Warning**: This operator has a **different precedence** than the + equivalent operator in GNU bc(1) and other bc(1) implementations! + This is a **non-portable extension**. **\$** diff --git a/manuals/bcl.3 b/manuals/bcl.3 index 09e5de74597..f2791624b2c 100644 --- a/manuals/bcl.3 +++ b/manuals/bcl.3 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,17 +25,17 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BCL" "3" "February 2023" "Gavin D. Howard" "Libraries Manual" +.TH "BCL" "3" "January 2024" "Gavin D. Howard" "Libraries Manual" .nh .ad l .SH NAME -bcl - library of arbitrary precision decimal arithmetic +bcl \- library of arbitrary precision decimal arithmetic .SH SYNOPSIS .SS Use \f[I]#include \f[R] .PP -Link with \f[I]-lbcl\f[R], and on POSIX systems, \f[I]-lpthread\f[R] is -also required. +Link with \f[I]\-lbcl\f[R], and on POSIX systems, \f[I]\-lpthread\f[R] +is also required. .SS Setup These items allow clients to set up bcl(3). .PP @@ -104,7 +104,7 @@ These items allow clients to handle errors. \f[B]BclError bcl_err(BclNumber\f[R] \f[I]n\f[R]\f[B]);\f[R] .SS Numbers These items allow clients to manipulate and query the -arbitrary-precision numbers managed by bcl(3). +arbitrary\-precision numbers managed by bcl(3). .PP \f[B]typedef struct { size_t i; } BclNumber;\f[R] .PP @@ -223,8 +223,8 @@ These items are miscellaneous. \f[I]s\f[R]\f[B]);\f[R] .PP \f[B]BclNumber bcl_dup(BclNumber\f[R] \f[I]s\f[R]\f[B]);\f[R] -.SS Pseudo-Random Number Generator -These items allow clients to manipulate the seeded pseudo-random number +.SS Pseudo\-Random Number Generator +These items allow clients to manipulate the seeded pseudo\-random number generator in bcl(3). .PP \f[B]#define BCL_SEED_ULONGS\f[R] @@ -265,8 +265,8 @@ size_t\f[R] \f[I]places\f[R]\f[B]);\f[R] \f[B]BclRandInt bcl_rand_bounded(BclRandInt\f[R] \f[I]bound\f[R]\f[B]);\f[R] .SH DESCRIPTION -bcl(3) is a library that implements arbitrary-precision decimal math, as -standardized by POSIX +bcl(3) is a library that implements arbitrary\-precision decimal math, +as standardized by POSIX (https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html) in bc(1). .PP @@ -361,7 +361,7 @@ a fatal error occurs. .PP If activated, clients do not need to check for fatal errors. .PP -This value is \f[I]thread-local\f[R]; it applies to just the thread it +This value is \f[I]thread\-local\f[R]; it applies to just the thread it is read on. .PP The default is \f[B]false\f[R]. @@ -375,7 +375,7 @@ If \f[I]abrt\f[R] is \f[B]true\f[R], bcl(3) will cause a \f[B]SIGABRT\f[R] on fatal errors after the call. .RS .PP -This value is \f[I]thread-local\f[R]; it applies to just the thread it +This value is \f[I]thread\-local\f[R]; it applies to just the thread it is set on. .PP If activated, clients do not need to check for fatal errors. @@ -384,11 +384,11 @@ If activated, clients do not need to check for fatal errors. \f[B]bool bcl_leadingZeroes(\f[R]\f[I]void\f[R]\f[B])\f[R] Queries and returns the state of whether leading zeroes are added to strings returned by \f[B]bcl_string()\f[R] when numbers are greater than -\f[B]-1\f[R], less than \f[B]1\f[R], and not equal to \f[B]0\f[R]. +\f[B]\-1\f[R], less than \f[B]1\f[R], and not equal to \f[B]0\f[R]. If \f[B]true\f[R] is returned, then leading zeroes will be added. .RS .PP -This value is \f[I]thread-local\f[R]; it applies to just the thread it +This value is \f[I]thread\-local\f[R]; it applies to just the thread it is read on. .PP The default is \f[B]false\f[R]. @@ -396,13 +396,13 @@ The default is \f[B]false\f[R]. .TP \f[B]void bcl_setLeadingZeroes(bool\f[R] \f[I]leadingZeroes\f[R]\f[B])\f[R] Sets the state of whether leading zeroes are added to strings returned -by \f[B]bcl_string()\f[R] when numbers are greater than \f[B]-1\f[R], +by \f[B]bcl_string()\f[R] when numbers are greater than \f[B]\-1\f[R], less than \f[B]1\f[R], and not equal to \f[B]0\f[R]. If \f[I]leadingZeroes\f[R] is \f[B]true\f[R], leading zeroes will be added to strings returned by \f[B]bcl_string()\f[R]. .RS .PP -This value is \f[I]thread-local\f[R]; it applies to just the thread it +This value is \f[I]thread\-local\f[R]; it applies to just the thread it is set on. .RE .TP @@ -426,7 +426,7 @@ while with clamping on and an \f[B]ibase\f[R] of \f[B]3\f[R], the string \[lq]AB\[rq] would be equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -This value is \f[I]thread-local\f[R]; it applies to just the thread it +This value is \f[I]thread\-local\f[R]; it applies to just the thread it is read on. .PP The default is \f[B]true\f[R]. @@ -439,12 +439,12 @@ For more information, see the \f[B]bcl_digitClamp(\f[R]\f[I]void\f[R]\f[B])\f[R] function. .RS .PP -This value is \f[I]thread-local\f[R]; it applies to just the thread it +This value is \f[I]thread\-local\f[R]; it applies to just the thread it is set on. .RE .TP \f[B]void bcl_gc(\f[R]\f[I]void\f[R]\f[B])\f[R] -Garbage collects cached instances of arbitrary-precision numbers. +Garbage collects cached instances of arbitrary\-precision numbers. This only frees the memory of numbers that are \f[I]not\f[R] in use, so it is safe to call at any time. .SS Contexts @@ -578,9 +578,9 @@ There must be a valid current context. All procedures in this section require a valid current context. .TP \f[B]BclNumber\f[R] -A handle to an arbitrary-precision number. +A handle to an arbitrary\-precision number. The actual number type is not exposed; the \f[B]BclNumber\f[R] handle is -the only way clients can refer to instances of arbitrary-precision +the only way clients can refer to instances of arbitrary\-precision numbers. .TP \f[B]BclNumber bcl_num_create(\f[R]\f[I]void\f[R]\f[B])\f[R] @@ -650,7 +650,7 @@ Parses a number string according to the current context\[cq]s \f[B]ibase\f[R] and returns the resulting number. .RS .PP -\f[I]val\f[R] must be non-\f[B]NULL\f[R] and a valid string. +\f[I]val\f[R] must be non\-\f[B]NULL\f[R] and a valid string. See \f[B]BCL_ERROR_PARSE_INVALID_STR\f[R] in the \f[B]ERRORS\f[R] section for more information. .PP @@ -933,7 +933,7 @@ Possible errors include: .TP \f[B]BclNumber bcl_mod(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Divides \f[I]a\f[R] by \f[I]b\f[R] to the \f[I]scale\f[R] of the current -context, computes the modulus \f[B]a-(a/b)*b\f[R], and returns the +context, computes the modulus \f[B]a\-(a/b)*b\f[R], and returns the modulus. .RS .PP @@ -960,7 +960,7 @@ Possible errors include: .TP \f[B]BclNumber bcl_mod_keep(BclNumber\f[R] \f[I]a\f[R]\f[B], BclNumber\f[R] \f[I]b\f[R]\f[B])\f[R] Divides \f[I]a\f[R] by \f[I]b\f[R] to the \f[I]scale\f[R] of the current -context, computes the modulus \f[B]a-(a/b)*b\f[R], and returns the +context, computes the modulus \f[B]a\-(a/b)*b\f[R], and returns the modulus. .RS .PP @@ -985,7 +985,7 @@ Possible errors include: Calculates \f[I]a\f[R] to the power of \f[I]b\f[R] to the \f[I]scale\f[R] of the current context. \f[I]b\f[R] must be an integer, but can be negative. -If it is negative, \f[I]a\f[R] must be non-zero. +If it is negative, \f[I]a\f[R] must be non\-zero. .RS .PP \f[I]b\f[R] must be an integer. @@ -1021,7 +1021,7 @@ Possible errors include: Calculates \f[I]a\f[R] to the power of \f[I]b\f[R] to the \f[I]scale\f[R] of the current context. \f[I]b\f[R] must be an integer, but can be negative. -If it is negative, \f[I]a\f[R] must be non-zero. +If it is negative, \f[I]a\f[R] must be non\-zero. .RS .PP \f[I]b\f[R] must be an integer. @@ -1354,10 +1354,11 @@ Possible errors include: .IP \[bu] 2 \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] .RE -.SS Pseudo-Random Number Generator -The pseudo-random number generator in bcl(3) is a \f[I]seeded\f[R] PRNG. +.SS Pseudo\-Random Number Generator +The pseudo\-random number generator in bcl(3) is a \f[I]seeded\f[R] +PRNG. Given the same seed twice, it will produce the same sequence of -pseudo-random numbers twice. +pseudo\-random numbers twice. .PP By default, bcl(3) attempts to seed the PRNG with data from \f[B]/dev/urandom\f[R]. @@ -1384,7 +1385,7 @@ their name consume the given \f[B]BclNumber\f[R] arguments that are not given to pointer arguments. See the \f[B]Consumption and Propagation\f[R] subsection below. .PP -The following items allow clients to use the pseudo-random number +The following items allow clients to use the pseudo\-random number generator. All procedures require a valid current context. .TP @@ -1414,7 +1415,7 @@ This is done by generating as many random numbers as necessary, multiplying them by certain exponents, and adding them all together. .RS .PP -\f[I]a\f[R] must be an integer and non-negative. +\f[I]a\f[R] must be an integer and non\-negative. .PP \f[I]a\f[R] is consumed; it cannot be used after the call. See the \f[B]Consumption and Propagation\f[R] subsection below. @@ -1447,7 +1448,7 @@ This is done by generating as many random numbers as necessary, multiplying them by certain exponents, and adding them all together. .RS .PP -\f[I]a\f[R] must be an integer and non-negative. +\f[I]a\f[R] must be an integer and non\-negative. .PP This procedure requires a valid current context. .PP @@ -1490,7 +1491,7 @@ decimal digits after the radix (decimal point). There are no limits on \f[I]a\f[R] or \f[I]places\f[R]. .RS .PP -\f[I]a\f[R] must be an integer and non-negative. +\f[I]a\f[R] must be an integer and non\-negative. .PP \f[I]a\f[R] is consumed; it cannot be used after the call. See the \f[B]Consumption and Propagation\f[R] subsection below. @@ -1518,7 +1519,7 @@ decimal digits after the radix (decimal point). There are no limits on \f[I]a\f[R] or \f[I]places\f[R]. .RS .PP -\f[I]a\f[R] must be an integer and non-negative. +\f[I]a\f[R] must be an integer and non\-negative. .PP This procedure requires a valid current context. .PP @@ -1670,8 +1671,8 @@ A negative number was given as an argument to a parameter that cannot accept negative numbers, such as for square roots. .TP \f[B]BCL_ERROR_MATH_NON_INTEGER\f[R] -A non-integer was given as an argument to a parameter that cannot accept -non-integer numbers, such as for the second parameter of +A non\-integer was given as an argument to a parameter that cannot +accept non\-integer numbers, such as for the second parameter of \f[B]bcl_num_pow()\f[R]. .TP \f[B]BCL_ERROR_MATH_OVERFLOW\f[R] @@ -1686,7 +1687,7 @@ An invalid number string was passed to a parsing function. .RS .PP A valid number string can only be one radix (period). -In addition, any lowercase ASCII letters, symbols, or non-ASCII +In addition, any lowercase ASCII letters, symbols, or non\-ASCII characters are invalid. It is allowed for the first character to be a dash. In that case, the number is considered to be negative. @@ -1706,7 +1707,7 @@ of the current \f[B]ibase\f[R]. For example, if \f[B]ibase\f[R] is \f[B]16\f[R] and bcl(3) is given the number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if bcl(3) is given the number string -\f[B]10e-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. +\f[B]10e\-4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .RE .TP \f[B]BCL_ERROR_FATAL_ALLOC_ERR\f[R] @@ -1739,12 +1740,12 @@ It is highly recommended that client libraries do \f[I]not\f[R] activate this behavior. .RE .SH ATTRIBUTES -bcl(3) is \f[I]MT-Safe\f[R]: it is safe to call any functions from more +bcl(3) is \f[I]MT\-Safe\f[R]: it is safe to call any functions from more than one thread. However, is is \f[I]not\f[R] safe to pass any data between threads except for strings returned by \f[B]bcl_string()\f[R]. .PP -bcl(3) is not \f[I]async-signal-safe\f[R]. +bcl(3) is not \f[I]async\-signal\-safe\f[R]. It was not possible to make bcl(3) safe with signals and also make it safe with multiple threads. If it is necessary to be able to interrupt bcl(3), spawn a separate @@ -1798,31 +1799,31 @@ Set at \f[B]BC_BASE_POW\f[R]. .TP \f[B]BC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]BC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]BC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]BC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]bcl_rand_int()\f[R] function. -Set at \f[B]2\[ha]BC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]BC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). Set at \f[B]BC_OVERFLOW_MAX\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH SEE ALSO bc(1) and dc(1) .SH STANDARDS bcl(3) is compliant with the arithmetic defined in the IEEE Std -1003.1-2017 (\[lq]POSIX.1-2017\[rq]) specification at +1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html for bc(1). .PP diff --git a/manuals/bcl.3.md b/manuals/bcl.3.md index fa566d161c4..41c1c120b62 100644 --- a/manuals/bcl.3.md +++ b/manuals/bcl.3.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/A.1 b/manuals/dc/A.1 index 7de20035f43..33ecb8e2031 100644 --- a/manuals/dc/A.1 +++ b/manuals/dc/A.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,45 +25,45 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -73,17 +73,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -94,17 +94,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -112,10 +112,10 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -124,44 +124,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -169,28 +169,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -198,10 +198,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -214,10 +214,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -236,10 +236,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -247,34 +247,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -284,7 +284,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -292,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -305,7 +305,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -341,8 +341,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -354,14 +354,14 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .PP \f[B]seed\f[R] is a register containing the current seed for the -pseudo-random number generator. +pseudo\-random number generator. If the current value of \f[B]seed\f[R] is queried and stored, then if it -is assigned to \f[B]seed\f[R] later, the pseudo-random number generator -is guaranteed to produce the same sequence of pseudo-random numbers that -were generated after the value of \f[B]seed\f[R] was first queried. +is assigned to \f[B]seed\f[R] later, the pseudo\-random number generator +is guaranteed to produce the same sequence of pseudo\-random numbers +that were generated after the value of \f[B]seed\f[R] was first queried. .PP Multiple values assigned to \f[B]seed\f[R] can produce the same sequence -of pseudo-random numbers. +of pseudo\-random numbers. Likewise, when a value is assigned to \f[B]seed\f[R], it is not guaranteed that querying \f[B]seed\f[R] immediately after will return the same value. @@ -371,22 +371,22 @@ get receive a value of \f[B]0\f[R] or \f[B]1\f[R]. The maximum integer returned by the \f[B]\[cq]\f[R] command can be queried with the \f[B]W\f[R] command. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with the \f[B]\[cq]\f[R] and \f[B]\[lq]\f[R] commands are guaranteed to \f[B]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from dc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from dc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .PP -The pseudo-random number generator, \f[B]seed\f[R], and all associated -operations are \f[B]non-portable extensions\f[R]. +The pseudo\-random number generator, \f[B]seed\f[R], and all associated +operations are \f[B]non\-portable extensions\f[R]. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -397,12 +397,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -420,7 +420,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -451,7 +451,7 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if dc(1) is given the number string \f[B]10e_4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SH COMMANDS The valid commands are listed below. @@ -467,7 +467,7 @@ activated by assigning \f[B]1\f[R] to \f[B]obase\f[R] using To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .TP \f[B]p\f[R] Prints the value on top of the stack, whether number or string, and @@ -487,12 +487,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -511,7 +511,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -532,7 +532,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -542,10 +542,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -556,9 +556,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -569,7 +569,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -578,7 +578,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -588,7 +588,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -597,7 +597,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -606,12 +606,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -619,7 +619,7 @@ The top value is popped off the stack and copied, and the copy is truncated and pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -629,9 +629,9 @@ extension. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]H\f[R] @@ -640,9 +640,9 @@ left (radix shifted right) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]h\f[R] @@ -651,9 +651,9 @@ right (radix shifted left) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -661,7 +661,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -669,7 +669,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -678,7 +678,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -687,7 +687,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -696,7 +696,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -705,41 +705,41 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE -.SS Pseudo-Random Number Generator -dc(1) has a built-in pseudo-random number generator. -These commands query the pseudo-random number generator. +.SS Pseudo\-Random Number Generator +dc(1) has a built\-in pseudo\-random number generator. +These commands query the pseudo\-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that -controls the pseudo-random number generator.) +controls the pseudo\-random number generator.) .PP -The pseudo-random number generator is guaranteed to \f[B]NOT\f[R] be +The pseudo\-random number generator is guaranteed to \f[B]NOT\f[R] be cryptographically secure. .TP \f[B]\[cq]\f[R] @@ -748,19 +748,19 @@ the \f[B]LIMITS\f[R] section). .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[lq]\f[R] Pops a value off of the stack, which is used as an \f[B]exclusive\f[R] upper bound on the integer that will be generated. -If the bound is negative or is a non-integer, an error is raised, and +If the bound is negative or is a non\-integer, an error is raised, and dc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If the bound is larger than \f[B]DC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]DC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this command is @@ -772,9 +772,9 @@ is \f[I]not\f[R] changed. .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -840,7 +840,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -850,7 +850,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the \f[B]j\f[R] Pops the value off of the top of the stack and uses it to set \f[B]seed\f[R]. -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .RS @@ -858,22 +858,22 @@ versions. The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is used again, the -pseudo-random number generator is guaranteed to produce the same -sequence of pseudo-random numbers as it did when the \f[B]seed\f[R] +pseudo\-random number generator is guaranteed to produce the same +sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if the \f[B]J\f[R] command is used. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will not -produce unique sequences of pseudo-random numbers. +produce unique sequences of pseudo\-random numbers. .PP There is no limit to the length (number of significant decimal digits) or \f[I]scale\f[R] of the value that can be assigned to \f[B]seed\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]I\f[R] @@ -889,7 +889,7 @@ Pushes the current value of \f[B]scale\f[R] onto the main stack. Pushes the current value of \f[B]seed\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]T\f[R] @@ -897,7 +897,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -905,7 +905,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -913,15 +913,15 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]W\f[R] Pushes the maximum (inclusive) integer that can be generated with the -\f[B]\[cq]\f[R] pseudo-random number generator command. +\f[B]\[cq]\f[R] pseudo\-random number generator command. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -961,16 +961,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -1006,7 +1006,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -1027,7 +1027,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -1048,7 +1048,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -1069,7 +1069,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -1090,7 +1090,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -1111,7 +1111,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -1124,7 +1124,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -1137,7 +1137,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -1170,7 +1170,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -1179,7 +1179,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -1197,7 +1197,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1216,7 +1216,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1238,8 +1238,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1250,7 +1250,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1259,18 +1259,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1334,29 +1334,29 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]\[cq]\f[R] command, if dc(1). -Set at \f[B]2\[ha]DC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]DC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1364,27 +1364,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1402,14 +1402,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1426,13 +1426,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1441,11 +1441,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1454,43 +1454,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1506,10 +1507,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -1544,7 +1545,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1555,16 +1556,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1580,23 +1582,23 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -1608,18 +1610,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1631,7 +1633,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1657,11 +1659,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -dc(1) supports interactive command-line editing. +dc(1) supports interactive command\-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -1677,7 +1679,7 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/A.1.md b/manuals/dc/A.1.md index 44b1578b670..613f98f7681 100644 --- a/manuals/dc/A.1.md +++ b/manuals/dc/A.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/E.1 b/manuals/dc/E.1 index bc8d66eb3f9..91f68dfd746 100644 --- a/manuals/dc/E.1 +++ b/manuals/dc/E.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,41 +25,41 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -69,17 +69,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -90,17 +90,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -109,44 +109,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -154,28 +154,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -183,10 +183,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -199,10 +199,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -221,10 +221,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -232,34 +232,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -269,7 +269,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -277,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -290,7 +290,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -333,7 +333,7 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -344,12 +344,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -367,7 +367,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -403,12 +403,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -427,7 +427,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -448,7 +448,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -458,10 +458,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -472,9 +472,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -485,7 +485,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -494,7 +494,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -504,7 +504,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -513,7 +513,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -522,12 +522,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -535,7 +535,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -543,7 +543,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -552,7 +552,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -561,7 +561,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -570,7 +570,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -579,33 +579,33 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -670,7 +670,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -691,7 +691,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -699,7 +699,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -707,7 +707,7 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -747,16 +747,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -792,7 +792,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -813,7 +813,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -834,7 +834,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -855,7 +855,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -876,7 +876,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -897,7 +897,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -910,7 +910,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -923,7 +923,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -956,7 +956,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -965,7 +965,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -983,7 +983,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1002,7 +1002,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1024,8 +1024,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1036,7 +1036,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1045,18 +1045,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1120,24 +1120,24 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1145,27 +1145,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1183,14 +1183,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1207,13 +1207,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1222,11 +1222,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1235,43 +1235,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1289,7 +1290,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator. @@ -1323,7 +1324,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1334,16 +1335,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1359,23 +1361,23 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -1387,18 +1389,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1410,7 +1412,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1436,11 +1438,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -dc(1) supports interactive command-line editing. +dc(1) supports interactive command\-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -1456,7 +1458,7 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/E.1.md b/manuals/dc/E.1.md index 8a172d8a124..3a47f789bd3 100644 --- a/manuals/dc/E.1.md +++ b/manuals/dc/E.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/EH.1 b/manuals/dc/EH.1 index 83b62e24b91..e60e6e0d849 100644 --- a/manuals/dc/EH.1 +++ b/manuals/dc/EH.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,41 +25,41 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -69,17 +69,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -90,17 +90,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -109,44 +109,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -154,28 +154,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -183,10 +183,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -199,10 +199,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -221,10 +221,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -232,34 +232,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -269,7 +269,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -277,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -290,7 +290,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -333,7 +333,7 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -344,12 +344,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -367,7 +367,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -403,12 +403,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -427,7 +427,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -448,7 +448,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -458,10 +458,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -472,9 +472,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -485,7 +485,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -494,7 +494,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -504,7 +504,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -513,7 +513,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -522,12 +522,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -535,7 +535,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -543,7 +543,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -552,7 +552,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -561,7 +561,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -570,7 +570,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -579,33 +579,33 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -670,7 +670,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -691,7 +691,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -699,7 +699,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -707,7 +707,7 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -747,16 +747,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -792,7 +792,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -813,7 +813,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -834,7 +834,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -855,7 +855,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -876,7 +876,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -897,7 +897,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -910,7 +910,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -923,7 +923,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -956,7 +956,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -965,7 +965,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -983,7 +983,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1002,7 +1002,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1024,8 +1024,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1036,7 +1036,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1045,18 +1045,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1120,24 +1120,24 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1145,27 +1145,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1183,14 +1183,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1207,13 +1207,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1222,11 +1222,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1235,43 +1235,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1289,7 +1290,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator. @@ -1323,7 +1324,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1334,16 +1335,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1359,16 +1361,16 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] @@ -1380,18 +1382,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1403,7 +1405,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1432,7 +1434,7 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/EH.1.md b/manuals/dc/EH.1.md index 1c5b6f566b1..761b9a89947 100644 --- a/manuals/dc/EH.1.md +++ b/manuals/dc/EH.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/EHN.1 b/manuals/dc/EHN.1 index 5df155cf525..d26d49c5ce3 100644 --- a/manuals/dc/EHN.1 +++ b/manuals/dc/EHN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,41 +25,41 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -69,17 +69,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -90,17 +90,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -109,44 +109,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -154,28 +154,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -183,10 +183,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -199,10 +199,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -221,10 +221,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -232,34 +232,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -269,7 +269,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -277,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -290,7 +290,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -333,7 +333,7 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -344,12 +344,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -367,7 +367,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -403,12 +403,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -427,7 +427,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -448,7 +448,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -458,10 +458,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -472,9 +472,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -485,7 +485,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -494,7 +494,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -504,7 +504,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -513,7 +513,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -522,12 +522,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -535,7 +535,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -543,7 +543,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -552,7 +552,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -561,7 +561,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -570,7 +570,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -579,33 +579,33 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -670,7 +670,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -691,7 +691,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -699,7 +699,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -707,7 +707,7 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -747,16 +747,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -792,7 +792,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -813,7 +813,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -834,7 +834,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -855,7 +855,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -876,7 +876,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -897,7 +897,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -910,7 +910,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -923,7 +923,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -956,7 +956,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -965,7 +965,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -983,7 +983,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1002,7 +1002,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1024,8 +1024,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1036,7 +1036,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1045,18 +1045,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1120,24 +1120,24 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1145,27 +1145,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1183,14 +1183,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1207,13 +1207,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1222,11 +1222,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1235,43 +1235,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1289,7 +1290,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator. @@ -1323,7 +1324,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1334,16 +1335,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1359,16 +1361,16 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] @@ -1380,18 +1382,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1403,7 +1405,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1429,7 +1431,7 @@ exit, and it uses the default handler for all other signals. bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/EHN.1.md b/manuals/dc/EHN.1.md index 8a3c6d2b780..58ae149bb68 100644 --- a/manuals/dc/EHN.1.md +++ b/manuals/dc/EHN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/EN.1 b/manuals/dc/EN.1 index 8cdefc2b352..03cb5743602 100644 --- a/manuals/dc/EN.1 +++ b/manuals/dc/EN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,41 +25,41 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -69,17 +69,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -90,17 +90,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -109,44 +109,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -154,28 +154,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -183,10 +183,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -199,10 +199,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -221,10 +221,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -232,34 +232,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -269,7 +269,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -277,7 +277,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -290,7 +290,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -333,7 +333,7 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -344,12 +344,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -367,7 +367,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -403,12 +403,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -427,7 +427,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -448,7 +448,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -458,10 +458,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -472,9 +472,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -485,7 +485,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -494,7 +494,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -504,7 +504,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -513,7 +513,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -522,12 +522,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -535,7 +535,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -543,7 +543,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -552,7 +552,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -561,7 +561,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -570,7 +570,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -579,33 +579,33 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -670,7 +670,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -691,7 +691,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -699,7 +699,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -707,7 +707,7 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -747,16 +747,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -792,7 +792,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -813,7 +813,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -834,7 +834,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -855,7 +855,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -876,7 +876,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -897,7 +897,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -910,7 +910,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -923,7 +923,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -956,7 +956,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -965,7 +965,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -983,7 +983,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1002,7 +1002,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1024,8 +1024,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1036,7 +1036,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1045,18 +1045,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1120,24 +1120,24 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1145,27 +1145,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1183,14 +1183,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1207,13 +1207,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1222,11 +1222,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1235,43 +1235,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1289,7 +1290,7 @@ Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting to use a -non-integer where an integer is required. +non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]) operator. @@ -1323,7 +1324,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1334,16 +1335,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1359,23 +1361,23 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -1387,18 +1389,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1410,7 +1412,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1436,11 +1438,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -dc(1) supports interactive command-line editing. +dc(1) supports interactive command\-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -1453,7 +1455,7 @@ section). bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/EN.1.md b/manuals/dc/EN.1.md index f8deee533c4..64c945be885 100644 --- a/manuals/dc/EN.1.md +++ b/manuals/dc/EN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/H.1 b/manuals/dc/H.1 index caa81645add..36f7458a331 100644 --- a/manuals/dc/H.1 +++ b/manuals/dc/H.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,45 +25,45 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -73,17 +73,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -94,17 +94,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -112,10 +112,10 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -124,44 +124,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -169,28 +169,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -198,10 +198,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -214,10 +214,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -236,10 +236,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -247,34 +247,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -284,7 +284,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -292,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -305,7 +305,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -341,8 +341,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -354,14 +354,14 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .PP \f[B]seed\f[R] is a register containing the current seed for the -pseudo-random number generator. +pseudo\-random number generator. If the current value of \f[B]seed\f[R] is queried and stored, then if it -is assigned to \f[B]seed\f[R] later, the pseudo-random number generator -is guaranteed to produce the same sequence of pseudo-random numbers that -were generated after the value of \f[B]seed\f[R] was first queried. +is assigned to \f[B]seed\f[R] later, the pseudo\-random number generator +is guaranteed to produce the same sequence of pseudo\-random numbers +that were generated after the value of \f[B]seed\f[R] was first queried. .PP Multiple values assigned to \f[B]seed\f[R] can produce the same sequence -of pseudo-random numbers. +of pseudo\-random numbers. Likewise, when a value is assigned to \f[B]seed\f[R], it is not guaranteed that querying \f[B]seed\f[R] immediately after will return the same value. @@ -371,22 +371,22 @@ get receive a value of \f[B]0\f[R] or \f[B]1\f[R]. The maximum integer returned by the \f[B]\[cq]\f[R] command can be queried with the \f[B]W\f[R] command. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with the \f[B]\[cq]\f[R] and \f[B]\[lq]\f[R] commands are guaranteed to \f[B]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from dc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from dc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .PP -The pseudo-random number generator, \f[B]seed\f[R], and all associated -operations are \f[B]non-portable extensions\f[R]. +The pseudo\-random number generator, \f[B]seed\f[R], and all associated +operations are \f[B]non\-portable extensions\f[R]. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -397,12 +397,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -420,7 +420,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -451,7 +451,7 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if dc(1) is given the number string \f[B]10e_4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SH COMMANDS The valid commands are listed below. @@ -467,7 +467,7 @@ activated by assigning \f[B]1\f[R] to \f[B]obase\f[R] using To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .TP \f[B]p\f[R] Prints the value on top of the stack, whether number or string, and @@ -487,12 +487,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -511,7 +511,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -532,7 +532,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -542,10 +542,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -556,9 +556,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -569,7 +569,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -578,7 +578,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -588,7 +588,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -597,7 +597,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -606,12 +606,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -619,7 +619,7 @@ The top value is popped off the stack and copied, and the copy is truncated and pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -629,9 +629,9 @@ extension. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]H\f[R] @@ -640,9 +640,9 @@ left (radix shifted right) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]h\f[R] @@ -651,9 +651,9 @@ right (radix shifted left) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -661,7 +661,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -669,7 +669,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -678,7 +678,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -687,7 +687,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -696,7 +696,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -705,41 +705,41 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE -.SS Pseudo-Random Number Generator -dc(1) has a built-in pseudo-random number generator. -These commands query the pseudo-random number generator. +.SS Pseudo\-Random Number Generator +dc(1) has a built\-in pseudo\-random number generator. +These commands query the pseudo\-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that -controls the pseudo-random number generator.) +controls the pseudo\-random number generator.) .PP -The pseudo-random number generator is guaranteed to \f[B]NOT\f[R] be +The pseudo\-random number generator is guaranteed to \f[B]NOT\f[R] be cryptographically secure. .TP \f[B]\[cq]\f[R] @@ -748,19 +748,19 @@ the \f[B]LIMITS\f[R] section). .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[lq]\f[R] Pops a value off of the stack, which is used as an \f[B]exclusive\f[R] upper bound on the integer that will be generated. -If the bound is negative or is a non-integer, an error is raised, and +If the bound is negative or is a non\-integer, an error is raised, and dc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If the bound is larger than \f[B]DC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]DC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this command is @@ -772,9 +772,9 @@ is \f[I]not\f[R] changed. .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -840,7 +840,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -850,7 +850,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the \f[B]j\f[R] Pops the value off of the top of the stack and uses it to set \f[B]seed\f[R]. -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .RS @@ -858,22 +858,22 @@ versions. The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is used again, the -pseudo-random number generator is guaranteed to produce the same -sequence of pseudo-random numbers as it did when the \f[B]seed\f[R] +pseudo\-random number generator is guaranteed to produce the same +sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if the \f[B]J\f[R] command is used. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will not -produce unique sequences of pseudo-random numbers. +produce unique sequences of pseudo\-random numbers. .PP There is no limit to the length (number of significant decimal digits) or \f[I]scale\f[R] of the value that can be assigned to \f[B]seed\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]I\f[R] @@ -889,7 +889,7 @@ Pushes the current value of \f[B]scale\f[R] onto the main stack. Pushes the current value of \f[B]seed\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]T\f[R] @@ -897,7 +897,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -905,7 +905,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -913,15 +913,15 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]W\f[R] Pushes the maximum (inclusive) integer that can be generated with the -\f[B]\[cq]\f[R] pseudo-random number generator command. +\f[B]\[cq]\f[R] pseudo\-random number generator command. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -961,16 +961,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -1006,7 +1006,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -1027,7 +1027,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -1048,7 +1048,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -1069,7 +1069,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -1090,7 +1090,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -1111,7 +1111,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -1124,7 +1124,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -1137,7 +1137,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -1170,7 +1170,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -1179,7 +1179,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -1197,7 +1197,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1216,7 +1216,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1238,8 +1238,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1250,7 +1250,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1259,18 +1259,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1334,29 +1334,29 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]\[cq]\f[R] command, if dc(1). -Set at \f[B]2\[ha]DC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]DC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1364,27 +1364,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1402,14 +1402,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1426,13 +1426,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1441,11 +1441,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1454,43 +1454,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1506,10 +1507,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -1544,7 +1545,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1555,16 +1556,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1580,16 +1582,16 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] @@ -1601,18 +1603,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1624,7 +1626,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1653,7 +1655,7 @@ locales and thus, supports \f[B]LC_MESSAGES\f[R]. bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/H.1.md b/manuals/dc/H.1.md index 7166c155efa..cc263eea0db 100644 --- a/manuals/dc/H.1.md +++ b/manuals/dc/H.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/HN.1 b/manuals/dc/HN.1 index cdfa4ad8261..eae5cc516f7 100644 --- a/manuals/dc/HN.1 +++ b/manuals/dc/HN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,45 +25,45 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -73,17 +73,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -94,17 +94,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -112,10 +112,10 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -124,44 +124,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -169,28 +169,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -198,10 +198,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -214,10 +214,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -236,10 +236,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -247,34 +247,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -284,7 +284,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -292,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -305,7 +305,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -341,8 +341,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -354,14 +354,14 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .PP \f[B]seed\f[R] is a register containing the current seed for the -pseudo-random number generator. +pseudo\-random number generator. If the current value of \f[B]seed\f[R] is queried and stored, then if it -is assigned to \f[B]seed\f[R] later, the pseudo-random number generator -is guaranteed to produce the same sequence of pseudo-random numbers that -were generated after the value of \f[B]seed\f[R] was first queried. +is assigned to \f[B]seed\f[R] later, the pseudo\-random number generator +is guaranteed to produce the same sequence of pseudo\-random numbers +that were generated after the value of \f[B]seed\f[R] was first queried. .PP Multiple values assigned to \f[B]seed\f[R] can produce the same sequence -of pseudo-random numbers. +of pseudo\-random numbers. Likewise, when a value is assigned to \f[B]seed\f[R], it is not guaranteed that querying \f[B]seed\f[R] immediately after will return the same value. @@ -371,22 +371,22 @@ get receive a value of \f[B]0\f[R] or \f[B]1\f[R]. The maximum integer returned by the \f[B]\[cq]\f[R] command can be queried with the \f[B]W\f[R] command. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with the \f[B]\[cq]\f[R] and \f[B]\[lq]\f[R] commands are guaranteed to \f[B]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from dc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from dc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .PP -The pseudo-random number generator, \f[B]seed\f[R], and all associated -operations are \f[B]non-portable extensions\f[R]. +The pseudo\-random number generator, \f[B]seed\f[R], and all associated +operations are \f[B]non\-portable extensions\f[R]. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -397,12 +397,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -420,7 +420,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -451,7 +451,7 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if dc(1) is given the number string \f[B]10e_4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SH COMMANDS The valid commands are listed below. @@ -467,7 +467,7 @@ activated by assigning \f[B]1\f[R] to \f[B]obase\f[R] using To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .TP \f[B]p\f[R] Prints the value on top of the stack, whether number or string, and @@ -487,12 +487,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -511,7 +511,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -532,7 +532,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -542,10 +542,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -556,9 +556,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -569,7 +569,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -578,7 +578,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -588,7 +588,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -597,7 +597,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -606,12 +606,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -619,7 +619,7 @@ The top value is popped off the stack and copied, and the copy is truncated and pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -629,9 +629,9 @@ extension. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]H\f[R] @@ -640,9 +640,9 @@ left (radix shifted right) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]h\f[R] @@ -651,9 +651,9 @@ right (radix shifted left) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -661,7 +661,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -669,7 +669,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -678,7 +678,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -687,7 +687,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -696,7 +696,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -705,41 +705,41 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE -.SS Pseudo-Random Number Generator -dc(1) has a built-in pseudo-random number generator. -These commands query the pseudo-random number generator. +.SS Pseudo\-Random Number Generator +dc(1) has a built\-in pseudo\-random number generator. +These commands query the pseudo\-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that -controls the pseudo-random number generator.) +controls the pseudo\-random number generator.) .PP -The pseudo-random number generator is guaranteed to \f[B]NOT\f[R] be +The pseudo\-random number generator is guaranteed to \f[B]NOT\f[R] be cryptographically secure. .TP \f[B]\[cq]\f[R] @@ -748,19 +748,19 @@ the \f[B]LIMITS\f[R] section). .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[lq]\f[R] Pops a value off of the stack, which is used as an \f[B]exclusive\f[R] upper bound on the integer that will be generated. -If the bound is negative or is a non-integer, an error is raised, and +If the bound is negative or is a non\-integer, an error is raised, and dc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If the bound is larger than \f[B]DC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]DC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this command is @@ -772,9 +772,9 @@ is \f[I]not\f[R] changed. .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -840,7 +840,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -850,7 +850,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the \f[B]j\f[R] Pops the value off of the top of the stack and uses it to set \f[B]seed\f[R]. -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .RS @@ -858,22 +858,22 @@ versions. The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is used again, the -pseudo-random number generator is guaranteed to produce the same -sequence of pseudo-random numbers as it did when the \f[B]seed\f[R] +pseudo\-random number generator is guaranteed to produce the same +sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if the \f[B]J\f[R] command is used. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will not -produce unique sequences of pseudo-random numbers. +produce unique sequences of pseudo\-random numbers. .PP There is no limit to the length (number of significant decimal digits) or \f[I]scale\f[R] of the value that can be assigned to \f[B]seed\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]I\f[R] @@ -889,7 +889,7 @@ Pushes the current value of \f[B]scale\f[R] onto the main stack. Pushes the current value of \f[B]seed\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]T\f[R] @@ -897,7 +897,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -905,7 +905,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -913,15 +913,15 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]W\f[R] Pushes the maximum (inclusive) integer that can be generated with the -\f[B]\[cq]\f[R] pseudo-random number generator command. +\f[B]\[cq]\f[R] pseudo\-random number generator command. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -961,16 +961,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -1006,7 +1006,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -1027,7 +1027,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -1048,7 +1048,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -1069,7 +1069,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -1090,7 +1090,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -1111,7 +1111,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -1124,7 +1124,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -1137,7 +1137,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -1170,7 +1170,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -1179,7 +1179,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -1197,7 +1197,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1216,7 +1216,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1238,8 +1238,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1250,7 +1250,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1259,18 +1259,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1334,29 +1334,29 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]\[cq]\f[R] command, if dc(1). -Set at \f[B]2\[ha]DC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]DC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1364,27 +1364,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1402,14 +1402,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1426,13 +1426,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1441,11 +1441,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1454,43 +1454,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1506,10 +1507,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -1544,7 +1545,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1555,16 +1556,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1580,16 +1582,16 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] @@ -1601,18 +1603,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1624,7 +1626,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1650,7 +1652,7 @@ exit, and it uses the default handler for all other signals. bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/HN.1.md b/manuals/dc/HN.1.md index 6239a12b286..b34d80325f7 100644 --- a/manuals/dc/HN.1.md +++ b/manuals/dc/HN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/manuals/dc/N.1 b/manuals/dc/N.1 index 5bb0dff18e0..6233c753dea 100644 --- a/manuals/dc/N.1 +++ b/manuals/dc/N.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2023 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -25,45 +25,45 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "February 2023" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name -dc - arbitrary-precision decimal reverse-Polish notation calculator +dc \- arbitrary\-precision decimal reverse\-Polish notation calculator .SH SYNOPSIS -\f[B]dc\f[R] [\f[B]-cChiPRvVx\f[R]] [\f[B]--version\f[R]] -[\f[B]--help\f[R]] [\f[B]--digit-clamp\f[R]] -[\f[B]--no-digit-clamp\f[R]] [\f[B]--interactive\f[R]] -[\f[B]--no-prompt\f[R]] [\f[B]--no-read-prompt\f[R]] -[\f[B]--extended-register\f[R]] [\f[B]-e\f[R] \f[I]expr\f[R]] -[\f[B]--expression\f[R]=\f[I]expr\f[R]\&...] -[\f[B]-f\f[R] \f[I]file\f[R]\&...] -[\f[B]--file\f[R]=\f[I]file\f[R]\&...] +\f[B]dc\f[R] [\f[B]\-cChiPRvVx\f[R]] [\f[B]\-\-version\f[R]] +[\f[B]\-\-help\f[R]] [\f[B]\-\-digit\-clamp\f[R]] +[\f[B]\-\-no\-digit\-clamp\f[R]] [\f[B]\-\-interactive\f[R]] +[\f[B]\-\-no\-prompt\f[R]] [\f[B]\-\-no\-read\-prompt\f[R]] +[\f[B]\-\-extended\-register\f[R]] [\f[B]\-e\f[R] \f[I]expr\f[R]] +[\f[B]\-\-expression\f[R]=\f[I]expr\f[R]\&...] +[\f[B]\-f\f[R] \f[I]file\f[R]\&...] +[\f[B]\-\-file\f[R]=\f[I]file\f[R]\&...] [\f[I]file\f[R]\&...] -[\f[B]-I\f[R] \f[I]ibase\f[R]] [\f[B]--ibase\f[R]=\f[I]ibase\f[R]] -[\f[B]-O\f[R] \f[I]obase\f[R]] [\f[B]--obase\f[R]=\f[I]obase\f[R]] -[\f[B]-S\f[R] \f[I]scale\f[R]] [\f[B]--scale\f[R]=\f[I]scale\f[R]] -[\f[B]-E\f[R] \f[I]seed\f[R]] [\f[B]--seed\f[R]=\f[I]seed\f[R]] +[\f[B]\-I\f[R] \f[I]ibase\f[R]] [\f[B]\-\-ibase\f[R]=\f[I]ibase\f[R]] +[\f[B]\-O\f[R] \f[I]obase\f[R]] [\f[B]\-\-obase\f[R]=\f[I]obase\f[R]] +[\f[B]\-S\f[R] \f[I]scale\f[R]] [\f[B]\-\-scale\f[R]=\f[I]scale\f[R]] +[\f[B]\-E\f[R] \f[I]seed\f[R]] [\f[B]\-\-seed\f[R]=\f[I]seed\f[R]] .SH DESCRIPTION -dc(1) is an arbitrary-precision calculator. +dc(1) is an arbitrary\-precision calculator. It uses a stack (reverse Polish notation) to store numbers and results of computations. Arithmetic operations pop arguments off of the stack and push the results. .PP -If no files are given on the command-line, then dc(1) reads from +If no files are given on the command\-line, then dc(1) reads from \f[B]stdin\f[R] (see the \f[B]STDIN\f[R] section). Otherwise, those files are processed, and dc(1) will then exit. .PP If a user wants to set up a standard environment, they can use \f[B]DC_ENV_ARGS\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). For example, if a user wants the \f[B]scale\f[R] always set to -\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]-e 10k\f[R], +\f[B]10\f[R], they can set \f[B]DC_ENV_ARGS\f[R] to \f[B]\-e 10k\f[R], and this dc(1) will always start with a \f[B]scale\f[R] of \f[B]10\f[R]. .SH OPTIONS The following are the options that dc(1) accepts. .TP -\f[B]-C\f[R], \f[B]--no-digit-clamp\f[R] +\f[B]\-C\f[R], \f[B]\-\-no\-digit\-clamp\f[R] Disables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -73,17 +73,17 @@ digit\[cq]s value multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-c\f[R] or \f[B]--digit-clamp\f[R] options are -given multiple times, the last one given is used. +If this and/or the \f[B]\-c\f[R] or \f[B]\-\-digit\-clamp\f[R] options +are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-c\f[R], \f[B]--digit-clamp\f[R] +\f[B]\-c\f[R], \f[B]\-\-digit\-clamp\f[R] Enables clamping of digits greater than or equal to the current \f[B]ibase\f[R] when parsing numbers. .RS @@ -94,17 +94,17 @@ all multiplied by the value of ibase raised to the power of the digit\[cq]s position, which starts from 0 at the least significant digit. .PP -If this and/or the \f[B]-C\f[R] or \f[B]--no-digit-clamp\f[R] options -are given multiple times, the last one given is used. +If this and/or the \f[B]\-C\f[R] or \f[B]\-\-no\-digit\-clamp\f[R] +options are given multiple times, the last one given is used. .PP This option overrides the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and the default, which -can be queried with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +can be queried with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-E\f[R] \f[I]seed\f[R], \f[B]--seed\f[R]=\f[I]seed\f[R] +\f[B]\-E\f[R] \f[I]seed\f[R], \f[B]\-\-seed\f[R]=\f[I]seed\f[R] Sets the builtin variable \f[B]seed\f[R] to the value \f[I]seed\f[R] assuming that \f[I]seed\f[R] is in base 10. It is a fatal error if \f[I]seed\f[R] is not a valid number. @@ -112,10 +112,10 @@ It is a fatal error if \f[I]seed\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R] +\f[B]\-e\f[R] \f[I]expr\f[R], \f[B]\-\-expression\f[R]=\f[I]expr\f[R] Evaluates \f[I]expr\f[R]. If multiple expressions are given, they are evaluated in order. If files are given as well (see below), the expressions and files are @@ -124,44 +124,44 @@ This means that if a file is given before an expression, the file is read in and evaluated first. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R], whether on the command-line or in +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R], whether on the command\-line or in \f[B]DC_ENV_ARGS\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-f\f[R] \f[I]file\f[R], \f[B]--file\f[R]=\f[I]file\f[R] +\f[B]\-f\f[R] \f[I]file\f[R], \f[B]\-\-file\f[R]=\f[I]file\f[R] Reads in \f[I]file\f[R] and evaluates it, line by line, as though it were read through \f[B]stdin\f[R]. If expressions are also given (see above), the expressions are evaluated in the order given. .RS .PP -If this option is given on the command-line (i.e., not in +If this option is given on the command\-line (i.e., not in \f[B]DC_ENV_ARGS\f[R], see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then after processing all expressions and files, dc(1) will exit, unless -\f[B]-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to -\f[B]-f\f[R] or \f[B]--file\f[R]. -However, if any other \f[B]-e\f[R], \f[B]--expression\f[R], -\f[B]-f\f[R], or \f[B]--file\f[R] arguments are given after -\f[B]-f-\f[R] or equivalent is given, dc(1) will give a fatal error and -exit. +\f[B]\-\f[R] (\f[B]stdin\f[R]) was given as an argument at least once to +\f[B]\-f\f[R] or \f[B]\-\-file\f[R]. +However, if any other \f[B]\-e\f[R], \f[B]\-\-expression\f[R], +\f[B]\-f\f[R], or \f[B]\-\-file\f[R] arguments are given after +\f[B]\-f\-\f[R] or equivalent is given, dc(1) will give a fatal error +and exit. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-h\f[R], \f[B]--help\f[R] +\f[B]\-h\f[R], \f[B]\-\-help\f[R] Prints a usage message and exits. .TP -\f[B]-I\f[R] \f[I]ibase\f[R], \f[B]--ibase\f[R]=\f[I]ibase\f[R] +\f[B]\-I\f[R] \f[I]ibase\f[R], \f[B]\-\-ibase\f[R]=\f[I]ibase\f[R] Sets the builtin variable \f[B]ibase\f[R] to the value \f[I]ibase\f[R] assuming that \f[I]ibase\f[R] is in base 10. It is a fatal error if \f[I]ibase\f[R] is not a valid number. @@ -169,28 +169,28 @@ It is a fatal error if \f[I]ibase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-i\f[R], \f[B]--interactive\f[R] +\f[B]\-i\f[R], \f[B]\-\-interactive\f[R] Forces interactive mode. (See the \f[B]INTERACTIVE MODE\f[R] section.) .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-L\f[R], \f[B]--no-line-length\f[R] +\f[B]\-L\f[R], \f[B]\-\-no\-line\-length\f[R] Disables line length checking and prints numbers without backslashes and newlines. In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-O\f[R] \f[I]obase\f[R], \f[B]--obase\f[R]=\f[I]obase\f[R] +\f[B]\-O\f[R] \f[I]obase\f[R], \f[B]\-\-obase\f[R]=\f[I]obase\f[R] Sets the builtin variable \f[B]obase\f[R] to the value \f[I]obase\f[R] assuming that \f[I]obase\f[R] is in base 10. It is a fatal error if \f[I]obase\f[R] is not a valid number. @@ -198,10 +198,10 @@ It is a fatal error if \f[I]obase\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-P\f[R], \f[B]--no-prompt\f[R] +\f[B]\-P\f[R], \f[B]\-\-no\-prompt\f[R] Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -214,10 +214,10 @@ Most of those users would want to put this option in These options override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-R\f[R], \f[B]--no-read-prompt\f[R] +\f[B]\-R\f[R], \f[B]\-\-no\-read\-prompt\f[R] Disables the read prompt in TTY mode. (The read prompt is only enabled in TTY mode. See the \f[B]TTY MODE\f[R] section.) @@ -236,10 +236,10 @@ These options \f[I]do\f[R] override the \f[B]DC_PROMPT\f[R] and \f[B]DC_TTY_MODE\f[R] environment variables (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), but only for the read prompt. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-S\f[R] \f[I]scale\f[R], \f[B]--scale\f[R]=\f[I]scale\f[R] +\f[B]\-S\f[R] \f[I]scale\f[R], \f[B]\-\-scale\f[R]=\f[I]scale\f[R] Sets the builtin variable \f[B]scale\f[R] to the value \f[I]scale\f[R] assuming that \f[I]scale\f[R] is in base 10. It is a fatal error if \f[I]scale\f[R] is not a valid number. @@ -247,34 +247,34 @@ It is a fatal error if \f[I]scale\f[R] is not a valid number. .PP If multiple instances of this option are given, the last is used. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-v\f[R], \f[B]-V\f[R], \f[B]--version\f[R] +\f[B]\-v\f[R], \f[B]\-V\f[R], \f[B]\-\-version\f[R] Print the version information (copyright header) and exits. .TP -\f[B]-x\f[R] \f[B]--extended-register\f[R] +\f[B]\-x\f[R] \f[B]\-\-extended\-register\f[R] Enables extended register mode. See the \f[I]Extended Register Mode\f[R] subsection of the \f[B]REGISTERS\f[R] section for more information. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP -\f[B]-z\f[R], \f[B]--leading-zeroes\f[R] -Makes dc(1) print all numbers greater than \f[B]-1\f[R] and less than +\f[B]\-z\f[R], \f[B]\-\-leading\-zeroes\f[R] +Makes dc(1) print all numbers greater than \f[B]\-1\f[R] and less than \f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .PP -All long options are \f[B]non-portable extensions\f[R]. +All long options are \f[B]non\-portable extensions\f[R]. .SH STDIN -If no files are given on the command-line and no files or expressions -are given by the \f[B]-f\f[R], \f[B]--file\f[R], \f[B]-e\f[R], or -\f[B]--expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. +If no files are given on the command\-line and no files or expressions +are given by the \f[B]\-f\f[R], \f[B]\-\-file\f[R], \f[B]\-e\f[R], or +\f[B]\-\-expression\f[R] options, then dc(1) reads from \f[B]stdin\f[R]. .PP However, there is a caveat to this. .PP @@ -284,7 +284,7 @@ ended. This means that, except for escaped brackets, all brackets must be balanced before dc(1) parses and executes. .SH STDOUT -Any non-error output is written to \f[B]stdout\f[R]. +Any non\-error output is written to \f[B]stdout\f[R]. In addition, if history (see the \f[B]HISTORY\f[R] section) and the prompt (see the \f[B]TTY MODE\f[R] section) are enabled, both are output to \f[B]stdout\f[R]. @@ -292,7 +292,7 @@ to \f[B]stdout\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stdout\f[R], so if \f[B]stdout\f[R] is closed, as in -\f[B]dc >&-\f[R], it will quit with an error. +\f[B]dc >&\-\f[R], it will quit with an error. This is done so that dc(1) can report problems when \f[B]stdout\f[R] is redirected to a file. .PP @@ -305,7 +305,7 @@ Any error output is written to \f[B]stderr\f[R]. \f[B]Note\f[R]: Unlike other dc(1) implementations, this dc(1) will issue a fatal error (see the \f[B]EXIT STATUS\f[R] section) if it cannot write to \f[B]stderr\f[R], so if \f[B]stderr\f[R] is closed, as in -\f[B]dc 2>&-\f[R], it will quit with an error. +\f[B]dc 2>&\-\f[R], it will quit with an error. This is done so that dc(1) can exit with an error code when \f[B]stderr\f[R] is redirected to a file. .PP @@ -341,8 +341,8 @@ notation, and if \f[B]obase\f[R] is \f[B]1\f[R], values are output in engineering notation. Otherwise, values are output in the specified base. .PP -Outputting in scientific and engineering notations are \f[B]non-portable -extensions\f[R]. +Outputting in scientific and engineering notations are +\f[B]non\-portable extensions\f[R]. .PP The \f[I]scale\f[R] of an expression is the number of digits in the result of the expression right of the decimal point, and \f[B]scale\f[R] @@ -354,14 +354,14 @@ The max allowable value for \f[B]scale\f[R] can be queried in dc(1) programs with the \f[B]V\f[R] command. .PP \f[B]seed\f[R] is a register containing the current seed for the -pseudo-random number generator. +pseudo\-random number generator. If the current value of \f[B]seed\f[R] is queried and stored, then if it -is assigned to \f[B]seed\f[R] later, the pseudo-random number generator -is guaranteed to produce the same sequence of pseudo-random numbers that -were generated after the value of \f[B]seed\f[R] was first queried. +is assigned to \f[B]seed\f[R] later, the pseudo\-random number generator +is guaranteed to produce the same sequence of pseudo\-random numbers +that were generated after the value of \f[B]seed\f[R] was first queried. .PP Multiple values assigned to \f[B]seed\f[R] can produce the same sequence -of pseudo-random numbers. +of pseudo\-random numbers. Likewise, when a value is assigned to \f[B]seed\f[R], it is not guaranteed that querying \f[B]seed\f[R] immediately after will return the same value. @@ -371,22 +371,22 @@ get receive a value of \f[B]0\f[R] or \f[B]1\f[R]. The maximum integer returned by the \f[B]\[cq]\f[R] command can be queried with the \f[B]W\f[R] command. .PP -\f[B]Note\f[R]: The values returned by the pseudo-random number +\f[B]Note\f[R]: The values returned by the pseudo\-random number generator with the \f[B]\[cq]\f[R] and \f[B]\[lq]\f[R] commands are guaranteed to \f[B]NOT\f[R] be cryptographically secure. -This is a consequence of using a seeded pseudo-random number generator. +This is a consequence of using a seeded pseudo\-random number generator. However, they \f[I]are\f[R] guaranteed to be reproducible with identical \f[B]seed\f[R] values. -This means that the pseudo-random values from dc(1) should only be used -where a reproducible stream of pseudo-random numbers is +This means that the pseudo\-random values from dc(1) should only be used +where a reproducible stream of pseudo\-random numbers is \f[I]ESSENTIAL\f[R]. -In any other case, use a non-seeded pseudo-random number generator. +In any other case, use a non\-seeded pseudo\-random number generator. .PP -The pseudo-random number generator, \f[B]seed\f[R], and all associated -operations are \f[B]non-portable extensions\f[R]. +The pseudo\-random number generator, \f[B]seed\f[R], and all associated +operations are \f[B]non\-portable extensions\f[R]. .SS Comments Comments go from \f[B]#\f[R] until, and not including, the next newline. -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .SH NUMBERS Numbers are strings made up of digits, uppercase letters up to \f[B]F\f[R], and at most \f[B]1\f[R] period for a radix. @@ -397,12 +397,12 @@ alphabet (i.e., \f[B]A\f[R] equals \f[B]10\f[R], or \f[B]9+1\f[R]). If a digit or letter makes no sense with the current value of \f[B]ibase\f[R] (i.e., they are greater than or equal to the current value of \f[B]ibase\f[R]), then the behavior depends on the existence of -the \f[B]-c\f[R]/\f[B]--digit-clamp\f[R] or -\f[B]-C\f[R]/\f[B]--no-digit-clamp\f[R] options (see the +the \f[B]\-c\f[R]/\f[B]\-\-digit\-clamp\f[R] or +\f[B]\-C\f[R]/\f[B]\-\-no\-digit\-clamp\f[R] options (see the \f[B]OPTIONS\f[R] section), the existence and setting of the \f[B]DC_DIGIT_CLAMP\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), or the default, which can be queried with the -\f[B]-h\f[R]/\f[B]--help\f[R] option. +\f[B]\-h\f[R]/\f[B]\-\-help\f[R] option. .PP If clamping is off, then digits or letters that are greater than or equal to the current value of \f[B]ibase\f[R] are not changed. @@ -420,7 +420,7 @@ This means that, with an \f[B]ibase\f[R] of \f[B]3\f[R], the number \f[B]AB\f[R] is equal to \f[B]3\[ha]1*2+3\[ha]0*2\f[R], which is \f[B]3\f[R] times \f[B]2\f[R] plus \f[B]2\f[R], or \f[B]8\f[R]. .PP -There is one exception to clamping: single-character numbers (i.e., +There is one exception to clamping: single\-character numbers (i.e., \f[B]A\f[R] alone). Such numbers are never clamped and always take the value they would have in the highest possible \f[B]ibase\f[R]. @@ -451,7 +451,7 @@ number string \f[B]FFeA\f[R], the resulting decimal number will be \f[B]2550000000000\f[R], and if dc(1) is given the number string \f[B]10e_4\f[R], the resulting decimal number will be \f[B]0.0016\f[R]. .PP -Accepting input as scientific notation is a \f[B]non-portable +Accepting input as scientific notation is a \f[B]non\-portable extension\f[R]. .SH COMMANDS The valid commands are listed below. @@ -467,7 +467,7 @@ activated by assigning \f[B]1\f[R] to \f[B]obase\f[R] using To deactivate them, just assign a different value to \f[B]obase\f[R]. .PP Printing numbers in scientific notation and/or engineering notation is a -\f[B]non-portable extension\f[R]. +\f[B]non\-portable extension\f[R]. .TP \f[B]p\f[R] Prints the value on top of the stack, whether number or string, and @@ -487,12 +487,12 @@ Pops a value off the stack. .PP If the value is a number, it is truncated and the absolute value of the result is printed as though \f[B]obase\f[R] is \f[B]256\f[R] and each -digit is interpreted as an 8-bit ASCII character, making it a byte +digit is interpreted as an 8\-bit ASCII character, making it a byte stream. .PP If the value is a string, it is printed without a trailing newline. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]f\f[R] @@ -511,7 +511,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of both operands. .TP -\f[B]-\f[R] +\f[B]\-\f[R] The top two values are popped off the stack, subtracted, and the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to the max \f[I]scale\f[R] of @@ -532,7 +532,7 @@ pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]%\f[R] @@ -542,10 +542,10 @@ is pushed onto the stack. .PP Remaindering is equivalent to 1) Computing \f[B]a/b\f[R] to current \f[B]scale\f[R], and 2) Using the result of step 1 to calculate -\f[B]a-(a/b)*b\f[R] to \f[I]scale\f[R] +\f[B]a\-(a/b)*b\f[R] to \f[I]scale\f[R] \f[B]max(scale+scale(b),scale(a))\f[R]. .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .RE .TP \f[B]\[ti]\f[R] @@ -556,9 +556,9 @@ This is equivalent to \f[B]x y / x y %\f[R] except that \f[B]x\f[R] and \f[B]y\f[R] are only evaluated once. .RS .PP -The first value popped off of the stack must be non-zero. +The first value popped off of the stack must be non\-zero. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[ha]\f[R] @@ -569,7 +569,7 @@ The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .PP The first value popped off of the stack must be an integer, and if that value is negative, the second value popped off of the stack must be -non-zero. +non\-zero. .RE .TP \f[B]v\f[R] @@ -578,7 +578,7 @@ the result is pushed onto the stack. The \f[I]scale\f[R] of the result is equal to \f[B]scale\f[R]. .RS .PP -The value popped off of the stack must be non-negative. +The value popped off of the stack must be non\-negative. .RE .TP \f[B]_\f[R] @@ -588,7 +588,7 @@ or other commands), then that number is input as a negative number. .PP Otherwise, the top value on the stack is popped and copied, and the copy is negated and pushed onto the stack. -This behavior without a number is a \f[B]non-portable extension\f[R]. +This behavior without a number is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]b\f[R] @@ -597,7 +597,7 @@ back onto the stack. Otherwise, its absolute value is pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]|\f[R] @@ -606,12 +606,12 @@ is computed, and the result is pushed onto the stack. .RS .PP The first value popped is used as the reduction modulus and must be an -integer and non-zero. +integer and non\-zero. The second value popped is used as the exponent and must be an integer -and non-negative. +and non\-negative. The third value popped is the base and must be an integer. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]$\f[R] @@ -619,7 +619,7 @@ The top value is popped off the stack and copied, and the copy is truncated and pushed onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[at]\f[R] @@ -629,9 +629,9 @@ extension. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]H\f[R] @@ -640,9 +640,9 @@ left (radix shifted right) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]h\f[R] @@ -651,9 +651,9 @@ right (radix shifted left) to the value of the first. .RS .PP The first value popped off of the stack must be an integer and -non-negative. +non\-negative. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]G\f[R] @@ -661,7 +661,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]1\f[R] is pushed if they are equal, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]N\f[R] @@ -669,7 +669,7 @@ The top value is popped off of the stack, and if it a \f[B]0\f[R], a \f[B]1\f[R] is pushed; otherwise, a \f[B]0\f[R] is pushed. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B](\f[R] @@ -678,7 +678,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]{\f[R] @@ -687,7 +687,7 @@ The top two values are popped off of the stack, they are compared, and a or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B])\f[R] @@ -696,7 +696,7 @@ The top two values are popped off of the stack, they are compared, and a \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]}\f[R] @@ -705,41 +705,41 @@ The top two values are popped off of the stack, they are compared, and a second, or \f[B]0\f[R] otherwise. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]M\f[R] The top two values are popped off of the stack. -If they are both non-zero, a \f[B]1\f[R] is pushed onto the stack. +If they are both non\-zero, a \f[B]1\f[R] is pushed onto the stack. If either of them is zero, or both of them are, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]&&\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]m\f[R] The top two values are popped off of the stack. -If at least one of them is non-zero, a \f[B]1\f[R] is pushed onto the +If at least one of them is non\-zero, a \f[B]1\f[R] is pushed onto the stack. If both of them are zero, then a \f[B]0\f[R] is pushed onto the stack. .RS .PP This is like the \f[B]||\f[R] operator in bc(1), and it is \f[I]not\f[R] -a short-circuit operator. +a short\-circuit operator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE -.SS Pseudo-Random Number Generator -dc(1) has a built-in pseudo-random number generator. -These commands query the pseudo-random number generator. +.SS Pseudo\-Random Number Generator +dc(1) has a built\-in pseudo\-random number generator. +These commands query the pseudo\-random number generator. (See Parameters for more information about the \f[B]seed\f[R] value that -controls the pseudo-random number generator.) +controls the pseudo\-random number generator.) .PP -The pseudo-random number generator is guaranteed to \f[B]NOT\f[R] be +The pseudo\-random number generator is guaranteed to \f[B]NOT\f[R] be cryptographically secure. .TP \f[B]\[cq]\f[R] @@ -748,19 +748,19 @@ the \f[B]LIMITS\f[R] section). .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]\[lq]\f[R] Pops a value off of the stack, which is used as an \f[B]exclusive\f[R] upper bound on the integer that will be generated. -If the bound is negative or is a non-integer, an error is raised, and +If the bound is negative or is a non\-integer, an error is raised, and dc(1) resets (see the \f[B]RESET\f[R] section) while \f[B]seed\f[R] remains unchanged. If the bound is larger than \f[B]DC_RAND_MAX\f[R], the higher bound is -honored by generating several pseudo-random integers, multiplying them +honored by generating several pseudo\-random integers, multiplying them by appropriate powers of \f[B]DC_RAND_MAX+1\f[R], and adding them together. Thus, the size of integer that can be generated with this command is @@ -772,9 +772,9 @@ is \f[I]not\f[R] changed. .RS .PP The generated integer is made as unbiased as possible, subject to the -limitations of the pseudo-random number generator. +limitations of the pseudo\-random number generator. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Stack Control These commands control the stack. @@ -840,7 +840,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the .TP \f[B]k\f[R] Pops the value off of the top of the stack and uses it to set -\f[B]scale\f[R], which must be non-negative. +\f[B]scale\f[R], which must be non\-negative. .RS .PP If the value on top of the stack has any \f[I]scale\f[R], the @@ -850,7 +850,7 @@ If the value on top of the stack has any \f[I]scale\f[R], the \f[B]j\f[R] Pops the value off of the top of the stack and uses it to set \f[B]seed\f[R]. -The meaning of \f[B]seed\f[R] is dependent on the current pseudo-random +The meaning of \f[B]seed\f[R] is dependent on the current pseudo\-random number generator but is guaranteed to not change except for new major versions. .RS @@ -858,22 +858,22 @@ versions. The \f[I]scale\f[R] and sign of the value may be significant. .PP If a previously used \f[B]seed\f[R] value is used again, the -pseudo-random number generator is guaranteed to produce the same -sequence of pseudo-random numbers as it did when the \f[B]seed\f[R] +pseudo\-random number generator is guaranteed to produce the same +sequence of pseudo\-random numbers as it did when the \f[B]seed\f[R] value was previously used. .PP The exact value assigned to \f[B]seed\f[R] is not guaranteed to be returned if the \f[B]J\f[R] command is used. However, if \f[B]seed\f[R] \f[I]does\f[R] return a different value, both values, when assigned to \f[B]seed\f[R], are guaranteed to produce the -same sequence of pseudo-random numbers. +same sequence of pseudo\-random numbers. This means that certain values assigned to \f[B]seed\f[R] will not -produce unique sequences of pseudo-random numbers. +produce unique sequences of pseudo\-random numbers. .PP There is no limit to the length (number of significant decimal digits) or \f[I]scale\f[R] of the value that can be assigned to \f[B]seed\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]I\f[R] @@ -889,7 +889,7 @@ Pushes the current value of \f[B]scale\f[R] onto the main stack. Pushes the current value of \f[B]seed\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]T\f[R] @@ -897,7 +897,7 @@ Pushes the maximum allowable value of \f[B]ibase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]U\f[R] @@ -905,7 +905,7 @@ Pushes the maximum allowable value of \f[B]obase\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]V\f[R] @@ -913,15 +913,15 @@ Pushes the maximum allowable value of \f[B]scale\f[R] onto the main stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]W\f[R] Pushes the maximum (inclusive) integer that can be generated with the -\f[B]\[cq]\f[R] pseudo-random number generator command. +\f[B]\[cq]\f[R] pseudo\-random number generator command. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Strings The following commands control strings. @@ -961,16 +961,16 @@ The value on top of the stack is popped. If it is a number, it is truncated and its absolute value is taken. The result mod \f[B]256\f[R] is calculated. If that result is \f[B]0\f[R], push an empty string; otherwise, push a -one-character string where the character is the result of the mod +one\-character string where the character is the result of the mod interpreted as an ASCII character. .PP If it is a string, then a new string is made. If the original string is empty, the new string is empty. If it is not, then the first character of the original string is used to -create the new string as a one-character string. +create the new string as a one\-character string. The new string is then pushed onto the stack. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]x\f[R] @@ -1006,7 +1006,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!>\f[R]\f[I]r\f[R] @@ -1027,7 +1027,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]<\f[R]\f[I]r\f[R] @@ -1048,7 +1048,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!<\f[R]\f[I]r\f[R] @@ -1069,7 +1069,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]=\f[R]\f[I]r\f[R] @@ -1090,7 +1090,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]!=\f[R]\f[I]r\f[R] @@ -1111,7 +1111,7 @@ fails. If either or both of the values are not numbers, dc(1) will raise an error and reset (see the \f[B]RESET\f[R] section). .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]?\f[R] @@ -1124,7 +1124,7 @@ the execution of the macro that executed it. If there are no macros, or only one macro executing, dc(1) exits. .TP \f[B]Q\f[R] -Pops a value from the stack which must be non-negative and is used the +Pops a value from the stack which must be non\-negative and is used the number of macro executions to pop off of the execution stack. If the number of levels to pop is greater than the number of executing macros, dc(1) exits. @@ -1137,7 +1137,7 @@ to make dc(1) exit with the \f[B]Q\f[R] command, so the sequence \f[B],Q\f[R] will make dc(1) exit. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Status These commands query status of the stack or its top value. @@ -1170,7 +1170,7 @@ If the value is a number, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a string), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]t\f[R] @@ -1179,7 +1179,7 @@ If the value is a string, this pushes \f[B]1\f[R] onto the stack. Otherwise (if it is a number), it pushes \f[B]0\f[R]. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .TP \f[B]z\f[R] @@ -1197,7 +1197,7 @@ register\[cq]s stack must always have at least one item; dc(1) will give an error and reset otherwise (see the \f[B]RESET\f[R] section). This means that this command will never push \f[B]0\f[R]. .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Arrays These commands manipulate arrays. @@ -1216,7 +1216,7 @@ The selected value is then pushed onto the stack. Pushes the length of the array \f[I]r\f[R] onto the stack. .RS .PP -This is a \f[B]non-portable extension\f[R]. +This is a \f[B]non\-portable extension\f[R]. .RE .SS Global Settings These commands retrieve global settings. @@ -1238,8 +1238,8 @@ See the \f[I]Extended Register Mode\f[R] subsection of the .TP \f[B]gz\f[R] Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not -been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options -(see the \f[B]OPTIONS\f[R] section), non-zero otherwise. +been enabled with the \f[B]\-z\f[R] or \f[B]\-\-leading\-zeroes\f[R] +options (see the \f[B]OPTIONS\f[R] section), non\-zero otherwise. .SH REGISTERS Registers are names that can store strings, numbers, and arrays. (Number/string registers do not interfere with array registers.) @@ -1250,7 +1250,7 @@ All registers, when first referenced, have one value (\f[B]0\f[R]) in their stack, and it is a runtime error to attempt to pop that item off of the register stack. .PP -In non-extended register mode, a register name is just the single +In non\-extended register mode, a register name is just the single character that follows any command that needs a register name. The only exceptions are: a newline (\f[B]`\[rs]n'\f[R]) and a left bracket (\f[B]`['\f[R]); it is a parse error for a newline or a left @@ -1259,18 +1259,18 @@ bracket to be used as a register name. Unlike most other dc(1) implentations, this dc(1) provides nearly unlimited amounts of registers, if extended register mode is enabled. .PP -If extended register mode is enabled (\f[B]-x\f[R] or -\f[B]--extended-register\f[R] command-line arguments are given), then -normal single character registers are used \f[I]unless\f[R] the +If extended register mode is enabled (\f[B]\-x\f[R] or +\f[B]\-\-extended\-register\f[R] command\-line arguments are given), +then normal single character registers are used \f[I]unless\f[R] the character immediately following a command that needs a register name is a space (according to \f[B]isspace()\f[R]) and not a newline (\f[B]`\[rs]n'\f[R]). .PP In that case, the register name is found according to the regex -\f[B][a-z][a-z0-9_]*\f[R] (like bc(1) identifiers), and it is a parse -error if the next non-space characters do not match that regex. +\f[B][a\-z][a\-z0\-9_]*\f[R] (like bc(1) identifiers), and it is a parse +error if the next non\-space characters do not match that regex. .SH RESET -When dc(1) encounters an error or a signal that it has a non-default +When dc(1) encounters an error or a signal that it has a non\-default handler for, it resets. This means that several things happen. .PP @@ -1334,29 +1334,29 @@ Set at \f[B]DC_BASE_POW\f[R]. .TP \f[B]DC_DIM_MAX\f[R] The maximum size of arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .TP \f[B]DC_SCALE_MAX\f[R] The maximum \f[B]scale\f[R]. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_STRING_MAX\f[R] The maximum length of strings. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NAME_MAX\f[R] The maximum length of identifiers. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_NUM_MAX\f[R] The maximum length of a number (in decimal digits), which includes digits after the decimal point. -Set at \f[B]DC_OVERFLOW_MAX-1\f[R]. +Set at \f[B]DC_OVERFLOW_MAX\-1\f[R]. .TP \f[B]DC_RAND_MAX\f[R] The maximum integer (inclusive) returned by the \f[B]\[cq]\f[R] command, if dc(1). -Set at \f[B]2\[ha]DC_LONG_BIT-1\f[R]. +Set at \f[B]2\[ha]DC_LONG_BIT\-1\f[R]. .TP Exponent The maximum allowable exponent (positive or negative). @@ -1364,27 +1364,27 @@ Set at \f[B]DC_OVERFLOW_MAX\f[R]. .TP Number of vars The maximum number of vars/arrays. -Set at \f[B]SIZE_MAX-1\f[R]. +Set at \f[B]SIZE_MAX\-1\f[R]. .PP -These limits are meant to be effectively non-existent; the limits are so -large (at least on 64-bit machines) that there should not be any point -at which they become a problem. +These limits are meant to be effectively non\-existent; the limits are +so large (at least on 64\-bit machines) that there should not be any +point at which they become a problem. In fact, memory should be exhausted before these limits should be hit. .SH ENVIRONMENT VARIABLES -As \f[B]non-portable extensions\f[R], dc(1) recognizes the following +As \f[B]non\-portable extensions\f[R], dc(1) recognizes the following environment variables: .TP \f[B]DC_ENV_ARGS\f[R] -This is another way to give command-line arguments to dc(1). -They should be in the same format as all other command-line arguments. +This is another way to give command\-line arguments to dc(1). +They should be in the same format as all other command\-line arguments. These are always processed first, so any files given in \f[B]DC_ENV_ARGS\f[R] will be processed before arguments and files given -on the command-line. +on the command\-line. This gives the user the ability to set up \[lq]standard\[rq] options and files to be used at every invocation. The most useful thing for such files to contain would be useful functions that the user might want every time dc(1) runs. -Another use would be to use the \f[B]-e\f[R] option to set +Another use would be to use the \f[B]\-e\f[R] option to set \f[B]scale\f[R] to a value other than \f[B]0\f[R]. .RS .PP @@ -1402,14 +1402,14 @@ you can use double quotes as the outside quotes, as in \f[B]\[lq]some quotes. However, handling a file with both kinds of quotes in \f[B]DC_ENV_ARGS\f[R] is not supported due to the complexity of the -parsing, though such files are still supported on the command-line where -the parsing is done by the shell. +parsing, though such files are still supported on the command\-line +where the parsing is done by the shell. .RE .TP \f[B]DC_LINE_LENGTH\f[R] If this environment variable exists and contains an integer that is greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R] -(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length, +(\f[B]2\[ha]16\-1\f[R]), dc(1) will output lines to that length, including the backslash newline combo. The default line length is \f[B]70\f[R]. .RS @@ -1426,13 +1426,13 @@ exits on \f[B]SIGINT\f[R] when not in interactive mode. .RS .PP However, when dc(1) is in interactive mode, then if this environment -variable exists and contains an integer, a non-zero value makes dc(1) +variable exists and contains an integer, a non\-zero value makes dc(1) reset on \f[B]SIGINT\f[R], rather than exit, and zero makes dc(1) exit. If this environment variable exists and is \f[I]not\f[R] an integer, then dc(1) will exit on \f[B]SIGINT\f[R]. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_TTY_MODE\f[R] @@ -1441,11 +1441,11 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, then a non-zero value makes dc(1) use +exists and contains an integer, then a non\-zero value makes dc(1) use TTY mode, and zero makes dc(1) not use TTY mode. .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_PROMPT\f[R] @@ -1454,43 +1454,44 @@ section), then this environment variable has no effect. .RS .PP However, when TTY mode is available, then if this environment variable -exists and contains an integer, a non-zero value makes dc(1) use a -prompt, and zero or a non-integer makes dc(1) not use a prompt. +exists and contains an integer, a non\-zero value makes dc(1) use a +prompt, and zero or a non\-integer makes dc(1) not use a prompt. If this environment variable does not exist and \f[B]DC_TTY_MODE\f[R] does, then the value of the \f[B]DC_TTY_MODE\f[R] environment variable is used. .PP This environment variable and the \f[B]DC_TTY_MODE\f[R] environment variable override the default, which can be queried with the -\f[B]-h\f[R] or \f[B]--help\f[R] options. +\f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_EXPR_EXIT\f[R] -If any expressions or expression files are given on the command-line -with \f[B]-e\f[R], \f[B]--expression\f[R], \f[B]-f\f[R], or -\f[B]--file\f[R], then if this environment variable exists and contains -an integer, a non-zero value makes dc(1) exit after executing the -expressions and expression files, and a zero value makes dc(1) not exit. +If any expressions or expression files are given on the command\-line +with \f[B]\-e\f[R], \f[B]\-\-expression\f[R], \f[B]\-f\f[R], or +\f[B]\-\-file\f[R], then if this environment variable exists and +contains an integer, a non\-zero value makes dc(1) exit after executing +the expressions and expression files, and a zero value makes dc(1) not +exit. .RS .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .TP \f[B]DC_DIGIT_CLAMP\f[R] When parsing numbers and if this environment variable exists and -contains an integer, a non-zero value makes dc(1) clamp digits that are +contains an integer, a non\-zero value makes dc(1) clamp digits that are greater than or equal to the current \f[B]ibase\f[R] so that all such digits are considered equal to the \f[B]ibase\f[R] minus 1, and a zero value disables such clamping so that those digits are always equal to their value, which is multiplied by the power of the \f[B]ibase\f[R]. .RS .PP -This never applies to single-digit numbers, as per the bc(1) standard +This never applies to single\-digit numbers, as per the bc(1) standard (see the \f[B]STANDARDS\f[R] section). .PP This environment variable overrides the default, which can be queried -with the \f[B]-h\f[R] or \f[B]--help\f[R] options. +with the \f[B]\-h\f[R] or \f[B]\-\-help\f[R] options. .RE .SH EXIT STATUS dc(1) returns the following exit statuses: @@ -1506,10 +1507,10 @@ since math errors will happen in the process of normal execution. .PP Math errors include divide by \f[B]0\f[R], taking the square root of a negative number, using a negative number as a bound for the -pseudo-random number generator, attempting to convert a negative number +pseudo\-random number generator, attempting to convert a negative number to a hardware integer, overflow when converting a number to a hardware integer, overflow when calculating the size of a number, and attempting -to use a non-integer where an integer is required. +to use a non\-integer where an integer is required. .PP Converting to a hardware integer happens for the second operand of the power (\f[B]\[ha]\f[R]), places (\f[B]\[at]\f[R]), left shift @@ -1544,7 +1545,7 @@ A fatal error occurred. Fatal errors include memory allocation errors, I/O errors, failing to open files, attempting to use files that do not have only ASCII characters (dc(1) only accepts ASCII characters), attempting to open a -directory as a file, and giving invalid command-line options. +directory as a file, and giving invalid command\-line options. .RE .PP The exit status \f[B]4\f[R] is special; when a fatal error occurs, dc(1) @@ -1555,16 +1556,17 @@ interactive mode (see the \f[B]INTERACTIVE MODE\f[R] section), since dc(1) resets its state (see the \f[B]RESET\f[R] section) and accepts more input when one of those errors occurs in interactive mode. This is also the case when interactive mode is forced by the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .PP These exit statuses allow dc(1) to be used in shell scripting with error checking, and its normal behavior can be forced by using the -\f[B]-i\f[R] flag or \f[B]--interactive\f[R] option. +\f[B]\-i\f[R] flag or \f[B]\-\-interactive\f[R] option. .SH INTERACTIVE MODE -Like bc(1), dc(1) has an interactive mode and a non-interactive mode. +Like bc(1), dc(1) has an interactive mode and a non\-interactive mode. Interactive mode is turned on automatically when both \f[B]stdin\f[R] -and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]-i\f[R] flag -and \f[B]--interactive\f[R] option can turn it on in other situations. +and \f[B]stdout\f[R] are hooked to a terminal, but the \f[B]\-i\f[R] +flag and \f[B]\-\-interactive\f[R] option can turn it on in other +situations. .PP In interactive mode, dc(1) attempts to recover from errors (see the \f[B]RESET\f[R] section), and in normal execution, flushes @@ -1580,23 +1582,23 @@ settings. .PP If there is the environment variable \f[B]DC_TTY_MODE\f[R] in the environment (see the \f[B]ENVIRONMENT VARIABLES\f[R] section), then if -that environment variable contains a non-zero integer, dc(1) will turn +that environment variable contains a non\-zero integer, dc(1) will turn on TTY mode when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. If the \f[B]DC_TTY_MODE\f[R] environment variable exists but is -\f[I]not\f[R] a non-zero integer, then dc(1) will not turn TTY mode on. +\f[I]not\f[R] a non\-zero integer, then dc(1) will not turn TTY mode on. .PP If the environment variable \f[B]DC_TTY_MODE\f[R] does \f[I]not\f[R] exist, the default setting is used. -The default setting can be queried with the \f[B]-h\f[R] or -\f[B]--help\f[R] options. +The default setting can be queried with the \f[B]\-h\f[R] or +\f[B]\-\-help\f[R] options. .PP TTY mode is different from interactive mode because interactive mode is required in the bc(1) specification (see the \f[B]STANDARDS\f[R] section), and interactive mode requires only \f[B]stdin\f[R] and \f[B]stdout\f[R] to be connected to a terminal. -.SS Command-Line History -Command-line history is only enabled if TTY mode is, i.e., that +.SS Command\-Line History +Command\-line history is only enabled if TTY mode is, i.e., that \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the \f[B]DC_TTY_MODE\f[R] environment variable (see the \f[B]ENVIRONMENT VARIABLES\f[R] section) and its default do not disable @@ -1608,18 +1610,18 @@ Like TTY mode itself, it can be turned on or off with an environment variable: \f[B]DC_PROMPT\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R] section). .PP -If the environment variable \f[B]DC_PROMPT\f[R] exists and is a non-zero -integer, then the prompt is turned on when \f[B]stdin\f[R], +If the environment variable \f[B]DC_PROMPT\f[R] exists and is a +non\-zero integer, then the prompt is turned on when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are connected to a TTY and the -\f[B]-P\f[R] and \f[B]--no-prompt\f[R] options were not used. +\f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options were not used. The read prompt will be turned on under the same conditions, except that -the \f[B]-R\f[R] and \f[B]--no-read-prompt\f[R] options must also not be -used. +the \f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options must also +not be used. .PP However, if \f[B]DC_PROMPT\f[R] does not exist, the prompt can be enabled or disabled with the \f[B]DC_TTY_MODE\f[R] environment variable, -the \f[B]-P\f[R] and \f[B]--no-prompt\f[R] options, and the \f[B]-R\f[R] -and \f[B]--no-read-prompt\f[R] options. +the \f[B]\-P\f[R] and \f[B]\-\-no\-prompt\f[R] options, and the +\f[B]\-R\f[R] and \f[B]\-\-no\-read\-prompt\f[R] options. See the \f[B]ENVIRONMENT VARIABLES\f[R] and \f[B]OPTIONS\f[R] sections for more details. .SH SIGNAL HANDLING @@ -1631,7 +1633,7 @@ section), or the \f[B]DC_SIGINT_RESET\f[R] environment variable (see the an integer or it is zero, dc(1) will exit. .PP However, if dc(1) is in interactive mode, and the -\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non-zero, +\f[B]DC_SIGINT_RESET\f[R] or its default is an integer and non\-zero, then dc(1) will stop executing the current input and reset (see the \f[B]RESET\f[R] section) upon receiving a \f[B]SIGINT\f[R]. .PP @@ -1657,11 +1659,11 @@ The one exception is \f[B]SIGHUP\f[R]; in that case, and only when dc(1) is in TTY mode (see the \f[B]TTY MODE\f[R] section), a \f[B]SIGHUP\f[R] will cause dc(1) to clean up and exit. .SH COMMAND LINE HISTORY -dc(1) supports interactive command-line editing. +dc(1) supports interactive command\-line editing. .PP If dc(1) can be in TTY mode (see the \f[B]TTY MODE\f[R] section), history can be enabled. -This means that command-line history can only be enabled when +This means that command\-line history can only be enabled when \f[B]stdin\f[R], \f[B]stdout\f[R], and \f[B]stderr\f[R] are all connected to a TTY. .PP @@ -1674,7 +1676,7 @@ section). bc(1) .SH STANDARDS The dc(1) utility operators and some behavior are compliant with the -operators in the IEEE Std 1003.1-2017 (\[lq]POSIX.1-2017\[rq]) bc(1) +operators in the IEEE Std 1003.1\-2017 (\[lq]POSIX.1\-2017\[rq]) bc(1) specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS diff --git a/manuals/dc/N.1.md b/manuals/dc/N.1.md index 8795d947eec..81933e2160b 100644 --- a/manuals/dc/N.1.md +++ b/manuals/dc/N.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2023 Gavin D. Howard and contributors. +Copyright (c) 2018-2024 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/scripts/exec-install.sh b/scripts/exec-install.sh index 8180b29c999..581b6bd1ed2 100755 --- a/scripts/exec-install.sh +++ b/scripts/exec-install.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/format.sh b/scripts/format.sh index dd227555b0f..f76aed37818 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/functions.sh b/scripts/functions.sh index 8ae765859e5..1599fea4847 100755 --- a/scripts/functions.sh +++ b/scripts/functions.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/karatsuba.py b/scripts/karatsuba.py index 9c94ffe448f..637887986ee 100755 --- a/scripts/karatsuba.py +++ b/scripts/karatsuba.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/link.sh b/scripts/link.sh index 7d95f866e17..772de27a08c 100755 --- a/scripts/link.sh +++ b/scripts/link.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/lint.sh b/scripts/lint.sh index 5a217204f8f..14cdc5c3afc 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/locale_install.sh b/scripts/locale_install.sh index 3816f54ef49..e891bf57db8 100755 --- a/scripts/locale_install.sh +++ b/scripts/locale_install.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/locale_uninstall.sh b/scripts/locale_uninstall.sh index dfa3899db26..1bf292b801e 100755 --- a/scripts/locale_uninstall.sh +++ b/scripts/locale_uninstall.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/sqrt_frac_guess.bc b/scripts/sqrt_frac_guess.bc index 5938cfcc7cb..acbcb368d2d 100644 --- a/scripts/sqrt_frac_guess.bc +++ b/scripts/sqrt_frac_guess.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/sqrt_int_guess.bc b/scripts/sqrt_int_guess.bc index 551a06eb2e6..925b7af7e10 100644 --- a/scripts/sqrt_int_guess.bc +++ b/scripts/sqrt_int_guess.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/sqrt_random.bc b/scripts/sqrt_random.bc index ff08348f497..1f58c2e30c5 100644 --- a/scripts/sqrt_random.bc +++ b/scripts/sqrt_random.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/sqrt_random.sh b/scripts/sqrt_random.sh index 694c7200319..e107ef532f6 100755 --- a/scripts/sqrt_random.sh +++ b/scripts/sqrt_random.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/src/args.c b/src/args.c index 9cb8165f883..635c7227d3d 100644 --- a/src/args.c +++ b/src/args.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/bc.c b/src/bc.c index 385c18b7701..c5a67f35e10 100644 --- a/src/bc.c +++ b/src/bc.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -45,7 +45,7 @@ * @param argc The number of arguments. * @param argv The arguments. */ -void +BcStatus bc_main(int argc, char* argv[]) { // All of these just set bc-specific items in BcVm. @@ -59,6 +59,6 @@ bc_main(int argc, char* argv[]) vm->parse = bc_parse_parse; vm->expr = bc_parse_expr; - bc_vm_boot(argc, argv); + return bc_vm_boot(argc, argv); } #endif // BC_ENABLED diff --git a/src/bc_lex.c b/src/bc_lex.c index 5c9d2c536ea..106bb3ee03c 100644 --- a/src/bc_lex.c +++ b/src/bc_lex.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/bc_parse.c b/src/bc_parse.c index 4cf886ef5a9..6842885933d 100644 --- a/src/bc_parse.c +++ b/src/bc_parse.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/data.c b/src/data.c index b57e1fc4c02..00eda2cc4a5 100644 --- a/src/data.c +++ b/src/data.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -70,7 +70,7 @@ const uchar dc_sig_msg_len = (uchar) (sizeof(dc_sig_msg) - 1); /// The copyright banner. const char bc_copyright[] = - "Copyright (c) 2018-2023 Gavin D. Howard and contributors\n" + "Copyright (c) 2018-2024 Gavin D. Howard and contributors\n" "Report bugs at: https://git.gavinhoward.com/gavin/bc\n\n" "This is free software with ABSOLUTELY NO WARRANTY.\n"; diff --git a/src/dc.c b/src/dc.c index 255bf2e6dcc..992efe262fd 100644 --- a/src/dc.c +++ b/src/dc.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -45,7 +45,7 @@ * @param argc The number of arguments. * @param argv The arguments. */ -void +BcStatus dc_main(int argc, char* argv[]) { // All of these just set dc-specific items in BcVm. @@ -59,6 +59,6 @@ dc_main(int argc, char* argv[]) vm->parse = dc_parse_parse; vm->expr = dc_parse_expr; - bc_vm_boot(argc, argv); + return bc_vm_boot(argc, argv); } #endif // DC_ENABLED diff --git a/src/dc_lex.c b/src/dc_lex.c index 963e3f1331c..a58ca8f79cf 100644 --- a/src/dc_lex.c +++ b/src/dc_lex.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/dc_parse.c b/src/dc_parse.c index 2a6f387ac67..1996120461a 100644 --- a/src/dc_parse.c +++ b/src/dc_parse.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/file.c b/src/file.c index c038c4472f3..9baea585603 100644 --- a/src/file.c +++ b/src/file.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -200,8 +200,13 @@ bc_file_flush(BcFile* restrict f, BcFlushType type) BC_SIG_TRYUNLOCK(lock); BC_JMP; } + // Make sure to handle non-fatal I/O properly. + else if (!f->errors_fatal) + { + bc_vm_fatalError(BC_ERR_FATAL_IO_ERR); + } // Blow up on fatal error. Okay, not blow up, just quit. - else bc_vm_fatalError(BC_ERR_FATAL_IO_ERR); + else exit(BC_STATUS_ERROR_FATAL); } BC_SIG_TRYUNLOCK(lock); @@ -238,8 +243,13 @@ bc_file_write(BcFile* restrict f, BcFlushType type, const char* buf, size_t n) BC_SIG_TRYUNLOCK(lock); BC_JMP; } + // Make sure to handle non-fatal I/O properly. + else if (!f->errors_fatal) + { + bc_vm_fatalError(BC_ERR_FATAL_IO_ERR); + } // Blow up on fatal error. Okay, not blow up, just quit. - else bc_vm_fatalError(BC_ERR_FATAL_IO_ERR); + else exit(BC_STATUS_ERROR_FATAL); } } else @@ -291,7 +301,15 @@ bc_file_vprintf(BcFile* restrict f, const char* fmt, va_list args) // Just print and propagate the error. if (BC_ERR(r < 0)) { - bc_vm_fatalError(BC_ERR_FATAL_IO_ERR); + // Make sure to handle non-fatal I/O properly. + if (!f->errors_fatal) + { + bc_vm_fatalError(BC_ERR_FATAL_IO_ERR); + } + else + { + exit(BC_STATUS_ERROR_FATAL); + } } } @@ -418,7 +436,7 @@ bc_file_putchar(BcFile* restrict f, BcFlushType type, uchar c) // This is here to prevent a stack overflow from unbounded recursion. if (f->f == stderr) exit(BC_STATUS_ERROR_FATAL); - bc_vm_fatalError(BC_ERR_FATAL_IO_ERR); + bc_err(BC_ERR_FATAL_IO_ERR); } #else // BC_ENABLE_LINE_LIB @@ -438,16 +456,17 @@ bc_file_putchar(BcFile* restrict f, BcFlushType type, uchar c) #if BC_ENABLE_LINE_LIB void -bc_file_init(BcFile* f, FILE* file) +bc_file_init(BcFile* f, FILE* file, bool errors_fatal) { BC_SIG_ASSERT_LOCKED; f->f = file; + f->errors_fatal = errors_fatal; } #else // BC_ENABLE_LINE_LIB void -bc_file_init(BcFile* f, int fd, char* buf, size_t cap) +bc_file_init(BcFile* f, int fd, char* buf, size_t cap, bool errors_fatal) { BC_SIG_ASSERT_LOCKED; @@ -455,6 +474,7 @@ bc_file_init(BcFile* f, int fd, char* buf, size_t cap) f->buf = buf; f->len = 0; f->cap = cap; + f->errors_fatal = errors_fatal; } #endif // BC_ENABLE_LINE_LIB diff --git a/src/history.c b/src/history.c index 924b62b41c2..71afe62db87 100644 --- a/src/history.c +++ b/src/history.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/lang.c b/src/lang.c index b1c7d4808ec..bb147fc60d0 100644 --- a/src/lang.c +++ b/src/lang.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/lex.c b/src/lex.c index 7dc1fb03bd3..d01e327e293 100644 --- a/src/lex.c +++ b/src/lex.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/library.c b/src/library.c index cc32a3a3a98..5451e91684a 100644 --- a/src/library.c +++ b/src/library.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/main.c b/src/main.c index 7809925dcf7..a6d50614af5 100644 --- a/src/main.c +++ b/src/main.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -56,6 +56,7 @@ int main(int argc, char* argv[]) { + BcStatus s; char* name; size_t len = strlen(BC_EXECPREFIX); @@ -100,18 +101,19 @@ main(int argc, char* argv[]) BC_SETJMP_LOCKED(vm, exit); #if !DC_ENABLED - bc_main(argc, argv); + s = bc_main(argc, argv); #elif !BC_ENABLED - dc_main(argc, argv); + s = dc_main(argc, argv); #else // BC_IS_BC uses vm->name, which was set above. So we're good. - if (BC_IS_BC) bc_main(argc, argv); - else dc_main(argc, argv); + if (BC_IS_BC) s = bc_main(argc, argv); + else s = dc_main(argc, argv); #endif + vm->status = (int) s; + exit: BC_SIG_MAYLOCK; - // Ensure we exit appropriately. - return bc_vm_atexit((int) vm->status); + return vm->status == BC_STATUS_QUIT ? BC_STATUS_SUCCESS : vm->status; } diff --git a/src/num.c b/src/num.c index ac0f828008f..5420183c1e1 100644 --- a/src/num.c +++ b/src/num.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -214,6 +214,26 @@ bc_num_zeroDigits(const BcDig* n) return BC_BASE_DIGS - bc_num_log10((size_t) *n); } +/** + * Returns the power of 10 that the least significant limb should be multiplied + * by to put its digits in the right place. For example, if the scale only + * reaches 8 places into the limb, this will return 1 (because it should be + * multiplied by 10^1) to put the number in the correct place. + * @param scale The scale. + * @return The power of 10 that the least significant limb should be + * multiplied by + */ +static inline size_t +bc_num_leastSigPow(size_t scale) +{ + size_t digs; + + digs = scale % BC_BASE_DIGS; + digs = digs != 0 ? BC_BASE_DIGS - digs : 0; + + return bc_num_pow10[digs]; +} + /** * Return the total number of integer digits in a number. This is the opposite * of scale, like bc_num_int() is the opposite of rdx. @@ -254,6 +274,33 @@ bc_num_nonZeroLen(const BcNum* restrict n) return i + 1; } +/** + * Returns the power of 10 that a number with an absolute value less than 1 + * needs to be multiplied by in order to be greater than 1 or less than -1. + * @param n The number. + * @return The power of 10 that a number greater than 1 and less than -1 must + * be multiplied by to be greater than 1 or less than -1. + */ +static size_t +bc_num_negPow10(const BcNum* restrict n) +{ + // Figure out how many limbs after the decimal point is zero. + size_t i, places, idx = bc_num_nonZeroLen(n) - 1; + + places = 1; + + // Figure out how much in the last limb is zero. + for (i = BC_BASE_DIGS - 1; i < BC_BASE_DIGS; --i) + { + if (bc_num_pow10[i] > (BcBigDig) n->num[idx]) places += 1; + else break; + } + + // Calculate the combination of zero limbs and zero digits in the last + // limb. + return places + (BC_NUM_RDX_VAL(n) - (idx + 1)) * BC_BASE_DIGS; +} + /** * Performs a one-limb add with a carry. * @param a The first limb. @@ -547,10 +594,8 @@ bc_num_truncate(BcNum* restrict n, size_t places) size_t pow; // This calculates how many decimal digits are in the least significant - // limb. - pow = n->scale % BC_BASE_DIGS; - pow = pow ? BC_BASE_DIGS - pow : 0; - pow = bc_num_pow10[pow]; + // limb, then gets the power for that. + pow = bc_num_leastSigPow(n->scale); n->len -= places_rdx; @@ -1911,6 +1956,9 @@ bc_num_d(BcNum* a, BcNum* b, BcNum* restrict c, size_t scale) // actual algorithm easier to understand because it can assume a lot of // things. Thus, you should view all of this setup code as establishing // assumptions for bc_num_d_long(), where the actual division happens. + // + // But in short, this setup makes it so bc_num_d_long() can pretend the + // numbers are integers. if (cpardx == cpa.len) cpa.len = bc_num_nonZeroLen(&cpa); if (BC_NUM_RDX_VAL_NP(cpb) == cpb.len) cpb.len = bc_num_nonZeroLen(&cpb); cpb.scale = 0; @@ -2860,21 +2908,11 @@ bc_num_printExponent(const BcNum* restrict n, bool eng, bool newline) // number is all fractional or not, obviously. if (neg) { - // Figure out how many limbs after the decimal point is zero. - size_t i, idx = bc_num_nonZeroLen(n) - 1; + // Figure out the negative power of 10. + places = bc_num_negPow10(n); - places = 1; - - // Figure out how much in the last limb is zero. - for (i = BC_BASE_DIGS - 1; i < BC_BASE_DIGS; --i) - { - if (bc_num_pow10[i] > (BcBigDig) n->num[idx]) places += 1; - else break; - } - - // Calculate the combination of zero limbs and zero digits in the last - // limb. - places += (nrdx - (idx + 1)) * BC_BASE_DIGS; + // Figure out how many digits mod 3 there are (important for + // engineering mode). mod = places % 3; // Calculate places if we are in engineering mode. diff --git a/src/opt.c b/src/opt.c index dada7442ec0..f01d86e1883 100644 --- a/src/opt.c +++ b/src/opt.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/parse.c b/src/parse.c index b02a195f83b..0107d4cdef0 100644 --- a/src/parse.c +++ b/src/parse.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/program.c b/src/program.c index c9d268dfde8..f30be26f214 100644 --- a/src/program.c +++ b/src/program.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/rand.c b/src/rand.c index 560e494214a..0f9950788f7 100644 --- a/src/rand.c +++ b/src/rand.c @@ -13,7 +13,7 @@ * This code is under the following license: * * Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/read.c b/src/read.c index de9e24ed6ac..01d80484894 100644 --- a/src/read.c +++ b/src/read.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/vector.c b/src/vector.c index 5995dc7d302..4b49e61968d 100644 --- a/src/vector.c +++ b/src/vector.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/vm.c b/src/vm.c index f4cd82e3ee4..1a93e965a3f 100644 --- a/src/vm.c +++ b/src/vm.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -358,6 +358,7 @@ bc_vm_handleError(BcErr e, size_t line, ...) #endif // BC_DEBUG { BcStatus s; + BcStatus fout_s; va_list args; uchar id = bc_err_ids[e]; const char* err_type = vm->err_ids[id]; @@ -383,14 +384,9 @@ bc_vm_handleError(BcErr e, size_t line, ...) BC_SIG_TRYLOCK(lock); // Make sure all of stdout is written first. - s = bc_file_flushErr(&vm->fout, bc_flush_err); + fout_s = bc_file_flushErr(&vm->fout, bc_flush_err); - // Just jump out if the flush failed; there's nothing we can do. - if (BC_ERR(s == BC_STATUS_ERROR_FATAL)) - { - vm->status = (sig_atomic_t) s; - BC_JMP; - } + // XXX: Keep the status for later. // Print the error message. va_start(args, line); @@ -429,18 +425,40 @@ bc_vm_handleError(BcErr e, size_t line, ...) bc_file_puts(&vm->ferr, bc_flush_none, "\n"); + // If flushing to stdout failed, try to print *that* error, as long as that + // was not the error already. + if (fout_s == BC_STATUS_ERROR_FATAL && e != BC_ERR_FATAL_IO_ERR) + { + bc_file_putchar(&vm->ferr, bc_flush_none, '\n'); + bc_file_puts(&vm->ferr, bc_flush_none, + vm->err_ids[bc_err_ids[BC_ERR_FATAL_IO_ERR]]); + bc_file_putchar(&vm->ferr, bc_flush_none, ' '); + bc_file_puts(&vm->ferr, bc_flush_none, + vm->err_msgs[BC_ERR_FATAL_IO_ERR]); + } + s = bc_file_flushErr(&vm->ferr, bc_flush_err); #if !BC_ENABLE_MEMCHECK + // Because this function is called by a BC_NORETURN function when fatal // errors happen, we need to make sure to exit on fatal errors. This will // be faster anyway. This function *cannot jump when a fatal error occurs!* - if (BC_ERR(id == BC_ERR_IDX_FATAL || s == BC_STATUS_ERROR_FATAL)) + if (BC_ERR(id == BC_ERR_IDX_FATAL || fout_s == BC_STATUS_ERROR_FATAL || + s == BC_STATUS_ERROR_FATAL)) { - exit(bc_vm_atexit((int) BC_STATUS_ERROR_FATAL)); + exit((int) BC_STATUS_ERROR_FATAL); } + #else // !BC_ENABLE_MEMCHECK - if (BC_ERR(s == BC_STATUS_ERROR_FATAL)) vm->status = (sig_atomic_t) s; + if (BC_ERR(fout_s == BC_STATUS_ERROR_FATAL)) + { + vm->status = (sig_atomic_t) fout_s; + } + else if (BC_ERR(s == BC_STATUS_ERROR_FATAL)) + { + vm->status = (sig_atomic_t) s; + } else #endif // !BC_ENABLE_MEMCHECK { @@ -1528,7 +1546,7 @@ bc_vm_exec(void) if (BC_VM_RUN_STDIN(has_file)) bc_vm_stdin(); } -void +BcStatus bc_vm_boot(int argc, char* argv[]) { int ttyin, ttyout, ttyerr; @@ -1572,8 +1590,8 @@ bc_vm_boot(int argc, char* argv[]) #if BC_ENABLE_LINE_LIB // Initialize the output file buffers. - bc_file_init(&vm->ferr, stderr); - bc_file_init(&vm->fout, stdout); + bc_file_init(&vm->ferr, stderr, true); + bc_file_init(&vm->fout, stdout, false); // Set the input buffer. vm->buf = output_bufs; @@ -1583,8 +1601,9 @@ bc_vm_boot(int argc, char* argv[]) // Initialize the output file buffers. They each take portions of the global // buffer. stdout gets more because it will probably have more data. bc_file_init(&vm->ferr, STDERR_FILENO, output_bufs + BC_VM_STDOUT_BUF_SIZE, - BC_VM_STDERR_BUF_SIZE); - bc_file_init(&vm->fout, STDOUT_FILENO, output_bufs, BC_VM_STDOUT_BUF_SIZE); + BC_VM_STDERR_BUF_SIZE, true); + bc_file_init(&vm->fout, STDOUT_FILENO, output_bufs, BC_VM_STDOUT_BUF_SIZE, + false); // Set the input buffer to the rest of the global buffer. vm->buf = output_bufs + BC_VM_STDOUT_BUF_SIZE + BC_VM_STDERR_BUF_SIZE; @@ -1716,6 +1735,11 @@ bc_vm_boot(int argc, char* argv[]) // Start executing. bc_vm_exec(); + + BC_SIG_LOCK; + + // Exit. + return bc_vm_atexit((BcStatus) vm->status); } #endif // !BC_ENABLE_LIBRARY @@ -1786,11 +1810,11 @@ bc_vm_atexit(void) #endif // BC_DEBUG } #else // BC_ENABLE_LIBRARY -int -bc_vm_atexit(int status) +BcStatus +bc_vm_atexit(BcStatus status) { // Set the status correctly. - int s = BC_STATUS_IS_ERROR(status) ? status : BC_STATUS_SUCCESS; + BcStatus s = BC_STATUS_IS_ERROR(status) ? status : BC_STATUS_SUCCESS; bc_vm_shutdown(); diff --git a/tests/all.sh b/tests/all.sh index 9174d398260..28631c048e7 100755 --- a/tests/all.sh +++ b/tests/all.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/bc/timeconst.sh b/tests/bc/timeconst.sh index fbd2909e099..35bd80d5604 100755 --- a/tests/bc/timeconst.sh +++ b/tests/bc/timeconst.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/bcl.c b/tests/bcl.c index 5bb50c29a75..3a2df4488c0 100644 --- a/tests/bcl.c +++ b/tests/bcl.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2023 Gavin D. Howard and contributors. + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/tests/dc/scripts/easter.sh b/tests/dc/scripts/easter.sh index 1f8e7aa797f..ee8fa1d94c8 100755 --- a/tests/dc/scripts/easter.sh +++ b/tests/dc/scripts/easter.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/error.sh b/tests/error.sh index b87a3d35447..15cbd5577ed 100755 --- a/tests/error.sh +++ b/tests/error.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/errors.sh b/tests/errors.sh index 081beb72411..47053f9c7b4 100755 --- a/tests/errors.sh +++ b/tests/errors.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/history.py b/tests/history.py index ced05fe7219..a3b722386a6 100755 --- a/tests/history.py +++ b/tests/history.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -126,8 +126,8 @@ def write_str(child, s): # Check the bc banner. # @param child The child process. def bc_banner(child): - bc_banner1 = "bc [0-9]+\.[0-9]+\.[0-9]+\r\n" - bc_banner2 = "Copyright \(c\) 2018-[2-9][0-9][0-9][0-9] Gavin D. Howard and contributors\r\n" + bc_banner1 = "bc [0-9]+\\.[0-9]+\\.[0-9]+\r\n" + bc_banner2 = "Copyright \\(c\\) 2018-[2-9][0-9][0-9][0-9] Gavin D. Howard and contributors\r\n" bc_banner3 = "Report bugs at: https://git.gavinhoward.com/gavin/bc\r\n\r\n" bc_banner4 = "This is free software with ABSOLUTELY NO WARRANTY.\r\n\r\n" expect(child, bc_banner1) diff --git a/tests/history.sh b/tests/history.sh index e68d568dcec..d06d3c6af10 100755 --- a/tests/history.sh +++ b/tests/history.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/other.sh b/tests/other.sh index c3a739a32e7..1012fe919de 100755 --- a/tests/other.sh +++ b/tests/other.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -308,14 +308,14 @@ else printf '0\n' > "$ext_reg_res" - "$exe" "$@" -e "gxpR" 2> /dev/null > "$ext_reg_out" + printf '%s\n' "$halt" | "$exe" "$@" -e "gxpR" 2> /dev/null > "$ext_reg_out" err="$?" checktest "$d" "$err" "Extended register command" "$ext_reg_out" "$ext_reg_res" printf '1\n' > "$ext_reg_res" - "$exe" "$@" -x -e "gxpR" 2> /dev/null > "$ext_reg_out" + printf '%s\n' "$halt" | "$exe" "$@" -x -e "gxpR" 2> /dev/null > "$ext_reg_out" err="$?" checktest "$d" "$err" "Extended register command" "$ext_reg_out" "$ext_reg_res" diff --git a/tests/read.sh b/tests/read.sh index 4881c10db58..fd4b9b6721a 100755 --- a/tests/read.sh +++ b/tests/read.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/script.sh b/tests/script.sh index bd16ce7eb3c..b1346ef0990 100755 --- a/tests/script.sh +++ b/tests/script.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/scripts.sh b/tests/scripts.sh index dda57e43505..2c8af6c06df 100755 --- a/tests/scripts.sh +++ b/tests/scripts.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/stdin.sh b/tests/stdin.sh index a650c5b996a..7061e950367 100755 --- a/tests/stdin.sh +++ b/tests/stdin.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/test.sh b/tests/test.sh index 343705bf10a..7b5916f0299 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2023 Gavin D. Howard and contributors. +# Copyright (c) 2018-2024 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: From 54d20d67e2af28d948ce2df13feb039fa10900fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Fri, 23 Aug 2024 18:45:58 +0200 Subject: [PATCH 10/14] vendor/bc: upgrade to version 7.0.0 This is a production release to fix three bugs, none of which affects well formed scripts on FreeBSD: The first bug is that bc/dc will exit on macOS when the terminal is resized. The second bug is that an array, which should only be a function parameter, was accepted as part of larger expressions. The third bug is that the value stack for dc was cleared on any error. However, this is not how other dc behave. To bring dc more in line with other implementations, this behavior was changed. This change is why this version is a new major version. --- Makefile.in | 10 +++- NEWS.md | 14 +++++ compile_flags.txt | 1 + configure.sh | 120 +++++++++++++++++++++++++++++++++-------- include/args.h | 2 +- include/bc.h | 2 +- include/dc.h | 2 +- include/opt.h | 6 +-- include/ossfuzz.h | 79 +++++++++++++++++++++++++++ include/status.h | 25 ++------- include/version.h | 2 +- include/vm.h | 2 +- manuals/dc/A.1 | 7 ++- manuals/dc/A.1.md | 9 ++-- manuals/dc/E.1 | 7 ++- manuals/dc/E.1.md | 9 ++-- manuals/dc/EH.1 | 7 ++- manuals/dc/EH.1.md | 9 ++-- manuals/dc/EHN.1 | 7 ++- manuals/dc/EHN.1.md | 9 ++-- manuals/dc/EN.1 | 7 ++- manuals/dc/EN.1.md | 9 ++-- manuals/dc/H.1 | 7 ++- manuals/dc/H.1.md | 9 ++-- manuals/dc/HN.1 | 7 ++- manuals/dc/HN.1.md | 9 ++-- manuals/dc/N.1 | 7 ++- manuals/dc/N.1.md | 9 ++-- scripts/os.c | 59 ++++++++++++++++++++ src/args.c | 4 +- src/bc.c | 3 +- src/bc_fuzzer.c | 112 ++++++++++++++++++++++++++++++++++++++ src/bc_lex.c | 2 + src/bc_parse.c | 23 +++++++- src/data.c | 59 ++++++++++++++++++++ src/dc.c | 3 +- src/dc_fuzzer.c | 112 ++++++++++++++++++++++++++++++++++++++ src/dc_lex.c | 2 + src/history.c | 2 +- src/lang.c | 4 +- src/lex.c | 8 +++ src/main.c | 21 +++++--- src/num.c | 4 ++ src/opt.c | 14 ++--- src/program.c | 13 +++-- src/vm.c | 38 +++++++++++-- tests/bc/errors/37.txt | 37 +++++++++++++ tests/bc/errors/38.txt | 37 +++++++++++++ vs/bc.vcxproj | 18 +++---- 49 files changed, 835 insertions(+), 133 deletions(-) create mode 100644 include/ossfuzz.h create mode 100644 scripts/os.c create mode 100644 src/bc_fuzzer.c create mode 100644 src/dc_fuzzer.c create mode 100644 tests/bc/errors/37.txt create mode 100644 tests/bc/errors/38.txt diff --git a/Makefile.in b/Makefile.in index 4adb76ddaa1..c63dc242e79 100644 --- a/Makefile.in +++ b/Makefile.in @@ -94,6 +94,10 @@ BC = bc DC = dc BC_EXEC = $(BIN)/$(EXEC_PREFIX)$(BC) DC_EXEC = $(BIN)/$(EXEC_PREFIX)$(DC) +BC_FUZZER = $(BIN)/$(BC)_fuzzer_c +BC_FUZZER_C = $(BIN)/$(BC)_fuzzer_C +DC_FUZZER = $(BIN)/$(DC)_fuzzer_c +DC_FUZZER_C = $(BIN)/$(DC)_fuzzer_C BC_TEST_OUTPUTS = tests/bc_outputs BC_FUZZ_OUTPUTS = tests/fuzzing/bc_outputs1 tests/fuzzing/bc_outputs2 tests/fuzzing/bc_outputs3 @@ -149,8 +153,11 @@ BC_ENABLE_NLS = %%NLS%% BC_EXCLUDE_EXTRA_MATH = %%EXCLUDE_EXTRA_MATH%% BC_ENABLE_AFL = %%FUZZ%% +BC_ENABLE_OSSFUZZ = %%OSSFUZZ%% BC_ENABLE_MEMCHECK = %%MEMCHECK%% +LIB_FUZZING_ENGINE = %%LIB_FUZZING_ENGINE%% + BC_DEFAULT_BANNER = %%BC_DEFAULT_BANNER%% BC_DEFAULT_SIGINT_RESET = %%BC_DEFAULT_SIGINT_RESET%% DC_DEFAULT_SIGINT_RESET = %%DC_DEFAULT_SIGINT_RESET%% @@ -210,7 +217,8 @@ CPPFLAGS5 = $(CPPFLAGS4) -DBC_NUM_KARATSUBA_LEN=$(BC_NUM_KARATSUBA_LEN) CPPFLAGS6 = $(CPPFLAGS5) -DBC_ENABLE_NLS=$(BC_ENABLE_NLS) CPPFLAGS7 = $(CPPFLAGS6) -D$(BC_ENABLE_EXTRA_MATH_NAME)=$(BC_ENABLE_EXTRA_MATH) CPPFLAGS8 = $(CPPFLAGS7) -DBC_ENABLE_HISTORY=$(BC_ENABLE_HISTORY) -DBC_ENABLE_LIBRARY=$(BC_ENABLE_LIBRARY) -CPPFLAGS = $(CPPFLAGS8) -DBC_ENABLE_MEMCHECK=$(BC_ENABLE_MEMCHECK) -DBC_ENABLE_AFL=$(BC_ENABLE_AFL) +CPPFLAGS9 = $(CPPFLAGS8) -DBC_ENABLE_MEMCHECK=$(BC_ENABLE_MEMCHECK) -DBC_ENABLE_AFL=$(BC_ENABLE_AFL) +CPPFLAGS = $(CPPFLAGS9) -DBC_ENABLE_OSSFUZZ=$(BC_ENABLE_OSSFUZZ) CFLAGS = $(CPPFLAGS) $(BC_DEFS) $(DC_DEFS) %%CPPFLAGS%% %%CFLAGS%% LDFLAGS = %%LDFLAGS%% diff --git a/NEWS.md b/NEWS.md index 95de7e5182c..1775fa0b653 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,19 @@ # News +## 7.0.0 + +This is a production release to fix three bugs. + +The first bug is that `bc`/`dc` will exit on macOS when the terminal is resized. + +The second bug is that an array, which should only be a function parameter, was +accepted as part of larger expressions. + +The third bug is that value stack for `dc` was cleared on any error. However, +this is not how other `dc` behave. To bring `dc` more in line with other +implementations, this behavior was changed. This change is why this version is a +new major version. + ## 6.7.6 This is a production release to fix one bug. diff --git a/compile_flags.txt b/compile_flags.txt index 7a08c87f387..3324798013c 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -13,3 +13,4 @@ -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_NLS=1 +-DBC_ENABLE_OSSFUZZ=0 diff --git a/configure.sh b/configure.sh index 43bb502ea81..442165d1569 100755 --- a/configure.sh +++ b/configure.sh @@ -68,7 +68,7 @@ usage() { printf ' [--man3dir=MAN3DIR]\n' if [ "$_usage_val" -ne 0 ]; then - exit + exit "$_usage_val" fi printf '\n' @@ -181,6 +181,8 @@ usage() { printf ' Enable a build appropriate for valgrind. For development only.\n' printf ' -z, --enable-fuzz-mode\n' printf ' Enable fuzzing mode. THIS IS FOR DEVELOPMENT ONLY.\n' + printf ' -Z, --enable-ossfuzz-mode\n' + printf ' Enable fuzzing mode for OSS-Fuzz. THIS IS FOR DEVELOPMENT ONLY.\n' printf ' --prefix PREFIX\n' printf ' The prefix to install to. Overrides "$PREFIX" if it exists.\n' printf ' If PREFIX is "/usr", install path will be "/usr/bin".\n' @@ -722,6 +724,7 @@ predefined_build() { all_locales=0 library=0 fuzz=0 + ossfuzz=0 time_tests=0 vg=0 memcheck=0 @@ -755,6 +758,7 @@ predefined_build() { all_locales=0 library=0 fuzz=0 + ossfuzz=0 time_tests=0 vg=0 memcheck=0 @@ -772,7 +776,8 @@ predefined_build() { dc_default_digit_clamp=0;; GDH) - CFLAGS="-flto -Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories -Werror -pedantic -std=c11" + CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories" + CFLAGS="$CFLAGS -Wno-switch-default -Werror -pedantic -std=c11" bc_only=0 dc_only=0 coverage=0 @@ -789,6 +794,7 @@ predefined_build() { all_locales=0 library=0 fuzz=0 + ossfuzz=0 time_tests=0 vg=0 memcheck=0 @@ -806,7 +812,8 @@ predefined_build() { dc_default_digit_clamp=1;; DBG) - CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories -Werror -pedantic -std=c11" + CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories" + CFLAGS="$CFLAGS -Wno-switch-default -Werror -pedantic -std=c11" bc_only=0 dc_only=0 coverage=0 @@ -823,6 +830,7 @@ predefined_build() { all_locales=0 library=0 fuzz=0 + ossfuzz=0 time_tests=0 vg=0 memcheck=1 @@ -888,6 +896,7 @@ strip_bin=1 all_locales=0 library=0 fuzz=0 +ossfuzz=0 time_tests=0 vg=0 memcheck=0 @@ -911,7 +920,7 @@ dc_default_digit_clamp=0 # getopts is a POSIX utility, but it cannot handle long options. Thus, the # handling of long options is done by hand, and that's the reason that short and # long options cannot be mixed. -while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvz-" opt; do +while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvzZ-" opt; do case "$opt" in a) library=1 ;; @@ -944,6 +953,7 @@ while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvz-" opt; do T) strip_bin=0 ;; v) vg=1 ;; z) fuzz=1 ;; + Z) ossfuzz=1 ;; -) arg="$1" arg="${arg#--}" @@ -1070,6 +1080,7 @@ while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvz-" opt; do enable-test-timing) time_tests=1 ;; enable-valgrind) vg=1 ;; enable-fuzz-mode) fuzz=1 ;; + enable-ossfuzz-mode) ossfuzz=1 ;; enable-memcheck) memcheck=1 ;; install-all-locales) all_locales=1 ;; help* | bc-only* | dc-only* | coverage* | debug*) @@ -1320,6 +1331,45 @@ elif [ "$dc_only" -eq 1 ]; then tests="test_dc" +elif [ "$ossfuzz" -eq 1 ]; then + + if [ "$bc_only" -ne 0 ] || [ "$dc_only" -ne 0 ]; then + usage "An OSS-Fuzz build must build both fuzzers." + fi + + bc=1 + dc=1 + + # Expressions *cannot* exit in an OSS-Fuzz build. + bc_default_expr_exit=0 + dc_default_expr_exit=0 + + executables="bc_fuzzer and dc_fuzzer" + + karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)" + karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)" + + if [ "$library" -eq 0 ]; then + install_prereqs=" install_execs" + install_man_prereqs=" install_bc_manpage install_dc_manpage" + uninstall_prereqs=" uninstall_bc uninstall_dc" + uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage" + else + install_prereqs=" install_library install_bcl_header" + install_man_prereqs=" install_bcl_manpage" + uninstall_prereqs=" uninstall_library uninstall_bcl_header" + uninstall_man_prereqs=" uninstall_bcl_manpage" + tests="test_library" + fi + + second_target_prereqs="src/bc_fuzzer.o $default_target_prereqs" + default_target_prereqs="\$(BC_FUZZER) src/dc_fuzzer.o $default_target_prereqs" + default_target_cmd="\$(CXX) \$(CFLAGS) src/dc_fuzzer.o \$(LIB_FUZZING_ENGINE) \$(OBJS) \$(LDFLAGS) -o \$(DC_FUZZER) \&\& ln -sf ./dc_fuzzer_c \$(DC_FUZZER_C)" + second_target_cmd="\$(CXX) \$(CFLAGS) src/bc_fuzzer.o \$(LIB_FUZZING_ENGINE) \$(OBJS) \$(LDFLAGS) -o \$(BC_FUZZER) \&\& ln -sf ./bc_fuzzer_c \$(BC_FUZZER_C)" + + default_target="\$(DC_FUZZER) \$(DC_FUZZER_C)" + second_target="\$(BC_FUZZER) \$(BC_FUZZER_C)" + else bc=1 @@ -1349,8 +1399,12 @@ else fi +if [ "$fuzz" -ne 0 ] && [ "$ossfuzz" -ne 0 ]; then + usage "Fuzzing mode and OSS-Fuzz mode are mutually exclusive" +fi + # We need specific stuff for fuzzing. -if [ "$fuzz" -ne 0 ]; then +if [ "$fuzz" -ne 0 ] || [ "$ossfuzz" -ne 0 ]; then debug=1 hist=0 nls=0 @@ -1395,7 +1449,6 @@ else COVERAGE_PREREQS="" fi - # Set some defaults. if [ -z "${DESTDIR+set}" ]; then destdir="" @@ -1485,8 +1538,8 @@ if [ "$nls" -ne 0 ]; then flags="-DBC_ENABLE_NLS=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc" flags="$flags -DBC_ENABLE_HISTORY=$hist -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0" - flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/" - flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" + flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -DBC_ENABLE_OSSFUZZ=0" + flags="$flags -I$scriptdir/include/ -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" ccbase=$(basename "$CC") @@ -1494,14 +1547,14 @@ if [ "$nls" -ne 0 ]; then flags="$flags -Wno-unreachable-code" fi - "$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -o "./vm.o" > /dev/null 2>&1 + "$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/vm.c" -E > /dev/null err="$?" rm -rf "./vm.o" - # If this errors, it is probably because of building on Windows, - # and NLS is not supported on Windows, so disable it. + # If this errors, it is probably because of building on Windows or musl, + # and NLS is not supported on Windows or musl, so disable it. if [ "$err" -ne 0 ]; then printf 'NLS does not work.\n' if [ $force -eq 0 ]; then @@ -1514,7 +1567,7 @@ if [ "$nls" -ne 0 ]; then printf 'NLS works.\n\n' printf 'Testing gencat...\n' - gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null 2>&1 + gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null err="$?" @@ -1587,10 +1640,10 @@ if [ "$hist" -eq 1 ]; then flags="-DBC_ENABLE_HISTORY=1 -DBC_ENABLED=$bc -DDC_ENABLED=$dc" flags="$flags -DBC_ENABLE_NLS=$nls -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_AFL=0" flags="$flags -DBC_ENABLE_EDITLINE=$editline -DBC_ENABLE_READLINE=$readline" - flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -I$scriptdir/include/" - flags="$flags -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" + flags="$flags -DBC_ENABLE_EXTRA_MATH=$extra_math -DBC_ENABLE_OSSFUZZ=0" + flags="$flags -I$scriptdir/include/ -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700" - "$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -o "./history.o" > /dev/null 2>&1 + "$CC" $CPPFLAGS $CFLAGS $flags -c "$scriptdir/src/history.c" -E > /dev/null err="$?" @@ -1660,7 +1713,7 @@ set +e printf 'Testing for FreeBSD...\n' flags="-DBC_TEST_FREEBSD -DBC_ENABLE_AFL=0" -"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/src/vm.c" > /dev/null 2>&1 +"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null err="$?" @@ -1677,7 +1730,7 @@ fi printf 'Testing for macOS...\n' flags="-DBC_TEST_APPLE -DBC_ENABLE_AFL=0" -"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/src/vm.c" > /dev/null 2>&1 +"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null err="$?" @@ -1705,7 +1758,7 @@ fi printf 'Testing for OpenBSD...\n' flags="-DBC_TEST_OPENBSD -DBC_ENABLE_AFL=0" -"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/src/vm.c" > /dev/null 2>&1 +"$CC" $CPPFLAGS $CFLAGS $flags "-I$scriptdir/include" -E "$scriptdir/scripts/os.c" > /dev/null err="$?" @@ -1741,7 +1794,7 @@ GEN_DIR="$scriptdir/gen" # These lines set the appropriate targets based on whether `gen/strgen.c` or # `gen/strgen.sh` is used. GEN="strgen" -GEN_EXEC_TARGET="\$(HOSTCC) -DBC_ENABLE_AFL=0 -I$scriptdir/include/ \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)" +GEN_EXEC_TARGET="\$(HOSTCC) -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -I$scriptdir/include/ \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)" CLEAN_PREREQS=" clean_gen clean_coverage" if [ -z "${GEN_HOST+set}" ]; then @@ -1754,8 +1807,9 @@ else fi fi +# The fuzzer files are always unneeded because they'll be built separately. manpage_args="" -unneeded="" +unneeded="bc_fuzzer.c dc_fuzzer.c" headers="\$(HEADERS)" # This series of if statements figure out what source files are *not* needed. @@ -1826,6 +1880,14 @@ if [ "$library" -ne 0 ]; then fi +elif [ "$ossfuzz" -ne 0 ]; then + + unneeded="$unneeded library.c main.c" + + PC_PATH="" + pkg_config_install="" + pkg_config_uninstall="" + else unneeded="$unneeded library.c" @@ -1836,9 +1898,10 @@ else fi -# library.c is not needed under normal circumstances. +# library.c, bc_fuzzer.c, and dc_fuzzer.c are not needed under normal +# circumstances. if [ "$unneeded" = "" ]; then - unneeded="library.c" + unneeded="library.c bc_fuzzer.c dc_fuzzer.c" fi # This sets the appropriate manpage for a full build. @@ -1846,7 +1909,7 @@ if [ "$manpage_args" = "" ]; then manpage_args="A" fi -if [ "$vg" -ne 0 ]; then +if [ "$vg" -ne 0 ] || [ "$ossfuzz" -ne 0 ]; then memcheck=1 fi @@ -2011,7 +2074,9 @@ contents=$(replace "$contents" "HISTORY" "$hist") contents=$(replace "$contents" "EXTRA_MATH" "$extra_math") contents=$(replace "$contents" "NLS" "$nls") contents=$(replace "$contents" "FUZZ" "$fuzz") +contents=$(replace "$contents" "OSSFUZZ" "$ossfuzz") contents=$(replace "$contents" "MEMCHECK" "$memcheck") +contents=$(replace "$contents" "LIB_FUZZING_ENGINE" "$LIB_FUZZING_ENGINE") contents=$(replace "$contents" "BC_LIB_O" "$bc_lib") contents=$(replace "$contents" "BC_HELP_O" "$bc_help") @@ -2117,6 +2182,15 @@ if [ "$dc" -ne 0 ]; then gen_err_tests dc $dc_test_exec fi +if [ "$ossfuzz" -ne 0 ]; then + + printf 'bc_fuzzer_c: $(BC_FUZZER)\n\tln -sf $(BC_FUZZER) bc_fuzzer_c\n' >> Makefile + printf 'bc_fuzzer_C: $(BC_FUZZER)\n\tln -sf $(BC_FUZZER) bc_fuzzer_C\n' >> Makefile + printf 'dc_fuzzer_c: $(DC_FUZZER)\n\tln -sf $(DC_FUZZER) dc_fuzzer_c\n' >> Makefile + printf 'dc_fuzzer_C: $(DC_FUZZER)\n\tln -sf $(DC_FUZZER) dc_fuzzer_C\n' >> Makefile + +fi + # Copy the correct manuals to the expected places. mkdir -p manuals cp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md diff --git a/include/args.h b/include/args.h index f1e9f007bdd..8f8f00be463 100644 --- a/include/args.h +++ b/include/args.h @@ -54,7 +54,7 @@ * any. */ void -bc_args(int argc, char* argv[], bool exit_exprs, BcBigDig* scale, +bc_args(int argc, const char* argv[], bool exit_exprs, BcBigDig* scale, BcBigDig* ibase, BcBigDig* obase); #if BC_ENABLED diff --git a/include/bc.h b/include/bc.h index b25df09a174..2213278be1d 100644 --- a/include/bc.h +++ b/include/bc.h @@ -51,7 +51,7 @@ * @return A status. */ BcStatus -bc_main(int argc, char* argv[]); +bc_main(int argc, const char* argv[]); // These are references to the help text, the library text, and the "filename" // for the library. diff --git a/include/dc.h b/include/dc.h index 1328f1c63b3..63f5ccbd10e 100644 --- a/include/dc.h +++ b/include/dc.h @@ -48,7 +48,7 @@ * @return A status. */ BcStatus -dc_main(int argc, char* argv[]); +dc_main(int argc, const char* argv[]); // A reference to the dc help text. extern const char dc_help[]; diff --git a/include/opt.h b/include/opt.h index e60328994d8..41058cb4e29 100644 --- a/include/opt.h +++ b/include/opt.h @@ -47,7 +47,7 @@ typedef struct BcOpt { /// The array of arguments. - char** argv; + const char** argv; /// The index of the current argument. size_t optind; @@ -59,7 +59,7 @@ typedef struct BcOpt int subopt; /// The option argument. - char* optarg; + const char* optarg; } BcOpt; @@ -103,7 +103,7 @@ typedef struct BcOptLong * @param argv The array of arguments. */ void -bc_opt_init(BcOpt* o, char** argv); +bc_opt_init(BcOpt* o, const char** argv); /** * Parse an option. This returns a value the same way getopt() and getopt_long() diff --git a/include/ossfuzz.h b/include/ossfuzz.h new file mode 100644 index 00000000000..5c12a3c9c9f --- /dev/null +++ b/include/ossfuzz.h @@ -0,0 +1,79 @@ +/* + * ***************************************************************************** + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * ***************************************************************************** + * + * Declarations for the OSS-Fuzz build of bc and dc. + * + */ + +#include +#include + +#ifndef BC_OSSFUZZ_H +#define BC_OSSFUZZ_H + +/// The number of args in fuzzer arguments, including the NULL terminator. +extern const size_t bc_fuzzer_args_len; + +/// The standard arguments for the bc fuzzer with the -c argument. +extern const char* bc_fuzzer_args_c[]; + +/// The standard arguments for the bc fuzzer with the -C argument. +extern const char* bc_fuzzer_args_C[]; + +/// The standard arguments for the dc fuzzer with the -c argument. +extern const char* dc_fuzzer_args_c[]; + +/// The standard arguments for the dc fuzzer with the -C argument. +extern const char* dc_fuzzer_args_C[]; + +/// The data pointer. +extern uint8_t* bc_fuzzer_data; + +/** + * The function that the fuzzer runs. + * @param Data The data. + * @param Size The number of bytes in @a Data. + * @return 0 on success, -1 on error. + * @pre @a Data must not be equal to NULL if @a Size > 0. + */ +int +LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size); + +/** + * The initialization function for the fuzzer. + * @param argc A pointer to the argument count. + * @param argv A pointer to the argument list. + * @return 0 on success, -1 on error. + */ +int +LLVMFuzzerInitialize(int* argc, char*** argv); + +#endif // BC_OSSFUZZ_H diff --git a/include/status.h b/include/status.h index f579df8c649..203f09af628 100644 --- a/include/status.h +++ b/include/status.h @@ -46,27 +46,6 @@ #include #include -// This is used by configure.sh to test for OpenBSD. -#ifdef BC_TEST_OPENBSD -#ifdef __OpenBSD__ -#error On OpenBSD without _BSD_SOURCE -#endif // __OpenBSD__ -#endif // BC_TEST_OPENBSD - -// This is used by configure.sh to test for FreeBSD. -#ifdef BC_TEST_FREEBSD -#ifdef __FreeBSD__ -#error On FreeBSD with _POSIX_C_SOURCE -#endif // __FreeBSD__ -#endif // BC_TEST_FREEBSD - -// This is used by configure.sh to test for macOS. -#ifdef BC_TEST_APPLE -#ifdef __APPLE__ -#error On macOS without _DARWIN_C_SOURCE -#endif // __APPLE__ -#endif // BC_TEST_APPLE - // Windows has deprecated isatty() and the rest of these. Or doesn't have them. // So these are just fixes for Windows. #ifdef _WIN32 @@ -676,9 +655,13 @@ typedef enum BcMode /// File mode. BC_MODE_FILE, +#if !BC_ENABLE_OSSFUZZ + /// stdin mode. BC_MODE_STDIN, +#endif // !BC_ENABLE_OSSFUZZ + } BcMode; /// Do a longjmp(). This is what to use when activating an "exception", i.e., a diff --git a/include/version.h b/include/version.h index 586691a6e7e..897a19530e3 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 6.7.6 +#define VERSION 7.0.0 #endif // BC_VERSION_H diff --git a/include/vm.h b/include/vm.h index 052c1d14c23..e81206b6387 100644 --- a/include/vm.h +++ b/include/vm.h @@ -794,7 +794,7 @@ bc_vm_info(const char* const help); * @return A status. */ BcStatus -bc_vm_boot(int argc, char* argv[]); +bc_vm_boot(int argc, const char* argv[]); /** * Initializes some of the BcVm global. This is separate to make things easier diff --git a/manuals/dc/A.1 b/manuals/dc/A.1 index 33ecb8e2031..d59e0fa68a5 100644 --- a/manuals/dc/A.1 +++ b/manuals/dc/A.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1275,11 +1275,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/A.1.md b/manuals/dc/A.1.md index 613f98f7681..ad0c59934fd 100644 --- a/manuals/dc/A.1.md +++ b/manuals/dc/A.1.md @@ -1130,11 +1130,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/manuals/dc/E.1 b/manuals/dc/E.1 index 91f68dfd746..a5febe44705 100644 --- a/manuals/dc/E.1 +++ b/manuals/dc/E.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1061,11 +1061,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/E.1.md b/manuals/dc/E.1.md index 3a47f789bd3..54b877999d0 100644 --- a/manuals/dc/E.1.md +++ b/manuals/dc/E.1.md @@ -961,11 +961,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/manuals/dc/EH.1 b/manuals/dc/EH.1 index e60e6e0d849..61fbaa4efe9 100644 --- a/manuals/dc/EH.1 +++ b/manuals/dc/EH.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1061,11 +1061,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/EH.1.md b/manuals/dc/EH.1.md index 761b9a89947..6398477a84d 100644 --- a/manuals/dc/EH.1.md +++ b/manuals/dc/EH.1.md @@ -961,11 +961,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/manuals/dc/EHN.1 b/manuals/dc/EHN.1 index d26d49c5ce3..974cb3c8679 100644 --- a/manuals/dc/EHN.1 +++ b/manuals/dc/EHN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1061,11 +1061,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/EHN.1.md b/manuals/dc/EHN.1.md index 58ae149bb68..51e30849996 100644 --- a/manuals/dc/EHN.1.md +++ b/manuals/dc/EHN.1.md @@ -961,11 +961,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/manuals/dc/EN.1 b/manuals/dc/EN.1 index 03cb5743602..5ce8defc91c 100644 --- a/manuals/dc/EN.1 +++ b/manuals/dc/EN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1061,11 +1061,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/EN.1.md b/manuals/dc/EN.1.md index 64c945be885..ab9647a196b 100644 --- a/manuals/dc/EN.1.md +++ b/manuals/dc/EN.1.md @@ -961,11 +961,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/manuals/dc/H.1 b/manuals/dc/H.1 index 36f7458a331..82c1bbd5c2b 100644 --- a/manuals/dc/H.1 +++ b/manuals/dc/H.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1275,11 +1275,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/H.1.md b/manuals/dc/H.1.md index cc263eea0db..64c7142bc4a 100644 --- a/manuals/dc/H.1.md +++ b/manuals/dc/H.1.md @@ -1130,11 +1130,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/manuals/dc/HN.1 b/manuals/dc/HN.1 index eae5cc516f7..c3f8c8ab1ff 100644 --- a/manuals/dc/HN.1 +++ b/manuals/dc/HN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1275,11 +1275,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/HN.1.md b/manuals/dc/HN.1.md index b34d80325f7..28b9dadd4b4 100644 --- a/manuals/dc/HN.1.md +++ b/manuals/dc/HN.1.md @@ -1130,11 +1130,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/manuals/dc/N.1 b/manuals/dc/N.1 index 6233c753dea..6e2baa587b1 100644 --- a/manuals/dc/N.1 +++ b/manuals/dc/N.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "DC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "DC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH Name @@ -1275,11 +1275,14 @@ handler for, it resets. This means that several things happen. .PP First, any macros that are executing are stopped and popped off the -stack. +execution stack. The behavior is not unlike that of exceptions in programming languages. Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. .PP +However, the stack of values is \f[I]not\f[R] cleared; in interactive +mode, users can inspect the stack and manipulate it. +.PP Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error diff --git a/manuals/dc/N.1.md b/manuals/dc/N.1.md index 81933e2160b..22ea9c96bc8 100644 --- a/manuals/dc/N.1.md +++ b/manuals/dc/N.1.md @@ -1130,11 +1130,14 @@ the next non-space characters do not match that regex. When dc(1) encounters an error or a signal that it has a non-default handler for, it resets. This means that several things happen. -First, any macros that are executing are stopped and popped off the stack. -The behavior is not unlike that of exceptions in programming languages. Then -the execution point is set so that any code waiting to execute (after all +First, any macros that are executing are stopped and popped off the execution +stack. The behavior is not unlike that of exceptions in programming languages. +Then the execution point is set so that any code waiting to execute (after all macros returned) is skipped. +However, the stack of values is *not* cleared; in interactive mode, users can +inspect the stack and manipulate it. + Thus, when dc(1) resets, it skips any remaining code waiting to be executed. Then, if it is interactive mode, and the error was not a fatal error (see the **EXIT STATUS** section), it asks for more input; otherwise, it exits with the diff --git a/scripts/os.c b/scripts/os.c new file mode 100644 index 00000000000..212a61772cc --- /dev/null +++ b/scripts/os.c @@ -0,0 +1,59 @@ +/* + * ***************************************************************************** + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * ***************************************************************************** + * + * File for testing compilation on different platforms. + * + */ + +// This is used by configure.sh to test for OpenBSD. +#ifdef BC_TEST_OPENBSD +#ifdef __OpenBSD__ +#error On OpenBSD without _BSD_SOURCE +#endif // __OpenBSD__ +#endif // BC_TEST_OPENBSD + +// This is used by configure.sh to test for FreeBSD. +#ifdef BC_TEST_FREEBSD +#ifdef __FreeBSD__ +#error On FreeBSD with _POSIX_C_SOURCE +#endif // __FreeBSD__ +#endif // BC_TEST_FREEBSD + +// This is used by configure.sh to test for macOS. +#ifdef BC_TEST_APPLE +#ifdef __APPLE__ +#error On macOS without _DARWIN_C_SOURCE +#endif // __APPLE__ +#endif // BC_TEST_APPLE + +extern int test; + +int test; diff --git a/src/args.c b/src/args.c index 635c7227d3d..6eba802d34a 100644 --- a/src/args.c +++ b/src/args.c @@ -149,7 +149,7 @@ bc_args_redefine(const char* keyword) #endif // BC_ENABLED void -bc_args(int argc, char* argv[], bool exit_exprs, BcBigDig* scale, +bc_args(int argc, const char* argv[], bool exit_exprs, BcBigDig* scale, BcBigDig* ibase, BcBigDig* obase) { int c; @@ -157,7 +157,7 @@ bc_args(int argc, char* argv[], bool exit_exprs, BcBigDig* scale, bool do_exit = false, version = false; BcOpt opts; #if BC_ENABLE_EXTRA_MATH - char* seed = NULL; + const char* seed = NULL; #endif // BC_ENABLE_EXTRA_MATH BC_SIG_ASSERT_LOCKED; diff --git a/src/bc.c b/src/bc.c index c5a67f35e10..572e42b1a16 100644 --- a/src/bc.c +++ b/src/bc.c @@ -46,7 +46,7 @@ * @param argv The arguments. */ BcStatus -bc_main(int argc, char* argv[]) +bc_main(int argc, const char* argv[]) { // All of these just set bc-specific items in BcVm. @@ -61,4 +61,5 @@ bc_main(int argc, char* argv[]) return bc_vm_boot(argc, argv); } + #endif // BC_ENABLED diff --git a/src/bc_fuzzer.c b/src/bc_fuzzer.c new file mode 100644 index 00000000000..7d7b3292b72 --- /dev/null +++ b/src/bc_fuzzer.c @@ -0,0 +1,112 @@ +/* + * ***************************************************************************** + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * ***************************************************************************** + * + * The entry point for libFuzzer when fuzzing bc. + * + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +uint8_t* bc_fuzzer_data; + +/// A boolean about whether we should use -c (false) or -C (true). +static bool bc_C; + +int +LLVMFuzzerInitialize(int* argc, char*** argv) +{ + BC_UNUSED(argc); + + if (argv == NULL || *argv == NULL) + { + bc_C = false; + } + else + { + char* name; + + // Get the basename + name = strrchr((*argv)[0], BC_FILE_SEP); + name = name == NULL ? (*argv)[0] : name + 1; + + // Figure out which to use. + bc_C = (strcmp(name, "bc_fuzzer_C") == 0); + } + + return 0; +} + +int +LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) +{ + BcStatus s; + + // I've already tested empty input, so just ignore. + if (Size == 0 || Data[0] == '\0') return 0; + + // Clear the global. This is to ensure a clean start. + memset(vm, 0, sizeof(BcVm)); + + // Make sure to set the name. + vm->name = "bc"; + + BC_SIG_LOCK; + + // We *must* do this here. Otherwise, other code could not jump out all of + // the way. + bc_vec_init(&vm->jmp_bufs, sizeof(sigjmp_buf), BC_DTOR_NONE); + + BC_SETJMP_LOCKED(vm, exit); + + // Create a string with the data. + bc_fuzzer_data = bc_vm_malloc(Size + 1); + memcpy(bc_fuzzer_data, Data, Size); + bc_fuzzer_data[Size] = '\0'; + + s = bc_main((int) (bc_fuzzer_args_len - 1), + bc_C ? bc_fuzzer_args_C : bc_fuzzer_args_c); + +exit: + + BC_SIG_MAYLOCK; + + free(bc_fuzzer_data); + + return s == BC_STATUS_SUCCESS || s == BC_STATUS_QUIT ? 0 : -1; +} diff --git a/src/bc_lex.c b/src/bc_lex.c index 106bb3ee03c..f83eaf73162 100644 --- a/src/bc_lex.c +++ b/src/bc_lex.c @@ -115,7 +115,9 @@ bc_lex_string(BcLex* l) buf = l->buf; got_more = false; +#if !BC_ENABLE_OSSFUZZ assert(vm->mode != BC_MODE_STDIN || buf == vm->buffer.v); +#endif // !BC_ENABLE_OSSFUZZ // Fortunately for us, bc doesn't escape quotes. Instead, the equivalent // is '\q', which makes this loop simpler. diff --git a/src/bc_parse.c b/src/bc_parse.c index 6842885933d..cf4398709e5 100644 --- a/src/bc_parse.c +++ b/src/bc_parse.c @@ -2002,7 +2002,8 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) BcLexType top, t; size_t nexprs, ops_bgn; uint32_t i, nparens, nrelops; - bool pfirst, rprn, done, get_token, assign, bin_last, incdec, can_assign; + bool pfirst, rprn, array_last, done, get_token, assign; + bool bin_last, incdec, can_assign; // One of these *must* be true. assert(!(flags & BC_PARSE_PRINT) || !(flags & BC_PARSE_NEEDVAL)); @@ -2019,6 +2020,7 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) // - nrelops is the number of relational operators that appear in the expr. // - nexprs is the number of unused expressions. // - rprn is a right paren encountered last. + // - array_last is an array item encountered last. // - done means the expression has been fully parsed. // - get_token is true when a token is needed at the end of an iteration. // - assign is true when an assignment statement was parsed last. @@ -2030,7 +2032,7 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) nparens = nrelops = 0; nexprs = 0; ops_bgn = p->ops.len; - rprn = done = get_token = assign = incdec = can_assign = false; + rprn = array_last = done = get_token = assign = incdec = can_assign = false; bin_last = true; // We want to eat newlines if newlines are not a valid ending token. @@ -2046,6 +2048,14 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) // This is the Shunting-Yard algorithm loop. for (; !done && BC_PARSE_EXPR(t); t = p->l.t) { + // Make sure an array expression is not mixed with any others. However, + // a right parenthesis may end the expression, so we will need to take + // care of that right there. + if (BC_ERR(array_last && t != BC_LEX_RPAREN)) + { + bc_parse_err(p, BC_ERR_PARSE_EXPR); + } + switch (t) { case BC_LEX_OP_INC: @@ -2221,6 +2231,14 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) break; } + // Now that we know the right paren has not ended the + // expression, make sure an array expression is not mixed with + // any others. + if (BC_ERR(array_last)) + { + bc_parse_err(p, BC_ERR_PARSE_EXPR); + } + nparens -= 1; rprn = true; get_token = bin_last = incdec = false; @@ -2263,6 +2281,7 @@ bc_parse_expr_err(BcParse* p, uint8_t flags, BcParseNext next) bc_parse_name(p, &prev, &can_assign, flags & ~BC_PARSE_NOCALL); rprn = (prev == BC_INST_CALL); + array_last = (prev == BC_INST_ARRAY); nexprs += 1; flags &= ~(BC_PARSE_ARRAY); diff --git a/src/data.c b/src/data.c index 00eda2cc4a5..bb1a6796f75 100644 --- a/src/data.c +++ b/src/data.c @@ -174,6 +174,65 @@ const BcOptLong bc_args_lopt[] = { }; +#if BC_ENABLE_OSSFUZZ + +const char* bc_fuzzer_args_c[] = { + "bc", + "-lqc", + "-e", + "seed = 82507683022933941343198991100880559238.7080266844215897551270760113" + "4734858017748592704189096562163085637164174146616055338762825421827784" + "566630725748836994171142578125", + NULL, +}; + +const char* dc_fuzzer_args_c[] = { + "dc", + "-xc", + "-e", + "82507683022933941343198991100880559238.7080266844215897551270760113" + "4734858017748592704189096562163085637164174146616055338762825421827784" + "566630725748836994171142578125j", + NULL, +}; + +const char* bc_fuzzer_args_C[] = { + "bc", + "-lqC", + "-e", + "seed = 82507683022933941343198991100880559238.7080266844215897551270760113" + "4734858017748592704189096562163085637164174146616055338762825421827784" + "566630725748836994171142578125", + NULL, +}; + +const char* dc_fuzzer_args_C[] = { + "dc", + "-xC", + "-e", + "82507683022933941343198991100880559238.7080266844215897551270760113" + "4734858017748592704189096562163085637164174146616055338762825421827784" + "566630725748836994171142578125j", + NULL, +}; + +const size_t bc_fuzzer_args_len = sizeof(bc_fuzzer_args_c) / sizeof(char*); + +#if BC_C11 + +_Static_assert(sizeof(bc_fuzzer_args_C) / sizeof(char*) == bc_fuzzer_args_len, + "Wrong number of bc fuzzer args"); + +_Static_assert(sizeof(dc_fuzzer_args_c) / sizeof(char*) == bc_fuzzer_args_len, + "Wrong number of dc fuzzer args"); + +_Static_assert(sizeof(dc_fuzzer_args_C) / sizeof(char*) == bc_fuzzer_args_len, + "Wrong number of dc fuzzer args"); + +#endif // BC_C11 + +#endif // BC_ENABLE_OSSFUZZ + // clang-format off /// The default error category strings. diff --git a/src/dc.c b/src/dc.c index 992efe262fd..37419acd4bd 100644 --- a/src/dc.c +++ b/src/dc.c @@ -46,7 +46,7 @@ * @param argv The arguments. */ BcStatus -dc_main(int argc, char* argv[]) +dc_main(int argc, const char* argv[]) { // All of these just set dc-specific items in BcVm. @@ -61,4 +61,5 @@ dc_main(int argc, char* argv[]) return bc_vm_boot(argc, argv); } + #endif // DC_ENABLED diff --git a/src/dc_fuzzer.c b/src/dc_fuzzer.c new file mode 100644 index 00000000000..adaf486a668 --- /dev/null +++ b/src/dc_fuzzer.c @@ -0,0 +1,112 @@ +/* + * ***************************************************************************** + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * ***************************************************************************** + * + * The entry point for libFuzzer when fuzzing dc. + * + */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +uint8_t* bc_fuzzer_data; + +/// A boolean about whether we should use -c (false) or -C (true). +static bool dc_C; + +int +LLVMFuzzerInitialize(int* argc, char*** argv) +{ + BC_UNUSED(argc); + + if (argv == NULL || *argv == NULL) + { + dc_C = false; + } + else + { + char* name; + + // Get the basename + name = strrchr((*argv)[0], BC_FILE_SEP); + name = name == NULL ? (*argv)[0] : name + 1; + + // Figure out which to use. + dc_C = (strcmp(name, "dc_fuzzer_C") == 0); + } + + return 0; +} + +int +LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) +{ + BcStatus s; + + // I've already tested empty input, so just ignore. + if (Size == 0 || Data[0] == '\0') return 0; + + // Clear the global. This is to ensure a clean start. + memset(vm, 0, sizeof(BcVm)); + + // Make sure to set the name. + vm->name = "dc"; + + BC_SIG_LOCK; + + // We *must* do this here. Otherwise, other code could not jump out all of + // the way. + bc_vec_init(&vm->jmp_bufs, sizeof(sigjmp_buf), BC_DTOR_NONE); + + BC_SETJMP_LOCKED(vm, exit); + + // Create a string with the data. + bc_fuzzer_data = bc_vm_malloc(Size + 1); + memcpy(bc_fuzzer_data, Data, Size); + bc_fuzzer_data[Size] = '\0'; + + s = dc_main((int) (bc_fuzzer_args_len - 1), + dc_C ? dc_fuzzer_args_C : dc_fuzzer_args_c); + +exit: + + BC_SIG_MAYLOCK; + + free(bc_fuzzer_data); + + return s == BC_STATUS_SUCCESS || s == BC_STATUS_QUIT ? 0 : -1; +} diff --git a/src/dc_lex.c b/src/dc_lex.c index a58ca8f79cf..d5131b45331 100644 --- a/src/dc_lex.c +++ b/src/dc_lex.c @@ -114,7 +114,9 @@ dc_lex_string(BcLex* l) nls = 0; got_more = false; +#if !BC_ENABLE_OSSFUZZ assert(l->mode != BC_MODE_STDIN || l->buf == vm->buffer.v); +#endif // !BC_ENABLE_OSSFUZZ // This is the meat. As long as we don't run into the NUL byte, and we // have "depth", which means we haven't completely balanced brackets diff --git a/src/history.c b/src/history.c index 71afe62db87..6ae9785d9a7 100644 --- a/src/history.c +++ b/src/history.c @@ -264,7 +264,7 @@ bc_history_line(BcHistory* h, BcVec* vec, const char* prompt) errno = EINTR; // Get the line. - while (line == NULL && len == -1 && errno == EINTR) + while (line == NULL && (len == -1 || errno == EINTR)) { line = el_gets(h->el, &len); bc_history_use_prompt = false; diff --git a/src/lang.c b/src/lang.c index bb147fc60d0..7968bcbd9df 100644 --- a/src/lang.c +++ b/src/lang.c @@ -136,7 +136,7 @@ bc_func_reset(BcFunc* f) #endif // BC_ENABLED } -#if BC_DEBUG +#if BC_DEBUG || BC_ENABLE_MEMCHECK void bc_func_free(void* func) { @@ -155,7 +155,7 @@ bc_func_free(void* func) } #endif // BC_ENABLED } -#endif // BC_DEBUG +#endif // BC_DEBUG || BC_ENABLE_MEMCHECK void bc_array_init(BcVec* a, bool nums) diff --git a/src/lex.c b/src/lex.c index d01e327e293..37e52c33fff 100644 --- a/src/lex.c +++ b/src/lex.c @@ -79,7 +79,9 @@ bc_lex_comment(BcLex* l) got_more = false; // If we are in stdin mode, the buffer must be the one used for stdin. +#if !BC_ENABLE_OSSFUZZ assert(vm->mode != BC_MODE_STDIN || buf == vm->buffer.v); +#endif // !BC_ENABLE_OSSFUZZ // Find the end of the comment. for (i = l->i; !end; i += !end) @@ -93,11 +95,13 @@ bc_lex_comment(BcLex* l) // If this is true, we need to request more data. if (BC_ERR(!c || buf[i + 1] == '\0')) { +#if !BC_ENABLE_OSSFUZZ // Read more, if possible. if (!vm->eof && l->mode != BC_MODE_FILE) { got_more = bc_lex_readLine(l); } +#endif // !BC_ENABLE_OSSFUZZ break; } @@ -363,12 +367,16 @@ bc_lex_readLine(BcLex* l) break; } +#if !BC_ENABLE_OSSFUZZ + case BC_MODE_STDIN: { good = bc_vm_readLine(false); break; } +#endif // !BC_ENABLE_OSSFUZZ + #ifdef __GNUC__ #ifndef __clang__ default: diff --git a/src/main.c b/src/main.c index a6d50614af5..e4a1f7399bb 100644 --- a/src/main.c +++ b/src/main.c @@ -100,20 +100,29 @@ main(int argc, char* argv[]) BC_SETJMP_LOCKED(vm, exit); +#if BC_CLANG +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wcast-qual" +#endif // BC_CLANG #if !DC_ENABLED - s = bc_main(argc, argv); + s = bc_main(argc, (const char**) argv); #elif !BC_ENABLED - s = dc_main(argc, argv); + s = dc_main(argc, (const char**) argv); #else // BC_IS_BC uses vm->name, which was set above. So we're good. - if (BC_IS_BC) s = bc_main(argc, argv); - else s = dc_main(argc, argv); + if (BC_IS_BC) s = bc_main(argc, (const char**) argv); + else s = dc_main(argc, (const char**) argv); #endif +#if BC_CLANG +#pragma clang diagnostic pop +#endif // BC_CLANG - vm->status = (int) s; + vm->status = (sig_atomic_t) s; exit: BC_SIG_MAYLOCK; - return vm->status == BC_STATUS_QUIT ? BC_STATUS_SUCCESS : vm->status; + s = bc_vm_atexit((BcStatus) vm->status); + + return (int) s; } diff --git a/src/num.c b/src/num.c index 5420183c1e1..83f84edb91f 100644 --- a/src/num.c +++ b/src/num.c @@ -274,6 +274,8 @@ bc_num_nonZeroLen(const BcNum* restrict n) return i + 1; } +#if BC_ENABLE_EXTRA_MATH + /** * Returns the power of 10 that a number with an absolute value less than 1 * needs to be multiplied by in order to be greater than 1 or less than -1. @@ -301,6 +303,8 @@ bc_num_negPow10(const BcNum* restrict n) return places + (BC_NUM_RDX_VAL(n) - (idx + 1)) * BC_BASE_DIGS; } +#endif // BC_ENABLE_EXTRA_MATH + /** * Performs a one-limb add with a carry. * @param a The first limb. diff --git a/src/opt.c b/src/opt.c index f01d86e1883..a1c8e813b1e 100644 --- a/src/opt.c +++ b/src/opt.c @@ -143,8 +143,8 @@ static int bc_opt_parseShort(BcOpt* o, const BcOptLong* longopts) { int type; - char* next; - char* option = o->argv[o->optind]; + const char* next; + const char* option = o->argv[o->optind]; int ret = -1; // Make sure to clear these. @@ -273,8 +273,8 @@ bc_opt_longoptsMatch(const char* name, const char* option) * @param option The option to find the argument of. * @return A pointer to the argument of the option, or NULL if none. */ -static char* -bc_opt_longoptsArg(char* option) +static const char* +bc_opt_longoptsArg(const char* option) { // Find the end or equals sign. for (; *option && *option != '='; ++option) @@ -290,7 +290,7 @@ int bc_opt_parse(BcOpt* o, const BcOptLong* longopts) { size_t i; - char* option; + const char* option; bool empty; // This just eats empty options. @@ -332,7 +332,7 @@ bc_opt_parse(BcOpt* o, const BcOptLong* longopts) // If we have a match... if (bc_opt_longoptsMatch(name, option)) { - char* arg; + const char* arg; // Get the option char and the argument. o->optopt = longopts[i].val; @@ -385,7 +385,7 @@ bc_opt_parse(BcOpt* o, const BcOptLong* longopts) } void -bc_opt_init(BcOpt* o, char* argv[]) +bc_opt_init(BcOpt* o, const char* argv[]) { o->argv = argv; o->optind = 1; diff --git a/src/program.c b/src/program.c index f30be26f214..3b6ebc003a3 100644 --- a/src/program.c +++ b/src/program.c @@ -2803,7 +2803,7 @@ bc_program_insertFunc(BcProgram* p, const char* name) return idx; } -#if BC_DEBUG +#if BC_DEBUG || BC_ENABLE_MEMCHECK void bc_program_free(BcProgram* p) { @@ -2850,7 +2850,7 @@ bc_program_free(BcProgram* p) if (BC_IS_DC) bc_vec_free(&p->tail_calls); #endif // DC_ENABLED } -#endif // BC_DEBUG +#endif // BC_DEBUG || BC_ENABLE_MEMCHECK void bc_program_init(BcProgram* p) @@ -2977,9 +2977,8 @@ bc_program_reset(BcProgram* p) BC_SIG_ASSERT_LOCKED; - // Pop all but the last execution and all results. + // Pop all but the last execution. bc_vec_npop(&p->stack, p->stack.len - 1); - bc_vec_popAll(&p->results); #if DC_ENABLED // We need to pop tail calls too. @@ -2987,6 +2986,12 @@ bc_program_reset(BcProgram* p) #endif // DC_ENABLED #if BC_ENABLED + // Clear the stack if we are in bc. We have to do this in bc because bc's + // stack is implicit. + // + // XXX: We don't do this in dc because other dc implementations don't. + if (BC_IS_BC || !BC_I) bc_vec_popAll(&p->results); + // Clear the globals' stacks. if (BC_G) bc_program_popGlobals(p, true); #endif // BC_ENABLED diff --git a/src/vm.c b/src/vm.c index 1a93e965a3f..636cd4ba0c1 100644 --- a/src/vm.c +++ b/src/vm.c @@ -66,6 +66,9 @@ #if BC_ENABLE_LIBRARY #include #endif // BC_ENABLE_LIBRARY +#if BC_ENABLE_OSSFUZZ +#include +#endif // BC_ENABLE_OSSFUZZ #if !BC_ENABLE_LIBRARY @@ -674,7 +677,7 @@ bc_vm_shutdown(void) #endif // BC_ENABLE_HISTORY #endif // !BC_ENABLE_LIBRARY -#if BC_DEBUG +#if BC_DEBUG || BC_ENABLE_MEMCHECK #if !BC_ENABLE_LIBRARY bc_vec_free(&vm->env_args); free(vm->env_args_buffer); @@ -694,7 +697,7 @@ bc_vm_shutdown(void) #endif // !BC_ENABLE_LIBRARY bc_vm_freeTemps(); -#endif // BC_DEBUG +#endif // BC_DEBUG || BC_ENABLE_MEMCHECK #if !BC_ENABLE_LIBRARY // We always want to flush. @@ -1140,6 +1143,8 @@ bc_vm_file(const char* file) BC_LONGJMP_CONT(vm); } +#if !BC_ENABLE_OSSFUZZ + bool bc_vm_readLine(bool clear) { @@ -1276,6 +1281,8 @@ bc_vm_stdin(void) BC_LONGJMP_CONT(vm); } +#endif // BC_ENABLE_OSSFUZZ + bool bc_vm_readBuf(bool clear) { @@ -1495,6 +1502,8 @@ bc_vm_exec(void) } #endif // BC_ENABLED + assert(!BC_ENABLE_OSSFUZZ || BC_EXPR_EXIT == 0); + // If there are expressions to execute... if (vm->exprs.len) { @@ -1502,7 +1511,11 @@ bc_vm_exec(void) bc_vm_exprs(); // Sometimes, executing expressions means we need to quit. - if (!vm->no_exprs && vm->exit_exprs && BC_EXPR_EXIT) return; + if (vm->status != BC_STATUS_SUCCESS || + (!vm->no_exprs && vm->exit_exprs && BC_EXPR_EXIT)) + { + return; + } } // Process files. @@ -1514,6 +1527,8 @@ bc_vm_exec(void) has_file = true; #endif // DC_ENABLED bc_vm_file(path); + + if (vm->status != BC_STATUS_SUCCESS) return; } #if BC_ENABLE_EXTRA_MATH @@ -1542,12 +1557,25 @@ bc_vm_exec(void) __AFL_INIT(); #endif // BC_ENABLE_AFL +#if BC_ENABLE_OSSFUZZ + + if (BC_VM_RUN_STDIN(has_file)) + { + // XXX: Yes, this is a hack to run the fuzzer for OSS-Fuzz, but it + // works. + bc_vm_load("", (const char*) bc_fuzzer_data); + } + +#else // BC_ENABLE_OSSFUZZ + // Execute from stdin. bc always does. if (BC_VM_RUN_STDIN(has_file)) bc_vm_stdin(); + +#endif // BC_ENABLE_OSSFUZZ } BcStatus -bc_vm_boot(int argc, char* argv[]) +bc_vm_boot(int argc, const char* argv[]) { int ttyin, ttyout, ttyerr; bool tty; @@ -1739,7 +1767,7 @@ bc_vm_boot(int argc, char* argv[]) BC_SIG_LOCK; // Exit. - return bc_vm_atexit((BcStatus) vm->status); + return (BcStatus) vm->status; } #endif // !BC_ENABLE_LIBRARY diff --git a/tests/bc/errors/37.txt b/tests/bc/errors/37.txt new file mode 100644 index 00000000000..e7c504dcdb8 --- /dev/null +++ b/tests/bc/errors/37.txt @@ -0,0 +1,37 @@ +print f +if(6)H +if(6)streafoob#! /q + +define printarray(a[], len) { + + auto i + + for (i = 0; i < len; ++i) { + m[i] + } +} + +define a2(a[], len) { + + auto i + + for (i = 0; i < len; ++i) { + a[i] = a[i] * a[i] + } + + printarray(a[], len) +} +define a1(*a[], len) { + + auto i + + for (i = 0; i < len; ++i) { + a[i] = i + } + + a2(a[], len) + + printarray(a[], len) +} +len = 16 +a1(b[] ++ase^= , len) diff --git a/tests/bc/errors/38.txt b/tests/bc/errors/38.txt new file mode 100644 index 00000000000..b0f9eb22f7a --- /dev/null +++ b/tests/bc/errors/38.txt @@ -0,0 +1,37 @@ +print f +if(6)H +if(6)streafoob#! /q + +define printarray(a[], len) { + + auto i + + for (i = 0; i < len; ++i) { + m[i] + } +} + +define a2(a[], len) { + + auto i + + for (i = 0; i < len; ++i) { + a[i] = a[i] * a[i] + } + + printarray(a[], len) +} +define a1(*a[], len) { + + auto i + + for (i = 0; i < len; ++i) { + a[i] = i + } + + a2(a[], len) + + printarray(a[], len) +} +len = 16 +a1((b[]) + ++ase^= , len) diff --git a/vs/bc.vcxproj b/vs/bc.vcxproj index 377eb8645a7..c98ebc6eee5 100644 --- a/vs/bc.vcxproj +++ b/vs/bc.vcxproj @@ -29,26 +29,26 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode @@ -103,7 +103,7 @@ /std:c17 /MP $(AdditionalOptions) Level3 true - BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BC_ENABLE_OSSFUZZ=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\include MultiThreadedDebug true @@ -125,7 +125,7 @@ true true true - BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BC_ENABLE_OSSFUZZ=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\include MultiThreaded true @@ -147,7 +147,7 @@ /std:c17 /MP $(AdditionalOptions) Level3 true - BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BC_ENABLE_OSSFUZZ=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\include MultiThreadedDebug true @@ -168,7 +168,7 @@ Level3 true true - BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BC_ENABLE_EDITLINE=0;BC_ENABLE_READLINE=0;BC_ENABLE_OSSFUZZ=0;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;BC_DEFAULT_EXPR_EXIT=1;DC_DEFAULT_EXPR_EXIT=1;BC_DEFAULT_DIGIT_CLAMP=1;DC_DEFAULT_DIGIT_CLAMP=1;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) ..\include MultiThreaded true @@ -299,4 +299,4 @@ - + \ No newline at end of file From 1e19146fc7692f59e8dfc5da7957e938cd0b81b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Wed, 28 Aug 2024 18:46:05 +0200 Subject: [PATCH 11/14] vendor/bc: upgrade to version 7.0.1 This update fixes building bc on FreeBSD with non-default compilers (GCC-12, GCC-13). GCC warned about casting argv from non-const to const and since warnings are treated as errors, the build failed. --- NEWS.md | 6 ++++++ include/version.h | 2 +- src/main.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 1775fa0b653..8156b673ce0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,11 @@ # News +## 7.0.1 + +This is a production release that fixes a warning using GCC on FreeBSD. + +Other users do ***NOT*** need to upgrade. + ## 7.0.0 This is a production release to fix three bugs. diff --git a/include/version.h b/include/version.h index 897a19530e3..4d2f6acfb43 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 7.0.0 +#define VERSION 7.0.1 #endif // BC_VERSION_H diff --git a/src/main.c b/src/main.c index e4a1f7399bb..da4c2715602 100644 --- a/src/main.c +++ b/src/main.c @@ -54,7 +54,7 @@ #include int -main(int argc, char* argv[]) +main(int argc, const char* argv[]) { BcStatus s; char* name; From c2c85f88902d18d2e9702381f1628112e15a5c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Wed, 18 Sep 2024 07:55:46 +0200 Subject: [PATCH 12/14] vendor/bc: upgrade to version 7.0.2 This update fixes exiting from an interactive bc session with ^D on FreeBSD and Linux when using editline. This bug was caused by the macOS fix for editline in version 7.0.0, which has been reverted in this version. --- NEWS.md | 8 ++++++++ include/history.h | 24 ++++++++++++++++++++++++ include/version.h | 2 +- manuals/bc/A.1 | 6 +++--- manuals/bc/A.1.md | 4 ++-- manuals/bc/E.1 | 2 +- manuals/bc/EH.1 | 2 +- manuals/bc/EHN.1 | 2 +- manuals/bc/EN.1 | 2 +- manuals/bc/H.1 | 6 +++--- manuals/bc/H.1.md | 4 ++-- manuals/bc/HN.1 | 6 +++--- manuals/bc/HN.1.md | 4 ++-- manuals/bc/N.1 | 6 +++--- manuals/bc/N.1.md | 4 ++-- src/history.c | 13 ++++++++++++- 16 files changed, 69 insertions(+), 26 deletions(-) diff --git a/NEWS.md b/NEWS.md index 8156b673ce0..e3b1f9ecb7b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,13 @@ # News +## 7.0.2 + +This is a production release that fixes `Ctrl+d` on FreeBSD and Linux when using +`editline`. + +This bug was caused by the macOS fix in `7.0.0`. Unfortunately, this means that +macOS does not respond properly to `Ctrl+d`. + ## 7.0.1 This is a production release that fixes a warning using GCC on FreeBSD. diff --git a/include/history.h b/include/history.h index 460524bd7b8..13f6dc6e985 100644 --- a/include/history.h +++ b/include/history.h @@ -120,6 +120,30 @@ typedef struct BcHistory extern const char bc_history_editrc[]; extern const size_t bc_history_editrc_len; +#ifdef __APPLE__ + +/** + * Returns true if the line is a valid line, false otherwise. + * @param line The line. + * @param len The length of the line. + * @return True if the line is valid, false otherwise. + */ +#define BC_HISTORY_INVALID_LINE(line, len) \ + ((line) == NULL && ((len) == -1 || errno == EINTR)) + +#else // __APPLE__ + +/** + * Returns true if the line is a valid line, false otherwise. + * @param line The line. + * @param len The length of the line. + * @return True if the line is valid, false otherwise. + */ +#define BC_HISTORY_INVALID_LINE(line, len) \ + ((line) == NULL && (len) == -1 && errno == EINTR) + +#endif // __APPLE__ + #else // BC_ENABLE_EDITLINE #if BC_ENABLE_READLINE diff --git a/include/version.h b/include/version.h index 4d2f6acfb43..a4fb8def502 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 7.0.1 +#define VERSION 7.0.2 #endif // BC_VERSION_H diff --git a/manuals/bc/A.1 b/manuals/bc/A.1 index 4750598b55f..adeb62f82e6 100644 --- a/manuals/bc/A.1 +++ b/manuals/bc/A.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -1731,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random number between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1740,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo\-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random number that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md index 56f7c52fb2c..e89305b1af4 100644 --- a/manuals/bc/A.1.md +++ b/manuals/bc/A.1.md @@ -1433,7 +1433,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random integer between **0** (inclusive) and **1** +: Generates a pseudo-random number between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1441,7 +1441,7 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random integer that is between **0** (inclusive) and the +: Generates a pseudo-random number that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and diff --git a/manuals/bc/E.1 b/manuals/bc/E.1 index 62b18165fe9..e2f1b034e69 100644 --- a/manuals/bc/E.1 +++ b/manuals/bc/E.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1 index 69f28e87599..c132a0b76a4 100644 --- a/manuals/bc/EH.1 +++ b/manuals/bc/EH.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1 index fb453b05363..e3395b1cc20 100644 --- a/manuals/bc/EHN.1 +++ b/manuals/bc/EHN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1 index 4833e3e70dd..c1ccbec567e 100644 --- a/manuals/bc/EN.1 +++ b/manuals/bc/EN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME diff --git a/manuals/bc/H.1 b/manuals/bc/H.1 index 4787435ae05..9dc46ee50de 100644 --- a/manuals/bc/H.1 +++ b/manuals/bc/H.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -1731,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random number between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1740,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo\-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random number that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md index aa313cd14b6..fbc0658d817 100644 --- a/manuals/bc/H.1.md +++ b/manuals/bc/H.1.md @@ -1433,7 +1433,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random integer between **0** (inclusive) and **1** +: Generates a pseudo-random number between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1441,7 +1441,7 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random integer that is between **0** (inclusive) and the +: Generates a pseudo-random number that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1 index 73c243310d5..7b4577f2dbd 100644 --- a/manuals/bc/HN.1 +++ b/manuals/bc/HN.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -1731,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random number between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1740,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo\-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random number that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md index dc537ffe4cf..015035c14da 100644 --- a/manuals/bc/HN.1.md +++ b/manuals/bc/HN.1.md @@ -1433,7 +1433,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random integer between **0** (inclusive) and **1** +: Generates a pseudo-random number between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1441,7 +1441,7 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random integer that is between **0** (inclusive) and the +: Generates a pseudo-random number that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and diff --git a/manuals/bc/N.1 b/manuals/bc/N.1 index f66ae06d9c3..193e0d15f6f 100644 --- a/manuals/bc/N.1 +++ b/manuals/bc/N.1 @@ -25,7 +25,7 @@ .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE .\" POSSIBILITY OF SUCH DAMAGE. .\" -.TH "BC" "1" "January 2024" "Gavin D. Howard" "General Commands Manual" +.TH "BC" "1" "August 2024" "Gavin D. Howard" "General Commands Manual" .nh .ad l .SH NAME @@ -1731,7 +1731,7 @@ Functions\f[R] subsection below). .RE .TP \f[B]frand(p)\f[R] -Generates a pseudo\-random integer between \f[B]0\f[R] (inclusive) and +Generates a pseudo\-random number between \f[B]0\f[R] (inclusive) and \f[B]1\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. If \f[B]p\f[R] is not \f[B]0\f[R], then calling this function will @@ -1740,7 +1740,7 @@ If \f[B]p\f[R] is \f[B]0\f[R], then \f[B]0\f[R] is returned, and \f[B]seed\f[R] is \f[I]not\f[R] changed. .TP \f[B]ifrand(i, p)\f[R] -Generates a pseudo\-random integer that is between \f[B]0\f[R] +Generates a pseudo\-random number that is between \f[B]0\f[R] (inclusive) and the truncated absolute value of \f[B]i\f[R] (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of \f[B]p\f[R]. diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md index ad1e603392a..859c32e3e77 100644 --- a/manuals/bc/N.1.md +++ b/manuals/bc/N.1.md @@ -1433,7 +1433,7 @@ The extended library is a **non-portable extension**. **frand(p)** -: Generates a pseudo-random integer between **0** (inclusive) and **1** +: Generates a pseudo-random number between **0** (inclusive) and **1** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If **p** is not **0**, then calling this function will change the value of **seed**. If **p** is **0**, @@ -1441,7 +1441,7 @@ The extended library is a **non-portable extension**. **ifrand(i, p)** -: Generates a pseudo-random integer that is between **0** (inclusive) and the +: Generates a pseudo-random number that is between **0** (inclusive) and the truncated absolute value of **i** (exclusive) with the number of decimal digits after the decimal point equal to the truncated absolute value of **p**. If the absolute value of **i** is greater than or equal to **2**, and diff --git a/src/history.c b/src/history.c index 6ae9785d9a7..32a19f71d77 100644 --- a/src/history.c +++ b/src/history.c @@ -264,7 +264,18 @@ bc_history_line(BcHistory* h, BcVec* vec, const char* prompt) errno = EINTR; // Get the line. - while (line == NULL && (len == -1 || errno == EINTR)) + // + // XXX: Why have a macro here? Because macOS needs to be special. Honestly, + // it's starting to feel special like Windows at this point. Anyway, the + // second SIGWINCH signal of multiple will return a valid line length on + // macOS, so we need to allow for that on macOS. However, FreeBSD's editline + // is different and will mess up the terminal if we do it that way. + // + // There is one limitation with this, however: Ctrl+D won't work on macOS. + // But it's because of macOS that this problem exists, and I can't really do + // anything about it. So macOS should fix their broken editline; once they + // do, I'll fix Ctrl+D on macOS. + while (BC_HISTORY_INVALID_LINE(line, len)) { line = el_gets(h->el, &len); bc_history_use_prompt = false; From 5a7f1dde93a4c681a5a4246ddabc562a7f7ce14d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Tue, 24 Sep 2024 23:22:37 +0200 Subject: [PATCH 13/14] vendor/bc: upgrade to version 7.0.3 This version fixes build warnings on other systems than FreeBSD. There are no functional changes relative to the previous version. --- NEWS.md | 6 ++++++ README.md | 3 +++ include/version.h | 2 +- src/file.c | 3 ++- src/program.c | 12 ++++++++---- src/vm.c | 3 ++- 6 files changed, 22 insertions(+), 7 deletions(-) diff --git a/NEWS.md b/NEWS.md index e3b1f9ecb7b..dc2425a532a 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,11 @@ # News +## 7.0.3 + +This is a production release that fixes build warnings on the musl libc. + +Other users do ***NOT*** need to upgrade. + ## 7.0.2 This is a production release that fixes `Ctrl+d` on FreeBSD and Linux when using diff --git a/README.md b/README.md index 696e6186b8b..3b17577945f 100644 --- a/README.md +++ b/README.md @@ -432,6 +432,8 @@ Other projects based on this bc are: * [macOS `bc`][35]. Any bugs in that `bc` should be reported to me, but do expect bugs because the version is old. * [Android Open Source `bc`][32]. Any bugs in that `bc` can be reported here. +* [A Fedora package][36]. If this package does not have any patches, you can + report bugs to me. This is a non-comprehensive list of Linux distros that use this `bc` as the system `bc`: @@ -516,3 +518,4 @@ Folders: [33]: https://github.com/gentoo/gentoo/blob/master/app-alternatives/bc/bc-0.ebuild#L8 [34]: https://www.linuxfromscratch.org/lfs/view/stable/chapter08/bc.html [35]: https://github.com/apple-oss-distributions/bc/tree/main/bc +[36]: https://copr.fedorainfracloud.org/coprs/tkbcopr/bc-gh/ diff --git a/include/version.h b/include/version.h index a4fb8def502..e5c9ea3290e 100644 --- a/include/version.h +++ b/include/version.h @@ -37,6 +37,6 @@ #define BC_VERSION_H /// The current version. -#define VERSION 7.0.2 +#define VERSION 7.0.3 #endif // BC_VERSION_H diff --git a/src/file.c b/src/file.c index 9baea585603..697fca8cf29 100644 --- a/src/file.c +++ b/src/file.c @@ -291,11 +291,12 @@ bc_file_vprintf(BcFile* restrict f, const char* fmt, va_list args) // This mess is to silence a warning. #if BC_CLANG +#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wformat-nonliteral" #endif // BC_CLANG r = vfprintf(f->f, fmt, args); #if BC_CLANG -#pragma clang diagnostic warning "-Wformat-nonliteral" +#pragma clang diagnostic pop #endif // BC_CLANG // Just print and propagate the error. diff --git a/src/program.c b/src/program.c index 3b6ebc003a3..469835d321b 100644 --- a/src/program.c +++ b/src/program.c @@ -3039,10 +3039,12 @@ bc_program_exec(BcProgram* p) #if BC_HAS_COMPUTED_GOTO #if BC_GCC +#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" #endif // BC_GCC #if BC_CLANG +#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu-label-as-value" #endif // BC_CLANG @@ -3050,11 +3052,11 @@ bc_program_exec(BcProgram* p) BC_PROG_LBLS_ASSERT; #if BC_CLANG -#pragma clang diagnostic warning "-Wgnu-label-as-value" +#pragma clang diagnostic pop #endif // BC_CLANG #if BC_GCC -#pragma GCC diagnostic warning "-Wpedantic" +#pragma GCC diagnostic pop #endif // BC_GCC // BC_INST_INVALID is a marker for the end so that we don't have to have an @@ -3085,10 +3087,12 @@ bc_program_exec(BcProgram* p) #if BC_HAS_COMPUTED_GOTO #if BC_GCC +#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" #endif // BC_GCC #if BC_CLANG +#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu-label-as-value" #endif // BC_CLANG @@ -3711,11 +3715,11 @@ bc_program_exec(BcProgram* p) #if BC_HAS_COMPUTED_GOTO #if BC_CLANG -#pragma clang diagnostic warning "-Wgnu-label-as-value" +#pragma clang diagnostic pop #endif // BC_CLANG #if BC_GCC -#pragma GCC diagnostic warning "-Wpedantic" +#pragma GCC diagnostic pop #endif // BC_GCC #else // BC_HAS_COMPUTED_GOTO diff --git a/src/vm.c b/src/vm.c index 636cd4ba0c1..b97fa37623a 100644 --- a/src/vm.c +++ b/src/vm.c @@ -222,11 +222,12 @@ bc_vm_sigaction(void) // This mess is to silence a warning on Clang with regards to glibc's // sigaction handler, which activates the warning here. #if BC_CLANG +#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdisabled-macro-expansion" #endif // BC_CLANG sa.sa_handler = bc_vm_sig; #if BC_CLANG -#pragma clang diagnostic warning "-Wdisabled-macro-expansion" +#pragma clang diagnostic pop #endif // BC_CLANG sigaction(SIGTERM, &sa, NULL); From 682da5a0fdb2c38ecc3951047a882471d62aa1d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Thu, 11 Sep 2025 16:07:46 +0200 Subject: [PATCH 14/14] vendor/bc: upgrade to version 7.1.0 This update fixes a few bugs: - Improper response to double SIGINT with editline. - Not letting libedit handle terminal size changes. - A dc crash from improperly handling an error. - A duplicate check for reference arrays. - Build failures with GCC 15. --- LICENSE.md | 4 +- MAINTENANCE-TERMS.md | 80 + Makefile.in | 283 +- NEWS.md | 17 + NOTICE.md | 2 +- README.md | 18 +- VERSION.txt | 1 + build.gaml | 402 + build.pkg.rig | 2345 +++++ build.rig | 575 ++ compile_flags.txt | 3 + configure.sh | 477 +- gen/bc_help.txt | 4 +- gen/dc_help.txt | 4 +- gen/lib.bc | 2 +- gen/lib2.bc | 115 +- gen/strgen.c | 4 +- gen/strgen.sh | 4 +- include/args.h | 2 +- include/bc.h | 8 +- include/bcl.h | 2 +- include/dc.h | 2 +- include/file.h | 2 +- include/history.h | 26 +- include/lang.h | 6 +- include/lex.h | 2 +- include/library.h | 2 +- include/num.h | 2 +- include/opt.h | 2 +- include/ossfuzz.h | 2 +- include/parse.h | 2 +- include/program.h | 16 +- include/rand.h | 2 +- include/read.h | 2 +- include/status.h | 7 +- include/vector.h | 2 +- include/version.h | 42 - include/vm.h | 3 +- locales/de_DE.ISO8859-1.msg | 2 +- locales/de_DE.UTF-8.msg | 2 +- locales/en_US.msg | 2 +- locales/es_ES.ISO8859-1.msg | 2 +- locales/es_ES.UTF-8.msg | 2 +- locales/fr_FR.ISO8859-1.msg | 2 +- locales/fr_FR.UTF-8.msg | 2 +- locales/ja_JP.UTF-8.msg | 2 +- locales/ja_JP.eucJP.msg | 2 +- locales/nl_NL.ISO8859-1.msg | 2 +- locales/nl_NL.UTF-8.msg | 2 +- locales/pl_PL.ISO8859-2.msg | 2 +- locales/pl_PL.UTF-8.msg | 2 +- locales/pt_PT.ISO8859-1.msg | 2 +- locales/pt_PT.UTF-8.msg | 2 +- locales/ru_RU.CP1251.msg | 2 +- locales/ru_RU.CP866.msg | 2 +- locales/ru_RU.ISO8859-5.msg | 2 +- locales/ru_RU.KOI8-R.msg | 2 +- locales/ru_RU.UTF-8.msg | 2 +- locales/zh_CN.GB18030.msg | 2 +- locales/zh_CN.GB2312.msg | 2 +- locales/zh_CN.GBK.msg | 2 +- locales/zh_CN.UTF-8.msg | 2 +- locales/zh_CN.eucCN.msg | 2 +- manuals/bc/A.1 | 15 +- manuals/bc/A.1.md | 14 +- manuals/bc/E.1 | 4 +- manuals/bc/E.1.md | 4 +- manuals/bc/EH.1 | 4 +- manuals/bc/EH.1.md | 4 +- manuals/bc/EHN.1 | 4 +- manuals/bc/EHN.1.md | 4 +- manuals/bc/EN.1 | 4 +- manuals/bc/EN.1.md | 4 +- manuals/bc/H.1 | 15 +- manuals/bc/H.1.md | 14 +- manuals/bc/HN.1 | 15 +- manuals/bc/HN.1.md | 14 +- manuals/bc/N.1 | 15 +- manuals/bc/N.1.md | 14 +- manuals/bcl.3 | 4 +- manuals/bcl.3.md | 4 +- manuals/build.md | 6 +- manuals/dc/A.1 | 4 +- manuals/dc/A.1.md | 4 +- manuals/dc/E.1 | 4 +- manuals/dc/E.1.md | 4 +- manuals/dc/EH.1 | 4 +- manuals/dc/EH.1.md | 4 +- manuals/dc/EHN.1 | 4 +- manuals/dc/EHN.1.md | 4 +- manuals/dc/EN.1 | 4 +- manuals/dc/EN.1.md | 4 +- manuals/dc/H.1 | 4 +- manuals/dc/H.1.md | 4 +- manuals/dc/HN.1 | 4 +- manuals/dc/HN.1.md | 4 +- manuals/dc/N.1 | 4 +- manuals/dc/N.1.md | 4 +- project/README.md | 32 + project/gitea.db | Bin 0 -> 86016 bytes project/github_issues.json | 3667 ++++++++ project/github_prs.json | 7729 +++++++++++++++++ project/issue10.md | 104 + scripts/exec-install.sh | 2 +- scripts/format.sh | 2 +- scripts/functions.sh | 2 +- scripts/karatsuba.py | 2 +- scripts/link.sh | 2 +- scripts/lint.sh | 2 +- scripts/locale_install.sh | 2 +- scripts/locale_uninstall.sh | 2 +- scripts/os.c | 2 +- scripts/release.pkg.yao | 1410 +++ scripts/sqrt_frac_guess.bc | 2 +- scripts/sqrt_int_guess.bc | 2 +- scripts/sqrt_random.bc | 2 +- scripts/sqrt_random.sh | 2 +- src/args.c | 2 +- src/bc.c | 2 +- src/bc_fuzzer.c | 3 +- src/bc_lex.c | 2 +- src/bc_parse.c | 2 +- src/data.c | 142 +- src/dc.c | 2 +- src/dc_fuzzer.c | 3 +- src/dc_lex.c | 2 +- src/dc_parse.c | 2 +- src/file.c | 2 +- src/history.c | 16 +- src/lang.c | 7 +- src/lex.c | 2 +- src/library.c | 2 +- src/main.c | 3 +- src/num.c | 3 +- src/opt.c | 2 +- src/parse.c | 2 +- src/program.c | 55 +- src/rand.c | 2 +- src/read.c | 23 +- src/vector.c | 2 +- src/vm.c | 32 +- tests/all.sh | 42 +- tests/bc/all.txt | 131 +- tests/bc/errors/39.txt | 1 + tests/bc/lib2.txt | 477 - tests/bc/lib2_a2.txt | 18 + tests/bc/lib2_a2_results.txt | 18 + tests/bc/lib2_bytes.txt | 46 + tests/bc/lib2_bytes_results.txt | 46 + tests/bc/lib2_ceil.txt | 24 + tests/bc/lib2_ceil_results.txt | 24 + tests/bc/lib2_d2r.txt | 16 + tests/bc/lib2_d2r_results.txt | 16 + tests/bc/lib2_fac.txt | 6 + tests/bc/lib2_fac_results.txt | 6 + tests/bc/lib2_gcd.txt | 7 + tests/bc/lib2_gcd_results.txt | 7 + tests/bc/lib2_log.txt | 32 + tests/bc/lib2_log_results.txt | 32 + tests/bc/lib2_p.txt | 4 + tests/bc/lib2_p_results.txt | 5 + tests/bc/lib2_perm.txt | 9 + tests/bc/lib2_perm_results.txt | 8 + tests/bc/lib2_pi.txt | 5 + tests/bc/lib2_pi_results.txt | 6 + tests/bc/lib2_r.txt | 23 + tests/bc/lib2_r2d.txt | 17 + tests/bc/lib2_r2d_results.txt | 16 + tests/bc/lib2_r_results.txt | 23 + tests/bc/lib2_rand.txt | 11 + tests/bc/lib2_rand_results.txt | 7 + tests/bc/lib2_root.txt | 13 + tests/bc/lib2_root_results.txt | 13 + tests/bc/lib2_tan.txt | 30 + tests/bc/lib2_tan_results.txt | 29 + tests/bc/lib2_uint.txt | 218 + ...lib2_results.txt => lib2_uint_results.txt} | 256 - tests/bc/scripts/{add.bc => add_00100.bc} | 2 +- tests/bc/scripts/add_00200.bc | 17 + tests/bc/scripts/add_00300.bc | 17 + tests/bc/scripts/add_00400.bc | 17 + tests/bc/scripts/add_00500.bc | 17 + tests/bc/scripts/add_00600.bc | 17 + tests/bc/scripts/add_00700.bc | 17 + tests/bc/scripts/add_00800.bc | 17 + tests/bc/scripts/add_00900.bc | 17 + tests/bc/scripts/add_01000.bc | 17 + tests/bc/scripts/add_01100.bc | 17 + tests/bc/scripts/add_01200.bc | 17 + tests/bc/scripts/add_01300.bc | 17 + tests/bc/scripts/add_01400.bc | 17 + tests/bc/scripts/add_01500.bc | 17 + tests/bc/scripts/add_01600.bc | 17 + tests/bc/scripts/add_01700.bc | 17 + tests/bc/scripts/add_01800.bc | 17 + tests/bc/scripts/add_01900.bc | 17 + tests/bc/scripts/add_02000.bc | 17 + tests/bc/scripts/add_02100.bc | 17 + tests/bc/scripts/add_02200.bc | 17 + tests/bc/scripts/add_02300.bc | 17 + tests/bc/scripts/add_02400.bc | 17 + tests/bc/scripts/add_02500.bc | 17 + tests/bc/scripts/add_02600.bc | 17 + tests/bc/scripts/add_02700.bc | 17 + tests/bc/scripts/add_02800.bc | 17 + tests/bc/scripts/add_02900.bc | 17 + tests/bc/scripts/add_03000.bc | 17 + tests/bc/scripts/add_03100.bc | 17 + tests/bc/scripts/add_03200.bc | 17 + tests/bc/scripts/add_03300.bc | 17 + tests/bc/scripts/add_03400.bc | 17 + tests/bc/scripts/add_03500.bc | 17 + tests/bc/scripts/add_03600.bc | 17 + tests/bc/scripts/add_03700.bc | 17 + tests/bc/scripts/add_03800.bc | 17 + tests/bc/scripts/add_03900.bc | 17 + tests/bc/scripts/add_04000.bc | 17 + tests/bc/scripts/add_04100.bc | 17 + tests/bc/scripts/add_04200.bc | 17 + tests/bc/scripts/add_04300.bc | 17 + tests/bc/scripts/add_04400.bc | 17 + tests/bc/scripts/add_04500.bc | 17 + tests/bc/scripts/add_04600.bc | 17 + tests/bc/scripts/add_04700.bc | 17 + tests/bc/scripts/add_04800.bc | 17 + tests/bc/scripts/add_04900.bc | 17 + tests/bc/scripts/add_05000.bc | 17 + tests/bc/scripts/add_05100.bc | 17 + tests/bc/scripts/add_05200.bc | 17 + tests/bc/scripts/add_05300.bc | 17 + tests/bc/scripts/add_05400.bc | 17 + tests/bc/scripts/add_05500.bc | 17 + tests/bc/scripts/add_05600.bc | 17 + tests/bc/scripts/add_05700.bc | 17 + tests/bc/scripts/add_05800.bc | 17 + tests/bc/scripts/add_05900.bc | 17 + tests/bc/scripts/add_06000.bc | 17 + tests/bc/scripts/add_06100.bc | 17 + tests/bc/scripts/add_06200.bc | 17 + tests/bc/scripts/add_06300.bc | 17 + tests/bc/scripts/add_06400.bc | 17 + tests/bc/scripts/add_06500.bc | 17 + tests/bc/scripts/add_06600.bc | 17 + tests/bc/scripts/add_06700.bc | 17 + tests/bc/scripts/add_06800.bc | 17 + tests/bc/scripts/add_06900.bc | 17 + tests/bc/scripts/add_07000.bc | 17 + tests/bc/scripts/add_07100.bc | 17 + tests/bc/scripts/add_07200.bc | 17 + tests/bc/scripts/add_07300.bc | 17 + tests/bc/scripts/add_07400.bc | 17 + tests/bc/scripts/add_07500.bc | 17 + tests/bc/scripts/add_07600.bc | 17 + tests/bc/scripts/add_07700.bc | 17 + tests/bc/scripts/add_07800.bc | 17 + tests/bc/scripts/add_07900.bc | 17 + tests/bc/scripts/add_08000.bc | 17 + tests/bc/scripts/add_08100.bc | 17 + tests/bc/scripts/add_08200.bc | 17 + tests/bc/scripts/add_08300.bc | 17 + tests/bc/scripts/add_08400.bc | 17 + tests/bc/scripts/add_08500.bc | 17 + tests/bc/scripts/add_08600.bc | 17 + tests/bc/scripts/add_08700.bc | 17 + tests/bc/scripts/add_08800.bc | 17 + tests/bc/scripts/add_08900.bc | 17 + tests/bc/scripts/add_09000.bc | 17 + tests/bc/scripts/add_09100.bc | 17 + tests/bc/scripts/add_09200.bc | 17 + tests/bc/scripts/add_09300.bc | 17 + tests/bc/scripts/add_09400.bc | 17 + tests/bc/scripts/add_09500.bc | 17 + tests/bc/scripts/add_09600.bc | 17 + tests/bc/scripts/add_09700.bc | 17 + tests/bc/scripts/add_09800.bc | 17 + tests/bc/scripts/add_09900.bc | 17 + tests/bc/scripts/add_10000.bc | 17 + tests/bc/scripts/all.txt | 406 +- .../bc/scripts/{divide.bc => divide_00100.bc} | 2 +- tests/bc/scripts/divide_00200.bc | 23 + tests/bc/scripts/divide_00300.bc | 23 + tests/bc/scripts/divide_00400.bc | 23 + tests/bc/scripts/divide_00500.bc | 23 + tests/bc/scripts/divide_00600.bc | 23 + tests/bc/scripts/divide_00700.bc | 23 + tests/bc/scripts/divide_00800.bc | 23 + tests/bc/scripts/divide_00900.bc | 23 + tests/bc/scripts/divide_01000.bc | 23 + tests/bc/scripts/divide_01100.bc | 23 + tests/bc/scripts/divide_01200.bc | 23 + tests/bc/scripts/divide_01300.bc | 23 + tests/bc/scripts/divide_01400.bc | 23 + tests/bc/scripts/divide_01500.bc | 23 + tests/bc/scripts/divide_01600.bc | 23 + tests/bc/scripts/divide_01700.bc | 23 + tests/bc/scripts/divide_01800.bc | 23 + tests/bc/scripts/divide_01900.bc | 23 + tests/bc/scripts/divide_02000.bc | 23 + tests/bc/scripts/divide_02100.bc | 23 + tests/bc/scripts/divide_02200.bc | 23 + tests/bc/scripts/divide_02300.bc | 23 + tests/bc/scripts/divide_02400.bc | 23 + tests/bc/scripts/divide_02500.bc | 23 + tests/bc/scripts/divide_02600.bc | 23 + tests/bc/scripts/divide_02700.bc | 23 + tests/bc/scripts/divide_02800.bc | 23 + tests/bc/scripts/divide_02900.bc | 23 + tests/bc/scripts/divide_03000.bc | 23 + tests/bc/scripts/divide_03100.bc | 23 + tests/bc/scripts/divide_03200.bc | 23 + tests/bc/scripts/divide_03300.bc | 23 + tests/bc/scripts/divide_03400.bc | 23 + tests/bc/scripts/divide_03500.bc | 23 + tests/bc/scripts/divide_03600.bc | 23 + tests/bc/scripts/divide_03700.bc | 23 + tests/bc/scripts/divide_03800.bc | 23 + tests/bc/scripts/divide_03900.bc | 23 + tests/bc/scripts/divide_04000.bc | 23 + tests/bc/scripts/divide_04100.bc | 23 + tests/bc/scripts/divide_04200.bc | 23 + tests/bc/scripts/divide_04300.bc | 23 + tests/bc/scripts/divide_04400.bc | 23 + tests/bc/scripts/divide_04500.bc | 23 + tests/bc/scripts/divide_04600.bc | 23 + tests/bc/scripts/divide_04700.bc | 23 + tests/bc/scripts/divide_04800.bc | 23 + tests/bc/scripts/divide_04900.bc | 23 + tests/bc/scripts/divide_05000.bc | 23 + tests/bc/scripts/divide_05100.bc | 23 + tests/bc/scripts/divide_05200.bc | 23 + tests/bc/scripts/divide_05300.bc | 23 + tests/bc/scripts/divide_05400.bc | 23 + tests/bc/scripts/divide_05500.bc | 23 + tests/bc/scripts/divide_05600.bc | 23 + tests/bc/scripts/divide_05700.bc | 23 + tests/bc/scripts/divide_05800.bc | 23 + tests/bc/scripts/divide_05900.bc | 23 + tests/bc/scripts/divide_06000.bc | 23 + tests/bc/scripts/divide_06100.bc | 23 + tests/bc/scripts/divide_06200.bc | 23 + tests/bc/scripts/divide_06300.bc | 23 + tests/bc/scripts/divide_06400.bc | 23 + tests/bc/scripts/divide_06500.bc | 23 + tests/bc/scripts/divide_06600.bc | 23 + tests/bc/scripts/divide_06700.bc | 23 + tests/bc/scripts/divide_06800.bc | 23 + tests/bc/scripts/divide_06900.bc | 23 + tests/bc/scripts/divide_07000.bc | 23 + tests/bc/scripts/divide_07100.bc | 23 + tests/bc/scripts/divide_07200.bc | 23 + tests/bc/scripts/divide_07300.bc | 23 + tests/bc/scripts/divide_07400.bc | 23 + tests/bc/scripts/divide_07500.bc | 23 + tests/bc/scripts/divide_07600.bc | 23 + tests/bc/scripts/divide_07700.bc | 23 + tests/bc/scripts/divide_07800.bc | 23 + tests/bc/scripts/divide_07900.bc | 23 + tests/bc/scripts/divide_08000.bc | 23 + tests/bc/scripts/divide_08100.bc | 23 + tests/bc/scripts/divide_08200.bc | 23 + tests/bc/scripts/divide_08300.bc | 23 + tests/bc/scripts/divide_08400.bc | 23 + tests/bc/scripts/divide_08500.bc | 23 + tests/bc/scripts/divide_08600.bc | 23 + tests/bc/scripts/divide_08700.bc | 23 + tests/bc/scripts/divide_08800.bc | 23 + tests/bc/scripts/divide_08900.bc | 23 + tests/bc/scripts/divide_09000.bc | 23 + tests/bc/scripts/divide_09100.bc | 23 + tests/bc/scripts/divide_09200.bc | 23 + tests/bc/scripts/divide_09300.bc | 23 + tests/bc/scripts/divide_09400.bc | 23 + tests/bc/scripts/divide_09500.bc | 23 + tests/bc/scripts/divide_09600.bc | 23 + tests/bc/scripts/divide_09700.bc | 23 + tests/bc/scripts/divide_09800.bc | 23 + tests/bc/scripts/divide_09900.bc | 23 + tests/bc/scripts/divide_10000.bc | 23 + .../{multiply.bc => multiply_00100.bc} | 2 +- tests/bc/scripts/multiply_00200.bc | 20 + tests/bc/scripts/multiply_00300.bc | 20 + tests/bc/scripts/multiply_00400.bc | 20 + tests/bc/scripts/multiply_00500.bc | 20 + tests/bc/scripts/multiply_00600.bc | 20 + tests/bc/scripts/multiply_00700.bc | 20 + tests/bc/scripts/multiply_00800.bc | 20 + tests/bc/scripts/multiply_00900.bc | 20 + tests/bc/scripts/multiply_01000.bc | 20 + tests/bc/scripts/multiply_01100.bc | 20 + tests/bc/scripts/multiply_01200.bc | 20 + tests/bc/scripts/multiply_01300.bc | 20 + tests/bc/scripts/multiply_01400.bc | 20 + tests/bc/scripts/multiply_01500.bc | 20 + tests/bc/scripts/multiply_01600.bc | 20 + tests/bc/scripts/multiply_01700.bc | 20 + tests/bc/scripts/multiply_01800.bc | 20 + tests/bc/scripts/multiply_01900.bc | 20 + tests/bc/scripts/multiply_02000.bc | 20 + tests/bc/scripts/multiply_02100.bc | 20 + tests/bc/scripts/multiply_02200.bc | 20 + tests/bc/scripts/multiply_02300.bc | 20 + tests/bc/scripts/multiply_02400.bc | 20 + tests/bc/scripts/multiply_02500.bc | 20 + tests/bc/scripts/multiply_02600.bc | 20 + tests/bc/scripts/multiply_02700.bc | 20 + tests/bc/scripts/multiply_02800.bc | 20 + tests/bc/scripts/multiply_02900.bc | 20 + tests/bc/scripts/multiply_03000.bc | 20 + tests/bc/scripts/multiply_03100.bc | 20 + tests/bc/scripts/multiply_03200.bc | 20 + tests/bc/scripts/multiply_03300.bc | 20 + tests/bc/scripts/multiply_03400.bc | 20 + tests/bc/scripts/multiply_03500.bc | 20 + tests/bc/scripts/multiply_03600.bc | 20 + tests/bc/scripts/multiply_03700.bc | 20 + tests/bc/scripts/multiply_03800.bc | 20 + tests/bc/scripts/multiply_03900.bc | 20 + tests/bc/scripts/multiply_04000.bc | 20 + tests/bc/scripts/multiply_04100.bc | 20 + tests/bc/scripts/multiply_04200.bc | 20 + tests/bc/scripts/multiply_04300.bc | 20 + tests/bc/scripts/multiply_04400.bc | 20 + tests/bc/scripts/multiply_04500.bc | 20 + tests/bc/scripts/multiply_04600.bc | 20 + tests/bc/scripts/multiply_04700.bc | 20 + tests/bc/scripts/multiply_04800.bc | 20 + tests/bc/scripts/multiply_04900.bc | 20 + tests/bc/scripts/multiply_05000.bc | 20 + tests/bc/scripts/multiply_05100.bc | 20 + tests/bc/scripts/multiply_05200.bc | 20 + tests/bc/scripts/multiply_05300.bc | 20 + tests/bc/scripts/multiply_05400.bc | 20 + tests/bc/scripts/multiply_05500.bc | 20 + tests/bc/scripts/multiply_05600.bc | 20 + tests/bc/scripts/multiply_05700.bc | 20 + tests/bc/scripts/multiply_05800.bc | 20 + tests/bc/scripts/multiply_05900.bc | 20 + tests/bc/scripts/multiply_06000.bc | 20 + tests/bc/scripts/multiply_06100.bc | 20 + tests/bc/scripts/multiply_06200.bc | 20 + tests/bc/scripts/multiply_06300.bc | 20 + tests/bc/scripts/multiply_06400.bc | 20 + tests/bc/scripts/multiply_06500.bc | 20 + tests/bc/scripts/multiply_06600.bc | 20 + tests/bc/scripts/multiply_06700.bc | 20 + tests/bc/scripts/multiply_06800.bc | 20 + tests/bc/scripts/multiply_06900.bc | 20 + tests/bc/scripts/multiply_07000.bc | 20 + tests/bc/scripts/multiply_07100.bc | 20 + tests/bc/scripts/multiply_07200.bc | 20 + tests/bc/scripts/multiply_07300.bc | 20 + tests/bc/scripts/multiply_07400.bc | 20 + tests/bc/scripts/multiply_07500.bc | 20 + tests/bc/scripts/multiply_07600.bc | 20 + tests/bc/scripts/multiply_07700.bc | 20 + tests/bc/scripts/multiply_07800.bc | 20 + tests/bc/scripts/multiply_07900.bc | 20 + tests/bc/scripts/multiply_08000.bc | 20 + tests/bc/scripts/multiply_08100.bc | 20 + tests/bc/scripts/multiply_08200.bc | 20 + tests/bc/scripts/multiply_08300.bc | 20 + tests/bc/scripts/multiply_08400.bc | 20 + tests/bc/scripts/multiply_08500.bc | 20 + tests/bc/scripts/multiply_08600.bc | 20 + tests/bc/scripts/multiply_08700.bc | 20 + tests/bc/scripts/multiply_08800.bc | 20 + tests/bc/scripts/multiply_08900.bc | 20 + tests/bc/scripts/multiply_09000.bc | 20 + tests/bc/scripts/multiply_09100.bc | 20 + tests/bc/scripts/multiply_09200.bc | 20 + tests/bc/scripts/multiply_09300.bc | 20 + tests/bc/scripts/multiply_09400.bc | 20 + tests/bc/scripts/multiply_09500.bc | 20 + tests/bc/scripts/multiply_09600.bc | 20 + tests/bc/scripts/multiply_09700.bc | 20 + tests/bc/scripts/multiply_09800.bc | 20 + tests/bc/scripts/multiply_09900.bc | 20 + tests/bc/scripts/multiply_10000.bc | 20 + tests/bc/scripts/parse.bc | 20 - tests/bc/scripts/parse_02.bc | 19 + tests/bc/scripts/parse_03.bc | 19 + tests/bc/scripts/parse_04.bc | 19 + tests/bc/scripts/parse_05.bc | 19 + tests/bc/scripts/parse_06.bc | 19 + tests/bc/scripts/parse_07.bc | 19 + tests/bc/scripts/parse_08.bc | 19 + tests/bc/scripts/parse_09.bc | 19 + tests/bc/scripts/parse_11.bc | 19 + tests/bc/scripts/parse_12.bc | 19 + tests/bc/scripts/parse_13.bc | 19 + tests/bc/scripts/parse_14.bc | 19 + tests/bc/scripts/parse_15.bc | 19 + tests/bc/scripts/parse_16.bc | 19 + tests/bc/scripts/print.bc | 25 - tests/bc/scripts/print_002.bc | 22 + tests/bc/scripts/print_003.bc | 22 + tests/bc/scripts/print_004.bc | 22 + tests/bc/scripts/print_005.bc | 22 + tests/bc/scripts/print_006.bc | 22 + tests/bc/scripts/print_007.bc | 22 + tests/bc/scripts/print_008.bc | 22 + tests/bc/scripts/print_009.bc | 22 + tests/bc/scripts/print_011.bc | 22 + tests/bc/scripts/print_012.bc | 22 + tests/bc/scripts/print_013.bc | 22 + tests/bc/scripts/print_014.bc | 22 + tests/bc/scripts/print_015.bc | 22 + tests/bc/scripts/print_016.bc | 22 + tests/bc/scripts/print_017.bc | 22 + tests/bc/scripts/print_018.bc | 22 + tests/bc/scripts/print_019.bc | 22 + tests/bc/scripts/print_020.bc | 22 + tests/bc/scripts/print_021.bc | 22 + tests/bc/scripts/print_022.bc | 22 + tests/bc/scripts/print_023.bc | 22 + tests/bc/scripts/print_024.bc | 22 + tests/bc/scripts/print_025.bc | 22 + tests/bc/scripts/print_026.bc | 22 + tests/bc/scripts/print_027.bc | 22 + tests/bc/scripts/print_028.bc | 22 + tests/bc/scripts/print_029.bc | 22 + tests/bc/scripts/print_030.bc | 22 + tests/bc/scripts/print_031.bc | 22 + tests/bc/scripts/print_032.bc | 22 + tests/bc/scripts/print_033.bc | 22 + tests/bc/scripts/print_034.bc | 22 + tests/bc/scripts/print_035.bc | 22 + tests/bc/scripts/print_036.bc | 22 + tests/bc/scripts/print_037.bc | 22 + tests/bc/scripts/print_038.bc | 22 + tests/bc/scripts/print_039.bc | 22 + tests/bc/scripts/print_040.bc | 22 + tests/bc/scripts/print_041.bc | 22 + tests/bc/scripts/print_042.bc | 22 + tests/bc/scripts/print_043.bc | 22 + tests/bc/scripts/print_044.bc | 22 + tests/bc/scripts/print_045.bc | 22 + tests/bc/scripts/print_046.bc | 22 + tests/bc/scripts/print_047.bc | 22 + tests/bc/scripts/print_048.bc | 22 + tests/bc/scripts/print_049.bc | 22 + tests/bc/scripts/print_050.bc | 22 + tests/bc/scripts/print_051.bc | 22 + tests/bc/scripts/print_052.bc | 22 + tests/bc/scripts/print_053.bc | 22 + tests/bc/scripts/print_054.bc | 22 + tests/bc/scripts/print_055.bc | 22 + tests/bc/scripts/print_056.bc | 22 + tests/bc/scripts/print_057.bc | 22 + tests/bc/scripts/print_058.bc | 22 + tests/bc/scripts/print_059.bc | 22 + tests/bc/scripts/print_060.bc | 22 + tests/bc/scripts/print_061.bc | 22 + tests/bc/scripts/print_062.bc | 22 + tests/bc/scripts/print_063.bc | 22 + tests/bc/scripts/print_064.bc | 22 + tests/bc/scripts/print_065.bc | 22 + tests/bc/scripts/print_066.bc | 22 + tests/bc/scripts/print_067.bc | 22 + tests/bc/scripts/print_068.bc | 22 + tests/bc/scripts/print_069.bc | 22 + tests/bc/scripts/print_070.bc | 22 + tests/bc/scripts/print_071.bc | 22 + tests/bc/scripts/print_072.bc | 22 + tests/bc/scripts/print_073.bc | 22 + tests/bc/scripts/print_074.bc | 22 + tests/bc/scripts/print_075.bc | 22 + tests/bc/scripts/print_076.bc | 22 + tests/bc/scripts/print_077.bc | 22 + tests/bc/scripts/print_078.bc | 22 + tests/bc/scripts/print_079.bc | 22 + tests/bc/scripts/print_080.bc | 22 + tests/bc/scripts/print_081.bc | 22 + tests/bc/scripts/print_082.bc | 22 + tests/bc/scripts/print_083.bc | 22 + tests/bc/scripts/print_084.bc | 22 + tests/bc/scripts/print_085.bc | 22 + tests/bc/scripts/print_086.bc | 22 + tests/bc/scripts/print_087.bc | 22 + tests/bc/scripts/print_088.bc | 22 + tests/bc/scripts/print_089.bc | 22 + tests/bc/scripts/print_090.bc | 22 + tests/bc/scripts/print_091.bc | 22 + tests/bc/scripts/print_092.bc | 22 + tests/bc/scripts/print_093.bc | 22 + tests/bc/scripts/print_094.bc | 22 + tests/bc/scripts/print_095.bc | 22 + tests/bc/scripts/print_096.bc | 22 + tests/bc/scripts/print_097.bc | 22 + tests/bc/scripts/print_098.bc | 22 + tests/bc/scripts/print_099.bc | 22 + tests/bc/scripts/print_100.bc | 22 + .../{subtract.bc => subtract_00100.bc} | 2 +- tests/bc/scripts/subtract_00200.bc | 17 + tests/bc/scripts/subtract_00300.bc | 17 + tests/bc/scripts/subtract_00400.bc | 17 + tests/bc/scripts/subtract_00500.bc | 17 + tests/bc/scripts/subtract_00600.bc | 17 + tests/bc/scripts/subtract_00700.bc | 17 + tests/bc/scripts/subtract_00800.bc | 17 + tests/bc/scripts/subtract_00900.bc | 17 + tests/bc/scripts/subtract_01000.bc | 17 + tests/bc/scripts/subtract_01100.bc | 17 + tests/bc/scripts/subtract_01200.bc | 17 + tests/bc/scripts/subtract_01300.bc | 17 + tests/bc/scripts/subtract_01400.bc | 17 + tests/bc/scripts/subtract_01500.bc | 17 + tests/bc/scripts/subtract_01600.bc | 17 + tests/bc/scripts/subtract_01700.bc | 17 + tests/bc/scripts/subtract_01800.bc | 17 + tests/bc/scripts/subtract_01900.bc | 17 + tests/bc/scripts/subtract_02000.bc | 17 + tests/bc/scripts/subtract_02100.bc | 17 + tests/bc/scripts/subtract_02200.bc | 17 + tests/bc/scripts/subtract_02300.bc | 17 + tests/bc/scripts/subtract_02400.bc | 17 + tests/bc/scripts/subtract_02500.bc | 17 + tests/bc/scripts/subtract_02600.bc | 17 + tests/bc/scripts/subtract_02700.bc | 17 + tests/bc/scripts/subtract_02800.bc | 17 + tests/bc/scripts/subtract_02900.bc | 17 + tests/bc/scripts/subtract_03000.bc | 17 + tests/bc/scripts/subtract_03100.bc | 17 + tests/bc/scripts/subtract_03200.bc | 17 + tests/bc/scripts/subtract_03300.bc | 17 + tests/bc/scripts/subtract_03400.bc | 17 + tests/bc/scripts/subtract_03500.bc | 17 + tests/bc/scripts/subtract_03600.bc | 17 + tests/bc/scripts/subtract_03700.bc | 17 + tests/bc/scripts/subtract_03800.bc | 17 + tests/bc/scripts/subtract_03900.bc | 17 + tests/bc/scripts/subtract_04000.bc | 17 + tests/bc/scripts/subtract_04100.bc | 17 + tests/bc/scripts/subtract_04200.bc | 17 + tests/bc/scripts/subtract_04300.bc | 17 + tests/bc/scripts/subtract_04400.bc | 17 + tests/bc/scripts/subtract_04500.bc | 17 + tests/bc/scripts/subtract_04600.bc | 17 + tests/bc/scripts/subtract_04700.bc | 17 + tests/bc/scripts/subtract_04800.bc | 17 + tests/bc/scripts/subtract_04900.bc | 17 + tests/bc/scripts/subtract_05000.bc | 17 + tests/bc/scripts/subtract_05100.bc | 17 + tests/bc/scripts/subtract_05200.bc | 17 + tests/bc/scripts/subtract_05300.bc | 17 + tests/bc/scripts/subtract_05400.bc | 17 + tests/bc/scripts/subtract_05500.bc | 17 + tests/bc/scripts/subtract_05600.bc | 17 + tests/bc/scripts/subtract_05700.bc | 17 + tests/bc/scripts/subtract_05800.bc | 17 + tests/bc/scripts/subtract_05900.bc | 17 + tests/bc/scripts/subtract_06000.bc | 17 + tests/bc/scripts/subtract_06100.bc | 17 + tests/bc/scripts/subtract_06200.bc | 17 + tests/bc/scripts/subtract_06300.bc | 17 + tests/bc/scripts/subtract_06400.bc | 17 + tests/bc/scripts/subtract_06500.bc | 17 + tests/bc/scripts/subtract_06600.bc | 17 + tests/bc/scripts/subtract_06700.bc | 17 + tests/bc/scripts/subtract_06800.bc | 17 + tests/bc/scripts/subtract_06900.bc | 17 + tests/bc/scripts/subtract_07000.bc | 17 + tests/bc/scripts/subtract_07100.bc | 17 + tests/bc/scripts/subtract_07200.bc | 17 + tests/bc/scripts/subtract_07300.bc | 17 + tests/bc/scripts/subtract_07400.bc | 17 + tests/bc/scripts/subtract_07500.bc | 17 + tests/bc/scripts/subtract_07600.bc | 17 + tests/bc/scripts/subtract_07700.bc | 17 + tests/bc/scripts/subtract_07800.bc | 17 + tests/bc/scripts/subtract_07900.bc | 17 + tests/bc/scripts/subtract_08000.bc | 17 + tests/bc/scripts/subtract_08100.bc | 17 + tests/bc/scripts/subtract_08200.bc | 17 + tests/bc/scripts/subtract_08300.bc | 17 + tests/bc/scripts/subtract_08400.bc | 17 + tests/bc/scripts/subtract_08500.bc | 17 + tests/bc/scripts/subtract_08600.bc | 17 + tests/bc/scripts/subtract_08700.bc | 17 + tests/bc/scripts/subtract_08800.bc | 17 + tests/bc/scripts/subtract_08900.bc | 17 + tests/bc/scripts/subtract_09000.bc | 17 + tests/bc/scripts/subtract_09100.bc | 17 + tests/bc/scripts/subtract_09200.bc | 17 + tests/bc/scripts/subtract_09300.bc | 17 + tests/bc/scripts/subtract_09400.bc | 17 + tests/bc/scripts/subtract_09500.bc | 17 + tests/bc/scripts/subtract_09600.bc | 17 + tests/bc/scripts/subtract_09700.bc | 17 + tests/bc/scripts/subtract_09800.bc | 17 + tests/bc/scripts/subtract_09900.bc | 17 + tests/bc/scripts/subtract_10000.bc | 17 + tests/bc/timeconst.sh | 5 +- tests/bcl.c | 2 +- tests/dc/scripts/easter.dc | 49 + tests/dc/scripts/easter.sh | 93 - tests/dc/scripts/easter.txt | 5 + tests/dc/scripts/prime.dc | 2 +- tests/error.sh | 4 +- tests/errors.sh | 4 +- tests/extra_required.txt | 17 +- tests/history.py | 4 +- tests/history.sh | 2 +- tests/other.sh | 593 -- tests/read.sh | 166 - tests/script.sh | 25 +- tests/scripts.sh | 17 +- tests/stdin.sh | 2 +- tests/test.sh | 24 +- vs/bc.vcxproj | 1 - vs/bc.vcxproj.filters | 3 - vs/bcl.vcxproj | 1 - vs/bcl.vcxproj.filters | 3 - 713 files changed, 28196 insertions(+), 3005 deletions(-) create mode 100644 MAINTENANCE-TERMS.md create mode 100644 VERSION.txt create mode 100644 build.gaml create mode 100644 build.pkg.rig create mode 100644 build.rig delete mode 100644 include/version.h create mode 100644 project/README.md create mode 100644 project/gitea.db create mode 100644 project/github_issues.json create mode 100644 project/github_prs.json create mode 100644 project/issue10.md create mode 100644 scripts/release.pkg.yao create mode 100644 tests/bc/errors/39.txt delete mode 100644 tests/bc/lib2.txt create mode 100644 tests/bc/lib2_a2.txt create mode 100644 tests/bc/lib2_a2_results.txt create mode 100644 tests/bc/lib2_bytes.txt create mode 100644 tests/bc/lib2_bytes_results.txt create mode 100644 tests/bc/lib2_ceil.txt create mode 100644 tests/bc/lib2_ceil_results.txt create mode 100644 tests/bc/lib2_d2r.txt create mode 100644 tests/bc/lib2_d2r_results.txt create mode 100644 tests/bc/lib2_fac.txt create mode 100644 tests/bc/lib2_fac_results.txt create mode 100644 tests/bc/lib2_gcd.txt create mode 100644 tests/bc/lib2_gcd_results.txt create mode 100644 tests/bc/lib2_log.txt create mode 100644 tests/bc/lib2_log_results.txt create mode 100644 tests/bc/lib2_p.txt create mode 100644 tests/bc/lib2_p_results.txt create mode 100644 tests/bc/lib2_perm.txt create mode 100644 tests/bc/lib2_perm_results.txt create mode 100644 tests/bc/lib2_pi.txt create mode 100644 tests/bc/lib2_pi_results.txt create mode 100644 tests/bc/lib2_r.txt create mode 100644 tests/bc/lib2_r2d.txt create mode 100644 tests/bc/lib2_r2d_results.txt create mode 100644 tests/bc/lib2_r_results.txt create mode 100644 tests/bc/lib2_rand.txt create mode 100644 tests/bc/lib2_rand_results.txt create mode 100644 tests/bc/lib2_root.txt create mode 100644 tests/bc/lib2_root_results.txt create mode 100644 tests/bc/lib2_tan.txt create mode 100644 tests/bc/lib2_tan_results.txt create mode 100644 tests/bc/lib2_uint.txt rename tests/bc/{lib2_results.txt => lib2_uint_results.txt} (72%) rename tests/bc/scripts/{add.bc => add_00100.bc} (86%) create mode 100644 tests/bc/scripts/add_00200.bc create mode 100644 tests/bc/scripts/add_00300.bc create mode 100644 tests/bc/scripts/add_00400.bc create mode 100644 tests/bc/scripts/add_00500.bc create mode 100644 tests/bc/scripts/add_00600.bc create mode 100644 tests/bc/scripts/add_00700.bc create mode 100644 tests/bc/scripts/add_00800.bc create mode 100644 tests/bc/scripts/add_00900.bc create mode 100644 tests/bc/scripts/add_01000.bc create mode 100644 tests/bc/scripts/add_01100.bc create mode 100644 tests/bc/scripts/add_01200.bc create mode 100644 tests/bc/scripts/add_01300.bc create mode 100644 tests/bc/scripts/add_01400.bc create mode 100644 tests/bc/scripts/add_01500.bc create mode 100644 tests/bc/scripts/add_01600.bc create mode 100644 tests/bc/scripts/add_01700.bc create mode 100644 tests/bc/scripts/add_01800.bc create mode 100644 tests/bc/scripts/add_01900.bc create mode 100644 tests/bc/scripts/add_02000.bc create mode 100644 tests/bc/scripts/add_02100.bc create mode 100644 tests/bc/scripts/add_02200.bc create mode 100644 tests/bc/scripts/add_02300.bc create mode 100644 tests/bc/scripts/add_02400.bc create mode 100644 tests/bc/scripts/add_02500.bc create mode 100644 tests/bc/scripts/add_02600.bc create mode 100644 tests/bc/scripts/add_02700.bc create mode 100644 tests/bc/scripts/add_02800.bc create mode 100644 tests/bc/scripts/add_02900.bc create mode 100644 tests/bc/scripts/add_03000.bc create mode 100644 tests/bc/scripts/add_03100.bc create mode 100644 tests/bc/scripts/add_03200.bc create mode 100644 tests/bc/scripts/add_03300.bc create mode 100644 tests/bc/scripts/add_03400.bc create mode 100644 tests/bc/scripts/add_03500.bc create mode 100644 tests/bc/scripts/add_03600.bc create mode 100644 tests/bc/scripts/add_03700.bc create mode 100644 tests/bc/scripts/add_03800.bc create mode 100644 tests/bc/scripts/add_03900.bc create mode 100644 tests/bc/scripts/add_04000.bc create mode 100644 tests/bc/scripts/add_04100.bc create mode 100644 tests/bc/scripts/add_04200.bc create mode 100644 tests/bc/scripts/add_04300.bc create mode 100644 tests/bc/scripts/add_04400.bc create mode 100644 tests/bc/scripts/add_04500.bc create mode 100644 tests/bc/scripts/add_04600.bc create mode 100644 tests/bc/scripts/add_04700.bc create mode 100644 tests/bc/scripts/add_04800.bc create mode 100644 tests/bc/scripts/add_04900.bc create mode 100644 tests/bc/scripts/add_05000.bc create mode 100644 tests/bc/scripts/add_05100.bc create mode 100644 tests/bc/scripts/add_05200.bc create mode 100644 tests/bc/scripts/add_05300.bc create mode 100644 tests/bc/scripts/add_05400.bc create mode 100644 tests/bc/scripts/add_05500.bc create mode 100644 tests/bc/scripts/add_05600.bc create mode 100644 tests/bc/scripts/add_05700.bc create mode 100644 tests/bc/scripts/add_05800.bc create mode 100644 tests/bc/scripts/add_05900.bc create mode 100644 tests/bc/scripts/add_06000.bc create mode 100644 tests/bc/scripts/add_06100.bc create mode 100644 tests/bc/scripts/add_06200.bc create mode 100644 tests/bc/scripts/add_06300.bc create mode 100644 tests/bc/scripts/add_06400.bc create mode 100644 tests/bc/scripts/add_06500.bc create mode 100644 tests/bc/scripts/add_06600.bc create mode 100644 tests/bc/scripts/add_06700.bc create mode 100644 tests/bc/scripts/add_06800.bc create mode 100644 tests/bc/scripts/add_06900.bc create mode 100644 tests/bc/scripts/add_07000.bc create mode 100644 tests/bc/scripts/add_07100.bc create mode 100644 tests/bc/scripts/add_07200.bc create mode 100644 tests/bc/scripts/add_07300.bc create mode 100644 tests/bc/scripts/add_07400.bc create mode 100644 tests/bc/scripts/add_07500.bc create mode 100644 tests/bc/scripts/add_07600.bc create mode 100644 tests/bc/scripts/add_07700.bc create mode 100644 tests/bc/scripts/add_07800.bc create mode 100644 tests/bc/scripts/add_07900.bc create mode 100644 tests/bc/scripts/add_08000.bc create mode 100644 tests/bc/scripts/add_08100.bc create mode 100644 tests/bc/scripts/add_08200.bc create mode 100644 tests/bc/scripts/add_08300.bc create mode 100644 tests/bc/scripts/add_08400.bc create mode 100644 tests/bc/scripts/add_08500.bc create mode 100644 tests/bc/scripts/add_08600.bc create mode 100644 tests/bc/scripts/add_08700.bc create mode 100644 tests/bc/scripts/add_08800.bc create mode 100644 tests/bc/scripts/add_08900.bc create mode 100644 tests/bc/scripts/add_09000.bc create mode 100644 tests/bc/scripts/add_09100.bc create mode 100644 tests/bc/scripts/add_09200.bc create mode 100644 tests/bc/scripts/add_09300.bc create mode 100644 tests/bc/scripts/add_09400.bc create mode 100644 tests/bc/scripts/add_09500.bc create mode 100644 tests/bc/scripts/add_09600.bc create mode 100644 tests/bc/scripts/add_09700.bc create mode 100644 tests/bc/scripts/add_09800.bc create mode 100644 tests/bc/scripts/add_09900.bc create mode 100644 tests/bc/scripts/add_10000.bc rename tests/bc/scripts/{divide.bc => divide_00100.bc} (90%) create mode 100644 tests/bc/scripts/divide_00200.bc create mode 100644 tests/bc/scripts/divide_00300.bc create mode 100644 tests/bc/scripts/divide_00400.bc create mode 100644 tests/bc/scripts/divide_00500.bc create mode 100644 tests/bc/scripts/divide_00600.bc create mode 100644 tests/bc/scripts/divide_00700.bc create mode 100644 tests/bc/scripts/divide_00800.bc create mode 100644 tests/bc/scripts/divide_00900.bc create mode 100644 tests/bc/scripts/divide_01000.bc create mode 100644 tests/bc/scripts/divide_01100.bc create mode 100644 tests/bc/scripts/divide_01200.bc create mode 100644 tests/bc/scripts/divide_01300.bc create mode 100644 tests/bc/scripts/divide_01400.bc create mode 100644 tests/bc/scripts/divide_01500.bc create mode 100644 tests/bc/scripts/divide_01600.bc create mode 100644 tests/bc/scripts/divide_01700.bc create mode 100644 tests/bc/scripts/divide_01800.bc create mode 100644 tests/bc/scripts/divide_01900.bc create mode 100644 tests/bc/scripts/divide_02000.bc create mode 100644 tests/bc/scripts/divide_02100.bc create mode 100644 tests/bc/scripts/divide_02200.bc create mode 100644 tests/bc/scripts/divide_02300.bc create mode 100644 tests/bc/scripts/divide_02400.bc create mode 100644 tests/bc/scripts/divide_02500.bc create mode 100644 tests/bc/scripts/divide_02600.bc create mode 100644 tests/bc/scripts/divide_02700.bc create mode 100644 tests/bc/scripts/divide_02800.bc create mode 100644 tests/bc/scripts/divide_02900.bc create mode 100644 tests/bc/scripts/divide_03000.bc create mode 100644 tests/bc/scripts/divide_03100.bc create mode 100644 tests/bc/scripts/divide_03200.bc create mode 100644 tests/bc/scripts/divide_03300.bc create mode 100644 tests/bc/scripts/divide_03400.bc create mode 100644 tests/bc/scripts/divide_03500.bc create mode 100644 tests/bc/scripts/divide_03600.bc create mode 100644 tests/bc/scripts/divide_03700.bc create mode 100644 tests/bc/scripts/divide_03800.bc create mode 100644 tests/bc/scripts/divide_03900.bc create mode 100644 tests/bc/scripts/divide_04000.bc create mode 100644 tests/bc/scripts/divide_04100.bc create mode 100644 tests/bc/scripts/divide_04200.bc create mode 100644 tests/bc/scripts/divide_04300.bc create mode 100644 tests/bc/scripts/divide_04400.bc create mode 100644 tests/bc/scripts/divide_04500.bc create mode 100644 tests/bc/scripts/divide_04600.bc create mode 100644 tests/bc/scripts/divide_04700.bc create mode 100644 tests/bc/scripts/divide_04800.bc create mode 100644 tests/bc/scripts/divide_04900.bc create mode 100644 tests/bc/scripts/divide_05000.bc create mode 100644 tests/bc/scripts/divide_05100.bc create mode 100644 tests/bc/scripts/divide_05200.bc create mode 100644 tests/bc/scripts/divide_05300.bc create mode 100644 tests/bc/scripts/divide_05400.bc create mode 100644 tests/bc/scripts/divide_05500.bc create mode 100644 tests/bc/scripts/divide_05600.bc create mode 100644 tests/bc/scripts/divide_05700.bc create mode 100644 tests/bc/scripts/divide_05800.bc create mode 100644 tests/bc/scripts/divide_05900.bc create mode 100644 tests/bc/scripts/divide_06000.bc create mode 100644 tests/bc/scripts/divide_06100.bc create mode 100644 tests/bc/scripts/divide_06200.bc create mode 100644 tests/bc/scripts/divide_06300.bc create mode 100644 tests/bc/scripts/divide_06400.bc create mode 100644 tests/bc/scripts/divide_06500.bc create mode 100644 tests/bc/scripts/divide_06600.bc create mode 100644 tests/bc/scripts/divide_06700.bc create mode 100644 tests/bc/scripts/divide_06800.bc create mode 100644 tests/bc/scripts/divide_06900.bc create mode 100644 tests/bc/scripts/divide_07000.bc create mode 100644 tests/bc/scripts/divide_07100.bc create mode 100644 tests/bc/scripts/divide_07200.bc create mode 100644 tests/bc/scripts/divide_07300.bc create mode 100644 tests/bc/scripts/divide_07400.bc create mode 100644 tests/bc/scripts/divide_07500.bc create mode 100644 tests/bc/scripts/divide_07600.bc create mode 100644 tests/bc/scripts/divide_07700.bc create mode 100644 tests/bc/scripts/divide_07800.bc create mode 100644 tests/bc/scripts/divide_07900.bc create mode 100644 tests/bc/scripts/divide_08000.bc create mode 100644 tests/bc/scripts/divide_08100.bc create mode 100644 tests/bc/scripts/divide_08200.bc create mode 100644 tests/bc/scripts/divide_08300.bc create mode 100644 tests/bc/scripts/divide_08400.bc create mode 100644 tests/bc/scripts/divide_08500.bc create mode 100644 tests/bc/scripts/divide_08600.bc create mode 100644 tests/bc/scripts/divide_08700.bc create mode 100644 tests/bc/scripts/divide_08800.bc create mode 100644 tests/bc/scripts/divide_08900.bc create mode 100644 tests/bc/scripts/divide_09000.bc create mode 100644 tests/bc/scripts/divide_09100.bc create mode 100644 tests/bc/scripts/divide_09200.bc create mode 100644 tests/bc/scripts/divide_09300.bc create mode 100644 tests/bc/scripts/divide_09400.bc create mode 100644 tests/bc/scripts/divide_09500.bc create mode 100644 tests/bc/scripts/divide_09600.bc create mode 100644 tests/bc/scripts/divide_09700.bc create mode 100644 tests/bc/scripts/divide_09800.bc create mode 100644 tests/bc/scripts/divide_09900.bc create mode 100644 tests/bc/scripts/divide_10000.bc rename tests/bc/scripts/{multiply.bc => multiply_00100.bc} (89%) create mode 100644 tests/bc/scripts/multiply_00200.bc create mode 100644 tests/bc/scripts/multiply_00300.bc create mode 100644 tests/bc/scripts/multiply_00400.bc create mode 100644 tests/bc/scripts/multiply_00500.bc create mode 100644 tests/bc/scripts/multiply_00600.bc create mode 100644 tests/bc/scripts/multiply_00700.bc create mode 100644 tests/bc/scripts/multiply_00800.bc create mode 100644 tests/bc/scripts/multiply_00900.bc create mode 100644 tests/bc/scripts/multiply_01000.bc create mode 100644 tests/bc/scripts/multiply_01100.bc create mode 100644 tests/bc/scripts/multiply_01200.bc create mode 100644 tests/bc/scripts/multiply_01300.bc create mode 100644 tests/bc/scripts/multiply_01400.bc create mode 100644 tests/bc/scripts/multiply_01500.bc create mode 100644 tests/bc/scripts/multiply_01600.bc create mode 100644 tests/bc/scripts/multiply_01700.bc create mode 100644 tests/bc/scripts/multiply_01800.bc create mode 100644 tests/bc/scripts/multiply_01900.bc create mode 100644 tests/bc/scripts/multiply_02000.bc create mode 100644 tests/bc/scripts/multiply_02100.bc create mode 100644 tests/bc/scripts/multiply_02200.bc create mode 100644 tests/bc/scripts/multiply_02300.bc create mode 100644 tests/bc/scripts/multiply_02400.bc create mode 100644 tests/bc/scripts/multiply_02500.bc create mode 100644 tests/bc/scripts/multiply_02600.bc create mode 100644 tests/bc/scripts/multiply_02700.bc create mode 100644 tests/bc/scripts/multiply_02800.bc create mode 100644 tests/bc/scripts/multiply_02900.bc create mode 100644 tests/bc/scripts/multiply_03000.bc create mode 100644 tests/bc/scripts/multiply_03100.bc create mode 100644 tests/bc/scripts/multiply_03200.bc create mode 100644 tests/bc/scripts/multiply_03300.bc create mode 100644 tests/bc/scripts/multiply_03400.bc create mode 100644 tests/bc/scripts/multiply_03500.bc create mode 100644 tests/bc/scripts/multiply_03600.bc create mode 100644 tests/bc/scripts/multiply_03700.bc create mode 100644 tests/bc/scripts/multiply_03800.bc create mode 100644 tests/bc/scripts/multiply_03900.bc create mode 100644 tests/bc/scripts/multiply_04000.bc create mode 100644 tests/bc/scripts/multiply_04100.bc create mode 100644 tests/bc/scripts/multiply_04200.bc create mode 100644 tests/bc/scripts/multiply_04300.bc create mode 100644 tests/bc/scripts/multiply_04400.bc create mode 100644 tests/bc/scripts/multiply_04500.bc create mode 100644 tests/bc/scripts/multiply_04600.bc create mode 100644 tests/bc/scripts/multiply_04700.bc create mode 100644 tests/bc/scripts/multiply_04800.bc create mode 100644 tests/bc/scripts/multiply_04900.bc create mode 100644 tests/bc/scripts/multiply_05000.bc create mode 100644 tests/bc/scripts/multiply_05100.bc create mode 100644 tests/bc/scripts/multiply_05200.bc create mode 100644 tests/bc/scripts/multiply_05300.bc create mode 100644 tests/bc/scripts/multiply_05400.bc create mode 100644 tests/bc/scripts/multiply_05500.bc create mode 100644 tests/bc/scripts/multiply_05600.bc create mode 100644 tests/bc/scripts/multiply_05700.bc create mode 100644 tests/bc/scripts/multiply_05800.bc create mode 100644 tests/bc/scripts/multiply_05900.bc create mode 100644 tests/bc/scripts/multiply_06000.bc create mode 100644 tests/bc/scripts/multiply_06100.bc create mode 100644 tests/bc/scripts/multiply_06200.bc create mode 100644 tests/bc/scripts/multiply_06300.bc create mode 100644 tests/bc/scripts/multiply_06400.bc create mode 100644 tests/bc/scripts/multiply_06500.bc create mode 100644 tests/bc/scripts/multiply_06600.bc create mode 100644 tests/bc/scripts/multiply_06700.bc create mode 100644 tests/bc/scripts/multiply_06800.bc create mode 100644 tests/bc/scripts/multiply_06900.bc create mode 100644 tests/bc/scripts/multiply_07000.bc create mode 100644 tests/bc/scripts/multiply_07100.bc create mode 100644 tests/bc/scripts/multiply_07200.bc create mode 100644 tests/bc/scripts/multiply_07300.bc create mode 100644 tests/bc/scripts/multiply_07400.bc create mode 100644 tests/bc/scripts/multiply_07500.bc create mode 100644 tests/bc/scripts/multiply_07600.bc create mode 100644 tests/bc/scripts/multiply_07700.bc create mode 100644 tests/bc/scripts/multiply_07800.bc create mode 100644 tests/bc/scripts/multiply_07900.bc create mode 100644 tests/bc/scripts/multiply_08000.bc create mode 100644 tests/bc/scripts/multiply_08100.bc create mode 100644 tests/bc/scripts/multiply_08200.bc create mode 100644 tests/bc/scripts/multiply_08300.bc create mode 100644 tests/bc/scripts/multiply_08400.bc create mode 100644 tests/bc/scripts/multiply_08500.bc create mode 100644 tests/bc/scripts/multiply_08600.bc create mode 100644 tests/bc/scripts/multiply_08700.bc create mode 100644 tests/bc/scripts/multiply_08800.bc create mode 100644 tests/bc/scripts/multiply_08900.bc create mode 100644 tests/bc/scripts/multiply_09000.bc create mode 100644 tests/bc/scripts/multiply_09100.bc create mode 100644 tests/bc/scripts/multiply_09200.bc create mode 100644 tests/bc/scripts/multiply_09300.bc create mode 100644 tests/bc/scripts/multiply_09400.bc create mode 100644 tests/bc/scripts/multiply_09500.bc create mode 100644 tests/bc/scripts/multiply_09600.bc create mode 100644 tests/bc/scripts/multiply_09700.bc create mode 100644 tests/bc/scripts/multiply_09800.bc create mode 100644 tests/bc/scripts/multiply_09900.bc create mode 100644 tests/bc/scripts/multiply_10000.bc delete mode 100644 tests/bc/scripts/parse.bc create mode 100644 tests/bc/scripts/parse_02.bc create mode 100644 tests/bc/scripts/parse_03.bc create mode 100644 tests/bc/scripts/parse_04.bc create mode 100644 tests/bc/scripts/parse_05.bc create mode 100644 tests/bc/scripts/parse_06.bc create mode 100644 tests/bc/scripts/parse_07.bc create mode 100644 tests/bc/scripts/parse_08.bc create mode 100644 tests/bc/scripts/parse_09.bc create mode 100644 tests/bc/scripts/parse_11.bc create mode 100644 tests/bc/scripts/parse_12.bc create mode 100644 tests/bc/scripts/parse_13.bc create mode 100644 tests/bc/scripts/parse_14.bc create mode 100644 tests/bc/scripts/parse_15.bc create mode 100644 tests/bc/scripts/parse_16.bc delete mode 100644 tests/bc/scripts/print.bc create mode 100644 tests/bc/scripts/print_002.bc create mode 100644 tests/bc/scripts/print_003.bc create mode 100644 tests/bc/scripts/print_004.bc create mode 100644 tests/bc/scripts/print_005.bc create mode 100644 tests/bc/scripts/print_006.bc create mode 100644 tests/bc/scripts/print_007.bc create mode 100644 tests/bc/scripts/print_008.bc create mode 100644 tests/bc/scripts/print_009.bc create mode 100644 tests/bc/scripts/print_011.bc create mode 100644 tests/bc/scripts/print_012.bc create mode 100644 tests/bc/scripts/print_013.bc create mode 100644 tests/bc/scripts/print_014.bc create mode 100644 tests/bc/scripts/print_015.bc create mode 100644 tests/bc/scripts/print_016.bc create mode 100644 tests/bc/scripts/print_017.bc create mode 100644 tests/bc/scripts/print_018.bc create mode 100644 tests/bc/scripts/print_019.bc create mode 100644 tests/bc/scripts/print_020.bc create mode 100644 tests/bc/scripts/print_021.bc create mode 100644 tests/bc/scripts/print_022.bc create mode 100644 tests/bc/scripts/print_023.bc create mode 100644 tests/bc/scripts/print_024.bc create mode 100644 tests/bc/scripts/print_025.bc create mode 100644 tests/bc/scripts/print_026.bc create mode 100644 tests/bc/scripts/print_027.bc create mode 100644 tests/bc/scripts/print_028.bc create mode 100644 tests/bc/scripts/print_029.bc create mode 100644 tests/bc/scripts/print_030.bc create mode 100644 tests/bc/scripts/print_031.bc create mode 100644 tests/bc/scripts/print_032.bc create mode 100644 tests/bc/scripts/print_033.bc create mode 100644 tests/bc/scripts/print_034.bc create mode 100644 tests/bc/scripts/print_035.bc create mode 100644 tests/bc/scripts/print_036.bc create mode 100644 tests/bc/scripts/print_037.bc create mode 100644 tests/bc/scripts/print_038.bc create mode 100644 tests/bc/scripts/print_039.bc create mode 100644 tests/bc/scripts/print_040.bc create mode 100644 tests/bc/scripts/print_041.bc create mode 100644 tests/bc/scripts/print_042.bc create mode 100644 tests/bc/scripts/print_043.bc create mode 100644 tests/bc/scripts/print_044.bc create mode 100644 tests/bc/scripts/print_045.bc create mode 100644 tests/bc/scripts/print_046.bc create mode 100644 tests/bc/scripts/print_047.bc create mode 100644 tests/bc/scripts/print_048.bc create mode 100644 tests/bc/scripts/print_049.bc create mode 100644 tests/bc/scripts/print_050.bc create mode 100644 tests/bc/scripts/print_051.bc create mode 100644 tests/bc/scripts/print_052.bc create mode 100644 tests/bc/scripts/print_053.bc create mode 100644 tests/bc/scripts/print_054.bc create mode 100644 tests/bc/scripts/print_055.bc create mode 100644 tests/bc/scripts/print_056.bc create mode 100644 tests/bc/scripts/print_057.bc create mode 100644 tests/bc/scripts/print_058.bc create mode 100644 tests/bc/scripts/print_059.bc create mode 100644 tests/bc/scripts/print_060.bc create mode 100644 tests/bc/scripts/print_061.bc create mode 100644 tests/bc/scripts/print_062.bc create mode 100644 tests/bc/scripts/print_063.bc create mode 100644 tests/bc/scripts/print_064.bc create mode 100644 tests/bc/scripts/print_065.bc create mode 100644 tests/bc/scripts/print_066.bc create mode 100644 tests/bc/scripts/print_067.bc create mode 100644 tests/bc/scripts/print_068.bc create mode 100644 tests/bc/scripts/print_069.bc create mode 100644 tests/bc/scripts/print_070.bc create mode 100644 tests/bc/scripts/print_071.bc create mode 100644 tests/bc/scripts/print_072.bc create mode 100644 tests/bc/scripts/print_073.bc create mode 100644 tests/bc/scripts/print_074.bc create mode 100644 tests/bc/scripts/print_075.bc create mode 100644 tests/bc/scripts/print_076.bc create mode 100644 tests/bc/scripts/print_077.bc create mode 100644 tests/bc/scripts/print_078.bc create mode 100644 tests/bc/scripts/print_079.bc create mode 100644 tests/bc/scripts/print_080.bc create mode 100644 tests/bc/scripts/print_081.bc create mode 100644 tests/bc/scripts/print_082.bc create mode 100644 tests/bc/scripts/print_083.bc create mode 100644 tests/bc/scripts/print_084.bc create mode 100644 tests/bc/scripts/print_085.bc create mode 100644 tests/bc/scripts/print_086.bc create mode 100644 tests/bc/scripts/print_087.bc create mode 100644 tests/bc/scripts/print_088.bc create mode 100644 tests/bc/scripts/print_089.bc create mode 100644 tests/bc/scripts/print_090.bc create mode 100644 tests/bc/scripts/print_091.bc create mode 100644 tests/bc/scripts/print_092.bc create mode 100644 tests/bc/scripts/print_093.bc create mode 100644 tests/bc/scripts/print_094.bc create mode 100644 tests/bc/scripts/print_095.bc create mode 100644 tests/bc/scripts/print_096.bc create mode 100644 tests/bc/scripts/print_097.bc create mode 100644 tests/bc/scripts/print_098.bc create mode 100644 tests/bc/scripts/print_099.bc create mode 100644 tests/bc/scripts/print_100.bc rename tests/bc/scripts/{subtract.bc => subtract_00100.bc} (86%) create mode 100644 tests/bc/scripts/subtract_00200.bc create mode 100644 tests/bc/scripts/subtract_00300.bc create mode 100644 tests/bc/scripts/subtract_00400.bc create mode 100644 tests/bc/scripts/subtract_00500.bc create mode 100644 tests/bc/scripts/subtract_00600.bc create mode 100644 tests/bc/scripts/subtract_00700.bc create mode 100644 tests/bc/scripts/subtract_00800.bc create mode 100644 tests/bc/scripts/subtract_00900.bc create mode 100644 tests/bc/scripts/subtract_01000.bc create mode 100644 tests/bc/scripts/subtract_01100.bc create mode 100644 tests/bc/scripts/subtract_01200.bc create mode 100644 tests/bc/scripts/subtract_01300.bc create mode 100644 tests/bc/scripts/subtract_01400.bc create mode 100644 tests/bc/scripts/subtract_01500.bc create mode 100644 tests/bc/scripts/subtract_01600.bc create mode 100644 tests/bc/scripts/subtract_01700.bc create mode 100644 tests/bc/scripts/subtract_01800.bc create mode 100644 tests/bc/scripts/subtract_01900.bc create mode 100644 tests/bc/scripts/subtract_02000.bc create mode 100644 tests/bc/scripts/subtract_02100.bc create mode 100644 tests/bc/scripts/subtract_02200.bc create mode 100644 tests/bc/scripts/subtract_02300.bc create mode 100644 tests/bc/scripts/subtract_02400.bc create mode 100644 tests/bc/scripts/subtract_02500.bc create mode 100644 tests/bc/scripts/subtract_02600.bc create mode 100644 tests/bc/scripts/subtract_02700.bc create mode 100644 tests/bc/scripts/subtract_02800.bc create mode 100644 tests/bc/scripts/subtract_02900.bc create mode 100644 tests/bc/scripts/subtract_03000.bc create mode 100644 tests/bc/scripts/subtract_03100.bc create mode 100644 tests/bc/scripts/subtract_03200.bc create mode 100644 tests/bc/scripts/subtract_03300.bc create mode 100644 tests/bc/scripts/subtract_03400.bc create mode 100644 tests/bc/scripts/subtract_03500.bc create mode 100644 tests/bc/scripts/subtract_03600.bc create mode 100644 tests/bc/scripts/subtract_03700.bc create mode 100644 tests/bc/scripts/subtract_03800.bc create mode 100644 tests/bc/scripts/subtract_03900.bc create mode 100644 tests/bc/scripts/subtract_04000.bc create mode 100644 tests/bc/scripts/subtract_04100.bc create mode 100644 tests/bc/scripts/subtract_04200.bc create mode 100644 tests/bc/scripts/subtract_04300.bc create mode 100644 tests/bc/scripts/subtract_04400.bc create mode 100644 tests/bc/scripts/subtract_04500.bc create mode 100644 tests/bc/scripts/subtract_04600.bc create mode 100644 tests/bc/scripts/subtract_04700.bc create mode 100644 tests/bc/scripts/subtract_04800.bc create mode 100644 tests/bc/scripts/subtract_04900.bc create mode 100644 tests/bc/scripts/subtract_05000.bc create mode 100644 tests/bc/scripts/subtract_05100.bc create mode 100644 tests/bc/scripts/subtract_05200.bc create mode 100644 tests/bc/scripts/subtract_05300.bc create mode 100644 tests/bc/scripts/subtract_05400.bc create mode 100644 tests/bc/scripts/subtract_05500.bc create mode 100644 tests/bc/scripts/subtract_05600.bc create mode 100644 tests/bc/scripts/subtract_05700.bc create mode 100644 tests/bc/scripts/subtract_05800.bc create mode 100644 tests/bc/scripts/subtract_05900.bc create mode 100644 tests/bc/scripts/subtract_06000.bc create mode 100644 tests/bc/scripts/subtract_06100.bc create mode 100644 tests/bc/scripts/subtract_06200.bc create mode 100644 tests/bc/scripts/subtract_06300.bc create mode 100644 tests/bc/scripts/subtract_06400.bc create mode 100644 tests/bc/scripts/subtract_06500.bc create mode 100644 tests/bc/scripts/subtract_06600.bc create mode 100644 tests/bc/scripts/subtract_06700.bc create mode 100644 tests/bc/scripts/subtract_06800.bc create mode 100644 tests/bc/scripts/subtract_06900.bc create mode 100644 tests/bc/scripts/subtract_07000.bc create mode 100644 tests/bc/scripts/subtract_07100.bc create mode 100644 tests/bc/scripts/subtract_07200.bc create mode 100644 tests/bc/scripts/subtract_07300.bc create mode 100644 tests/bc/scripts/subtract_07400.bc create mode 100644 tests/bc/scripts/subtract_07500.bc create mode 100644 tests/bc/scripts/subtract_07600.bc create mode 100644 tests/bc/scripts/subtract_07700.bc create mode 100644 tests/bc/scripts/subtract_07800.bc create mode 100644 tests/bc/scripts/subtract_07900.bc create mode 100644 tests/bc/scripts/subtract_08000.bc create mode 100644 tests/bc/scripts/subtract_08100.bc create mode 100644 tests/bc/scripts/subtract_08200.bc create mode 100644 tests/bc/scripts/subtract_08300.bc create mode 100644 tests/bc/scripts/subtract_08400.bc create mode 100644 tests/bc/scripts/subtract_08500.bc create mode 100644 tests/bc/scripts/subtract_08600.bc create mode 100644 tests/bc/scripts/subtract_08700.bc create mode 100644 tests/bc/scripts/subtract_08800.bc create mode 100644 tests/bc/scripts/subtract_08900.bc create mode 100644 tests/bc/scripts/subtract_09000.bc create mode 100644 tests/bc/scripts/subtract_09100.bc create mode 100644 tests/bc/scripts/subtract_09200.bc create mode 100644 tests/bc/scripts/subtract_09300.bc create mode 100644 tests/bc/scripts/subtract_09400.bc create mode 100644 tests/bc/scripts/subtract_09500.bc create mode 100644 tests/bc/scripts/subtract_09600.bc create mode 100644 tests/bc/scripts/subtract_09700.bc create mode 100644 tests/bc/scripts/subtract_09800.bc create mode 100644 tests/bc/scripts/subtract_09900.bc create mode 100644 tests/bc/scripts/subtract_10000.bc create mode 100644 tests/dc/scripts/easter.dc delete mode 100755 tests/dc/scripts/easter.sh create mode 100644 tests/dc/scripts/easter.txt delete mode 100755 tests/other.sh delete mode 100755 tests/read.sh diff --git a/LICENSE.md b/LICENSE.md index c8f6758e6d4..e5d44dee6da 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ # License -Copyright (c) 2018-2024 Gavin D. Howard +Copyright (c) 2018-2025 Gavin D. Howard Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -60,7 +60,7 @@ The files `src/rand.c` and `include/rand.h` are under the following copyrights and license: Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors
-Copyright (c) 2018-2024 Gavin D. Howard +Copyright (c) 2018-2025 Gavin D. Howard Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in diff --git a/MAINTENANCE-TERMS.md b/MAINTENANCE-TERMS.md new file mode 100644 index 00000000000..ef24202cc6c --- /dev/null +++ b/MAINTENANCE-TERMS.md @@ -0,0 +1,80 @@ +# Maintenance Terms + +> Last Updated: 27 June 2025 + +The code, text, and other materials in this repository are provided as-is under +the terms of the repository's [`LICENSE.md`][0] file, as a gift to the commons +and the common good. In providing this software as-is, its author(s) admit no +further obligations from anyone using the software for any reason, particularly +with respect to: + +* Releases, +* Response time, +* Change review and integration, +* Disclosure schedules, +* Discretionary, proprietary or otherwise secretive communications, and +* Any other non-contractual obligations or conventions, regardless of their + presumed urgency or severity. + +Should anyone wish to make a contract with me (Gavin Howard) to ensure that work +he or she deems critical gets done, the terms are as follows: + +* Compute time will be charged at \$25/hr. +* My time will be charged at \$100/hr. +* All issues deemed critical by either me or the requester, that also change the + source code (anything in `gen`, `include`, or `src`) will require at least two + weeks of fuzzing without error. + * If errors are found, those hours will still be charged on top of the final + two weeks. +* All changes will require running the [release script][2] on Linux (GCC), Linux + (Clang), FreeBSD, OpenBSD, macOS, Windows. +* Any hours spent on bugs or code that have been, or are suspected to have been, + generated by "AI" will be charged double rates. + +Compute time includes, but is not limited to: + +* Fuzzing. +* Running my [release script][2]. +* Running tests and my [release script][2] on macOS. + +My time includes, but is not limited to: + +* Code review. +* Reading bug reports. +* Design. +* Coding. +* Any compute time that interferes with my ability to do any other work: + * Fuzzing makes my computer unusable, so fuzzing for the 8-12 hours of the + day that I could be working will be charged at \$100/hr. + * Same with running my [release script][2] because I run two instances on my + machine and two in VMs at the same time. + * Running my [release script][2] or any other compute time on Windows + because Windows blocks me from doing my main work on Linux. + * Any other instances of blocking compute time. + +All amounts will be billed by, and paid to, [Yzena, LLC][2]. Invoices will be +provided, including line items for what each hour was spent on. + +It is suggested that the following amounts be budgeted: + +* At least \$3000 for a non-critical issue or change. + + The release script takes about 10 hours, and I would need to run it once on + Linux (and others at the same time) and once on Windows, which is 20 hours. + Most of that won't be at the \$100/hr rate, but some probably will be. Then + an extra \$1000 for other work. + +* At least \$15,000 for a critical issue or change. + + The \$3000 above is the start, which leaves \$12,000. Fuzzing is expected to + cost \$11,400 (6 days a week, 8 hours a day, at \$100, the rest at \$25), and + rounded up to \$12,000 for good measure. + +--- + +This document is inspired by [Mike Hoye's Maintenance Terms][1]. + +[0]: LICENSE.md +[1]: https://github.com/mhoye/maintenance-terms +[2]: scripts/release.sh +[3]: https://yzena.com/ diff --git a/Makefile.in b/Makefile.in index c63dc242e79..f8b120c1328 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,7 +1,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -38,6 +38,8 @@ GENDIR = $(ROOTDIR)/gen BUILDDIR = %%BUILDDIR%% +VERSION = %%VERSION%% + SRC = %%SRC%% OBJ = %%OBJ%% GCDA = %%GCDA%% @@ -99,17 +101,16 @@ BC_FUZZER_C = $(BIN)/$(BC)_fuzzer_C DC_FUZZER = $(BIN)/$(DC)_fuzzer_c DC_FUZZER_C = $(BIN)/$(DC)_fuzzer_C -BC_TEST_OUTPUTS = tests/bc_outputs BC_FUZZ_OUTPUTS = tests/fuzzing/bc_outputs1 tests/fuzzing/bc_outputs2 tests/fuzzing/bc_outputs3 -DC_TEST_OUTPUTS = tests/dc_outputs DC_FUZZ_OUTPUTS = tests/fuzzing/dc_outputs LIB = libbcl LIB_NAME = $(LIB).a LIBBC = $(BIN)/$(LIB_NAME) BCL = bcl -BCL_TEST = $(BIN)/$(BCL) -BCL_TEST_C = $(TESTSDIR)/$(BCL).c + +GENERATE_TESTS = %%GENERATE_TESTS%% +PROBLEMATIC_TESTS = %%PROBLEMATIC_TESTS%% MANUALS = manuals BC_MANPAGE_NAME = $(EXEC_PREFIX)$(BC)$(EXEC_SUFFIX).1 @@ -152,11 +153,11 @@ BC_ENABLE_EXTRA_MATH = %%EXTRA_MATH%% BC_ENABLE_NLS = %%NLS%% BC_EXCLUDE_EXTRA_MATH = %%EXCLUDE_EXTRA_MATH%% -BC_ENABLE_AFL = %%FUZZ%% -BC_ENABLE_OSSFUZZ = %%OSSFUZZ%% -BC_ENABLE_MEMCHECK = %%MEMCHECK%% +BC_ENABLE_AFL = 0 +BC_ENABLE_OSSFUZZ = 0 +BC_ENABLE_MEMCHECK = 0 -LIB_FUZZING_ENGINE = %%LIB_FUZZING_ENGINE%% +LIB_FUZZING_ENGINE = 0 BC_DEFAULT_BANNER = %%BC_DEFAULT_BANNER%% BC_DEFAULT_SIGINT_RESET = %%BC_DEFAULT_SIGINT_RESET%% @@ -189,10 +190,6 @@ KARATSUBA = $(SCRIPTSDIR)/karatsuba.py LOCALE_INSTALL = $(SCRIPTSDIR)/locale_install.sh LOCALE_UNINSTALL = $(SCRIPTSDIR)/locale_uninstall.sh -VALGRIND_ARGS = --error-exitcode=100 --leak-check=full --show-leak-kinds=all --errors-for-leak-kinds=all - -TEST_STARS = *********************************************************************** - BC_NUM_KARATSUBA_LEN = %%KARATSUBA_LEN%% BC_DEFS0 = -DBC_DEFAULT_BANNER=$(BC_DEFAULT_BANNER) @@ -218,7 +215,7 @@ CPPFLAGS6 = $(CPPFLAGS5) -DBC_ENABLE_NLS=$(BC_ENABLE_NLS) CPPFLAGS7 = $(CPPFLAGS6) -D$(BC_ENABLE_EXTRA_MATH_NAME)=$(BC_ENABLE_EXTRA_MATH) CPPFLAGS8 = $(CPPFLAGS7) -DBC_ENABLE_HISTORY=$(BC_ENABLE_HISTORY) -DBC_ENABLE_LIBRARY=$(BC_ENABLE_LIBRARY) CPPFLAGS9 = $(CPPFLAGS8) -DBC_ENABLE_MEMCHECK=$(BC_ENABLE_MEMCHECK) -DBC_ENABLE_AFL=$(BC_ENABLE_AFL) -CPPFLAGS = $(CPPFLAGS9) -DBC_ENABLE_OSSFUZZ=$(BC_ENABLE_OSSFUZZ) +CPPFLAGS = -DVERSION=$(VERSION) $(CPPFLAGS9) -DBC_ENABLE_OSSFUZZ=$(BC_ENABLE_OSSFUZZ) CFLAGS = $(CPPFLAGS) $(BC_DEFS) $(DC_DEFS) %%CPPFLAGS%% %%CFLAGS%% LDFLAGS = %%LDFLAGS%% @@ -293,236 +290,10 @@ help: @printf ' check alias for `make test`\n' @printf ' clean removes all build files\n' @printf ' clean_config removes all build files as well as the generated Makefile\n' - @printf ' clean_tests removes all build files, the generated Makefile,\n' - @printf ' and generated tests\n' @printf ' install installs binaries to "%s%s"\n' "$(DESTDIR)" "$(BINDIR)" @printf ' and (if enabled) manpages to "%s%s"\n' "$(DESTDIR)" "$(MAN1DIR)" - @printf ' karatsuba runs the karatsuba script (requires Python 3)\n' - @printf ' karatsuba_test runs the karatsuba script while running tests\n' - @printf ' (requires Python 3)\n' @printf ' uninstall uninstalls binaries from "%s%s"\n' "$(DESTDIR)" "$(BINDIR)" @printf ' and (if enabled) manpages from "%s%s"\n' "$(DESTDIR)" "$(MAN1DIR)" - @printf ' test runs the test suite\n' - @printf ' test_bc runs the bc test suite, if bc has been built\n' - @printf ' test_dc runs the dc test suite, if dc has been built\n' - @printf ' time_test runs the test suite, displaying times for some things\n' - @printf ' time_test_bc runs the bc test suite, displaying times for some things\n' - @printf ' time_test_dc runs the dc test suite, displaying times for some things\n' - @printf ' timeconst runs the test on the Linux timeconst.bc script,\n' - @printf ' if it exists and bc has been built\n' - -run_all_tests: bc_all_tests timeconst_all_tests dc_all_tests - -run_all_tests_np: bc_all_tests_np timeconst_all_tests dc_all_tests_np - -bc_all_tests: - %%BC_ALL_TESTS%% - -bc_all_tests_np: - %%BC_ALL_TESTS_NP%% - -timeconst_all_tests: - %%TIMECONST_ALL_TESTS%% - -dc_all_tests: - %%DC_ALL_TESTS%% - -dc_all_tests_np: - %%DC_ALL_TESTS_NP%% - -history_all_tests: - %%HISTORY_TESTS%% - -check: test - -test: %%TESTS%% - -test_bc: test_bc_header test_bc_tests test_bc_scripts test_bc_errors test_bc_stdin test_bc_read test_bc_other - @printf '\nAll bc tests passed.\n\n$(TEST_STARS)\n' - -test_bc_tests:%%BC_TESTS%% - -test_bc_scripts:%%BC_SCRIPT_TESTS%% - -test_bc_stdin: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/stdin.sh bc %%BC_TEST_EXEC%% - -test_bc_read: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/read.sh bc %%BC_TEST_EXEC%% - -test_bc_errors: test_bc_error_lines%%BC_ERROR_TESTS%% - -test_bc_error_lines: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/errors.sh bc %%BC_TEST_EXEC%% - -test_bc_other: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/other.sh bc $(BC_ENABLE_EXTRA_MATH) %%BC_TEST_EXEC%% - -test_bc_header: - @printf '$(TEST_STARS)\n\nRunning bc tests...\n\n' - -test_dc: test_dc_header test_dc_tests test_dc_scripts test_dc_errors test_dc_stdin test_dc_read test_dc_other - @printf '\nAll dc tests passed.\n\n$(TEST_STARS)\n' - -test_dc_tests:%%DC_TESTS%% - -test_dc_scripts:%%DC_SCRIPT_TESTS%% - -test_dc_stdin: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/stdin.sh dc %%DC_TEST_EXEC%% - -test_dc_read: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/read.sh dc %%DC_TEST_EXEC%% - -test_dc_errors: test_dc_error_lines%%DC_ERROR_TESTS%% - -test_dc_error_lines: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/errors.sh dc %%DC_TEST_EXEC%% - -test_dc_other: - @export BC_TEST_OUTPUT_DIR="$(BUILDDIR)/tests"; sh $(TESTSDIR)/other.sh dc $(BC_ENABLE_EXTRA_MATH) %%DC_TEST_EXEC%% - -test_dc_header: - @printf '$(TEST_STARS)\n\nRunning dc tests...\n\n' - -timeconst: - %%TIMECONST%% - -test_history: test_history_header test_bc_history test_dc_history - @printf '\nAll history tests passed.\n\n$(TEST_STARS)\n' - -test_bc_history:%%BC_HISTORY_TEST_PREREQS%% - -test_bc_history_all: test_bc_history0 test_bc_history1 test_bc_history2 test_bc_history3 test_bc_history4 test_bc_history5 test_bc_history6 test_bc_history7 test_bc_history8 test_bc_history9 test_bc_history10 test_bc_history11 test_bc_history12 test_bc_history13 test_bc_history14 test_bc_history15 test_bc_history16 test_bc_history17 test_bc_history18 test_bc_history19 test_bc_history20 test_bc_history21 - -test_bc_history_skip: - @printf 'No bc history tests to run\n' - -test_bc_history0: - @sh $(TESTSDIR)/history.sh bc 0 %%BC_TEST_EXEC%% - -test_bc_history1: - @sh $(TESTSDIR)/history.sh bc 1 %%BC_TEST_EXEC%% - -test_bc_history2: - @sh $(TESTSDIR)/history.sh bc 2 %%BC_TEST_EXEC%% - -test_bc_history3: - @sh $(TESTSDIR)/history.sh bc 3 %%BC_TEST_EXEC%% - -test_bc_history4: - @sh $(TESTSDIR)/history.sh bc 4 %%BC_TEST_EXEC%% - -test_bc_history5: - @sh $(TESTSDIR)/history.sh bc 5 %%BC_TEST_EXEC%% - -test_bc_history6: - @sh $(TESTSDIR)/history.sh bc 6 %%BC_TEST_EXEC%% - -test_bc_history7: - @sh $(TESTSDIR)/history.sh bc 7 %%BC_TEST_EXEC%% - -test_bc_history8: - @sh $(TESTSDIR)/history.sh bc 8 %%BC_TEST_EXEC%% - -test_bc_history9: - @sh $(TESTSDIR)/history.sh bc 9 %%BC_TEST_EXEC%% - -test_bc_history10: - @sh $(TESTSDIR)/history.sh bc 10 %%BC_TEST_EXEC%% - -test_bc_history11: - @sh $(TESTSDIR)/history.sh bc 11 %%BC_TEST_EXEC%% - -test_bc_history12: - @sh $(TESTSDIR)/history.sh bc 12 %%BC_TEST_EXEC%% - -test_bc_history13: - @sh $(TESTSDIR)/history.sh bc 13 %%BC_TEST_EXEC%% - -test_bc_history14: - @sh $(TESTSDIR)/history.sh bc 14 %%BC_TEST_EXEC%% - -test_bc_history15: - @sh $(TESTSDIR)/history.sh bc 15 %%BC_TEST_EXEC%% - -test_bc_history16: - @sh $(TESTSDIR)/history.sh bc 16 %%BC_TEST_EXEC%% - -test_bc_history17: - @sh $(TESTSDIR)/history.sh bc 17 %%BC_TEST_EXEC%% - -test_bc_history18: - @sh $(TESTSDIR)/history.sh bc 18 %%BC_TEST_EXEC%% - -test_bc_history19: - @sh $(TESTSDIR)/history.sh bc 19 %%BC_TEST_EXEC%% - -test_bc_history20: - @sh $(TESTSDIR)/history.sh bc 20 %%BC_TEST_EXEC%% - -test_bc_history21: - @sh $(TESTSDIR)/history.sh bc 21 %%BC_TEST_EXEC%% - -test_dc_history:%%DC_HISTORY_TEST_PREREQS%% - -test_dc_history_all: test_dc_history0 test_dc_history1 test_dc_history2 test_dc_history3 test_dc_history4 test_dc_history5 test_dc_history6 test_dc_history7 test_dc_history8 test_dc_history9 test_dc_history10 - -test_dc_history_skip: - @printf 'No dc history tests to run\n' - -test_dc_history0: - @sh $(TESTSDIR)/history.sh dc 0 %%DC_TEST_EXEC%% - -test_dc_history1: - @sh $(TESTSDIR)/history.sh dc 1 %%DC_TEST_EXEC%% - -test_dc_history2: - @sh $(TESTSDIR)/history.sh dc 2 %%DC_TEST_EXEC%% - -test_dc_history3: - @sh $(TESTSDIR)/history.sh dc 3 %%DC_TEST_EXEC%% - -test_dc_history4: - @sh $(TESTSDIR)/history.sh dc 4 %%DC_TEST_EXEC%% - -test_dc_history5: - @sh $(TESTSDIR)/history.sh dc 5 %%DC_TEST_EXEC%% - -test_dc_history6: - @sh $(TESTSDIR)/history.sh dc 6 %%DC_TEST_EXEC%% - -test_dc_history7: - @sh $(TESTSDIR)/history.sh dc 7 %%DC_TEST_EXEC%% - -test_dc_history8: - @sh $(TESTSDIR)/history.sh dc 8 %%DC_TEST_EXEC%% - -test_dc_history9: - @sh $(TESTSDIR)/history.sh dc 9 %%DC_TEST_EXEC%% - -test_dc_history10: - @sh $(TESTSDIR)/history.sh dc 10 %%DC_TEST_EXEC%% - -test_history_header: - @printf '$(TEST_STARS)\n\nRunning history tests...\n\n' - -library_test: $(LIBBC) - $(CC) $(CFLAGS) -lpthread $(BCL_TEST_C) $(LIBBC) -o $(BCL_TEST) - -test_library: library_test - %%BCL_TEST_EXEC%% - -karatsuba: - %%KARATSUBA%% - -karatsuba_test: - %%KARATSUBA_TEST%% - -coverage_output: - %%COVERAGE_OUTPUT%% - -coverage:%%COVERAGE_PREREQS%% manpages: $(MANPAGE) bc @@ -559,37 +330,25 @@ clean_config: clean clean_benchmarks @$(RM) -f compile_commands.json @$(RM) -f $(BCL_PC) -clean_coverage: - @printf 'Cleaning coverage files...\n' - @$(RM) -f *.gcov - @$(RM) -f *.html *.css - @$(RM) -f *.gcda *.gcno - @$(RM) -f *.profraw - @$(RM) -f $(GCDA) $(GCNO) - @$(RM) -f $(BC_GCDA) $(BC_GCNO) - @$(RM) -f $(DC_GCDA) $(DC_GCNO) - @$(RM) -f $(HISTORY_GCDA) $(HISTORY_GCNO) - @$(RM) -f $(RAND_GCDA) $(RAND_GCNO) - @$(RM) -f $(BC_LIB_GCDA) $(BC_LIB_GCNO) - @$(RM) -f $(BC_LIB2_GCDA) $(BC_LIB2_GCNO) - @$(RM) -f $(BC_HELP_GCDA) $(BC_HELP_GCNO) - @$(RM) -f $(DC_HELP_GCDA) $(DC_HELP_GCNO) +test: + @if [ $(BC_ENABLED) -ne 0 ]; then $(TESTSDIR)/all.sh -n bc $(BC_ENABLE_EXTRA_MATH) 1 $(GENERATE_TESTS) $(PROBLEMATIC_TESTS) $(BC_EXEC); fi + @if [ $(DC_ENABLED) -ne 0 ]; then $(TESTSDIR)/all.sh -n dc $(BC_ENABLE_EXTRA_MATH) 1 $(GENERATE_TESTS) $(PROBLEMATIC_TESTS) $(DC_EXEC); fi -clean_tests: clean clean_config clean_coverage +clean_tests: clean clean_config @printf 'Cleaning test files...\n' @$(RM) -fr $(BC_TEST_OUTPUTS) $(DC_TEST_OUTPUTS) @$(RM) -fr $(BC_FUZZ_OUTPUTS) $(DC_FUZZ_OUTPUTS) - @$(RM) -f $(TESTSDIR)/bc/parse.txt $(TESTSDIR)/bc/parse_results.txt - @$(RM) -f $(TESTSDIR)/bc/print.txt $(TESTSDIR)/bc/print_results.txt + @$(RM) -f $(TESTSDIR)/bc/parse_*.txt $(TESTSDIR)/bc/parse_*_results.txt + @$(RM) -f $(TESTSDIR)/bc/print_*.txt $(TESTSDIR)/bc/print_*_results.txt @$(RM) -f $(TESTSDIR)/bc/bessel.txt $(TESTSDIR)/bc/bessel_results.txt @$(RM) -f $(TESTSDIR)/bc/strings2.txt $(TESTSDIR)/bc/strings2_results.txt @$(RM) -f $(TESTSDIR)/bc/scripts/bessel.txt @$(RM) -f $(TESTSDIR)/bc/scripts/parse.txt @$(RM) -f $(TESTSDIR)/bc/scripts/print.txt - @$(RM) -f $(TESTSDIR)/bc/scripts/add.txt - @$(RM) -f $(TESTSDIR)/bc/scripts/divide.txt - @$(RM) -f $(TESTSDIR)/bc/scripts/multiply.txt - @$(RM) -f $(TESTSDIR)/bc/scripts/subtract.txt + @$(RM) -f $(TESTSDIR)/bc/scripts/add_*.txt + @$(RM) -f $(TESTSDIR)/bc/scripts/divide_*.txt + @$(RM) -f $(TESTSDIR)/bc/scripts/multiply_*.txt + @$(RM) -f $(TESTSDIR)/bc/scripts/subtract_*.txt @$(RM) -f $(TESTSDIR)/bc/scripts/strings2.txt @$(RM) -f $(TESTSDIR)/dc/scripts/prime.txt @$(RM) -f .log_*.txt diff --git a/NEWS.md b/NEWS.md index dc2425a532a..72a276b8c01 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,21 @@ # News +## 7.1.0 + +This is an ***UNTESTED*** release. If you would like testing, see the +[maintenance terms][23]. + +This fixes a few bugs: + +* Improper response to double `SIGINT` with editline. +* Not letting `libedit` handle terminal size changes. +* A `dc` crash from improperly handling an error. +* A duplicate check for reference arrays. +* Build failures with GCC 15. + +It also has a performance increase in the `band()` function and others in the +math library. + ## 7.0.3 This is a production release that fixes build warnings on the musl libc. @@ -1594,3 +1610,4 @@ not thoroughly tested. [20]: https://github.com/apjanke/ronn-ng [21]: https://pandoc.org/ [22]: ./scripts/locale_uninstall.sh +[23]: ./MAINTENANCE-TERMS.md diff --git a/NOTICE.md b/NOTICE.md index 35536b2c27d..c3c211a9230 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -1,6 +1,6 @@ # Notice -Copyright 2018-2024 Gavin D. Howard and contributors. +Copyright 2018-2025 Gavin D. Howard and contributors. ## Contributors diff --git a/README.md b/README.md index 3b17577945f..a203386f3b6 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ # `bc` -***WARNING: New user registration for is disabled -because of spam. If you need to report a bug with `bc`, email gavin at this site -minus the `git.` part for an account, and I will create one for you. Or you can -report an issue at [GitHub][29].*** +***WARNING: This project has moved back to GitHub temporarily; self-hosted Git +forges are not working for me, so I am trying to replace them.*** ***WARNING: This project has moved to [https://git.gavinhoward.com/][20] for [these reasons][21], though GitHub will remain a mirror.*** @@ -282,6 +280,12 @@ The easiest way to run this script is with `make karatsuba`. If desired, maintainers can also skip running this script because there is a sane default for the Karatsuba number. +##### `timeconst.bc` + +The test suite will print a warning in normal usage. The warning is about a +missing `timeconst.bc`. This file [comes from][37] the [Linux kernel][38], which +has an incompatible license. The warning can be ignored. + ## Status This `bc` is robust. @@ -471,12 +475,16 @@ Files: .gitignore The git ignore file (maintainer use only). .gitattributes The git attributes file (maintainer use only). bcl.pc.in A template pkg-config file for bcl. + build.gaml The GAML file with options for building under Rig. + build.pkg.rig The Rig build package file. + build.rig The Rig build script. configure A symlink to configure.sh to make packaging easier. configure.sh The configure script. LICENSE.md A Markdown form of the BSD 2-clause License. Makefile.in The Makefile template. NEWS.md The changelog. NOTICE.md List of contributors and copyright owners. + VERSION.txt A file containing the version. Folders: @@ -519,3 +527,5 @@ Folders: [34]: https://www.linuxfromscratch.org/lfs/view/stable/chapter08/bc.html [35]: https://github.com/apple-oss-distributions/bc/tree/main/bc [36]: https://copr.fedorainfracloud.org/coprs/tkbcopr/bc-gh/ +[37]: https://github.com/torvalds/linux/blob/master/kernel/time/timeconst.bc +[38]: https://github.com/torvalds/linux diff --git a/VERSION.txt b/VERSION.txt new file mode 100644 index 00000000000..a3fcc7121bb --- /dev/null +++ b/VERSION.txt @@ -0,0 +1 @@ +7.1.0 diff --git a/build.gaml b/build.gaml new file mode 100644 index 00000000000..b8ce873835b --- /dev/null +++ b/build.gaml @@ -0,0 +1,402 @@ +/* + * ***************************************************************************** + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * ***************************************************************************** + * + * The build options file. + * + */ + +project: @com.gavinhoward.bc + +language: @C11 + +version: { + min: @24.04.05 +} + +mode: { + language: @iterative + stampers: @metadata + dependencies: @dynamic +} + +default_target: @all + +presets: { + debug: { + debug: true + optimization: "0" + memcheck: true + devtools: true + strip: false + } + release: { + optimization: "3" + lto: true + } + // This is the predefined build for BSDs. + bsd: { + optimization: "3" + history: @editline + generated_tests: false + install_manpages: false + install_locales: @system + strip: true + bc_default_banner: false + bc_default_sigint_reset: true + dc_default_sigint_reset: true + bc_default_tty_mode: true + dc_default_tty_mode: false + bc_default_prompt: @off + dc_default_prompt: @off + bc_default_expr_exit: true + dc_default_expr_exit: true + bc_default_digit_clamp: false + dc_default_digit_clamp: false + } + // This is the predefined build to match the GNU bc/dc. + gnu: { + optimization: "3" + generated_tests: false + install_manpages: true + install_locales: @system + strip: true + bc_default_banner: true + bc_default_sigint_reset: true + dc_default_sigint_reset: false + bc_default_tty_mode: true + dc_default_tty_mode: false + bc_default_prompt: @tty_mode + dc_default_prompt: @tty_mode + bc_default_expr_exit: true + dc_default_expr_exit: true + bc_default_digit_clamp: false + dc_default_digit_clamp: false + } + // This is the preferred release build of the author, Gavin D. Howard. + gdh: { + optimization: "3" + install_manpages: true + install_locales: @none + bc/default_banner: true + bc/default_sigint_reset: true + dc/default_sigint_reset: true + bc/default_tty_mode: true + dc/default_tty_mode: true + bc/default_prompt: @tty_mode + dc/default_prompt: @tty_mode + bc/default_expr_exit: false + dc/default_expr_exit: false + bc/default_digit_clamp: true + dc/default_digit_clamp: true + } + // This is the preferred debug build of the author, Gavin D. Howard. + dbg: { + optimization: "0" + debug: true + strip: false + install_manpages: true + install_locales: @system + bc/default_banner: true + bc/default_sigint_reset: true + dc/default_sigint_reset: true + bc/default_tty_mode: true + dc/default_tty_mode: true + bc/default_prompt: @tty_mode + dc/default_prompt: @tty_mode + bc/default_expr_exit: false + dc/default_expr_exit: false + bc/default_digit_clamp: true + dc/default_digit_clamp: true + } +} + +default_development: @debug +default_release: @release + +options: { + build_mode: { + type: @option + options: [ + @both + @bc + @dc + @library + ] + default: @both + desc: "Which of the executables or library to build." + } + extra_math: { + type: @bool + default: true + desc: "Enable the extra math extensions." + } + history: { + type: @option + options: [ + @none + @builtin + @editline + @readline + ] + default: @builtin + desc: "Which history implementation should be used, if any." + } + locales: { + type: @option + options: [ + @none + @system + @all + ] + default: @system + desc: "Whether to disable locales, use just the system ones, or use all (for building a package)." + } + bc/default_banner: { + type: @bool + default: false + desc: "Whether to display the bc version banner by default when in interactive mode." + } + bc/default_sigint_reset: { + type: @bool + default: true + desc: "Whether SIGINT will reset bc by default, instead of exiting, when in interactive mode." + } + dc/default_sigint_reset: { + type: @bool + default: true + desc: "Whether SIGINT will reset dc by default, instead of exiting, when in interactive mode." + } + bc/default_tty_mode: { + type: @bool + default: true + desc: "Whether TTY mode for bc should be on by default when available." + } + dc/default_tty_mode: { + type: @bool + default: false + desc: "Whether TTY mode for dc should be on by default when available." + } + bc/default_prompt: { + type: @option + options: [ + @off + @tty_mode + @on + ] + default: @tty_mode + desc: "Whether the prompt for bc should be on by default in TTY mode. This defaults to match TTY mode." + } + dc/default_prompt: { + type: @option + options: [ + @off + @tty_mode + @on + ] + default: @tty_mode + desc: "Whether the prompt for dc should be on by default in TTY mode. This defaults to match TTY mode." + } + bc/default_expr_exit: { + type: @bool + default: true + desc: "Whether to exit bc by default if an expression or expression file is given with the -e or -f options." + } + dc/default_expr_exit: { + type: @bool + default: true + desc: "Whether to exit dc by default if an expression or expression file is given with the -e or -f options." + } + bc/default_digit_clamp: { + type: @bool + default: false + desc: "Whether to have bc, by default, clamp digits that are greater than or equal to the current ibase when parsing numbers." + } + dc/default_digit_clamp: { + type: @bool + default: false + desc: "Whether to have dc, by default, clamp digits that are greater than or equal to the current ibase when parsing numbers." + } + karatsuba_len: { + type: @num + default: 32 + desc: "Set the Karatsuba length (default is 32). Must be a number and greater than or equal to 16." + } + execprefix: { + type: @string + default: "" + desc: "The prefix to prepend to the executable names, to prevent collisions." + } + execsuffix: { + type: @string + default: "" + desc: "The suffix to append to the executable names, to prevent collisions." + } + debug: { + type: @bool + default: false + desc: "Enable debug info." + } + optimization: { + type: @string + default: "0" + desc: "The optimization level for the C compiler." + } + lto: { + type: @bool + default: false + desc: "Build with link-time optimization, if available." + } + strip: { + type: @bool + default: true + desc: "Strip any binaries." + } + strict: { + type: @bool + default: true + desc: "Build with strict compiler options." + } + force: { + type: @bool + default: false + desc: "Force options that don't work. THIS IS FOR DEV ONLY!" + } + memcheck: { + type: @bool + default: false + desc: "Enable memcheck mode, to check for memory leaks." + } + valgrind: { + type: @bool + default: false + desc: "Enable Valgrind mode, to check for memory bugs." + } + afl: { + type: @bool + default: false + desc: "Enable AFL++ mode." + } + ossfuzz: { + type: @bool + default: false + desc: "Enable OSSFUZZ mode." + } + generated_tests: { + type: @bool + default: true + desc: "Enable tests generated from a GNU bc-compatible program." + } + problematic_tests: { + type: @bool + default: true + desc: "Enable tests that may be problematic." + } + coverage: { + type: @bool + default: false + desc: "Enable code coverage (only works on GCC)." + } + install_manpages: { + type: @bool + default: true + desc: "Whether to install manpages or not." + } + cflags: { + type: @list + default: [] + desc: "The command-line flags for the C compiler." + } + ldflags: { + type: @list + default: [] + desc: "The command-line flags for the C linker." + } + destdir: { + type: @path + default: "" + desc: "The equivalent of $DESTDIR in other build systems." + } + prefix: { + type: @path + default: "/usr/local" + desc: "The default prefix to install everything into." + } + bindir: { + type: @path + default: "" + desc: "The directory to install executables into. Defaults to \"$prefix/bin\"." + } + libdir: { + type: @path + default: "" + desc: "The directory to install libraries into. Defaults to \"$prefix/lib\"." + } + includedir: { + type: @path + default: "" + desc: "The location to install headers in. Defaults to \"$prefix/include\"." + } + nlspath: { + type: @path + default: "/usr/share/locale/%L/%N" + desc: "The location to install locales." + } + pc_path: { + type: @path + default: "" + desc: "The location to pkg-config files to. Defaults to the output of `pkg-config --variable=pc_path pkg-config`." + } + datarootdir: { + type: @path + default: "" + desc: "The root directory for data files. Defaults to `$prefix/share`." + } + datadir: { + type: @path + default: "" + desc: "The directory for data files. Defaults to `$datarootdir`." + } + mandir: { + type: @path + default: "" + desc: "The root directory for manpages. Defaults to `$datadir/man`." + } + man1dir: { + type: @path + default: "" + desc: "The directory for manpages in section 1. Defaults to `$mandir/man1`." + } + man3dir: { + type: @path + default: "" + desc: "The directory for manpages in section 3. Defaults to `$mandir/man3`." + } +} diff --git a/build.pkg.rig b/build.pkg.rig new file mode 100644 index 00000000000..d607e888573 --- /dev/null +++ b/build.pkg.rig @@ -0,0 +1,2345 @@ +/* + * ***************************************************************************** + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * ***************************************************************************** + * + * The build package file. + * + */ + +/// The path to the safe install script. +SAFE_INSTALL: str = path.join(src_dir, "scripts/safe-install.sh"); + +/// The file mode for executables, as an argument to the safe install script. +EXEC_INSTALL_MODE: str = "-Dm755"; + +/// The file mode for man pages and other files, as an argument to the safe +/// install script. +MANPAGE_INSTALL_MODE: str = "-Dm644"; + +// Save this. +OS: str = platform.os; + +DESTDIR: str = str(config["destdir"]); + +EXECPREFIX: str = str(config["execprefix"]); +EXECSUFFIX: str = str(config["execsuffix"]); + +/** + * Generates the true executable name for the given base name. + * @param name The base name of the executable. + * @return The true name of the executable, including prefix, suffix, and + extension. + */ +fn exe_name(name: str) -> str +{ + temp: str = EXECPREFIX +~ name +~ EXECSUFFIX; + return if OS == "Windows" { temp +~ ".exe"; } else { temp; }; +} + +/** + * Generates the default executable name for the given base name. + * @param name The base name of the executable. + * @return The true name of the executable, including prefix, suffix, and + extension. + */ +fn default_exe_name(name: str) -> str +{ + return if OS == "Windows" { name +~ ".exe"; } else { name; }; +} + +/** + * Generates the true library name for the given base name. + * @param name The base name of the library. + * @return The true name of the library, including prefix and extension. + */ +fn lib_name(name: str) -> str +{ + ext: str = if OS == "Windows" { ".lib"; } else { ".a"; }; + return "lib" +~ name +~ ext; +} + +BC_BIN: str = exe_name("bc"); +DC_BIN: str = exe_name("dc"); +LIBRARY: str = lib_name("libbcl"); + +BC_MANPAGE: str = EXECPREFIX +~ "bc" +~ EXECSUFFIX +~ ".1"; +DC_MANPAGE: str = EXECPREFIX +~ "dc" +~ EXECSUFFIX +~ ".1"; +BCL_MANPAGE: str = "bcl.3"; + +BCL_HEADER: str = "bcl.h"; +BCL_HEADER_PATH: str = path.join(src_dir, path.join("include", BCL_HEADER)); +PC_FILE: str = "bcl.pc"; + +/** + * Returns the string value of the define for a prompt default define for an + * executable. + * @param name The base name of the executable. + * @return The string value of the compiler define for the prompt default. + */ +fn prompt(name: str) -> str +{ + opt: sym = sym(config[name +~ "/default_prompt"]); + + ret: str = + if opt == @off + { + "0"; + } + else if opt == @tty_mode + { + str(uint(bool(config[name +~ "/default_tty_mode"]))); + } + else + { + "1"; + }; + + return ret; +} + +HEADERS: []str = find_src_ext("include", "h"); + +FORCE: bool = bool(config["force"]); + +BUILD_MODE: sym = sym(config["build_mode"]); + +BC_ENABLED: str = str(uint(BUILD_MODE == @both || BUILD_MODE == @bc)); +DC_ENABLED: str = str(uint(BUILD_MODE == @both || BUILD_MODE == @dc)); +LIBRARY_ENABLED: str = str(uint(BUILD_MODE == @library)); + +EXTRA_MATH_ENABLED: str = str(uint(bool(config["extra_math"]))); + +HISTORY: sym = sym(config["history"]); +HISTORY_ENABLED: str = str(uint(HISTORY != @none)); +EDITLINE_ENABLED: str = str(uint(HISTORY == @editline)); +READLINE_ENABLED: str = str(uint(HISTORY == @readline)); + +NLS_ENABLED: str = +if OS == "Windows" || BUILD_MODE == @library +{ + "0"; +} +else +{ + str(uint(sym(config["locales"]) != @none)); +}; + +BUILD_TYPE: str = +if EXTRA_MATH_ENABLED != "0" && HISTORY_ENABLED != "0" && NLS_ENABLED != "0" +{ + "A"; +} +else +{ + t: str = if EXTRA_MATH_ENABLED != "0" { ""; } else { "E"; } +~ + if HISTORY_ENABLED != "0" { ""; } else { "H"; } +~ + if NLS_ENABLED != "0" { ""; } else { "N"; }; + + t; +}; + +OPTIMIZE: str = str(config["optimization"]); + +VALGRIND_ARGS: []str = @[ + "valgrind", + "--error-exitcode=100", + "--leak-check=full", + "--show-leak-kinds=all", + "--errors-for-leak-kinds=all", + "--track-fds=yes", + "--track-origins=yes", +]; + +// Get the compiler. The user might have set one at the command line. +CC: str = language.compiler; + +// Set optimization to "0" if it is empty. +CFLAGS_OPT: str = if OPTIMIZE == "" { "0"; } else { OPTIMIZE; }; + +// Get the command-line option for defining a preprocessor variable. +DEFOPT: str = compiler_db["opt.define"]; + +// Get the command-line string for the optimization option for the compiler. +OPTOPT: str = compiler_db["opt.optimization"] +~ CFLAGS_OPT; + +// Get the compiler option for the object file to output to. +OBJOUTOPT: str = compiler_db["opt.objout"]; +EXEOUTOPT: str = compiler_db["opt.exeout"]; + +// Get the compiler option for outputting an object file rather than an +// executable. +OBJOPT: str = compiler_db["opt.obj"]; + +// Get the compiler option for setting an include directory. +INCOPT: str = compiler_db["opt.include"] +~ path.join(src_dir, "include"); + +COVERAGE_CFLAGS: []str = +if bool(config["coverage"]) +{ + @[ "-fprofile-arcs", "-ftest-coverage", "-g", "-O0", DEFOPT +~ "NDEBUG" ]; +}; + +MAINEXEC: str = +if BUILD_MODE == @both || BUILD_MODE == @bc || BUILD_MODE == @library +{ + BC_BIN; +} +else +{ + DC_BIN; +}; + +MAINEXEC_FLAGS: []str = @[ DEFOPT +~ "MAINEXEC=" +~ MAINEXEC ]; + +// XXX: Library needs these defines to be true. +BC_DEF: str = if LIBRARY_ENABLED == "0" { BC_ENABLED; } else { "1"; }; +DC_DEF: str = if LIBRARY_ENABLED == "0" { DC_ENABLED; } else { "1"; }; + +CFLAGS1: []str = config_list["cflags"] +~ @[ OPTOPT, INCOPT ] +~ + COVERAGE_CFLAGS +~ MAINEXEC_FLAGS; +CFLAGS2: []str = @[ + DEFOPT +~ "BC_ENABLED=" +~ BC_DEF, + DEFOPT +~ "DC_ENABLED=" +~ DC_DEF, + DEFOPT +~ "BUILD_TYPE=" +~ BUILD_TYPE, + DEFOPT +~ "EXECPREFIX=" +~ str(config["execprefix"]), + DEFOPT +~ "BC_NUM_KARATSUBA_LEN=" +~ str(num(config["karatsuba_len"])), + DEFOPT +~ "BC_ENABLE_LIBRARY=" +~ LIBRARY_ENABLED, + DEFOPT +~ "BC_ENABLE_NLS=" +~ NLS_ENABLED, + DEFOPT +~ "BC_ENABLE_EXTRA_MATH=" +~ EXTRA_MATH_ENABLED, + DEFOPT +~ "BC_ENABLE_HISTORY=" +~ HISTORY_ENABLED, + DEFOPT +~ "BC_ENABLE_EDITLINE=" +~ EDITLINE_ENABLED, + DEFOPT +~ "BC_ENABLE_READLINE=" +~ READLINE_ENABLED, + DEFOPT +~ "BC_ENABLE_MEMCHECK=" +~ str(uint(bool(config["memcheck"]))), + DEFOPT +~ "BC_ENABLE_AFL=" +~ str(uint(bool(config["afl"]))), + DEFOPT +~ "BC_ENABLE_OSSFUZZ=" +~ str(uint(bool(config["ossfuzz"]))), + DEFOPT +~ "BC_DEFAULT_BANNER=" +~ + str(uint(bool(config["bc/default_banner"]))), + DEFOPT +~ "BC_DEFAULT_SIGINT_RESET=" +~ + str(uint(bool(config["bc/default_sigint_reset"]))), + DEFOPT +~ "BC_DEFAULT_TTY_MODE=" +~ + str(uint(bool(config["bc/default_tty_mode"]))), + DEFOPT +~ "BC_DEFAULT_PROMPT=" +~ prompt("bc"), + DEFOPT +~ "BC_DEFAULT_EXPR_EXIT=" +~ + str(uint(bool(config["bc/default_expr_exit"]))), + DEFOPT +~ "BC_DEFAULT_DIGIT_CLAMP=" +~ + str(uint(bool(config["bc/default_digit_clamp"]))), + DEFOPT +~ "DC_DEFAULT_SIGINT_RESET=" +~ + str(uint(bool(config["dc/default_sigint_reset"]))), + DEFOPT +~ "DC_DEFAULT_TTY_MODE=" +~ + str(uint(bool(config["dc/default_tty_mode"]))), + DEFOPT +~ "DC_DEFAULT_PROMPT=" +~ prompt("dc"), + DEFOPT +~ "DC_DEFAULT_EXPR_EXIT=" +~ + str(uint(bool(config["dc/default_expr_exit"]))), + DEFOPT +~ "DC_DEFAULT_DIGIT_CLAMP=" +~ + str(uint(bool(config["dc/default_digit_clamp"]))), +]; +CFLAGS: []str = CFLAGS1 +~ CFLAGS2; + +LDFLAGS: []str = config_list["ldflags"]; + +COMMON_C_FILES: []str = @[ + "src/data.c", + "src/num.c", + "src/rand.c", + "src/vector.c", + "src/vm.c", +]; + +EXEC_C_FILES: []str = @[ + "src/args.c", + "src/file.c", + "src/lang.c", + "src/lex.c", + "src/main.c", + "src/opt.c", + "src/parse.c", + "src/program.c", + "src/read.c", +]; + +BC_C_FILES: []str = @[ + "src/bc.c", + "src/bc_lex.c", + "src/bc_parse.c", +]; + +DC_C_FILES: []str = @[ + "src/dc.c", + "src/dc_lex.c", + "src/dc_parse.c", +]; + +HISTORY_C_FILES: []str = @[ + "src/history.c", +]; + +LIBRARY_C_FILES: []str = @[ + "src/library.c", +]; + +GEN_HEADER1: str = + "// Copyright (c) 2018-2025 Gavin D. Howard and contributors.\n" +~ + "// Licensed under the 2-clause BSD license.\n" +~ + "// *** AUTOMATICALLY GENERATED FROM "; +GEN_HEADER2: str = ". DO NOT MODIFY. ***\n\n"; + +GEN_LABEL1: str = "const char *"; +GEN_LABEL2: str = " = \""; +GEN_LABEL3: str = "\";\n\n"; +GEN_NAME1: str = "const char "; +GEN_NAME2: str = "[] = {\n"; + +GEN_LABEL_EXTERN1: str = "extern const char *"; +GEN_LABEL_EXTERN2: str = ";\n\n"; +GEN_NAME_EXTERN1: str = "extern const char "; +GEN_NAME_EXTERN2: str = "[];\n\n"; + +GEN_IFDEF1: str = "#if "; +GEN_IFDEF2: str = "\n"; +GEN_ENDIF1: str = "#endif // "; +GEN_ENDIF2: str = "\n"; + +GEN_EX_START: str = "{{ A H N HN }}"; +GEN_EX_END: str = "{{ end }}"; + +/// This is the max width to print characters to strgen files. This is to ensure +/// that lines don't go much over 80 characters. +MAX_WIDTH: usize = usize(72); + +/** + * A function to generate a C file that contains a C character array with the + * contents of a text file. For more detail, see the `gen/strgen.c` program; + * this function is exactly equivalent to that or should be. + * @param input The input file name. + * @param output The output file name. + * @param exclude True if extra math stuff should be excluded, false if + * they should be included. + * @param name The name of the array. + * @param label If not equal to "", this is the label for the array, + * which is essentially the "file name" in `bc` and `dc`. + * @param define If not equal to "", this is the preprocessor define + * expression that should be used to guard the array with a + * `#if`/`#endif` combo. + * @param remove_tabs True if tabs should be ignored, false if they should be + * included. + */ +fn strgen( + input: str, + output: str, + exclude: bool, + name: str, + label: str, + def: str, + remove_tabs: bool, +) -> void +{ + in: str = io.read_file(input); + + io.open(output, "w"): f + { + f.print(GEN_HEADER1 +~ input +~ GEN_HEADER2); + + if label != "" + { + f.print(GEN_LABEL_EXTERN1 +~ label +~ GEN_LABEL_EXTERN2); + } + + f.print(GEN_NAME_EXTERN1 +~ name +~ GEN_NAME_EXTERN2); + + if def != "" + { + f.print(GEN_IFDEF1 +~ def +~ GEN_IFDEF2); + } + + if label != "" + { + f.print(GEN_LABEL1 +~ label +~ GEN_LABEL2 +~ name +~ GEN_LABEL3); + } + + f.print(GEN_NAME1 +~ name +~ GEN_NAME2); + + i: !usize = usize(0); + count: !usize = usize(0); + slashes: !usize = usize(0); + + // This is where the end of the license comment is found. + while slashes < 2 && in[i] > 0 + { + if slashes == 1 && in[i] == '*' && in[i + 1] == '/' && + (in[i + 2] == '\n' || in[i + 2] == '\r') + { + slashes! = slashes + usize(1); + i! = i + usize(2); + } + else if slashes == 0 && in[i] == '/' && in[i + 1] == '*' + { + slashes! = slashes + usize(1); + i! = i + usize(1); + } + + i! = i + usize(1); + } + + // The file is invalid if the end of the license comment could not be + // found. + if i == in.len + { + error("Could not find end of license comment"); + } + + i! = i + usize(1); + + // Do not put extra newlines at the beginning of the char array. + while in[i] == '\n' || in[i] == '\r' + { + i! = i + usize(1); + } + + // This loop is what generates the actual char array. It counts how many + // chars it has printed per line in order to insert newlines at + // appropriate places. It also skips tabs if they should be removed. + while i < in.len + { + if in[i] == '\r' + { + i! = i + usize(1); + continue; + } + + // If we should output the character, i.e., it is not a tab or we + // can remove tabs... + if !remove_tabs || in[i] != '\t' + { + // Check for excluding something for extra math. + if in[i] == '{' + { + if i + GEN_EX_START.len <= in.len && + in.slice(i, i + GEN_EX_START.len) == GEN_EX_START + { + if exclude + { + // Get past the braces. + i! = i + usize(2); + + // Find the end of the end. + while in[i] != '{' && + in.slice(i, i + GEN_EX_END.len) != GEN_EX_END + { + i! = i + usize(1); + } + + i! = i + GEN_EX_END.len; + + // Skip the last newline. + if in[i] == '\r' + { + i! = i + usize(1); + } + + i! = i + usize(1); + + continue; + } + } + else if !exclude && + in.slice(i, i + GEN_EX_END.len) == GEN_EX_END + { + i! = i + GEN_EX_END.len; + + // Skip the last newline. + if in[i] == '\r' + { + i! = i + usize(1); + } + + i! = i + usize(1); + + continue; + } + } + + // Print a tab if we are at the beginning of a line. + if count == 0 + { + f.print("\t"); + } + + val: str = str(in[i]) +~ ","; + + // Print the character. + f.print(val); + + // Adjust the count. + count! = count + val.len; + + if count > MAX_WIDTH + { + count! = usize(0); + f.print("\n"); + } + } + + i! = i + usize(1); + } + + // Make sure the end looks nice. + if count == 0 + { + f.print(" "); + } + + // Insert the NUL byte at the end. + f.print("0\n};\n"); + + if def != "" + { + f.print(GEN_ENDIF1 +~ def +~ GEN_ENDIF2); + } + } +} + +/** + * Creates a target to generate an object file from the given C file and returns + * the target name of the new target. + * @param c_file The name of the C file target. + * @return The name of the object file target. + */ +fn c2o(c_file: str) -> str +{ + o_file: str = c_file +~ (if OS == "Windows" { ".obj"; } else { ".o"; }); + + target o_file: c_file, HEADERS + { + $ $CC %(config_list["other_cflags"]) %(CFLAGS) $OBJOPT $OBJOUTOPT @(tgt) + @(file_dep); + } + + return o_file; +} + +/** + * Generates a target to turn a text file into a C file with the text file's + * contents as a char array, then generates a target to generate an object file + * from that C file, then returns the name of the object file target. + * @param txt_file The name of the text file. + * @param name The name of the char array in the C file. + * @param label The label for the array, if any. (See the @a strgen() + * function for more information.) + * @param def The preprocessor define(s) to guard the array, if any. + * (See the @a strgen() function for more information.) + * @param remove_tabs True if tabs should be ignored, false otherwise. (See the + * @a strgen() function for more information.) + * @return The name of the object file target. + */ +fn txt2o( + txt_file: str, + name: str, + label: str, + def: str, + remove_tabs: bool, +) -> str +{ + c_file: str = txt_file +~ ".c"; + + c_config: Gaml = @(gaml){ + strgen_name: $name + strgen_label: $label + strgen_define: $def + strgen_remove_tabs: $remove_tabs + }; + + push c_config: config_stack + { + target c_file: txt_file + { + strgen(file_dep, tgt, EXTRA_MATH_ENABLED == "0", + str(config["strgen_name"]), str(config["strgen_label"]), + str(config["strgen_define"]), + bool(config["strgen_remove_tabs"])); + } + } + + return c2o(c_file); +} + +/** + * Generates a target for an executable and returns its name. + * @param name The name of the executable. + * @param o_files The object files for the executable. + * @return The name of the generated target. + */ +fn exe(name: str, o_files: []str) -> void +{ + target name: o_files + { + $ $CC %(config_list["other_cflags"]) %(config_list["strip_flag"]) + %(CFLAGS) %(LDFLAGS) $EXEOUTOPT @(tgt) %(file_deps); + } +} + +/** + * Generates a target for a link. + * @param name The name of the link. + * @param exec The name of the executable target. + */ +fn ln(name: str, exec: str) -> void +{ + if OS == "Windows" + { + target name: exec + { + $ copy /v /y /b @(file_dep) @(tgt); + } + } + else + { + target name: exec + { + $ ln -fs @("./" +~ path.basename(file_dep)) @(tgt); + } + } +} + +/** + * Generates a target for a library. + * @param name The name of the library. + * @param exec The name of the executable target. + */ +fn lib(name: str, o_files: []str) -> void +{ + if OS == "WINDOWS" + { + exe(name, o_files); + } + else + { + target name: o_files + { + $ ar -r -cu @(tgt) %(file_deps); + } + } +} + +fn check_err_test( + name: str, + res: CmdResult, +) -> void +{ + if res.exitcode > 127 + { + error("Test \"" +~ name +~ "\" crashed"); + } + + if res.exitcode == 0 + { + error("Test \"" +~ name +~ "\" returned no error"); + } + + if res.exitcode == 100 + { + error("Test \"" +~ name +~ "\" had memory errors on non-fatal error\n"); + } + + if res.stderr.len <= 1 + { + error("Test \"" +~ name +~ "\" produced no error message"); + } +} + +fn check_test_retcode( + name: str, + exitcode: uint, +) -> void +{ + if exitcode != 0 + { + error("Test \"" +~ name +~ "\" failed with exitcode: " +~ + str(exitcode) +~ "\n"); + } +} + +fn check_test( + name: str, + res: CmdResult, + exp_path: str, +) -> void +{ + check_test_retcode(name, res.exitcode); + + exp := io.read_file_bytes(exp_path); + + if exp != res.stdout_full + { + error("Test \"" +~ name +~ "\" failed\n" +~ str(res.stderr)); + } +} + +fn register_standard_tests( + bin: str, + testdir: str, + src_testdir: str, + extra: bool, +) -> void +{ + all_file: str = path.join(src_testdir, "all.txt"); + tests: []str = io.read_file(all_file).split("\n"); + + extra_path := path.join(src_dir, "tests/extra_required.txt"); + extra_required: []str = io.read_file(extra_path).split("\n"); + + for t: tests + { + if t == "" + { + continue; + } + + // Skip extra math tests if it is not enabled. + if !extra && extra_required contains t + { + continue; + } + + test sym(path.join(testdir, t)): bin + { + halt: str = str(config["halt"]); + + name: str = path.basename(tgt_name); + testdir: str = path.dirname(tgt_name); + calc: str = path.basename(testdir); + + test_file: str = tgt_name +~ ".txt"; + test_result_file: str = tgt_name +~ "_results.txt"; + + src_test_file: str = path.join(src_dir, test_file); + src_test_result_file: str = path.join(src_dir, test_result_file); + + actual_test_file: str = + if !path.isfile(src_test_file) + { + // If we shouldn't generate tests, skip. + if !bool(config["generated_tests"]) + { + io.eprint("Skipping test " +~ tgt_name +~ "\n"); + return; + } + + script_name: str = name +~ "." +~ calc; + + scriptdir: str = path.join(testdir, "scripts"); + src_scriptdir: str = path.join(src_dir, scriptdir); + src_script_name: str = path.join(src_scriptdir, script_name); + + $ @(default_exe_name(calc)) $src_script_name > $test_file; + + test_file; + } + else + { + src_test_file; + }; + + exp_result_file: str = + if !path.isfile(src_test_result_file) + { + tmpfile: str = path.tmp(calc +~ "_test_result"); + + $ @(default_exe_name(calc)) %(config_list["gen_options"]) + $actual_test_file << $halt > $tmpfile; + + tmpfile; + } + else + { + src_test_result_file; + }; + + res := $ %(config_list["args"]) %(config_list["options"]) + $actual_test_file << $halt; + + check_test(tgt_name, res, exp_result_file); + } + } +} + +fn register_script_tests( + bin: str, + testdir: str, + src_testdir: str, + extra: bool, +) -> void +{ + scriptdir: str = path.join(testdir, "scripts"); + src_scriptdir: str = path.join(src_testdir, "scripts"); + all_file: str = path.join(src_scriptdir, "all.txt"); + tests: []str = io.read_file(all_file).split("\n"); + + for t: tests + { + if t == "" + { + continue; + } + + // Skip extra math tests if it is not enabled. + if !extra && (t == "rand.bc" || t == "root.bc" || t == "i2rand.bc") + { + continue; + } + + test sym(path.join(scriptdir, t)): bin + { + halt: str = str(config["halt"]); + + name: str = path.basename(tgt_name); + testdir: str = path.dirname(tgt_name); + testdir2: str = path.dirname(testdir); + calc: str = path.basename(testdir2); + + test_file: str = tgt_name; + test_file_dir: str = path.dirname(tgt_name); + test_file_name: str = path.basename(tgt_name, "." +~ calc); + test_result_file: str = path.join(test_file_dir, + test_file_name +~ ".txt"); + + src_test_file: str = path.join(src_dir, test_file); + src_test_result_file: str = path.join(src_dir, test_result_file); + + exp_result_file: str = + if !path.isfile(src_test_result_file) + { + tmpfile: str = path.tmp(calc +~ "_script_test_result"); + + // This particular test needs to be generated straight. Also, on + // Windows, we don't have `sed`, and the `bc`/`dc` there is + // probably this one anyway. + if name == "stream.dc" || host.os == "Windows" + { + $ @(default_exe_name(calc)) $src_test_file << $halt + > $tmpfile; + } + else + { + root_testdir: str = path.join(src_dir, "tests"); + + // This sed and the script are to remove an incompatibility + // with GNU bc, where GNU bc is wrong. See the development + // manual (manuals/development.md#script-tests) for more + // information. + $ @(default_exe_name(calc)) $src_test_file << $halt | + sed -n -f @(path.join(root_testdir, "script.sed")) + > $tmpfile; + } + + tmpfile; + } + else + { + src_test_result_file; + }; + + if calc == "bc" + { + res1 := $ %(config_list["args"]) -g + %(config_list["script_options"]) $src_test_file + << $halt; + + check_test(tgt_name, res1, exp_result_file); + } + + // These tests do not need to run without global stacks. + if name == "globals.bc" || name == "references.bc" || + name == "rand.bc" + { + return; + } + + res2 := $ %(config_list["args"]) %(config_list["script_options"]) + $src_test_file << $halt; + + check_test(tgt_name, res2, exp_result_file); + } + } +} + +fn register_stdin_test( + bin: str, + testdir: str, + name: str +) -> void +{ + test sym(path.join(testdir, name)): bin + { + name: str = path.basename(tgt_name); + testdir: str = path.dirname(tgt_name); + calc: str = path.basename(testdir); + + halt: str = if name == "bc" { "halt"; } else { "q"; }; + + test_file: str = tgt_name +~ ".txt"; + test_result_file: str = tgt_name +~ "_results.txt"; + + src_test_file: str = path.join(src_dir, test_file); + src_test_result_file: str = path.join(src_dir, test_result_file); + + res := $ %(config_list["args"]) %(config_list["options"]) + < $src_test_file; + + check_test(tgt_name, res, src_test_result_file); + } +} + +fn register_stdin_tests( + bin: str, + testdir: str, + src_testdir: str, +) -> void +{ + calc: str = path.basename(testdir); + + if calc == "bc" + { + for t: @[ "stdin", "stdin1", "stdin2" ] + { + register_stdin_test(bin, testdir, t); + } + } + else + { + // dc only needs one. + register_stdin_test(bin, testdir, "stdin"); + } +} + +fn register_read_tests( + bin: str, + testdir: str, + src_testdir: str, +) -> void +{ + calc: str = path.basename(testdir); + + read_call: str = if calc == "bc" { "read()"; } else { "?"; }; + read_expr: str = + if calc == "bc" + { + read_call +~ "\n5+5;"; + } + else + { + read_call; + }; + read_multiple: str = + if calc == "bc" + { + "3\n2\n1\n"; + } + else + { + "3pR\n2pR\n1pR\n"; + }; + + read_test_config: Gaml = @(gaml){ + read_call: $read_call + read_expr: $read_expr + read_multiple: $read_multiple + }; + + push read_test_config: config_stack + { + // First test is the regular read test. + test sym(path.join(testdir, "read")): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + test_file: str = tgt_name +~ ".txt"; + src_test_file: str = path.join(src_dir, test_file); + + read_call: str = str(config["read_call"]); + + lines: []str = io.read_file(src_test_file).split("\n"); + + for l: lines + { + if l == "" + { + continue; + } + + res := $ %(config_list["args"]) %(config_list["options"]) + << @(read_call +~ "\n" +~ l +~ "\n"); + + check_test(tgt_name, res, + path.join(src_testdir, "read_results.txt")); + } + } + + // Next test is reading multiple times. + test sym(path.join(testdir, "read_multiple")): bin + { + testdir: str = path.dirname(tgt_name); + + test_file: str = tgt_name +~ ".txt"; + + path.mkdirp(path.dirname(test_file)); + + read_call: str = str(config["read_call"]); + + exp_path: str = path.tmp("read_multiple_results"); + + io.open(exp_path, "w"): f + { + f.print("3\n2\n1\n"); + } + + res := $ %(config_list["args"]) %(config_list["options"]) + -e $read_call -e $read_call -e $read_call + << @(str(config["read_multiple"])); + + check_test(tgt_name, res, exp_path); + } + + // Next test is the read errors test. + test sym(path.join(testdir, "read_errors")): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + test_file: str = tgt_name +~ ".txt"; + src_test_file: str = path.join(src_dir, test_file); + + path.mkdirp(path.dirname(test_file)); + + read_call: str = str(config["read_call"]); + + lines: []str = io.read_file(src_test_file).split("\n"); + + for l: lines + { + if l == "" + { + continue; + } + + res := $ %(config_list["args"]) %(config_list["options"]) + << @(read_call +~ "\n" +~ l +~ "\n"); + + check_err_test(tgt_name, res); + } + } + + // Next test is the empty read test. + test sym(path.join(testdir, "read_empty")): bin + { + read_call: str = str(config["read_call"]); + + res := $ %(config_list["args"]) %(config_list["options"]) + << @(read_call +~ "\n"); + + check_err_test(tgt_name, res); + } + + // Next test is the read EOF test. + test sym(path.join(testdir, "read_EOF")): bin + { + read_call: str = str(config["read_call"]); + + res := $ %(config_list["args"]) %(config_list["options"]) + << $read_call; + + check_err_test(tgt_name, res); + } + } +} + +fn run_error_lines_test(name: str) -> void +{ + file: str = path.join(src_dir, name); + + lines: []str = io.read_file(file).split("\n"); + + for l: lines + { + if l == "" + { + continue; + } + + res := $ %(config_list["args"]) %(config_list["options"]) + %(config_list["error_options"]) << @(l +~ "\n"); + + check_err_test(name, res); + } +} + +fn register_error_tests( + bin: str, + testdir: str, + src_testdir: str, +) -> void +{ + calc: str = path.basename(testdir); + + // First test is command-line expression error. + test sym(path.join(testdir, "command-line_expr_error")): bin + { + halt: str = str(config["halt"]); + + res := $ %(config_list["args"]) %(config_list["options"]) -e "1+1" -f- + -e "2+2" << $halt; + + check_err_test(tgt_name, res); + } + + // First test is command-line file expression error. + test sym(path.join(testdir, "command-line_file_expr_error")): bin + { + testdir: str = path.dirname(tgt_name); + halt: str = str(config["halt"]); + + res := $ %(config_list["args"]) %(config_list["options"]) -e "1+1" -f- + -f @(path.join(testdir, "decimal.txt")) << $halt; + + check_err_test(tgt_name, res); + } + + if calc == "bc" + { + test sym(path.join(testdir, "posix_warning")): bin + { + res := $ %(config_list["args"]) %(config_list["options"]) -w + << @("line"); + + if res.exitcode != 0 + { + error("Test \"" +~ tgt_name +~ "\" returned an error (" +~ + str(res.exitcode) +~ ")"); + } + + output: str = str(res.stderr); + + if output == "" || output == "\n" + { + error("Test \"" +~ tgt_name +~ "\" did not print a warning"); + } + } + + test sym(path.join(testdir, "posix_errors.txt")): bin + { + run_error_lines_test(tgt_name); + } + } + + test sym(path.join(testdir, "errors.txt")): bin + { + run_error_lines_test(tgt_name); + } + + errors_dir: str = path.join(testdir, "errors"); + + for f: find_src_ext(errors_dir, "txt") + { + // Skip the problematic test, if requested. + if calc == "bc" && f contains "33.txt" && + !bool(config["problematic_tests"]) + { + continue; + } + + test sym(f): bin + { + errors_dir: str = path.dirname(tgt_name); + testdir: str = path.dirname(errors_dir); + calc: str = path.basename(testdir); + + halt: str = str(config["halt"]); + + res1 := $ %(config_list["args"]) %(config_list["error_options"]) -c + @(tgt_name) << $halt; + + check_err_test(tgt_name, res1); + + res2 := $ %(config_list["args"]) %(config_list["error_options"]) -C + @(tgt_name) << $halt; + + check_err_test(tgt_name, res2); + + res3 := $ %(config_list["args"]) %(config_list["error_options"]) -c + < @(path.join(src_dir, tgt_name)); + + check_err_test(tgt_name, res3); + + res4 := $ %(config_list["args"]) %(config_list["error_options"]) -C + < @(path.join(src_dir, tgt_name)); + + check_err_test(tgt_name, res4); + } + } +} + +fn check_kwredef_test( + name: str, + res: CmdResult, +) -> void +{ + testdir: str = path.dirname(name); + redefine_exp: str = path.join(testdir, "redefine_exp.txt"); + + check_test(tgt_name, res, redefine_exp); +} + +OTHER_LINE_LEN_RESULTS_NAME: str = "line_length_test_results.txt"; +OTHER_LINE_LEN70_RESULTS_NAME: str = "line_length70_test_results.txt"; +OTHER_MATHLIB_SCALE_RESULTS_NAME: str = "mathlib_scale_results.txt"; + +fn register_other_tests( + bin: str, + testdir: str, + src_testdir: str, + extra: bool, +) -> void +{ + calc: str = path.basename(testdir); + + path.mkdirp(testdir); + + // Halt test. + test sym(path.join(testdir, "halt")): bin + { + halt: str = str(config["halt"]) +~ "\n"; + + res := $ %(config_list["args"]) << $halt; + + check_test_retcode(tgt_name, res.exitcode); + } + + if calc == "bc" + { + // bc has two halt or quit commands, so test the second as well. + test sym(path.join(testdir, "quit")): bin + { + res := $ %(config_list["args"]) << @("quit\n"); + + check_test_retcode(tgt_name, res.exitcode); + } + + // Also, make sure quit only quits after an expression. + test sym(path.join(testdir, "quit_after_expr")): bin + { + res := $ %(config_list["args"]) -e "1+1" << @("quit\n"); + + check_test_retcode(tgt_name, res.exitcode); + + if str(res.stdout) != "2" + { + error("Test \"" +~ tgt_name +~ + "\" did not have the right output"); + } + } + + test sym(path.join(testdir, "env_args1")): bin + { + env.set env.str("BC_ENV_ARGS", " '-l' '' -q") + { + res := $ %(config_list["args"]) << @("s(.02893)\n"); + + check_test_retcode(tgt_name, res.exitcode); + } + } + + test sym(path.join(testdir, "env_args2")): bin + { + env.set env.str("BC_ENV_ARGS", " '-l' '' -q") + { + res := $ %(config_list["args"]) -e 4 << @("halt\n"); + + check_test_retcode(tgt_name, res.exitcode); + } + } + + redefine_exp: str = path.join(testdir, "redefine_exp.txt"); + + io.open(redefine_exp, "w"): f + { + f.print("5\n0\n"); + } + + test sym(path.join(testdir, "keyword_redefinition1")): bin + { + res := $ %(config_list["args"]) --redefine=print -e + "define print(x) { x }" -e "print(5)" << @("halt\n"); + + check_kwredef_test(tgt_name, res); + } + + test sym(path.join(testdir, "keyword_redefinition2")): bin + { + res := $ %(config_list["args"]) -r abs -r else -e + "abs = 5; else = 0" -e "abs;else" << @("halt\n"); + + check_kwredef_test(tgt_name, res); + } + + if extra + { + test sym(path.join(testdir, "keyword_redefinition_lib2")): bin + { + res := $ %(config_list["args"]) -lr abs -e "perm(5, 1)" -e 0 + << @("halt\n"); + + check_kwredef_test(tgt_name, res); + } + + test sym(path.join(testdir, "leading_zero_script")): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + res := $ %(config_list["args"]) -lz + @(path.join(src_testdir, "leadingzero.txt")) + << @(str(config["halt"])); + + check_test(tgt_name, res, + path.join(src_testdir, "leadingzero_results.txt")); + } + } + + test sym(path.join(testdir, "keyword_redefinition3")): bin + { + res := $ %(config_list["args"]) -r abs -r else -e + "abs = 5; else = 0" -e "abs;else" << @("halt\n"); + + check_kwredef_test(tgt_name, res); + } + + test sym(path.join(testdir, "keyword_redefinition_error")): bin + { + res := $ %(config_list["args"]) -r break -e "define break(x) { x }"; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, + "keyword_redefinition_without_redefine")): bin + { + res := $ %(config_list["args"]) -e "define read(x) { x }"; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "multiline_comment_in_expr_file")): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + // tests/bc/misc1.txt happens to have a multiline comment in it. + src_test_file: str = path.join(src_testdir, "misc1.txt"); + src_test_results_file: str = path.join(src_testdir, + "misc1_results.txt"); + + res := $ %(config_list["args"]) -f $src_test_file << @("halt\n"); + + check_test(tgt_name, res, src_test_results_file); + } + + test sym(path.join(testdir, + "multiline_comment_error_in_expr_file")): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + src_test_file: str = path.join(src_testdir, "errors/05.txt"); + + res := $ %(config_list["args"]) -f $src_test_file << @("halt\n"); + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "multiline_string_in_expr_file")): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + // tests/bc/strings.txt happens to have a multiline string in it. + src_test_file: str = path.join(src_testdir, "strings.txt"); + src_test_results_file: str = path.join(src_testdir, + "strings_results.txt"); + + res := $ %(config_list["args"]) -f $src_test_file << @("halt\n"); + + check_test(tgt_name, res, src_test_results_file); + } + + tst := path.join(testdir, + "multiline_string_with_backslash_error_in_expr_file"); + + test sym(tst): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + src_test_file: str = path.join(src_testdir, "errors/16.txt"); + + res := $ %(config_list["args"]) -f $src_test_file << @("halt\n"); + + check_err_test(tgt_name, res); + } + + tst2 := path.join(testdir, "multiline_string_error_in_expr_file"); + + test sym(tst2): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + src_test_file: str = path.join(src_testdir, "errors/04.txt"); + + res := $ %(config_list["args"]) -f $src_test_file << @("halt\n"); + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "interactive_halt")): bin + { + res := $ %(config_list["args"]) -i << @("halt\n"); + + check_test_retcode(tgt_name, res.exitcode); + } + } + else + { + test sym(path.join(testdir, "env_args1")): bin + { + env.set env.str("DC_ENV_ARGS", "'-x'"), env.str("DC_EXPR_EXIT", "1") + { + res := $ %(config_list["args"]) << @("4s stuff\n"); + + check_test_retcode(tgt_name, res.exitcode); + } + } + + test sym(path.join(testdir, "env_args2")): bin + { + env.set env.str("DC_ENV_ARGS", "'-x'"), env.str("DC_EXPR_EXIT", "1") + { + res := $ %(config_list["args"]) -e 4pR; + + check_test_retcode(tgt_name, res.exitcode); + } + } + + test sym(path.join(testdir, "extended_register_command1")): bin + { + testdir: str = path.dirname(tgt_name); + results: str = tgt_name +~ ".txt"; + + path.mkdirp(testdir); + + io.open(results, "w"): f + { + f.print("0\n"); + } + + res := $ %(config_list["args"]) -e gxpR << @("q\n"); + + check_test(tgt_name, res, results); + } + + test sym(path.join(testdir, "extended_register_command2")): bin + { + testdir: str = path.dirname(tgt_name); + results: str = tgt_name +~ ".txt"; + + path.mkdirp(testdir); + + io.open(results, "w"): f + { + f.print("1\n"); + } + + res := $ %(config_list["args"]) -x -e gxpR << @("q\n"); + + check_test(tgt_name, res, results); + } + } + + path.mkdirp(testdir); + + other_tests_results: []str = config_list["other_tests_results"]; + + io.open(path.join(testdir, OTHER_LINE_LEN_RESULTS_NAME), "w"): f + { + f.print(other_tests_results[0] +~ "\n"); + } + + io.open(path.join(testdir, OTHER_LINE_LEN70_RESULTS_NAME), "w"): f + { + f.print(other_tests_results[1] +~ "\n"); + } + + test sym(path.join(testdir, "line_length1")): bin + { + env.set env.str(str(config["var"]), "80") + { + testdir: str = path.dirname(tgt_name); + + other_tests: []str = config_list["other_tests"]; + + res := $ %(config_list["args"]) << @(other_tests[3]); + + check_test(tgt_name, res, + path.join(testdir, OTHER_LINE_LEN_RESULTS_NAME)); + } + } + + test sym(path.join(testdir, "line_length2")): bin + { + env.set env.str(str(config["var"]), "2147483647") + { + testdir: str = path.dirname(tgt_name); + + other_tests: []str = config_list["other_tests"]; + + res := $ %(config_list["args"]) << @(other_tests[3]); + + check_test(tgt_name, res, + path.join(testdir, OTHER_LINE_LEN70_RESULTS_NAME)); + } + } + + test sym(path.join(testdir, "expr_and_file_args_test")): bin + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + input_file: str = path.join(src_testdir, "add.txt"); + input: str = io.read_file(input_file); + results_file: str = path.join(src_testdir, "add_results.txt"); + results: str = io.read_file(results_file); + + output_file: str = path.join(testdir, "expr_file_args.txt"); + + io.open(output_file, "w"): f + { + f.print(results +~ results +~ results +~ results); + } + + res := $ %(config_list["args"]) -e $input -f $input_file + --expression $input --file $input_file + -e @(str(config["halt"])); + + check_test(tgt_name, res, output_file); + } + + test sym(path.join(testdir, "files_test")): bin + { + env.set env.str(str(config["var"]), "2147483647") + { + testdir: str = path.dirname(tgt_name); + src_testdir: str = path.join(src_dir, testdir); + + input_file: str = path.join(src_testdir, "add.txt"); + input: str = io.read_file(input_file); + results_file: str = path.join(src_testdir, "add_results.txt"); + results: str = io.read_file(results_file); + + output_file: str = path.join(testdir, "files.txt"); + + io.open(output_file, "w"): f + { + f.print(results +~ results +~ results +~ results); + } + + res := $ %(config_list["args"]) -- $input_file $input_file + $input_file $input_file << @(str(config["halt"])); + + check_test(tgt_name, res, output_file); + } + } + + test sym(path.join(testdir, "line_length3")): bin + { + env.set env.str(str(config["var"]), "62") + { + testdir: str = path.dirname(tgt_name); + + other_tests: []str = config_list["other_tests"]; + + res := $ %(config_list["args"]) -L << @(other_tests[3]); + + check_test(tgt_name, res, + path.join(testdir, OTHER_LINE_LEN_RESULTS_NAME)); + } + } + + test sym(path.join(testdir, "line_length_func")): bin + { + env.set env.str(str(config["var"]), "62") + { + testdir: str = path.dirname(tgt_name); + results: str = tgt_name +~ ".txt"; + + path.mkdirp(testdir); + + io.open(results, "w"): f + { + f.print("0\n"); + } + + other_tests: []str = config_list["other_tests"]; + + res := $ %(config_list["args"]) -L << @(other_tests[2]); + + check_test(tgt_name, res, results); + } + } + + test sym(path.join(testdir, "arg")): bin + { + halt: str = str(config["halt"]); + + res1 := $ %(config_list["args"]) -h << $halt; + check_test_retcode(tgt_name, res1.exitcode); + + res2 := $ %(config_list["args"]) -P << $halt; + check_test_retcode(tgt_name, res2.exitcode); + + res3 := $ %(config_list["args"]) -R << $halt; + check_test_retcode(tgt_name, res3.exitcode); + + res4 := $ %(config_list["args"]) -v << $halt; + check_test_retcode(tgt_name, res4.exitcode); + + res5 := $ %(config_list["args"]) -V << $halt; + check_test_retcode(tgt_name, res5.exitcode); + } + + test sym(path.join(testdir, "leading_zero_arg")): bin + { + testdir: str = path.dirname(tgt_name); + calc: str = path.basename(testdir); + + expected_file: str = tgt_name +~ ".txt"; + + expected: str = "0.1\n-0.1\n1.1\n-1.1\n0.1\n-0.1\n"; + + io.open(expected_file, "w"): f + { + f.print(expected); + } + + data: str = + if calc == "bc" + { + "0.1\n-0.1\n1.1\n-1.1\n.1\n-.1\n"; + } + else + { + "0.1pR\n_0.1pR\n1.1pR\n_1.1pR\n.1pR\n_.1pR\n"; + }; + + res := $ %(config_list["args"]) -z << $data; + + check_test(tgt_name, res, expected_file); + } + + test sym(path.join(testdir, "invalid_file_arg")): bin + { + res := $ %(config_list["args"]) -f + "astoheusanotehynstahonsetihaotsnuhynstahoaoetusha.txt"; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "invalid_option_arg")): bin + { + other_tests: []str = config_list["other_tests"]; + + res := $ %(config_list["args"]) @("-" +~ other_tests[0]) + -e @(str(config["halt"])); + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "invalid_long_option_arg")): bin + { + other_tests: []str = config_list["other_tests"]; + + res := $ %(config_list["args"]) @("--" +~ other_tests[1]) + -e @(str(config["halt"])); + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "unrecognized_option_arg")): bin + { + res := $ %(config_list["args"]) -u -e @(str(config["halt"])); + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "unrecognized_long_option_arg")): bin + { + res := $ %(config_list["args"]) --uniform -e @(str(config["halt"])); + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "no_required_arg_for_option")): bin + { + res := $ %(config_list["args"]) -f; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "no_required_arg_for_long_option")): bin + { + res := $ %(config_list["args"]) --file; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "given_arg_for_long_option_with_no_arg")): bin + { + res := $ %(config_list["args"]) --version=5; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "colon_option")): bin + { + res := $ %(config_list["args"]) -:; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "colon_long_option")): bin + { + res := $ %(config_list["args"]) --:; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "builtin_variable_arg_test")): bin + { + testdir: str = path.dirname(tgt_name); + calc: str = path.basename(testdir); + + extra: bool = bool(config["extra_math"]); + + output: str = + if extra + { + "14\n15\n16\n17.25\n"; + } + else + { + "14\n15\n16\n"; + }; + + output_file: str = tgt_name +~ ".txt"; + + io.open(output_file, "w"): f + { + f.print(output); + } + + data: str = + if extra + { + if calc == "bc" + { + "s=scale;i=ibase;o=obase;t=seed@2;ibase=A;obase=A;s;i;o;t;"; + } + else + { + "J2@OIKAiAopRpRpRpR"; + } + } + else + { + if calc == "bc" + { + "s=scale;i=ibase;o=obase;ibase=A;obase=A;s;i;o;"; + } + else + { + "OIKAiAopRpRpR"; + } + }; + + args: []str = + if extra + { + @[ "-S14", "-I15", "-O16", "-E17.25" ]; + } + else + { + @[ "-S14", "-I15", "-O16" ]; + }; + + res1 := $ %(config_list["args"]) %(args) << $data; + check_test(tgt_name, res1, output_file); + + long_args: []str = + if extra + { + @[ "--scale=14", "--ibase=15", "--obase=16", "--seed=17.25" ]; + } + else + { + @[ "--scale=14", "--ibase=15", "--obase=16" ]; + }; + + res2 := $ %(config_list["args"]) %(long_args) << $data; + check_test(tgt_name, res2, output_file); + } + + if calc == "bc" + { + io.open(path.join(testdir, OTHER_MATHLIB_SCALE_RESULTS_NAME), "w"): f + { + f.print("100\n"); + } + + test sym(path.join(testdir, "builtin_var_arg_with_lib")): bin + { + testdir: str = path.dirname(tgt_name); + results_file: str = path.join(testdir, + OTHER_MATHLIB_SCALE_RESULTS_NAME); + + res := $ %(config_list["args"]) -S100 -l << @("scale\n"); + + check_test(tgt_name, res, results_file); + } + + test sym(path.join(testdir, "builtin_variable_long_arg_with_lib")): bin + { + testdir: str = path.dirname(tgt_name); + results_file: str = path.join(testdir, + OTHER_MATHLIB_SCALE_RESULTS_NAME); + + res := $ %(config_list["args"]) --scale=100 --mathlib << + @("scale\n"); + + check_test(tgt_name, res, results_file); + } + + test sym(path.join(testdir, "builtin_var_arg_with_lib_env_arg")): bin + { + env.set env.str("BC_ENV_ARGS", "-l") + { + testdir: str = path.dirname(tgt_name); + results_file: str = path.join(testdir, + OTHER_MATHLIB_SCALE_RESULTS_NAME); + + res := $ %(config_list["args"]) -S100 << @("scale\n"); + + check_test(tgt_name, res, results_file); + } + } + + test sym(path.join(testdir, + "builtin_var_long_arg_with_lib_env_arg")): bin + { + env.set env.str("BC_ENV_ARGS", "-l") + { + testdir: str = path.dirname(tgt_name); + results_file: str = path.join(testdir, + OTHER_MATHLIB_SCALE_RESULTS_NAME); + + res := $ %(config_list["args"]) --scale=100 << @("scale\n"); + + check_test(tgt_name, res, results_file); + } + } + + test sym(path.join(testdir, "builtin_var_env_arg_with_lib_arg")): bin + { + env.set env.str("BC_ENV_ARGS", "-S100") + { + testdir: str = path.dirname(tgt_name); + results_file: str = path.join(testdir, + OTHER_MATHLIB_SCALE_RESULTS_NAME); + + res := $ %(config_list["args"]) -l << @("scale\n"); + + check_test(tgt_name, res, results_file); + } + } + + test sym(path.join(testdir, + "builtin_var_long_env_arg_with_lib_arg")): bin + { + env.set env.str("BC_ENV_ARGS", "--scale=100") + { + testdir: str = path.dirname(tgt_name); + results_file: str = path.join(testdir, + OTHER_MATHLIB_SCALE_RESULTS_NAME); + + res := $ %(config_list["args"]) -l << @("scale\n"); + + check_test(tgt_name, res, results_file); + } + } + + test sym(path.join(testdir, "limits")): bin + { + res := $ %(config_list["args"]) << @("limits\n"); + + check_test_retcode(tgt_name, res.exitcode); + + if str(res.stdout) == "" || str(res.stdout) == "\n" + { + error("Test \"" +~ tgt_name +~ "\" did not produce output"); + } + } + } + + test sym(path.join(testdir, "bad_arg_for_builtin_var_option")): bin + { + testdir: str = path.dirname(tgt_name); + calc: str = path.basename(testdir); + + scale: str = if calc == "bc" { "scale\n"; } else { "K\n"; }; + + res1 := $ %(config_list["args"]) --scale=18923c.rlg << $scale; + + check_err_test(tgt_name, res1); + + if bool(config["extra_math"]) + { + seed: str = if calc == "bc" { "seed\n"; } else { "J\n"; }; + + res2 := $ %(config_list["args"]) --seed=18923c.rlg << $seed; + + check_err_test(tgt_name, res2); + } + } + + test sym(path.join(testdir, "directory_as_file")): bin + { + testdir: str = path.dirname(tgt_name); + + res := $ %(config_list["args"]) $testdir; + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "binary_file")): bin + { + res := $ %(config_list["args"]) @(file_dep); + + check_err_test(tgt_name, res); + } + + test sym(path.join(testdir, "binary_stdin")): bin + { + res := $ %(config_list["args"]) < @(file_dep); + + check_err_test(tgt_name, res); + } +} + +fn register_timeconst_tests( + bin: str, + testdir: str, + src_testdir: str, +) -> void +{ + timeconst: str = path.join(testdir, "scripts/timeconst.bc"); + + if !path.isfile(path.join(src_dir, timeconst)) + { + io.eprint("Warning: " +~ timeconst +~ " does not exist\n"); + io.eprint(timeconst +~ " is not part of this bc because of " +~ + "license incompatibility\n"); + io.eprint("To test it, get it from the Linux kernel at " +~ + "`kernel/time/timeconst.bc`\n"); + io.eprint("Skipping...\n"); + + return; + } + + for i: range(1001) + { + test sym(path.join(timeconst, str(i))) + { + idx: str = path.basename(tgt_name) +~ "\n"; + file: str = path.join(src_dir, path.dirname(tgt_name)); + + // Generate. + res1 := $ bc -q $file << $idx; + + if res1.exitcode != 0 + { + io.eprint("Other bc is not GNU compatible. Skipping...\n"); + return; + } + + // Run. + res2 := $ %(config_list["args"]) -q $file << $idx; + + if res2.exitcode != 0 || res2.stdout != res1.stdout + { + error("\nFailed on input: " +~ idx +~ "\n"); + } + } + } +} + +fn register_history_tests( + bin: str, + testdir: str, + src_testdir: str, +) -> void +{ + calc: str = path.basename(testdir); + + src_test_scriptdir: str = path.dirname(src_testdir); + + len_res := $ @(path.join(src_test_scriptdir, "history.py")) $calc -a; + + if len_res.exitcode != 0 + { + io.eprint("Python 3 with pexpect doesn't work. Skipping history tests"); + return; + } + + len: usize = usize(str(len_res.stdout)); + + for i: range(len) + { + test sym(calc +~ "/history/" +~ str(i)): bin + { + name: str = tgt_name; + parts: []str = name.split("/"); + + calc: str = parts[0]; + idx: str= parts[2]; + + src_testdir: str = path.join(src_dir, "tests"); + + $ @(path.join(src_testdir, "history.py")) -t $calc $idx @(file_dep); + } + } +} + +/** + * Generates all of the test targets for an executable. + * @param name The base name of the executable. + * @param targets The targets that tests should depend on. + */ +fn exe_tests(name: str) -> void +{ + bin: str = exe_name(name); + + testdir: str = path.join("tests", name); + src_testdir: str = path.join(src_dir, testdir); + + halt: str = if name == "bc" { "halt"; } else { "q"; }; + gen_options: []str = if name == "bc" { @[ "-lq" ]; }; + options: []str = if name == "bc" { @[ "-lqc" ]; } else { @[ "-xc" ]; }; + + other_num: str = "10000000000000000000000000000000000000000000000000" +~ + "0000000000000000000000000000"; + other_num70: str = "10000000000000000000000000000000000000000000000" +~ + "000000000000000000000\\\n0000000000"; + + other_tests: []str = + if name == "bc" + { + @[ "x", "extended-register", "line_length()", other_num ]; + } + else + { + @[ "l", "mathlib", "glpR", other_num +~ "pR" ]; + }; + + other_tests_results: []str = @[ other_num, other_num70 ]; + + var: str = name.toupper() +~ "_LINE_LENGTH"; + + script_options: []str = + if name == "bc" + { + @[ "-lqC" ]; + } + else + { + @[ "-xC" ]; + }; + + error_options: []str = if name == "bc" { @[ "-ls" ]; } else { @[ "-x" ]; }; + + args: []str = + if bool(config["valgrind"]) + { + VALGRIND_ARGS +~ @[ "./" +~ bin ]; + } + else + { + @[ "./" +~ bin ]; + }; + + test_config: Gaml = @(gaml){ + args: $args + halt: $halt + gen_options: $gen_options + options: $options + script_options: $script_options + error_options: $error_options + other_tests: $other_tests + other_tests_results: $other_tests_results + var: $var + }; + + push test_config: config_stack + { + extra: bool = bool(config["extra_math"]); + + register_standard_tests(bin, testdir, src_testdir, extra); + register_script_tests(bin, testdir, src_testdir, extra); + register_stdin_tests(bin, testdir, src_testdir); + register_read_tests(bin, testdir, src_testdir); + register_error_tests(bin, testdir, src_testdir); + register_other_tests(bin, testdir, src_testdir, extra); + + if name == "bc" && bool(config["generated_tests"]) && + path.isfile(path.join(src_testdir, "scripts/timeconst.bc")) + { + register_timeconst_tests(bin, testdir, src_testdir); + } + + if host.os != "Windows" && sym(config["history"]) == @builtin + { + register_history_tests(bin, testdir, src_testdir); + } + } +} + +/** + * Gets the `$BINDIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$BINDIR`, with the `$DESTDIR`. + */ +fn get_bindir() -> str +{ + temp: str = str(config["bindir"]); + + bindir: str = + if temp == "" + { + path.join(str(config["prefix"]), "bin"); + } + else + { + temp; + }; + + return path.join(DESTDIR, bindir); +} + +/** + * Gets the `$LIBDIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$LIBDIR`, with the `$DESTDIR`. + */ +fn get_libdir() -> str +{ + temp: str = str(config["libdir"]); + + libdir: str = + if temp == "" + { + path.join(str(config["prefix"]), "lib"); + } + else + { + temp; + }; + + return path.join(DESTDIR, libdir); +} + +/** + * Gets the `$INCLUDEDIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$INCLUDEDIR`, with the `$DESTDIR`. + */ +fn get_includedir() -> str +{ + temp: str = str(config["includedir"]); + + includedir: str = + if temp == "" + { + path.join(str(config["prefix"]), "include"); + } + else + { + temp; + }; + + return path.join(DESTDIR, includedir); +} + +/** + * Gets the `$PC_PATH`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$PC_PATH`, with the `$DESTDIR`. + */ +fn get_pc_path() -> str +{ + pc_path: str = + if str(config["pc_path"]) == "" + { + res := $ pkg-config --variable=pc_path pkg-config; + + str(res.stdout); + } + else + { + str(config["pc_path"]); + }; + + return path.join(DESTDIR, pc_path); +} + +/** + * Gets the `$DATAROOTDIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$DATAROOTDIR`, with the `$DESTDIR`. + */ +fn get_datarootdir() -> str +{ + temp: str = str(config["datarootdir"]); + + datarootdir: str = + if temp == "" + { + path.join(str(config["prefix"]), "share"); + } + else + { + temp; + }; + + return path.join(DESTDIR, datarootdir); +} + +/** + * Gets the `$DATADIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$DATADIR`, with the `$DESTDIR`. + */ +fn get_datadir() -> str +{ + temp: str = str(config["datadir"]); + + datadir: str = + if temp == "" + { + get_datarootdir(); + } + else + { + temp; + }; + + return path.join(DESTDIR, datadir); +} + +/** + * Gets the `$MANDIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$MANDIR`, with the `$DESTDIR`. + */ +fn get_mandir() -> str +{ + temp: str = str(config["mandir"]); + + mandir: str = + if temp == "" + { + path.join(get_datadir(), "man"); + } + else + { + temp; + }; + + return path.join(DESTDIR, mandir); +} + +/** + * Gets the `$MAN1DIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$MAN1DIR`, with the `$DESTDIR`. + */ +fn get_man1dir() -> str +{ + temp: str = str(config["man1dir"]); + + man1dir: str = + if temp == "" + { + path.join(get_mandir(), "man1"); + } + else + { + temp; + }; + + return path.join(DESTDIR, man1dir); +} + +/** + * Gets the `$MAN3DIR`, including the `$DESTDIR`. This generates the default + * value if it wasn't set. + * @return The `$MAN3DIR`, with the `$DESTDIR`. + */ +fn get_man3dir() -> str +{ + temp: str = str(config["man3dir"]); + + man3dir: str = + if temp == "" + { + path.join(get_mandir(), "man3"); + } + else + { + temp; + }; + + return path.join(DESTDIR, man3dir); +} diff --git a/build.rig b/build.rig new file mode 100644 index 00000000000..55f8c85dadd --- /dev/null +++ b/build.rig @@ -0,0 +1,575 @@ +/* + * ***************************************************************************** + * + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * ***************************************************************************** + * + * The build script file. + * + */ + +if OS == "Windows" && bool(config["lto"]) +{ + error("Link-time optimization is not supported on Windows"); +} + +if LIBRARY_ENABLED == "0" +{ + if OS != "Windows" && NLS_ENABLED != "0" + { + io.eprint("Testing NLS...\n"); + + clang_flags: []str = + if CC contains "clang" + { + @[ "-Wno_unreachable-code" ]; + }; + + flags: []str = clang_flags +~ @[ + DEFOPT +~ "BC_ENABLE_NLS=1", + DEFOPT +~ "BC_ENABLED=" +~ BC_ENABLED, + DEFOPT +~ "DC_ENABLED=" +~ DC_ENABLED, + DEFOPT +~ "BC_ENABLE_HISTORY=0", + DEFOPT +~ "BC_ENABLE_LIBRARY=0", + DEFOPT +~ "BC_ENABLE_AFL=0", + DEFOPT +~ "BC_ENABLE_EXTRA_MATH=" +~ EXTRA_MATH_ENABLED, + DEFOPT +~ "BC_ENABLE_OSSFUZZ=0", + DEFOPT +~ "_POSIX_C_SOURCE=200809L", + DEFOPT +~ "_XOPEN_SOURCE=700", + INCOPT, + ]; + + res := $ $CC %(flags) -c @(path.join(src_dir, "src/vm.c")) -E; + + if res.exitcode != 0 + { + if FORCE + { + io.eprint("Forcing NLS...\n"); + } + else + { + error("NLS does not work\n"); + } + } + else + { + if path.isfile("vm.o") + { + path.rm("vm.o"); + } + + io.eprint("NLS works.\n\n"); + io.eprint("Testing gencat...\n"); + + res2 := $ gencat ./en_US.cat + @(path.join(src_dir, "locales/en_US.msg")); + + if res2.exitcode != 0 + { + if FORCE + { + io.eprint("Forcing NLS...\n"); + } + else + { + error("gencat does not work\n"); + } + } + else + { + io.eprint("gencat works.\n\n"); + + if platform != host + { + error("Cross compiles will not work!\n\n"); + } + } + } + } + + if OS != "Windows" && sym(config["history"]) != @none + { + io.eprint("Testing history...\n"); + + flags: []str = @[ + DEFOPT +~ "BC_ENABLE_HISTORY=1", + DEFOPT +~ "BC_ENABLED=" +~ BC_ENABLED, + DEFOPT +~ "DC_ENABLED=" +~ DC_ENABLED, + DEFOPT +~ "BC_ENABLE_NLS=" +~ NLS_ENABLED, + DEFOPT +~ "BC_ENABLE_LIBRARY=0", + DEFOPT +~ "BC_ENABLE_AFL=0", + DEFOPT +~ "BC_ENABLE_EDITLINE=" +~ EDITLINE_ENABLED, + DEFOPT +~ "BC_ENABLE_READLINE=" +~ READLINE_ENABLED, + DEFOPT +~ "BC_ENABLE_EXTRA_MATH=" +~ EXTRA_MATH_ENABLED, + DEFOPT +~ "BC_ENABLE_OSSFUZZ=0", + DEFOPT +~ "_POSIX_C_SOURCE=200809L", + DEFOPT +~ "_XOPEN_SOURCE=700", + INCOPT, + ]; + + res := $ $CC %(flags) -c @(path.join(src_dir, "src/history.c")) -E; + + if res.exitcode != 0 + { + if FORCE + { + io.eprint("Forcing history...\n"); + } + else + { + error("History does not work\n"); + } + } + else + { + if path.isfile("history.o") + { + path.rm("history.o"); + } + + io.eprint("History works.\n\n"); + } + } +} + +freebsd_flags: []str = +if OS != "FreeBSD" +{ + @[ DEFOPT +~ "_POSIX_C_SOURCE=200809L", DEFOPT +~ "_XOPEN_SOURCE=700" ]; +}; + +macos: bool = (OS == "Darwin"); + +macos_flags: []str = +if macos +{ + @[ DEFOPT +~ "_DARWIN_C_SOURCE" ]; +}; + +openbsd_flags: []str = +if OS == "OpenBSD" +{ + if READLINE_ENABLED != "0" + { + error("Cannot use readline on OpenBSD"); + } + + @[ DEFOPT +~ "_BSD_SOURCE" ]; +}; + +strip_flag: []str = +if OS != "Windows" && !bool(config["debug"]) && !macos && bool(config["strip"]) +{ + @[ "-s" ]; +}; + +lto_flag: []str = +if bool(config["lto"]) +{ + @[ "-flto" ]; +}; + +strict_flags: []str = +if bool(config["strict"]) +{ + // Strict build only works for GCC and Clang, so we do want to set that + // here. + if CC contains "gcc" || CC contains "clang" + { + // These are the standard strict build flags for both compilers. + std_strict: []str = @[ "-Wall", "-Wextra", "-Werror", "-pedantic" ]; + + // Clang has -Weverything, which I ensure Yc builds under. + // + // I also want unlimited errors because Clang is my development + // compiler; it caps at 20 by default. + compiler_strict: []str = + if CC contains "clang" + { + // Oh, and add the standard. + @[ "-Weverything", "-ferror-limit=100000", "-Wno-padded", + "-Wno-unknown-warning-option", "-Wno-unsafe-buffer-usage", + "-Wno-documentation-unknown-command", "-Wno-pre-c11-compat", + "-Wno-enum-enum-conversion", "-Wno-switch-default" ]; + }; + + // Return the combination of the sets. + std_strict +~ compiler_strict; + } + else if OS == "Windows" + { + // Return the combo of the strict options, the standard, and the + // sanitizer defines. + @[ "/W4", "/WX", "/wd\"4996\"", "/permissive-" ]; + } +}; + +version_contents: str = io.read_file(path.join(src_dir, "VERSION.txt")); +version_lines: []str = version_contents.split("\n"); +version: str = version_lines[0]; + +version_flag: []str = @[ DEFOPT +~ "VERSION=" +~ version ]; + +other_flags: []str = freebsd_flags +~ macos_flags +~ openbsd_flags +~ + lto_flag +~ strict_flags +~ version_flag +~ +if bool(config["debug"]) +{ + @[ compiler_db["opt.debug"] ]; +}; + +history_files: []str = +if HISTORY != @none +{ + HISTORY_C_FILES; +}; + +c_files: []str = +if BUILD_MODE == @both +{ + COMMON_C_FILES +~ EXEC_C_FILES +~ BC_C_FILES +~ DC_C_FILES +~ history_files; +} +else if BUILD_MODE == @bc +{ + COMMON_C_FILES +~ EXEC_C_FILES +~ BC_C_FILES +~ history_files; +} +else if BUILD_MODE == @dc +{ + COMMON_C_FILES +~ EXEC_C_FILES +~ DC_C_FILES +~ history_files; +} +else +{ + COMMON_C_FILES +~ LIBRARY_C_FILES; +}; + +build_config: Gaml = @(gaml){ + other_cflags: $other_flags + strip_flag: $strip_flag +}; + +targets: []str = +push build_config: config_stack +{ + gen_o_files: []str = + if BUILD_MODE != @library + { + @[ + txt2o("gen/lib.bc", "bc_lib", "bc_lib_name", "BC_ENABLED", true), + txt2o("gen/lib2.bc", "bc_lib2", "bc_lib2_name", + "BC_ENABLED && BC_ENABLE_EXTRA_MATH", true), + txt2o("gen/bc_help.txt", "bc_help", "", "BC_ENABLED", false), + txt2o("gen/dc_help.txt", "dc_help", "", "DC_ENABLED", false), + ]; + }; + + obj_files: []str = gen_o_files +~ + for f: c_files + { + c2o(f); + }; + + if BUILD_MODE == @both || BUILD_MODE == @bc + { + if OS != "Windows" && bool(config["install_manpages"]) + { + src: str = path.join("manuals/bc", BUILD_TYPE +~ ".1"); + + target BC_MANPAGE: src + { + $ cp -f @(file_dep) @(tgt); + } + } + + exe(BC_BIN, obj_files); + } + + if BUILD_MODE == @both || BUILD_MODE == @dc + { + if OS != "Windows" && bool(config["install_manpages"]) + { + src: str = path.join("manuals/dc", BUILD_TYPE +~ ".1"); + + target DC_MANPAGE: src + { + $ cp -f @(file_dep) @(tgt); + } + } + + if BUILD_MODE == @both + { + ln(DC_BIN, BC_BIN); + } + else + { + exe(DC_BIN, obj_files); + } + } + + if BUILD_MODE == @library + { + lib(LIBRARY, obj_files); + } + + if BUILD_MODE == @both + { + @[ BC_BIN, DC_BIN ]; + } + else if BUILD_MODE == @bc + { + @[ DC_BIN ]; + } + else if BUILD_MODE == @dc + { + @[ DC_BIN ]; + } + else + { + includedir: str = get_includedir(); + libdir: str = get_libdir(); + + pc_config: Gaml = @(gaml){ + INCLUDEDIR: $includedir + LIBDIR: $libdir + VERSION: $version + }; + + push pc_config: config_stack + { + target PC_FILE: PC_FILE +~ ".in" + { + configure_file(file_dep, tgt, "%%"); + } + } + + @[ LIBRARY, PC_FILE ]; + } +}; + +if OS != "Windows" +{ + if LIBRARY_ENABLED == "0" + { + target @install: targets + { + bindir: str = get_bindir(); + + if BC_ENABLED != "0" + { + $ $SAFE_INSTALL $EXEC_INSTALL_MODE $BC_BIN + @(path.join(bindir, BC_BIN)); + } + + if DC_ENABLED != "0" + { + if BC_ENABLED != "0" + { + $ ln -sf @("./" +~ BC_BIN) @(path.join(bindir, DC_BIN)); + } + else + { + $ $SAFE_INSTALL $EXEC_INSTALL_MODE $BC_BIN + @(path.join(bindir, BC_BIN)); + } + } + + if NLS_ENABLED != "0" + { + locale_install_args: []str = + if sym(config["locales"]) == @all + { + @[ "-l" ]; + }; + + if DESTDIR != "" + { + $ @(path.join(src_dir, "scripts/locale_install.sh")) + %(locale_install_args) @(str(config["nlspath"])) + $MAINEXEC $DESTDIR; + } + else + { + $ @(path.join(src_dir, "scripts/locale_install.sh")) + %(locale_install_args) @(str(config["nlspath"])) + $MAINEXEC; + } + } + + if bool(config["install_manpages"]) + { + man1dir: str = get_man1dir(); + + if BC_ENABLED != "0" + { + $ rm -rf @(path.join(man1dir, BC_MANPAGE)); + } + + if DC_ENABLED != "0" + { + $ rm -rf @(path.join(man1dir, DC_MANPAGE)); + } + } + } + + target @uninstall + { + bindir: str = get_bindir(); + + if BC_ENABLED != "0" + { + $ rm -rf @(path.join(bindir, BC_BIN)); + } + + if DC_ENABLED != "0" + { + $ rm -rf @(path.join(bindir, DC_BIN)); + } + + if NLS_ENABLED != "0" + { + if DESTDIR != "" + { + $ @(path.join(src_dir, "scripts/locale_uninstall.sh")) + @(str(config["nlspath"])) $MAINEXEC $DESTDIR; + } + else + { + $ @(path.join(src_dir, "scripts/locale_uninstall.sh")) + @(str(config["nlspath"])) $MAINEXEC; + } + } + + if bool(config["install_manpages"]) + { + man1dir: str = get_man1dir(); + $ rm -rf @(path.join(man1dir, BC_MANPAGE)) + @(path.join(man1dir, DC_MANPAGE)); + } + } + } + else + { + target @install: targets, BCL_HEADER_PATH + { + full_libdir: str = get_libdir(); + + $ $SAFE_INSTALL $EXEC_INSTALL_MODE @(file_dep) + @(path.join(full_libdir, file_dep)); + + full_pc_path: str = get_pc_path(); + bcl_pc: str = file_deps[1]; + + $ $SAFE_INSTALL $MANPAGE_INSTALL_MODE $bcl_pc + @(path.join(full_pc_path, bcl_pc)); + + full_includedir: str = get_includedir(); + + $ $SAFE_INSTALL $MANPAGE_INSTALL_MODE @(file_deps[2]) + @(path.join(full_includedir, BCL_HEADER)); + + if bool(config["install_manpages"]) + { + $ $SAFE_INSTALL $MANPAGE_INSTALL_MODE + @(path.join(src_dir, path.join("manuals", BCL_MANPAGE))) + @(path.join(get_man3dir(), BCL_MANPAGE)); + } + } + + target @uninstall + { + $ rm -rf @(path.join(get_libdir(), LIBRARY)) + @(path.join(get_pc_path(), PC_FILE)) + @(path.join(get_includedir(), BCL_HEADER)); + + if bool(config["install_manpages"]) + { + $ rm -rf @(path.join(get_man3dir(), BCL_MANPAGE)); + } + } + } +} + +// If the platform matches the host, we can run the test suite. +if platform == host +{ + // If we have the library, build and run that test. + if BUILD_MODE == @library + { + libtesto: str = c2o("tests/bcl.c"); + + libtest: str = "bcl"; + + exe(libtest, @[ libtesto, targets[0] ]); + + test @bcl: libtest + { + $ @(str(tgt_name)); + } + } + else + { + if BUILD_MODE != @dc + { + exe_tests("bc"); + } + + if BUILD_MODE != @bc + { + exe_tests("dc"); + } + + target @clean_tests + { + for f: path.find_ext(build_dir, "txt") + { + path.rm(f); + } + } + } +} + +target "bitfuncgen" +{ + error("TODO: Make this"); +} + +target @bitfuncgen: "bitfuncgen" +{ + error("TODO: Make this"); +} + +target "ministat" +{ + error("TODO: Make this"); +} + +target @ministat: "ministat" +{ + error("TODO: Make this"); +} + +target @all: targets; diff --git a/compile_flags.txt b/compile_flags.txt index 3324798013c..64af9a35e75 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -1,6 +1,9 @@ -Weverything -pedantic -Wno-unsafe-buffer-usage +-Wno-pre-c11-compat +-Wno-unknown-warning-option +-Wno-switch-default -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -D_BSD_SOURCE diff --git a/configure.sh b/configure.sh index 442165d1569..92ff45cca84 100755 --- a/configure.sh +++ b/configure.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -55,7 +55,7 @@ usage() { printf ' %s [-a|-bD|-dB|-c] [-CeEfgGHilmMNPrtTvz] [-O OPT_LEVEL] [-k KARATSUBA_LEN]\\\n' "$script" printf ' [-s SETTING] [-S SETTING] [-p TYPE]\n' printf ' %s \\\n' "$script" - printf ' [--library|--bc-only --disable-dc|--dc-only --disable-bc|--coverage] \\\n' + printf ' [--library|--bc-only --disable-dc|--dc-only --disable-bc] \\\n' printf ' [--force --debug --disable-extra-math --disable-generated-tests] \\\n' printf ' [--disable-history --disable-man-pages --disable-nls --disable-strip] \\\n' printf ' [--enable-editline] [--enable-readline] [--enable-internal-history] \\\n' @@ -74,7 +74,7 @@ usage() { printf '\n' printf ' -a, --library\n' printf ' Build the libbcl instead of the programs. This is meant to be used with\n' - printf ' Other software like programming languages that want to make use of the\n' + printf ' other software like programming languages that want to make use of the\n' printf ' parsing and math capabilities. This option will install headers using\n' printf ' `make install`.\n' printf ' -b, --bc-only\n' @@ -83,10 +83,6 @@ usage() { printf ' -B, --disable-bc\n' printf ' Disable bc. It is an error if "-b", "--bc-only", "-D", or "--disable-dc"\n' printf ' are specified too.\n' - printf ' -c, --coverage\n' - printf ' Generate test coverage code. Requires gcov and gcovr.\n' - printf ' It is an error if either "-b" ("-D") or "-d" ("-B") is specified.\n' - printf ' Requires a compiler that use gcc-compatible coverage options\n' printf ' -C, --disable-clean\n' printf ' Disable the clean that configure.sh does before configure.\n' printf ' -d, --dc-only\n' @@ -133,8 +129,6 @@ usage() { printf ' Installs all locales, regardless of how many are on the system. This\n' printf ' option is useful for package maintainers who want to make sure that\n' printf ' a package contains all of the locales that end users might need.\n' - printf ' -m, --enable-memcheck\n' - printf ' Enable memcheck mode, to ensure no memory leaks. For development only.\n' printf ' -M, --disable-man-pages\n' printf ' Disable installing manpages.\n' printf ' -N, --disable-nls\n' @@ -172,17 +166,9 @@ usage() { printf ' Set the default named by SETTING to off. See below for possible values\n' printf ' for SETTING. For multiple instances of the -s or -S for the the same\n' printf ' setting, the last one is used.\n' - printf ' -t, --enable-test-timing\n' - printf ' Enable the timing of tests. This is for development only.\n' printf ' -T, --disable-strip\n' printf ' Disable stripping symbols from the compiled binary or binaries.\n' printf ' Stripping symbols only happens when debug mode is off.\n' - printf ' -v, --enable-valgrind\n' - printf ' Enable a build appropriate for valgrind. For development only.\n' - printf ' -z, --enable-fuzz-mode\n' - printf ' Enable fuzzing mode. THIS IS FOR DEVELOPMENT ONLY.\n' - printf ' -Z, --enable-ossfuzz-mode\n' - printf ' Enable fuzzing mode for OSS-Fuzz. THIS IS FOR DEVELOPMENT ONLY.\n' printf ' --prefix PREFIX\n' printf ' The prefix to install to. Overrides "$PREFIX" if it exists.\n' printf ' If PREFIX is "/usr", install path will be "/usr/bin".\n' @@ -254,12 +240,12 @@ usage() { printf ' path (or contain one). This is treated the same as the POSIX\n' printf ' definition of $NLSPATH (see POSIX environment variables for\n' printf ' more information). Default is "/usr/share/locale/%%L/%%N".\n' - printf ' PC_PATH The location to install pkg-config files to. Must be an\n' + printf ' PC_PATH The location to install pkg-config files to. Must be a\n' printf ' path or contain one. Default is the first path given by the\n' printf ' output of `pkg-config --variable=pc_path pkg-config`.\n' printf ' EXECSUFFIX The suffix to append to the executable names, used to not\n' printf ' interfere with other installed bc executables. Default is "".\n' - printf ' EXECPREFIX The prefix to append to the executable names, used to not\n' + printf ' EXECPREFIX The prefix to prepend to the executable names, used to not\n' printf ' interfere with other installed bc executables. Default is "".\n' printf ' DESTDIR For package creation. Default is "". If it is empty when\n' printf ' `%s` is run, it can also be passed to `make install`\n' "$script" @@ -482,7 +468,7 @@ find_src_files() { } # This function generates a list of files to go into the Makefile. It generates -# the list of object files, as well as the list of test coverage files. +# the list of object files. # # @param contents The contents of the Makefile template to put the list of # files into. @@ -503,8 +489,6 @@ gen_file_list() { _gen_file_list_needle_src="SRC" _gen_file_list_needle_obj="OBJ" - _gen_file_list_needle_gcda="GCDA" - _gen_file_list_needle_gcno="GCNO" _gen_file_list_replacement=$(find_src_files $_gen_file_list_unneeded | tr '\n' ' ') _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ @@ -521,151 +505,9 @@ gen_file_list() { _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ "$_gen_file_list_needle_obj" "$_gen_file_list_replacement") - _gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "o" "gcda") - _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ - "$_gen_file_list_needle_gcda" "$_gen_file_list_replacement") - - _gen_file_list_replacement=$(replace_exts "$_gen_file_list_replacement" "gcda" "gcno") - _gen_file_list_contents=$(replace "$_gen_file_list_contents" \ - "$_gen_file_list_needle_gcno" "$_gen_file_list_replacement") - printf '%s\n' "$_gen_file_list_contents" } -# Generates the proper test targets for each test to have its own target. This -# allows `make test` to run in parallel. -# -# @param name Which calculator to generate tests for. -# @param extra_math An integer that, if non-zero, activates extra math tests. -# @param time_tests An integer that, if non-zero, tells the test suite to time -# the execution of each test. -gen_std_tests() { - - _gen_std_tests_name="$1" - shift - - _gen_std_tests_extra_math="$1" - shift - - _gen_std_tests_time_tests="$1" - shift - - _gen_std_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt") - - for _gen_std_tests_t in $(cat "$scriptdir/tests/$_gen_std_tests_name/all.txt"); do - - if [ "$_gen_std_tests_extra_math" -eq 0 ]; then - - if [ -z "${_gen_std_tests_extra_required##*$_gen_std_tests_t*}" ]; then - printf 'test_%s_%s:\n\t@printf "Skipping %s %s\\n"\n\n' \ - "$_gen_std_tests_name" "$_gen_std_tests_t" "$_gen_std_tests_name" \ - "$_gen_std_tests_t" >> "Makefile" - continue - fi - - fi - - printf 'test_%s_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh $(TESTSDIR)/test.sh %s %s %s %s %s\n\n' \ - "$_gen_std_tests_name" "$_gen_std_tests_t" "$builddir" "$_gen_std_tests_name" \ - "$_gen_std_tests_t" "$generate_tests" "$time_tests" \ - "$*" >> "Makefile" - - done -} - -# Generates a list of test targets that will be used as prerequisites for other -# targets. -# -# @param name The name of the calculator to generate test targets for. -gen_std_test_targets() { - - _gen_std_test_targets_name="$1" - shift - - _gen_std_test_targets_tests=$(cat "$scriptdir/tests/${_gen_std_test_targets_name}/all.txt") - - for _gen_std_test_targets_t in $_gen_std_test_targets_tests; do - printf ' test_%s_%s' "$_gen_std_test_targets_name" "$_gen_std_test_targets_t" - done - - printf '\n' -} - -# Generates the proper test targets for each error test to have its own target. -# This allows `make test_bc_errors` and `make test_dc_errors` to run in -# parallel. -# -# @param name Which calculator to generate tests for. -gen_err_tests() { - - _gen_err_tests_name="$1" - shift - - _gen_err_tests_fs=$(ls "$scriptdir/tests/$_gen_err_tests_name/errors/") - - for _gen_err_tests_t in $_gen_err_tests_fs; do - - printf 'test_%s_error_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh $(TESTSDIR)/error.sh %s %s %s %s\n\n' \ - "$_gen_err_tests_name" "$_gen_err_tests_t" "$builddir" "$_gen_err_tests_name" \ - "$_gen_err_tests_t" "$problematic_tests" "$*" >> "Makefile" - - done - -} - -# Generates a list of error test targets that will be used as prerequisites for -# other targets. -# -# @param name The name of the calculator to generate test targets for. -gen_err_test_targets() { - - _gen_err_test_targets_name="$1" - shift - - _gen_err_test_targets_tests=$(ls "$scriptdir/tests/$_gen_err_test_targets_name/errors/") - - for _gen_err_test_targets_t in $_gen_err_test_targets_tests; do - printf ' test_%s_error_%s' "$_gen_err_test_targets_name" "$_gen_err_test_targets_t" - done - - printf '\n' -} - -# Generates the proper script test targets for each script test to have its own -# target. This allows `make test` to run in parallel. -# -# @param name Which calculator to generate tests for. -# @param extra_math An integer that, if non-zero, activates extra math tests. -# @param generate An integer that, if non-zero, activates generated tests. -# @param time_tests An integer that, if non-zero, tells the test suite to time -# the execution of each test. -gen_script_tests() { - - _gen_script_tests_name="$1" - shift - - _gen_script_tests_extra_math="$1" - shift - - _gen_script_tests_generate="$1" - shift - - _gen_script_tests_time="$1" - shift - - _gen_script_tests_tests=$(cat "$scriptdir/tests/$_gen_script_tests_name/scripts/all.txt") - - for _gen_script_tests_f in $_gen_script_tests_tests; do - - _gen_script_tests_b=$(basename "$_gen_script_tests_f" ".${_gen_script_tests_name}") - - printf 'test_%s_script_%s:\n\t@export BC_TEST_OUTPUT_DIR="%s/tests"; sh $(TESTSDIR)/script.sh %s %s %s 1 %s %s %s\n\n' \ - "$_gen_script_tests_name" "$_gen_script_tests_b" "$builddir" "$_gen_script_tests_name" \ - "$_gen_script_tests_f" "$_gen_script_tests_extra_math" "$_gen_script_tests_generate" \ - "$_gen_script_tests_time" "$*" >> "Makefile" - done -} - set_default() { _set_default_on="$1" @@ -710,7 +552,6 @@ predefined_build() { BSD) bc_only=0 dc_only=0 - coverage=0 debug=0 optimization="3" hist=1 @@ -723,11 +564,6 @@ predefined_build() { strip_bin=1 all_locales=0 library=0 - fuzz=0 - ossfuzz=0 - time_tests=0 - vg=0 - memcheck=0 clean=1 bc_default_banner=0 bc_default_sigint_reset=1 @@ -744,7 +580,6 @@ predefined_build() { GNU) bc_only=0 dc_only=0 - coverage=0 debug=0 optimization="3" hist=1 @@ -757,11 +592,6 @@ predefined_build() { strip_bin=1 all_locales=0 library=0 - fuzz=0 - ossfuzz=0 - time_tests=0 - vg=0 - memcheck=0 clean=1 bc_default_banner=1 bc_default_sigint_reset=1 @@ -777,10 +607,10 @@ predefined_build() { GDH) CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories" - CFLAGS="$CFLAGS -Wno-switch-default -Werror -pedantic -std=c11" + CFLAGS="$CFLAGS -Wno-unknown-warning-option -Wno-switch-default -Wno-pre-c11-compat" + CFLAGS="$CFLAGS -Werror -pedantic -std=c11" bc_only=0 dc_only=0 - coverage=0 debug=0 optimization="3" hist=1 @@ -793,11 +623,6 @@ predefined_build() { strip_bin=1 all_locales=0 library=0 - fuzz=0 - ossfuzz=0 - time_tests=0 - vg=0 - memcheck=0 clean=1 bc_default_banner=1 bc_default_sigint_reset=1 @@ -813,10 +638,10 @@ predefined_build() { DBG) CFLAGS="-Weverything -Wno-padded -Wno-unsafe-buffer-usage -Wno-poison-system-directories" - CFLAGS="$CFLAGS -Wno-switch-default -Werror -pedantic -std=c11" + CFLAGS="$CFLAGS -Wno-unknown-warning-option -Wno-switch-default -Wno-pre-c11-compat" + CFLAGS="$CFLAGS -Werror -pedantic -std=c11" bc_only=0 dc_only=0 - coverage=0 debug=1 optimization="0" hist=1 @@ -829,11 +654,6 @@ predefined_build() { strip_bin=1 all_locales=0 library=0 - fuzz=0 - ossfuzz=0 - time_tests=0 - vg=0 - memcheck=1 clean=1 bc_default_banner=1 bc_default_sigint_reset=1 @@ -852,36 +672,12 @@ predefined_build() { esac } -# Generates a list of script test targets that will be used as prerequisites for -# other targets. -# -# @param name The name of the calculator to generate script test targets for. -gen_script_test_targets() { - - _gen_script_test_targets_name="$1" - shift - - _gen_script_test_targets_tests=$(cat "$scriptdir/tests/$_gen_script_test_targets_name/scripts/all.txt") - - for _gen_script_test_targets_f in $_gen_script_test_targets_tests; do - _gen_script_test_targets_b=$(basename "$_gen_script_test_targets_f" \ - ".$_gen_script_test_targets_name") - printf ' test_%s_script_%s' "$_gen_script_test_targets_name" \ - "$_gen_script_test_targets_b" - done - - printf '\n' -} - # This is a list of defaults, but it is also the list of possible options for # users to change. # -# The development options are: force (force options even if they fail), valgrind -# (build in a way suitable for valgrind testing), memcheck (same as valgrind), -# and fuzzing (build in a way suitable for fuzzing). +# The development options are: force (force options even if they fail). bc_only=0 dc_only=0 -coverage=0 karatsuba_len=32 debug=0 hist=1 @@ -895,11 +691,6 @@ force=0 strip_bin=1 all_locales=0 library=0 -fuzz=0 -ossfuzz=0 -time_tests=0 -vg=0 -memcheck=0 clean=1 problematic_tests=1 @@ -920,13 +711,12 @@ dc_default_digit_clamp=0 # getopts is a POSIX utility, but it cannot handle long options. Thus, the # handling of long options is done by hand, and that's the reason that short and # long options cannot be mixed. -while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvzZ-" opt; do +while getopts "abBcdDeEfgGhHik:lMNO:p:PrS:s:T-" opt; do case "$opt" in a) library=1 ;; b) bc_only=1 ;; B) dc_only=1 ;; - c) coverage=1 ;; C) clean=0 ;; d) dc_only=1 ;; D) bc_only=1 ;; @@ -940,7 +730,6 @@ while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvzZ-" opt; do i) hist_impl="internal" ;; k) karatsuba_len="$OPTARG" ;; l) all_locales=1 ;; - m) memcheck=1 ;; M) install_manpages=0 ;; N) nls=0 ;; O) optimization="$OPTARG" ;; @@ -949,11 +738,7 @@ while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvzZ-" opt; do r) hist_impl="readline" ;; S) set_default 0 "$OPTARG" ;; s) set_default 1 "$OPTARG" ;; - t) time_tests=1 ;; T) strip_bin=0 ;; - v) vg=1 ;; - z) fuzz=1 ;; - Z) ossfuzz=1 ;; -) arg="$1" arg="${arg#--}" @@ -963,7 +748,6 @@ while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvzZ-" opt; do library) library=1 ;; bc-only) bc_only=1 ;; dc-only) dc_only=1 ;; - coverage) coverage=1 ;; debug) debug=1 ;; force) force=1 ;; prefix=?*) PREFIX="$LONG_OPTARG" ;; @@ -1077,27 +861,20 @@ while getopts "abBcdDeEfgGhHik:lMmNO:p:PrS:s:tTvzZ-" opt; do enable-editline) hist_impl="editline" ;; enable-readline) hist_impl="readline" ;; enable-internal-history) hist_impl="internal" ;; - enable-test-timing) time_tests=1 ;; - enable-valgrind) vg=1 ;; - enable-fuzz-mode) fuzz=1 ;; - enable-ossfuzz-mode) ossfuzz=1 ;; - enable-memcheck) memcheck=1 ;; install-all-locales) all_locales=1 ;; - help* | bc-only* | dc-only* | coverage* | debug*) + help* | bc-only* | dc-only* | debug*) usage "No arg allowed for --$arg option" ;; disable-bc* | disable-dc* | disable-clean*) usage "No arg allowed for --$arg option" ;; disable-extra-math*) usage "No arg allowed for --$arg option" ;; - disable-generated-tests* | disable-history*) + disable-history*) usage "No arg allowed for --$arg option" ;; disable-man-pages* | disable-nls* | disable-strip*) usage "No arg allowed for --$arg option" ;; disable-problematic-tests*) usage "No arg allowed for --$arg option" ;; - enable-fuzz-mode* | enable-test-timing* | enable-valgrind*) - usage "No arg allowed for --$arg option" ;; - enable-memcheck* | install-all-locales*) + install-all-locales*) usage "No arg allowed for --$arg option" ;; enable-editline* | enable-readline*) usage "No arg allowed for --$arg option" ;; @@ -1221,33 +998,7 @@ link="@printf 'No link necessary\\\\n'" main_exec="BC" executable="BC_EXEC" -tests="test_bc timeconst test_dc" - -bc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh bc $extra_math 1 $generate_tests $problematic_tests $time_tests \$(BC_EXEC)" -bc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n bc $extra_math 1 $generate_tests $problematic_tests $time_tests \$(BC_EXEC)" -dc_test="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh dc $extra_math 1 $generate_tests $problematic_tests $time_tests \$(DC_EXEC)" -dc_test_np="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/all.sh -n dc $extra_math 1 $generate_tests $problematic_tests $time_tests \$(DC_EXEC)" - -timeconst="@export BC_TEST_OUTPUT_DIR=\"$builddir/tests\"; \$(TESTSDIR)/bc/timeconst.sh \$(TESTSDIR)/bc/scripts/timeconst.bc \$(BC_EXEC)" - -# In order to have cleanup at exit, we need to be in -# debug mode, so don't run valgrind without that. -if [ "$vg" -ne 0 ]; then - debug=1 - bc_test_exec='valgrind $(VALGRIND_ARGS) $(BC_EXEC)' - dc_test_exec='valgrind $(VALGRIND_ARGS) $(DC_EXEC)' - bcl_test_exec='valgrind $(VALGRIND_ARGS) $(BCL_TEST)' -else - bc_test_exec='$(BC_EXEC)' - dc_test_exec='$(DC_EXEC)' - bcl_test_exec='$(BCL_TEST)' -fi - -test_bc_history_prereqs="test_bc_history_all" -test_dc_history_prereqs="test_dc_history_all" - karatsuba="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'" -karatsuba_test="@printf 'karatsuba cannot be run because one of bc or dc is not built\\\\n'" bc_lib="\$(GEN_DIR)/lib.o" bc_help="\$(GEN_DIR)/bc_help.o" @@ -1274,9 +1025,6 @@ if [ "$library" -ne 0 ]; then default_target_prereqs="\$(BIN) \$(OBJ)" default_target_cmd="ar -r -cu \$(LIBBC) \$(OBJ)" default_target="\$(LIBBC)" - tests="test_library" - test_bc_history_prereqs=" test_bc_history_skip" - test_dc_history_prereqs=" test_dc_history_skip" install_prereqs=" install_library" uninstall_prereqs=" uninstall_library" @@ -1292,10 +1040,6 @@ elif [ "$bc_only" -eq 1 ]; then executables="bc" - dc_test="@printf 'No dc tests to run\\\\n'" - dc_test_np="@printf 'No dc tests to run\\\\n'" - test_dc_history_prereqs=" test_dc_history_skip" - install_prereqs=" install_execs" install_man_prereqs=" install_bc_manpage" uninstall_prereqs=" uninstall_bc" @@ -1303,7 +1047,6 @@ elif [ "$bc_only" -eq 1 ]; then default_target="\$(BC_EXEC)" second_target="\$(DC_EXEC)" - tests="test_bc timeconst" elif [ "$dc_only" -eq 1 ]; then @@ -1318,58 +1061,11 @@ elif [ "$dc_only" -eq 1 ]; then main_exec="DC" executable="DC_EXEC" - bc_test="@printf 'No bc tests to run\\\\n'" - bc_test_np="@printf 'No bc tests to run\\\\n'" - test_bc_history_prereqs=" test_bc_history_skip" - - timeconst="@printf 'timeconst cannot be run because bc is not built\\\\n'" - install_prereqs=" install_execs" install_man_prereqs=" install_dc_manpage" uninstall_prereqs=" uninstall_dc" uninstall_man_prereqs=" uninstall_dc_manpage" - tests="test_dc" - -elif [ "$ossfuzz" -eq 1 ]; then - - if [ "$bc_only" -ne 0 ] || [ "$dc_only" -ne 0 ]; then - usage "An OSS-Fuzz build must build both fuzzers." - fi - - bc=1 - dc=1 - - # Expressions *cannot* exit in an OSS-Fuzz build. - bc_default_expr_exit=0 - dc_default_expr_exit=0 - - executables="bc_fuzzer and dc_fuzzer" - - karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)" - karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)" - - if [ "$library" -eq 0 ]; then - install_prereqs=" install_execs" - install_man_prereqs=" install_bc_manpage install_dc_manpage" - uninstall_prereqs=" uninstall_bc uninstall_dc" - uninstall_man_prereqs=" uninstall_bc_manpage uninstall_dc_manpage" - else - install_prereqs=" install_library install_bcl_header" - install_man_prereqs=" install_bcl_manpage" - uninstall_prereqs=" uninstall_library uninstall_bcl_header" - uninstall_man_prereqs=" uninstall_bcl_manpage" - tests="test_library" - fi - - second_target_prereqs="src/bc_fuzzer.o $default_target_prereqs" - default_target_prereqs="\$(BC_FUZZER) src/dc_fuzzer.o $default_target_prereqs" - default_target_cmd="\$(CXX) \$(CFLAGS) src/dc_fuzzer.o \$(LIB_FUZZING_ENGINE) \$(OBJS) \$(LDFLAGS) -o \$(DC_FUZZER) \&\& ln -sf ./dc_fuzzer_c \$(DC_FUZZER_C)" - second_target_cmd="\$(CXX) \$(CFLAGS) src/bc_fuzzer.o \$(LIB_FUZZING_ENGINE) \$(OBJS) \$(LDFLAGS) -o \$(BC_FUZZER) \&\& ln -sf ./bc_fuzzer_c \$(BC_FUZZER_C)" - - default_target="\$(DC_FUZZER) \$(DC_FUZZER_C)" - second_target="\$(BC_FUZZER) \$(BC_FUZZER_C)" - else bc=1 @@ -1378,7 +1074,6 @@ else executables="bc and dc" karatsuba="@\$(KARATSUBA) 30 0 \$(BC_EXEC)" - karatsuba_test="@\$(KARATSUBA) 1 100 \$(BC_EXEC)" if [ "$library" -eq 0 ]; then install_prereqs=" install_execs" @@ -1390,7 +1085,6 @@ else install_man_prereqs=" install_bcl_manpage" uninstall_prereqs=" uninstall_library uninstall_bcl_header" uninstall_man_prereqs=" uninstall_bcl_manpage" - tests="test_library" fi second_target_prereqs="$default_target_prereqs" @@ -1399,18 +1093,6 @@ else fi -if [ "$fuzz" -ne 0 ] && [ "$ossfuzz" -ne 0 ]; then - usage "Fuzzing mode and OSS-Fuzz mode are mutually exclusive" -fi - -# We need specific stuff for fuzzing. -if [ "$fuzz" -ne 0 ] || [ "$ossfuzz" -ne 0 ]; then - debug=1 - hist=0 - nls=0 - optimization="3" -fi - # This sets some necessary things for debug mode. if [ "$debug" -eq 1 ]; then @@ -1429,26 +1111,6 @@ if [ -n "$optimization" ]; then CFLAGS="-O$optimization $CFLAGS" fi -# Set test coverage defaults. -if [ "$coverage" -eq 1 ]; then - - if [ "$bc_only" -eq 1 ] || [ "$dc_only" -eq 1 ]; then - usage "Can only specify -c without -b or -d" - fi - - CFLAGS="-fprofile-arcs -ftest-coverage -g -O0 $CFLAGS" - CPPFLAGS="-DNDEBUG $CPPFLAGS" - - COVERAGE_OUTPUT="@gcov -pabcdf \$(GCDA) \$(BC_GCDA) \$(DC_GCDA) \$(HISTORY_GCDA) \$(RAND_GCDA)" - COVERAGE_OUTPUT="$COVERAGE_OUTPUT;\$(RM) -f \$(GEN)*.gc*" - COVERAGE_OUTPUT="$COVERAGE_OUTPUT;gcovr --exclude-unreachable-branches --exclude-throw-branches --html-details --output index.html" - COVERAGE_PREREQS=" test coverage_output" - -else - COVERAGE_OUTPUT="@printf 'Coverage not generated\\\\n'" - COVERAGE_PREREQS="" -fi - # Set some defaults. if [ -z "${DESTDIR+set}" ]; then destdir="" @@ -1567,7 +1229,7 @@ if [ "$nls" -ne 0 ]; then printf 'NLS works.\n\n' printf 'Testing gencat...\n' - gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" > /dev/null + gencat "./en_US.cat" "$scriptdir/locales/en_US.msg" 2>&1 err="$?" @@ -1672,26 +1334,10 @@ else fi -# We have to disable the history tests if it is disabled or valgrind is on. Or -# if we are using editline or readline. -if [ "$hist" -eq 0 ] || [ "$vg" -ne 0 ]; then - test_bc_history_prereqs=" test_bc_history_skip" - test_dc_history_prereqs=" test_dc_history_skip" - history_tests="@printf 'Skipping history tests...\\\\n'" +if [ "$hist" -eq 0 ]; then CFLAGS="$CFLAGS -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0" else - if [ "$editline" -eq 0 ] && [ "$readline" -eq 0 ]; then - history_tests="@printf '\$(TEST_STARS)\\\\n\\\\nRunning history tests...\\\\n\\\\n'" - history_tests="$history_tests \&\& \$(TESTSDIR)/history.sh bc -a \&\&" - history_tests="$history_tests \$(TESTSDIR)/history.sh dc -a \&\& printf" - history_tests="$history_tests '\\\\nAll history tests passed.\\\\n\\\\n\$(TEST_STARS)\\\\n'" - else - test_bc_history_prereqs=" test_bc_history_skip" - test_dc_history_prereqs=" test_dc_history_skip" - history_tests="@printf 'Skipping history tests...\\\\n'" - fi - # We are also setting the CFLAGS and LDFLAGS here. if [ "$editline" -ne 0 ]; then LDFLAGS="$LDFLAGS -ledit" @@ -1795,7 +1441,7 @@ GEN_DIR="$scriptdir/gen" # `gen/strgen.sh` is used. GEN="strgen" GEN_EXEC_TARGET="\$(HOSTCC) -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -I$scriptdir/include/ \$(HOSTCFLAGS) -o \$(GEN_EXEC) \$(GEN_C)" -CLEAN_PREREQS=" clean_gen clean_coverage" +CLEAN_PREREQS=" clean_gen" if [ -z "${GEN_HOST+set}" ]; then GEN_HOST=1 @@ -1803,7 +1449,6 @@ else if [ "$GEN_HOST" -eq 0 ]; then GEN="strgen.sh" GEN_EXEC_TARGET="@printf 'Do not need to build gen/strgen.c\\\\n'" - CLEAN_PREREQS=" clean_coverage" fi fi @@ -1848,9 +1493,7 @@ else headers="$headers \$(DC_HEADERS)" fi -# This convoluted mess does pull the version out. If you change the format of -# include/version.h, you may have to change this line. -version=$(cat "$scriptdir/include/version.h" | grep "VERSION " - | awk '{ print $3 }' -) +version=$(cat "$scriptdir/VERSION.txt" | head -n1) if [ "$library" -ne 0 ]; then @@ -1880,14 +1523,6 @@ if [ "$library" -ne 0 ]; then fi -elif [ "$ossfuzz" -ne 0 ]; then - - unneeded="$unneeded library.c main.c" - - PC_PATH="" - pkg_config_install="" - pkg_config_uninstall="" - else unneeded="$unneeded library.c" @@ -1909,10 +1544,6 @@ if [ "$manpage_args" = "" ]; then manpage_args="A" fi -if [ "$vg" -ne 0 ] || [ "$ossfuzz" -ne 0 ]; then - memcheck=1 -fi - if [ "$bc_default_prompt" = "" ]; then bc_default_prompt="$bc_default_tty_mode" fi @@ -1921,14 +1552,6 @@ if [ "$dc_default_prompt" = "" ]; then dc_default_prompt="$dc_default_tty_mode" fi -# Generate the test targets and prerequisites. -bc_tests=$(gen_std_test_targets bc) -bc_script_tests=$(gen_script_test_targets bc) -bc_err_tests=$(gen_err_test_targets bc) -dc_tests=$(gen_std_test_targets dc) -dc_script_tests=$(gen_script_test_targets dc) -dc_err_tests=$(gen_err_test_targets dc) - printf 'unneeded: %s\n' "$unneeded" # Print out the values; this is for debugging. @@ -1949,7 +1572,6 @@ printf 'BC_ENABLE_LIBRARY=%s\n\n' "$library" printf 'BC_ENABLE_HISTORY=%s\n' "$hist" printf 'BC_ENABLE_EXTRA_MATH=%s\n' "$extra_math" printf 'BC_ENABLE_NLS=%s\n\n' "$nls" -printf 'BC_ENABLE_AFL=%s\n' "$fuzz" printf '\n' printf 'BC_NUM_KARATSUBA_LEN=%s\n' "$karatsuba_len" printf '\n' @@ -2046,26 +1668,11 @@ contents=$(replace "$contents" "BUILDDIR" "$builddir") contents=$(replace "$contents" "HEADERS" "$headers") +contents=$(replace "$contents" "VERSION" "$version") + contents=$(replace "$contents" "BC_ENABLED" "$bc") contents=$(replace "$contents" "DC_ENABLED" "$dc") -contents=$(replace "$contents" "BC_ALL_TESTS" "$bc_test") -contents=$(replace "$contents" "BC_ALL_TESTS_NP" "$bc_test_np") -contents=$(replace "$contents" "BC_TESTS" "$bc_tests") -contents=$(replace "$contents" "BC_SCRIPT_TESTS" "$bc_script_tests") -contents=$(replace "$contents" "BC_ERROR_TESTS" "$bc_err_tests") -contents=$(replace "$contents" "BC_TEST_EXEC" "$bc_test_exec") -contents=$(replace "$contents" "TIMECONST_ALL_TESTS" "$timeconst") - -contents=$(replace "$contents" "DC_ALL_TESTS" "$dc_test") -contents=$(replace "$contents" "DC_ALL_TESTS_NP" "$dc_test_np") -contents=$(replace "$contents" "DC_TESTS" "$dc_tests") -contents=$(replace "$contents" "DC_SCRIPT_TESTS" "$dc_script_tests") -contents=$(replace "$contents" "DC_ERROR_TESTS" "$dc_err_tests") -contents=$(replace "$contents" "DC_TEST_EXEC" "$dc_test_exec") - -contents=$(replace "$contents" "BCL_TEST_EXEC" "$bcl_test_exec") - contents=$(replace "$contents" "BUILD_TYPE" "$manpage_args") contents=$(replace "$contents" "EXCLUDE_EXTRA_MATH" "$exclude_extra_math") @@ -2073,10 +1680,6 @@ contents=$(replace "$contents" "LIBRARY" "$library") contents=$(replace "$contents" "HISTORY" "$hist") contents=$(replace "$contents" "EXTRA_MATH" "$extra_math") contents=$(replace "$contents" "NLS" "$nls") -contents=$(replace "$contents" "FUZZ" "$fuzz") -contents=$(replace "$contents" "OSSFUZZ" "$ossfuzz") -contents=$(replace "$contents" "MEMCHECK" "$memcheck") -contents=$(replace "$contents" "LIB_FUZZING_ENGINE" "$LIB_FUZZING_ENGINE") contents=$(replace "$contents" "BC_LIB_O" "$bc_lib") contents=$(replace "$contents" "BC_HELP_O" "$bc_help") @@ -2099,8 +1702,6 @@ contents=$(replace "$contents" "CPPFLAGS" "$CPPFLAGS") contents=$(replace "$contents" "LDFLAGS" "$LDFLAGS") contents=$(replace "$contents" "CC" "$CC") contents=$(replace "$contents" "HOSTCC" "$HOSTCC") -contents=$(replace "$contents" "COVERAGE_OUTPUT" "$COVERAGE_OUTPUT") -contents=$(replace "$contents" "COVERAGE_PREREQS" "$COVERAGE_PREREQS") contents=$(replace "$contents" "INSTALL_PREREQS" "$install_prereqs") contents=$(replace "$contents" "INSTALL_MAN_PREREQS" "$install_man_prereqs") contents=$(replace "$contents" "INSTALL_LOCALES" "$install_locales") @@ -2126,22 +1727,14 @@ contents=$(replace "$contents" "BC_EXEC_CMD" "$bc_exec_cmd") contents=$(replace "$contents" "DC_EXEC_PREREQ" "$dc_exec_prereq") contents=$(replace "$contents" "DC_EXEC_CMD" "$dc_exec_cmd") +contents=$(replace "$contents" "GENERATE_TESTS" "$generate_tests") +contents=$(replace "$contents" "PROBLEMATIC_TESTS" "$problematic_tests") + contents=$(replace "$contents" "EXECUTABLES" "$executables") contents=$(replace "$contents" "MAIN_EXEC" "$main_exec") contents=$(replace "$contents" "EXEC" "$executable") -contents=$(replace "$contents" "TESTS" "$tests") - -contents=$(replace "$contents" "BC_HISTORY_TEST_PREREQS" "$test_bc_history_prereqs") -contents=$(replace "$contents" "DC_HISTORY_TEST_PREREQS" "$test_dc_history_prereqs") -contents=$(replace "$contents" "HISTORY_TESTS" "$history_tests") - -contents=$(replace "$contents" "VG_BC_TEST" "$vg_bc_test") -contents=$(replace "$contents" "VG_DC_TEST" "$vg_dc_test") - -contents=$(replace "$contents" "TIMECONST" "$timeconst") contents=$(replace "$contents" "KARATSUBA" "$karatsuba") -contents=$(replace "$contents" "KARATSUBA_TEST" "$karatsuba_test") contents=$(replace "$contents" "LONG_BIT_DEFINE" "$LONG_BIT_DEFINE") @@ -2169,28 +1762,6 @@ contents=$(replace "$contents" "DC_DEFAULT_DIGIT_CLAMP" "$dc_default_digit_clamp # Do the first print to the Makefile. printf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "Makefile" -# Generate the individual test targets. -if [ "$bc" -ne 0 ]; then - gen_std_tests bc "$extra_math" "$time_tests" $bc_test_exec - gen_script_tests bc "$extra_math" "$generate_tests" "$time_tests" $bc_test_exec - gen_err_tests bc $bc_test_exec -fi - -if [ "$dc" -ne 0 ]; then - gen_std_tests dc "$extra_math" "$time_tests" $dc_test_exec - gen_script_tests dc "$extra_math" "$generate_tests" "$time_tests" $dc_test_exec - gen_err_tests dc $dc_test_exec -fi - -if [ "$ossfuzz" -ne 0 ]; then - - printf 'bc_fuzzer_c: $(BC_FUZZER)\n\tln -sf $(BC_FUZZER) bc_fuzzer_c\n' >> Makefile - printf 'bc_fuzzer_C: $(BC_FUZZER)\n\tln -sf $(BC_FUZZER) bc_fuzzer_C\n' >> Makefile - printf 'dc_fuzzer_c: $(DC_FUZZER)\n\tln -sf $(DC_FUZZER) dc_fuzzer_c\n' >> Makefile - printf 'dc_fuzzer_C: $(DC_FUZZER)\n\tln -sf $(DC_FUZZER) dc_fuzzer_C\n' >> Makefile - -fi - # Copy the correct manuals to the expected places. mkdir -p manuals cp -f "$scriptdir/manuals/bc/$manpage_args.1.md" manuals/bc.1.md diff --git a/gen/bc_help.txt b/gen/bc_help.txt index 489b54a185f..ce82d267773 100644 --- a/gen/bc_help.txt +++ b/gen/bc_help.txt @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -37,7 +37,7 @@ usage: %s [options] [file...] bc is a command-line, arbitrary-precision calculator with a Turing-complete language. For details, use `man %s` or see the online documentation at -https://git.gavinhoward.com/gavin/bc/src/tag/%s/manuals/bc/%s.1.md. +https://github.com/gavinhoward/bc/tree/%s/manuals/bc/%s.1.md . This bc is compatible with both the GNU bc and the POSIX bc spec. See the GNU bc manual (https://www.gnu.org/software/bc/manual/bc.html) and bc spec diff --git a/gen/dc_help.txt b/gen/dc_help.txt index df4ede1583a..897ab31a882 100644 --- a/gen/dc_help.txt +++ b/gen/dc_help.txt @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -37,7 +37,7 @@ usage: %s [options] [file...] dc is a reverse-polish notation command-line calculator which supports unlimited precision arithmetic. For details, use `man %s` or see the online documentation -at https://git.gavinhoward.com/gavin/bc/src/tag/%s/manuals/bc/%s.1.md. +at https://github.com/gavinhoward/bc/tree/%s/manuals/dc/%s.1.md . This dc is (mostly) compatible with the OpenBSD dc and the GNU dc. See the OpenBSD man page (http://man.openbsd.org/OpenBSD-current/man1/dc.1) and the GNU diff --git a/gen/lib.bc b/gen/lib.bc index 0c9389b8510..95ba2765ddf 100644 --- a/gen/lib.bc +++ b/gen/lib.bc @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/gen/lib2.bc b/gen/lib2.bc index d6d9f70fe06..cc959db73ce 100644 --- a/gen/lib2.bc +++ b/gen/lib2.bc @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -444,108 +444,77 @@ define void uint64(x){uintn(x,8)} define void int64(x){intn(x,8)} define void uint(x){uintn(x,ubytes(x))} define void int(x){intn(x,sbytes(x))} -define bunrev(t){ - auto a,s,m[] - s=scale - scale=0 - t=abs(t)$ - while(t!=1){ - t=divmod(t,2,m[]) - a*=2 - a+=m[0] - } - scale=s - return a -} define band(a,b){ - auto s,t,m[],n[] + auto r,p,s,m[] a=abs(a)$ b=abs(b)$ - if(b>a){ - t=b - b=a - a=t - } + r=0 + p=1 s=scale scale=0 - t=1 - while(b){ + while(a&&b) { a=divmod(a,2,m[]) - b=divmod(b,2,n[]) - t*=2 - t+=(m[0]&&n[0]) + if(m[0]){ + b=divmod(b,2,m[]) + if(m[0])r+=p + }else b/=2 + p*=2 } scale=s - return bunrev(t) + return r } define bor(a,b){ - auto s,t,m[],n[] + auto r,p,s,m[] a=abs(a)$ b=abs(b)$ - if(b>a){ - t=b - b=a - a=t - } + r=0 + p=1 s=scale scale=0 - t=1 - while(b){ + while(a||b){ a=divmod(a,2,m[]) - b=divmod(b,2,n[]) - t*=2 - t+=(m[0]||n[0]) - } - while(a){ - a=divmod(a,2,m[]) - t*=2 - t+=m[0] + if(!m[0])b=divmod(b,2,m[]) + else b/=2 + if(m[0])r+=p + p*=2 } scale=s - return bunrev(t) + return r } define bxor(a,b){ - auto s,t,m[],n[] + auto r,p,s,m[],n[] a=abs(a)$ b=abs(b)$ - if(b>a){ - t=b - b=a - a=t - } + r=0 + p=1 s=scale scale=0 - t=1 - while(b){ + while(a||b){ a=divmod(a,2,m[]) b=divmod(b,2,n[]) - t*=2 - t+=(m[0]+n[0]==1) - } - while(a){ - a=divmod(a,2,m[]) - t*=2 - t+=m[0] + if(m[0]+n[0]==1)r+=p + p*=2 } scale=s - return bunrev(t) + return r } define bshl(a,b){return abs(a)$*2^abs(b)$} define bshr(a,b){return(abs(a)$/2^abs(b)$)$} define bnotn(x,n){ - auto s,t,m[] + auto r,p,s,t,m[] s=scale scale=0 - t=2^(abs(n)$*8) - x=abs(x)$%t+t - t=1 + r=2^(abs(n)$*8) + x=abs(x)$%r+r + r=0 + p=1 while(x!=1){ x=divmod(x,2,m[]) - t*=2 - t+=!m[0] + if(!m[0])r+=p + p*=2 } scale=s - return bunrev(t) + return r } define bnot8(x){return bnotn(x,1)} define bnot16(x){return bnotn(x,2)} @@ -553,13 +522,19 @@ define bnot32(x){return bnotn(x,4)} define bnot64(x){return bnotn(x,8)} define bnot(x){return bnotn(x,ubytes(x))} define brevn(x,n){ - auto s,t,m[] + auto a,s,m[] s=scale scale=0 - t=2^(abs(n)$*8) - x=abs(x)$%t+t + a=2^(abs(n)$*8) + x=abs(x)$%a+a + a=0 + while(x!=1){ + x=divmod(x,2,m[]) + a*=2 + a+=m[0] + } scale=s - return bunrev(x) + return a } define brev8(x){return brevn(x,1)} define brev16(x){return brevn(x,2)} diff --git a/gen/strgen.c b/gen/strgen.c index 1394a05c4a7..996ea9b3c83 100644 --- a/gen/strgen.c +++ b/gen/strgen.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -68,7 +68,7 @@ static const char* const bc_gen_ex_end = "{{ end }}"; // This is exactly what it looks like. It just slaps a simple license header on // the generated C source file. static const char* const bc_gen_header = - "// Copyright (c) 2018-2024 Gavin D. Howard and contributors.\n" + "// Copyright (c) 2018-2025 Gavin D. Howard and contributors.\n" "// Licensed under the 2-clause BSD license.\n" "// *** AUTOMATICALLY GENERATED FROM %s. DO NOT MODIFY. ***\n\n"; // clang-format on diff --git a/gen/strgen.sh b/gen/strgen.sh index 8542bd40ee8..683307d4fa8 100755 --- a/gen/strgen.sh +++ b/gen/strgen.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -96,7 +96,7 @@ if [ -n "$remove_tabs" ]; then fi cat<results, (nops), (p)->results.len - (nres + nops))) +#define bc_program_retire(p, nops) \ + do \ + { \ + bc_vec_npopAt(&(p)->results, (nops), \ + (p)->results.len - ((p)->nresults + nops)); \ + p->nresults = 0; \ + } \ + while (0) #if DC_ENABLED diff --git a/include/rand.h b/include/rand.h index aee63b866cf..f88de071b25 100644 --- a/include/rand.h +++ b/include/rand.h @@ -13,7 +13,7 @@ * This code is under the following license: * * Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/include/read.h b/include/read.h index 62e6897635a..c43a9980327 100644 --- a/include/read.h +++ b/include/read.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/status.h b/include/status.h index 203f09af628..8e3ab9ed218 100644 --- a/include/status.h +++ b/include/status.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -683,12 +683,7 @@ typedef enum BcMode #define BC_NO_SIG_EXC(vm) \ BC_LIKELY((vm)->status == (sig_atomic_t) BC_STATUS_SUCCESS && !(vm)->sig) -#ifndef _WIN32 -#define BC_SIG_INTERRUPT(vm) \ - BC_UNLIKELY((vm)->sig != 0 && (vm)->sig != SIGWINCH) -#else // _WIN32 #define BC_SIG_INTERRUPT(vm) BC_UNLIKELY((vm)->sig != 0) -#endif // _WIN32 #if BC_DEBUG diff --git a/include/vector.h b/include/vector.h index cad5fc2aa7c..01b02996146 100644 --- a/include/vector.h +++ b/include/vector.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/include/version.h b/include/version.h deleted file mode 100644 index e5c9ea3290e..00000000000 --- a/include/version.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * ***************************************************************************** - * - * SPDX-License-Identifier: BSD-2-Clause - * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ***************************************************************************** - * - * The version of bc. - * - */ - -#ifndef BC_VERSION_H -#define BC_VERSION_H - -/// The current version. -#define VERSION 7.0.3 - -#endif // BC_VERSION_H diff --git a/include/vm.h b/include/vm.h index e81206b6387..86e0fe06edc 100644 --- a/include/vm.h +++ b/include/vm.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -52,7 +52,6 @@ #endif // BC_ENABLE_NLS -#include #include #include #include diff --git a/locales/de_DE.ISO8859-1.msg b/locales/de_DE.ISO8859-1.msg index 9700ab070b2..3269b7632cc 100644 --- a/locales/de_DE.ISO8859-1.msg +++ b/locales/de_DE.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/de_DE.UTF-8.msg b/locales/de_DE.UTF-8.msg index 7b918fc6d1c..7d5859584d8 100644 --- a/locales/de_DE.UTF-8.msg +++ b/locales/de_DE.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/en_US.msg b/locales/en_US.msg index 4afcbcd1f81..7ae50d189b5 100644 --- a/locales/en_US.msg +++ b/locales/en_US.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/es_ES.ISO8859-1.msg b/locales/es_ES.ISO8859-1.msg index 4d022d9bf66..a9edbfa2673 100644 --- a/locales/es_ES.ISO8859-1.msg +++ b/locales/es_ES.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/es_ES.UTF-8.msg b/locales/es_ES.UTF-8.msg index 364cff6ee57..25512c0862d 100644 --- a/locales/es_ES.UTF-8.msg +++ b/locales/es_ES.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/fr_FR.ISO8859-1.msg b/locales/fr_FR.ISO8859-1.msg index b4b39866c96..a3935535521 100644 --- a/locales/fr_FR.ISO8859-1.msg +++ b/locales/fr_FR.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/fr_FR.UTF-8.msg b/locales/fr_FR.UTF-8.msg index c3387e31ae9..dee83c11023 100644 --- a/locales/fr_FR.UTF-8.msg +++ b/locales/fr_FR.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ja_JP.UTF-8.msg b/locales/ja_JP.UTF-8.msg index 21640eb9f1c..5a6aac17120 100644 --- a/locales/ja_JP.UTF-8.msg +++ b/locales/ja_JP.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ja_JP.eucJP.msg b/locales/ja_JP.eucJP.msg index 3e3b73d20f4..3bd47e1e7d3 100644 --- a/locales/ja_JP.eucJP.msg +++ b/locales/ja_JP.eucJP.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/nl_NL.ISO8859-1.msg b/locales/nl_NL.ISO8859-1.msg index aaf41c65b04..4531269752a 100644 --- a/locales/nl_NL.ISO8859-1.msg +++ b/locales/nl_NL.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/nl_NL.UTF-8.msg b/locales/nl_NL.UTF-8.msg index 0ab0b9c3dc6..29eb3f344fb 100644 --- a/locales/nl_NL.UTF-8.msg +++ b/locales/nl_NL.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pl_PL.ISO8859-2.msg b/locales/pl_PL.ISO8859-2.msg index 5b427c808fd..c1e2b8b5355 100644 --- a/locales/pl_PL.ISO8859-2.msg +++ b/locales/pl_PL.ISO8859-2.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pl_PL.UTF-8.msg b/locales/pl_PL.UTF-8.msg index fd0f85b5f76..27cbabfc33d 100644 --- a/locales/pl_PL.UTF-8.msg +++ b/locales/pl_PL.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pt_PT.ISO8859-1.msg b/locales/pt_PT.ISO8859-1.msg index 9b365b4a7bd..0bec4b284f9 100644 --- a/locales/pt_PT.ISO8859-1.msg +++ b/locales/pt_PT.ISO8859-1.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/pt_PT.UTF-8.msg b/locales/pt_PT.UTF-8.msg index f5054a178cf..5204e8beef4 100644 --- a/locales/pt_PT.UTF-8.msg +++ b/locales/pt_PT.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.CP1251.msg b/locales/ru_RU.CP1251.msg index ac8957cc6aa..3d25413b058 100644 --- a/locales/ru_RU.CP1251.msg +++ b/locales/ru_RU.CP1251.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.CP866.msg b/locales/ru_RU.CP866.msg index 763fd55a365..6700dc6c401 100644 --- a/locales/ru_RU.CP866.msg +++ b/locales/ru_RU.CP866.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.ISO8859-5.msg b/locales/ru_RU.ISO8859-5.msg index bbb1f418c3a..66766fbf193 100644 --- a/locales/ru_RU.ISO8859-5.msg +++ b/locales/ru_RU.ISO8859-5.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.KOI8-R.msg b/locales/ru_RU.KOI8-R.msg index d1e2bdc014d..ecc7f03a1a9 100644 --- a/locales/ru_RU.KOI8-R.msg +++ b/locales/ru_RU.KOI8-R.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/ru_RU.UTF-8.msg b/locales/ru_RU.UTF-8.msg index b45b3634a76..fb796155f49 100644 --- a/locales/ru_RU.UTF-8.msg +++ b/locales/ru_RU.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.GB18030.msg b/locales/zh_CN.GB18030.msg index 3625c5b40fd..c01a2239f62 100644 --- a/locales/zh_CN.GB18030.msg +++ b/locales/zh_CN.GB18030.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.GB2312.msg b/locales/zh_CN.GB2312.msg index 3625c5b40fd..c01a2239f62 100644 --- a/locales/zh_CN.GB2312.msg +++ b/locales/zh_CN.GB2312.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.GBK.msg b/locales/zh_CN.GBK.msg index 3625c5b40fd..c01a2239f62 100644 --- a/locales/zh_CN.GBK.msg +++ b/locales/zh_CN.GBK.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.UTF-8.msg b/locales/zh_CN.UTF-8.msg index 95813f41169..3767e45a395 100644 --- a/locales/zh_CN.UTF-8.msg +++ b/locales/zh_CN.UTF-8.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/locales/zh_CN.eucCN.msg b/locales/zh_CN.eucCN.msg index 3625c5b40fd..c01a2239f62 100644 --- a/locales/zh_CN.eucCN.msg +++ b/locales/zh_CN.eucCN.msg @@ -1,7 +1,7 @@ $ $ $ SPDX-License-Identifier: BSD-2-Clause $ $ -$ Copyright (c) 2018-2024 Gavin D. Howard and contributors. +$ Copyright (c) 2018-2025 Gavin D. Howard and contributors. $ $ $ Redistribution and use in source and binary forms, with or without $ modification, are permitted provided that the following conditions are met: diff --git a/manuals/bc/A.1 b/manuals/bc/A.1 index adeb62f82e6..9b38de7dc1b 100644 --- a/manuals/bc/A.1 +++ b/manuals/bc/A.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -2109,17 +2109,6 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]s2u(x)\f[R] to convert. .RE .TP -\f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit -one place more significant than the real most significant bit (which was -the least significant bit in the original number). -This number is reversed and returned without the extra set bit. -.RS -.PP -This function is used to implement other bitwise functions; it is not -meant to be used by users, but it can be. -.RE -.TP \f[B]plz(x)\f[R] If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading @@ -2943,7 +2932,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md index e89305b1af4..73da0caa0a6 100644 --- a/manuals/bc/A.1.md +++ b/manuals/bc/A.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1766,16 +1766,6 @@ The extended library is a **non-portable extension**. If you want to a use signed two's complement argument, use **s2u(x)** to convert. -**bunrev(t)** - -: Assumes **t** is a bitwise-reversed number with an extra set bit one place - more significant than the real most significant bit (which was the least - significant bit in the original number). This number is reversed and - returned without the extra set bit. - - This function is used to implement other bitwise functions; it is not meant - to be used by users, but it can be. - **plz(x)** : If **x** is not equal to **0** and greater that **-1** and less than **1**, @@ -2521,7 +2511,7 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bc/E.1 b/manuals/bc/E.1 index e2f1b034e69..36f402d9993 100644 --- a/manuals/bc/E.1 +++ b/manuals/bc/E.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1758,7 +1758,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/E.1.md b/manuals/bc/E.1.md index 0082caea840..4536381f72b 100644 --- a/manuals/bc/E.1.md +++ b/manuals/bc/E.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1509,7 +1509,7 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1 index c132a0b76a4..bf29cca9e82 100644 --- a/manuals/bc/EH.1 +++ b/manuals/bc/EH.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1731,7 +1731,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/EH.1.md b/manuals/bc/EH.1.md index 7e682058234..27c3f46f9ed 100644 --- a/manuals/bc/EH.1.md +++ b/manuals/bc/EH.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1483,7 +1483,7 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1 index e3395b1cc20..2c0a2ddc9cd 100644 --- a/manuals/bc/EHN.1 +++ b/manuals/bc/EHN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1725,7 +1725,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/EHN.1.md b/manuals/bc/EHN.1.md index 9578d2ab772..eee3c9c8cb9 100644 --- a/manuals/bc/EHN.1.md +++ b/manuals/bc/EHN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1475,7 +1475,7 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1 index c1ccbec567e..ce88b2af8e1 100644 --- a/manuals/bc/EN.1 +++ b/manuals/bc/EN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1752,7 +1752,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/EN.1.md b/manuals/bc/EN.1.md index f6ad0093090..8752c4eda7e 100644 --- a/manuals/bc/EN.1.md +++ b/manuals/bc/EN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1501,7 +1501,7 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bc/H.1 b/manuals/bc/H.1 index 9dc46ee50de..ee0312f3e8d 100644 --- a/manuals/bc/H.1 +++ b/manuals/bc/H.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -2109,17 +2109,6 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]s2u(x)\f[R] to convert. .RE .TP -\f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit -one place more significant than the real most significant bit (which was -the least significant bit in the original number). -This number is reversed and returned without the extra set bit. -.RS -.PP -This function is used to implement other bitwise functions; it is not -meant to be used by users, but it can be. -.RE -.TP \f[B]plz(x)\f[R] If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading @@ -2916,7 +2905,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md index fbc0658d817..76763ed648e 100644 --- a/manuals/bc/H.1.md +++ b/manuals/bc/H.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1766,16 +1766,6 @@ The extended library is a **non-portable extension**. If you want to a use signed two's complement argument, use **s2u(x)** to convert. -**bunrev(t)** - -: Assumes **t** is a bitwise-reversed number with an extra set bit one place - more significant than the real most significant bit (which was the least - significant bit in the original number). This number is reversed and - returned without the extra set bit. - - This function is used to implement other bitwise functions; it is not meant - to be used by users, but it can be. - **plz(x)** : If **x** is not equal to **0** and greater that **-1** and less than **1**, @@ -2495,7 +2485,7 @@ This bc(1) supports error messages for different locales, and thus, it supports Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1 index 7b4577f2dbd..fb593b6d3a6 100644 --- a/manuals/bc/HN.1 +++ b/manuals/bc/HN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -2109,17 +2109,6 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]s2u(x)\f[R] to convert. .RE .TP -\f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit -one place more significant than the real most significant bit (which was -the least significant bit in the original number). -This number is reversed and returned without the extra set bit. -.RS -.PP -This function is used to implement other bitwise functions; it is not -meant to be used by users, but it can be. -.RE -.TP \f[B]plz(x)\f[R] If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading @@ -2910,7 +2899,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md index 015035c14da..fbbf3b09715 100644 --- a/manuals/bc/HN.1.md +++ b/manuals/bc/HN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1766,16 +1766,6 @@ The extended library is a **non-portable extension**. If you want to a use signed two's complement argument, use **s2u(x)** to convert. -**bunrev(t)** - -: Assumes **t** is a bitwise-reversed number with an extra set bit one place - more significant than the real most significant bit (which was the least - significant bit in the original number). This number is reversed and - returned without the extra set bit. - - This function is used to implement other bitwise functions; it is not meant - to be used by users, but it can be. - **plz(x)** : If **x** is not equal to **0** and greater that **-1** and less than **1**, @@ -2487,7 +2477,7 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bc/N.1 b/manuals/bc/N.1 index 193e0d15f6f..8fc3249f8b7 100644 --- a/manuals/bc/N.1 +++ b/manuals/bc/N.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -2109,17 +2109,6 @@ If you want to a use signed two\[cq]s complement argument, use \f[B]s2u(x)\f[R] to convert. .RE .TP -\f[B]bunrev(t)\f[R] -Assumes \f[B]t\f[R] is a bitwise\-reversed number with an extra set bit -one place more significant than the real most significant bit (which was -the least significant bit in the original number). -This number is reversed and returned without the extra set bit. -.RS -.PP -This function is used to implement other bitwise functions; it is not -meant to be used by users, but it can be. -.RE -.TP \f[B]plz(x)\f[R] If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]\-1\f[R] and less than \f[B]1\f[R], it is printed with a leading @@ -2937,7 +2926,7 @@ Before version \f[B]6.1.0\f[R], this bc(1) had incorrect behavior for the \f[B]quit\f[R] statement. .PP No other bugs are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md index 859c32e3e77..6c9b6fce5d0 100644 --- a/manuals/bc/N.1.md +++ b/manuals/bc/N.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1766,16 +1766,6 @@ The extended library is a **non-portable extension**. If you want to a use signed two's complement argument, use **s2u(x)** to convert. -**bunrev(t)** - -: Assumes **t** is a bitwise-reversed number with an extra set bit one place - more significant than the real most significant bit (which was the least - significant bit in the original number). This number is reversed and - returned without the extra set bit. - - This function is used to implement other bitwise functions; it is not meant - to be used by users, but it can be. - **plz(x)** : If **x** is not equal to **0** and greater that **-1** and less than **1**, @@ -2513,7 +2503,7 @@ use a period (**.**) as a radix point, regardless of the value of Before version **6.1.0**, this bc(1) had incorrect behavior for the **quit** statement. -No other bugs are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +No other bugs are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/bcl.3 b/manuals/bcl.3 index f2791624b2c..adfa61681bd 100644 --- a/manuals/bcl.3 +++ b/manuals/bcl.3 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1833,7 +1833,7 @@ the value of \f[B]LC_NUMERIC\f[R]. This is also true of bcl(3). .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc. +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHORS Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/bcl.3.md b/manuals/bcl.3.md index 41c1c120b62..48eb6174bf4 100644 --- a/manuals/bcl.3.md +++ b/manuals/bcl.3.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1532,7 +1532,7 @@ use a period (**.**) as a radix point, regardless of the value of # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc. +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHORS diff --git a/manuals/build.md b/manuals/build.md index d9c46ae2260..c0e7e35934b 100644 --- a/manuals/build.md +++ b/manuals/build.md @@ -6,6 +6,9 @@ POSIX-compliant system. To accomplish that, a POSIX-compatible, custom `configure.sh` script is used to select build options, compiler, and compiler flags and generate a `Makefile`. +The rest of this document talks about that, *not* the build system using +[Rig][12], which is much simpler to understand, change, and use. + The general form of configuring, building, and installing this `bc` is as follows: @@ -40,7 +43,7 @@ accepted build options. ## Windows For releases, Windows builds of `bc`, `dc`, and `bcl` are available for download -from and GitHub. +from GitHub. However, if you wish to build it yourself, this `bc` can be built using Visual Studio or MSBuild. @@ -993,3 +996,4 @@ Both commands are equivalent. [9]: #nls-locale-support [10]: #extra-math [11]: #settings +[12]: https://rigbuild.dev/ diff --git a/manuals/dc/A.1 b/manuals/dc/A.1 index d59e0fa68a5..50c14dd4098 100644 --- a/manuals/dc/A.1 +++ b/manuals/dc/A.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1687,7 +1687,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/A.1.md b/manuals/dc/A.1.md index ad0c59934fd..bfe50b8230c 100644 --- a/manuals/dc/A.1.md +++ b/manuals/dc/A.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1522,7 +1522,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/manuals/dc/E.1 b/manuals/dc/E.1 index a5febe44705..b079e40ed62 100644 --- a/manuals/dc/E.1 +++ b/manuals/dc/E.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1466,7 +1466,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/E.1.md b/manuals/dc/E.1.md index 54b877999d0..7bde12de49a 100644 --- a/manuals/dc/E.1.md +++ b/manuals/dc/E.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1346,7 +1346,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/manuals/dc/EH.1 b/manuals/dc/EH.1 index 61fbaa4efe9..199f50fb0fe 100644 --- a/manuals/dc/EH.1 +++ b/manuals/dc/EH.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1442,7 +1442,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/EH.1.md b/manuals/dc/EH.1.md index 6398477a84d..bbddd4ae947 100644 --- a/manuals/dc/EH.1.md +++ b/manuals/dc/EH.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1323,7 +1323,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/manuals/dc/EHN.1 b/manuals/dc/EHN.1 index 974cb3c8679..3b4afa90e30 100644 --- a/manuals/dc/EHN.1 +++ b/manuals/dc/EHN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1439,7 +1439,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/EHN.1.md b/manuals/dc/EHN.1.md index 51e30849996..fc2c01d52a5 100644 --- a/manuals/dc/EHN.1.md +++ b/manuals/dc/EHN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1318,7 +1318,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/manuals/dc/EN.1 b/manuals/dc/EN.1 index 5ce8defc91c..2d1c038754e 100644 --- a/manuals/dc/EN.1 +++ b/manuals/dc/EN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1463,7 +1463,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/EN.1.md b/manuals/dc/EN.1.md index ab9647a196b..ca8bb1ebdd0 100644 --- a/manuals/dc/EN.1.md +++ b/manuals/dc/EN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1341,7 +1341,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/manuals/dc/H.1 b/manuals/dc/H.1 index 82c1bbd5c2b..990eadec23f 100644 --- a/manuals/dc/H.1 +++ b/manuals/dc/H.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1663,7 +1663,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/H.1.md b/manuals/dc/H.1.md index 64c7142bc4a..844dd686f21 100644 --- a/manuals/dc/H.1.md +++ b/manuals/dc/H.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1499,7 +1499,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/manuals/dc/HN.1 b/manuals/dc/HN.1 index c3f8c8ab1ff..ebc4292bb13 100644 --- a/manuals/dc/HN.1 +++ b/manuals/dc/HN.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1660,7 +1660,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/HN.1.md b/manuals/dc/HN.1.md index 28b9dadd4b4..58c870f8efc 100644 --- a/manuals/dc/HN.1.md +++ b/manuals/dc/HN.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1494,7 +1494,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/manuals/dc/N.1 b/manuals/dc/N.1 index 6e2baa587b1..74ed018b97a 100644 --- a/manuals/dc/N.1 +++ b/manuals/dc/N.1 @@ -1,7 +1,7 @@ .\" .\" SPDX-License-Identifier: BSD-2-Clause .\" -.\" Copyright (c) 2018-2024 Gavin D. Howard and contributors. +.\" Copyright (c) 2018-2025 Gavin D. Howard and contributors. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions are met: @@ -1684,7 +1684,7 @@ specification at https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . .SH BUGS None are known. -Report bugs at https://git.gavinhoward.com/gavin/bc . +Report bugs at https://github.com/gavinhoward/bc . .SH AUTHOR Gavin D. Howard \c .MT gavin@gavinhoward.com diff --git a/manuals/dc/N.1.md b/manuals/dc/N.1.md index 22ea9c96bc8..10e8befb1d7 100644 --- a/manuals/dc/N.1.md +++ b/manuals/dc/N.1.md @@ -2,7 +2,7 @@ SPDX-License-Identifier: BSD-2-Clause -Copyright (c) 2018-2024 Gavin D. Howard and contributors. +Copyright (c) 2018-2025 Gavin D. Howard and contributors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @@ -1517,7 +1517,7 @@ https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html . # BUGS -None are known. Report bugs at https://git.gavinhoward.com/gavin/bc . +None are known. Report bugs at https://github.com/gavinhoward/bc . # AUTHOR diff --git a/project/README.md b/project/README.md new file mode 100644 index 00000000000..9086bb2e927 --- /dev/null +++ b/project/README.md @@ -0,0 +1,32 @@ +# `bc` Project Management History + +This directory has the project management history of `bc`. This `README` exists +to explain what the files are. + +* `gitea.db` + + Because I (Gavin Howard, the main author) do not trust big companies, I moved + `bc` to a self-hosted Gitea instance. This is what's left of the database from + that instance. Obviously, I wiped of personal identifying information as much + as possible, but it still has the comments on issues and pull requests, as + well as the issues and pull requests themselves (whatever matters anyway). + +* `github_issues.json` + + This is information about issues reported on GitHub. I used the GitHub CLI to + export *all* of the available information, since it's public. + +* `github_prs.json` + + This is information about pull requests opened on GitHub. I used the GitHub + CLI to export *all* of the available information, since it's public. + +* `issue10.md` + + When I first started self-hosting Gitea, I was not a good sysadmin. On top of + that, I was learning how to use OpenZFS, and Gitea was stored in a ZFS + dataset. + + This is the best I could do to reproduce an actual issue that was reported and + got erased when I rolled back to a ZFS snapshot. It was originally `#10` on + Gitea, hence the file name. diff --git a/project/gitea.db b/project/gitea.db new file mode 100644 index 0000000000000000000000000000000000000000..c63c79ff928f464862ca43c130c7a2ee1b93e609 GIT binary patch literal 86016 zcmeFa34CN%b>OXi>sG66V>fMMT;1Nf+g<9nzgGrqx9zq|R&Vrz*Ov5FNmx?JDybJk zfRb&n9Uz?yAq4mWgb6w>o_qFt&hZx?oL!DfNo{G~UoM#)TRS>CJ8mhJI=Z(1QAbC| zrM$8~edqa0PyR3d+gbSg#(xzUqp!Gcn0E)d#yW=Y+WgI-f7So3-Y@n9-T#GOwEz5n zhXRlE5A<)_zP7CJ?rHgSSeu`pT~?n@-%5dGzn+ilb$`0~we-EkmHJG)w9zAG>yuGD7ca*J zoU^BAzn=`wZS=+b-Iayevun%EzMA2(JS+I;q{!b}ihUk8x#1UA7Nci)b9ZBNfB&{i zFYRo+Ozp%qNL@JW&c>pMzD*tNSQ0Dommi|lVNRTVR>!8FMwK~eYn657rY&QH^$iTi0poJ zq_=wzkF`7fO*Eqi?#alIznde)RtzaXBYgrNq=Q| zruGcy?iuz@(9BNvx`Q(}yKo^AVQpcVoyw&|CJMeAC7=0-A&Ii5*Ju1zh_ef){kd6n zHrF;dTkTSuOm4V6O0p%B--S&Rc;*>7P2l?B@@#Ek!$%^y7FXuxTHo9K*tVYjZP#Ag z`NTttBjghx_s~jQUoQT=x0N@FZ~e%-ZN1@5FzkPZ>n$RN~?&0`qoBo%*RX9@ua-nit>zKpH%N%s6*0Ut6kne zWvO>JJRaHiHq;R*kJcxBS-}R>mGe`d4B{CmcH!GI{=zhrUtFp!$Ir9}3CdvYn*~9& zrn3DxJ~KJ*&m!UZB46F$>U zZ_GK*T70!`_Op;}7pjO2rPRDI|8i|%Lp`;)G|Q8g&#i4kCT%$O;asi0fxWV!K;XPB ztjykZE0C1XGEm-Pk_)t~%Y~nSzAJTuTiD& zIb{Ftqg{R5Zn&ZIUd3YdhvsmCChH>p7Q%SlKf7DlZrz)^WDoc9&E1cgoyyL6QdcmA z$Lh1owWV`wf9q<2q^#NWBi|PnV@+(VRli3Ijh&C;dbl*Zn5vMXh>POHUzuB;+(^m^ zyPWZt!x@px>r}A3hg4tM_#M2>2RD94o#~C=N|`xTk{f?Ql+(uVWZ&KR1M9Ufpj&&u_kUngKDbbpOruEtsR!>C-@JeG?v9bWw|ryE{P2Gt zwl=?xf42X$DbS`sn*wbLv?3bZNErojK7DG<1qb#z{F#f!FgHvjbW^laK zUFhH!jcayq>*&1bqQ>2=Pr0OLFbIQi|3YbYesL~NlLv%5OSPnQlC%mBP|rDf`y6YVVpE6b%b@!VXw8J>#PAxbjz zo%gA&saAWi z9zoT*{JPPD^<7m^!x(`bP-J6{-S?B@zewVIPuiXBe4w^$S)?ZgqgQ*zqvq=ZkV~d^YrX|IS89S zOZ9VvEzg!D{Hz#y{v7PpTrAMlLv~*~@#e;7qxZe{R}?FE?!LBhUFU`@qRz_?l#{zy zSWj=S(BjQM>`wehbkp?fr(U1p$uE@uKk`!@BVQZ&%*Y>({M(U_jQj%sZ2xIfpiO}` z1=&w|Azs7ncwAbzj;gRlD7{ZR+j5 zqBAQ9oZH&deQjs4F0Xg6yL(%ws-(Dcq^o;J*IGSo=Pz&R?B3D2R*`a}`2T~QpXk`~ z?%}^5`qP2O`+u|V-Mw$>{vZ6R{pbHy3Osu86_>KBUBd$}c+Iwffx&^!eFH>+21YtR zd_0~msgj=3>_TbYe=sglzY{(n=(}O@(QJJ71bjt10{!l2lu$+{xzqbCs!u6${*T@%l4iBkM zs;@dFh_e=3PN}5c-WAqZK(sQy7)QHHFXzh;VkiH(MSj#&-Bf*N$+$`WwX(dkbW>?x z6rbL=Kta;*(C`pT2$y_`IhS_nW@UGY(6ub&MtM`7@X}rSUSqGhdw58;7Pl`S3`_dSt|NgN<{%`)| zm*n-x4THiIox=n7K6XSg#js+E!QrE-2);y#;bKXZ<_X!u+TuB?vuBn|3$^80isDXi zF(NL_*77gIL|OZkxs-@_jZrBKTBM@yxnag78(>C6nzq|A4T+AZ=6XJ)v&M2&D7 z*PkrS$NoaSRG+D>%tgYZ!d8Oj9C7gyA1&f3rP`&Kd_lYf{NuG0m@uQ@6xDxr_2lCx|TW7OVT zTB1IfbzEPc;pq$MfgG*RTwfY1O~=b$d)tq`t|Y8jd@nm$j&9tTN5TJzM?UlSr_?EW z<{!~)UG5B($nohcA}b>h}JO9P^KeL>q*SMWXc&?mu0d zjY<^w1wqUSpXQR#ROvJ+D1j*Sy_I`D@mwicSx_bN!$T+7gQ=HJHGdOhIupEMBMlF_mT!&*3Z#4@Ge}C(JQR_DB*2zv4NlPhC=x0xLZAgm zAyDeGbF-?hR;{*)LDyt`^9+IX6rW= zz<=Q<-u{IjfBcJYe)RJ{`s<(j)t~v&J6`+cS3U9NcYO4(e(lZIUmIS(D}BQ5<|FQg zv(U2j7?eSqw5#0Y%!wr8dKpHNGTlfmndJ$q3d<}05=F#e@R7v3rlN2vQ&sidqeDYu zvSSMmk|fQfX~~a}%B3mAkMX3k9S|f_dxc%qzeJV8{jGSUf^LnVB2U3cz9cy3rShc% z3)6GtW;5(T_f}YP?D}~=i1hX!#tNw+llhX*p=6n&xt3LCZUNKc#@(Y`le?d=C->|w zP42n+PhWjycg9q;AHK36M7#U)1LFVRU35o=4eGTqbzXZpHbLq*8>($xPosy>B zD{^v-UCby@0I*k%D(E9NgaFw)XrA<=^;B47Uo4e9~^QB!11GXs$%f_gw@6M5v6^W6zxB>xWSJP#eq%gS-T@Ym% z>#r;)9*dXkyL=Ag3NgD_TTp_duo^ju7o3*#*dl_KQ{8%|CK~>NC8efkT2u`&FiSb6 z59Z(mgOtRO{enlNdm;EfgjCy$Sg9Y5lE zcBQPRD?$d=S0G&a=4`ztZ|cxHUJgfhcTarnLnkJ_e&%+0HLmZvEHw!mgN>rp?druv zobyAD{qj<@f?0@npf-LU_N;|B%*XTLBCG=Wmg4yuOPjps$k79bCyyUFdF-|W^_9hV zDU7*RP`X;*TY4~#7we_8Iz!MCk;>sUG>tdY@7GKB93SKF53S7d3;1nx6B+yM6Te!r z39Rr;gaq(hs`}R|Vrv`fl2D|P*)!)CH5Cg&OEZJlFMjZH#;}}t3hqmim zk?V$`7Y1e=>XBzSmC&&q&CqSbjSNce6Wi2n(@H|qvSKfYt-!FgAkdxAi8Nx%FKJxT z(|q)i!lV28b`eA+lCcn%i8d_GhLR;L6QPh8cv(^$eu`D%SAsCq44xF|fo*Aq6&ZFC z2X5#_k>;7P6KF$tCp(Fq zM3I&7B-b$GsA7A%mza@fYLTaFhT}$+B-ZW8yZ`%JJOBMkr&<#+j=?LMYr0B$NSrNa zHx8aHKwq=1h`rQfCkh=swkl>6yN2#MiO+IDk^r-MzW%qn&QYUv>O;$8yKPXT$o}ZM~Qa7xHJgr)N0*TUT!f7cufMP73A4 zBl+jT=I1)p=fKryHtu7YAe$-qosqf#PG5}vxI#Xc-~c4$SZ}j`pV6h zWNUrwMQf1MB4+0aA*cE5NChX)_=HbYq%4i8Nf;@OD(xi!mqysrD2+s|N@pZ(DIp%8 zAIsdDDu%^m@e5f@M^c{>HA~}YL9D|1d}}S@GdC-bP64V!Jy-ykoKKo$l_(WC9+d;- ztu%_cxJWQK10o2eky^hrb8b=MkR*f2u^c%r83&aUT_o-)^#N&KKmA*df~^& zmM(ZNYvi_9b$*_@fxr(Rl&2_S3tWGiEEgc3^GEVZLEbx*gRHOHQb|KdN;sutovig- zmQ)5k!8}D#B_h(Dy?NqS`+h@SDd@(&!JJ=KuUrGJ@ZF!t9+P0J&yvwj7cEJ_oHZoP zn6pI25UfOnj6;=<76vWy2MD;eX!5-#qou!{O3~f5dunvzSHArjd8HVy z-aC+E{OCh#7%L8MIV&VXmM8~Uic}7xz9_l&u^c^0OZcbC7VIs}Q%6G9hRsiw;y9>B zoH5BG@SoOueR<-M$aDI67DyHoqH`occrISJVO=1aKxww`1koiKE(awK#7i=hz-yZ8 zQ)iF_31|S82>V){fI4&a+3AJZ1SXf9hgwZEn2W}rbK|-9IhT3eARBH>_ zTUrTaK`+}|UYP!&6!m~$_iQ-v(O2Cu@zKVUDQ#bUM}JP+*N(5zHsjv3qDC^2^%{>M zH$sx1WSL;BGW1LH&{Wkt2v631L}Hq}oeC?JDGs>s5D8dywuLvQZo7S|G`&!l%s-NuEa%b8;$V2Zi@!jndv!fo8jJEX^!0 zFV=6|x9`lEGoz>dg_(Gz&K``S4fbI_hWk>=XaAWzJ$ZcYkUw__mKj}~S)BOj%bz2! z^dLR9voAkLPjb&OvpF(bLTb}giJH=j&{wvG`r|YnBDGWq6v~r8ewmW1 z`4!}gR7t@&a7pPlNm5QP`SYluG}Rb{aO{2#2hHdxIVyrnSxS!6`csmA3PR@jG73d_ z8Xr|s={QnpSG|@jQGO`j>$+P3DuiRW9V6_1yNQTe-phn8&cntKV0mCly5l-3YlDN+$?1R z``KSaF$ky)OU3G%P?V0H=pWQx@v#cF>=it_#s`H(z+n1TkM#%GnOSgvF2z# z%n22tnc75il6wYisveini5W>mceB9!YZFhuJdjtmA9hc^AFtlMwjau}IU)KGMX;iz zJU?n@GEI}FS9y{g>1Ofj`Xug)^r_tT7pp(F7nIpcfe{*a45@@3&&sS?4@Oo8mwGs9 zSz3L0B|%Pz5g?YlB(5)brr7_It7h+1wdRGN(5F&NN>a>+b)@VY>~U3SkfyZL^Pu)r z1OW=`nNs3P!DVu(CFgzNSA-gDIw1;9PihZI?WgLqxGbImY%0n@a1z6Ag)>H}fl{j! zSWG-M$2sc%e7bMfb?4^!nvXZ6c8yAbH^?jd9Nu~Ae6D>CH?$L9@Tr-r!;aTyh}gLO@k^fgE+J@RnKo=G*wOX)iy9wu=AX zKk_Mlc3i6b|F4bwkCD%fe0tf zgB=6EJTNz~v;R~5ukXLT@9+9P*q8J@ulM7}&@rq15Q(wMk?)yh%Qd~SZyOr_ zG_=@FT+Meh!ZcJM*;KgFXma%I!=qU44|Kh8;`~P!t5yc=hR*JuK_@ni3Netf<0Mhp zGJL&UAvRMc&=vY->_u9nX&Ep*19rUY;Ta%#<7O*bS`b%!vm7~*Q?|lLFME!jl(nd$ zYfcbp74TaJNzl4iq2*PLB3izwX)H`H2LxlvmRB(VW>w0L7Fk4a^w>B3eHkzg*#S8PaM3EgtVvi)+!l^~a? z1$G?Lx!Gut)j3`+q7_xe?Dv%0s4mQ91ys1iHn$W46Es#xVp09tTwlz><7u3Pp@(=I!d9Tj#;U&iEtUg z%&_c-w&D3iLbV{dAww(QL;-e80lTcaySPS}J=BTgmIK2}$^ zt8;_0pTJAViokJTS})LcE1Yy#D-|_&b)EbaIC<4;i;zs+aUIXn%4Vbs(P0Q=iwSoT zTqgX@Id^ttkaD3_?fS_VPMrU6RK2DMNsD9OCTPxnX~OJ=SFS_`lET&@Q({&O+qyo3 zlylXAu9timNPDVR7a{4sW>y@}C|8UM6n7$U@-?>{8N}G*3IS+Kzb=E6Gs0b6_j(iO zKlJ|U&LSjs$j}ofDMyjxm95x7fI1xRBzEA~FtJ?Qy;ecensmCO>tTU(y1JtXNlQF8 z_N=7r7?#BW48Sg?fHCBR`vk@fqW{-qka9ZR(Y60kAnDao5fZ_9Hz7k%wqp*CMT(f5{LUOgh3M$CY!1CeD3jE}SBDZ`GJB>_(5m`Hcq$8%h zjGwBVU;l%N^B?$9^~xe7(}--{552PELM)^fIBBA{h~-yYKS&aj2u2FY%^)4<{L*VD z&cFY+tIsP!vPlei7JAP&Ef+eO2v5W0o1kd8u^&c`b5#b($sir>{KqPgHdn7GLNaZN zNn^x7WF&AwQi;lbWLxFLv9!RkJK_D51mm102uVj5nPF%mp91J)SCCJp=9e{7Ob&+x zo*Qq=AmtQ4+4=4_Oq~C@*H$knLb8&m;_8@Ct{Y+K>FlBh9%W6}NCC#4Zzld_8Kj)z zhdO`mOF){cUR;C}Td`$E3EwxxWYmzuUc})u9GhQ9v6h(Dr5U80;xFlZ_p2t(zx$Kb zi;9pmyJA2Qr>ut+IW1bHOj6K6mtu&TzUYMbIT@s!;>SCG>4OvJfA))GTQf*yu{^Od zTn+tE4s{EhY|AP8LCm=^y#TvKnP!)yke0%nP{%sw{{&EP7#k^qvdHElXOprY8(1xD z7;4Ik%CLZs=@GJ>{>3?{oKhz`=NADLRksw^=bK(d^MO*qR6$RLS{Vgsm2D4W#kMRH zMRrjND#*|9-JJ`_-=E!89WFvjNUUn6i;*I737VrjgUBj_P^5*}$A;!?%^>9*b+mKg zO%vzeHB;SOgcM>AYQBrj>cikZooiLh=GE zMGN_>hisf>!&?PTnp79hRzuE7k_KH&qb3d1EeU$)&Cj?yCZ6jl|-&o&cw z5t-+2P9c?-!W`C#&c&Al%f4eEgLS>YG7QIaY$S^v>sXu#LM1R_y==3izJqke*x00C z<-A$#ycq5B&iY;bMV!1O(0o&m$}Z+J*13-v9AF+`UPK52NEMmfTt!c5;MCMF9sdBO z-tn*R>MO!Z4AV6$IB6E!Cw3h&%JuLY3qV@0{=(CvNmGkFV$3I*%asKV^zpJMR%hM8Uu8H8Y496;a2^^*+3AGim z#t{flE^XQ?Dzklz<`M3SnU0p?3ZpGkim`EsH^l^x1#CCXP*Ye5Qy9qp@(-JX* zm2>G`9p6M2zwO9fokduYjUcX=PC3*7gJloBY#R^zIgf1O=OwGh_<8YaiJuoW=J~m` zG0M-86@F~7rT%|lB$57qe=_oWBfm28QzJh%@+yAO{?n#Fn*wbLv?3bZNE zra+qlZ3?t0(566}0^cJAo;%#rv17+eYcmUH!WxAkYk%9isi$N6_8?jb7@?tl4h{Bn zTyhDcCiws513evAUtO5zQ26WCKKW*PfJ5yQkxdE9lz69T7TZ zssC*0l+UR4|LTYM|Cjc?wPWO`NAB42#VrqR86N)W;a!`5ee-Rbes|N6q0bN9KlsOk zD+Aviczyp@`WyY1@zM65HU-)gXj7m~fi?yHw^HEj<-;AFm!5iPfIl?*+eQDdh_oKJ z2#LUx4)93QMhSIO)IZs#6GgsHmcF8sUJXw!rk9$iwYzn8!KbGC`0T^f$5V%xHgr?< zdug#NEtaVFoOthtzZ$>tmS2$9>~@}f#i>L2lc|hZpt{*7Axw2p7@MZ+##Tseh2|J0 zIU(v=?7&Kbz@z-cJx-Mfb>(R%JZ`Zup_kfBb%}(#G5d~8{MLJ~$saZITpqQ3?NRC7 zL5dDsSLYUA;6$Fry+I0E$f|^qX(SY+kZBS4 z+*4i5pVTOA+tSf_x|siw9MFa z4#~j#Qrf7vbbY#n>$w4->WTk}Yoc7}{Es<`4_>C|{^AV5t1`N4G37pfMR#qs*bht+ zu#_1@RvaZEwM^U)tpr>sb-xQ58KjA~|JHlsv+w#xd7Ztqg}tu&0kBv0jIMU*9V(QN%oxKP9_MYIFaTdL2@Hrr~QE z`)hK`mMf}Z=o&Uf3Z_jJBR6EfpUzqnPr;hmDjWS5!*AP9HE7tS4sdomHs%hp6I+r& zjbnOZKW)bo1TtU&gAY(Yky?`)3A%teY4;~5^ixueC9x^u2p zF}MY7n7+&XWXerUQjcU;xtZ)!>yc1j#;s#JK9+Vkle*mnX`ehBbAd!%vAZ=q%%Jmk z&g_rRzV2yxo!zQ-c0PYny0g@Il2FxbDMTP|NMV^yO&>XKZst5^i=bJ;SysXEwP$;YAJ?^gTbM7XgL9p&ll#=iBtwb~MqlRQ*dsL%AEMTI<)D zT=_HcOW)BW6D;rRR^at)X;-G;DO@oq0HVYaoh3~bs1&9|gKA+970z{SZsJpe5YaLh zdCuLz*|2o%!2a709blB;L-F(#kI3tR&f$*1?Wc0oQ_z$}#Plto($xqegR*f;$3~#+ zM)zppU}I`HQg5n2t2;wzVn6S^%K*TMINr1A`s5)dLg#PxrmM@0Gou?>*Yn(fz4ztMluf|Dp5dj?;WR|6}jXdoA3s)s#|?Swh1He@SbXs~<3MP+Ku@(rM)tG)F)p^BQW|Iy=dn?RUJapfPM5kq0`j9XWKP&=S^uAMkZ3KJ}@!_ z<+`iQ$_u{N=(hS&Y1h^6?ljm=Jq-BVm-1NSVj^^g1jijWp5}k;UdvNdq z?bAdXlGvcbqBI?%M-73wJLraY>+#!_{qzDAKwYF=p-)C_o+gDdj*I?)^toA*_oV+1 z;OKuNf2BbYE#a1FB{G^$(t2W7#theO$P8d84OHcoF~gy2^R+xWSY!r1`CXXdSvG5Z zW@h+qqsj7(ce0Hy6g?>h_@^4r{&RW5NqHlq)3a?%oAJiQ*W~nU6dF?wbU;rUcrDO2 zY=PD?c#f)jTG~uVSRrGA@@*%N9XoLNMA`~QRE5l<;|R^oou23RF#Txg8b*9>7ekE} z{6#wP(a4F9M6{ftK?)br414$JWc>}7%PT`_+tp2^=8FtV_m?$>71opoB9jnAs(Tu( zW9Z~IFWFsM7iD~xwUk+0sjC)Re4H^q`Il)_)NDJrJ}IrlS2~+(cPYi}x}6uYX;&u= z+&ZMsuDsIEt!~+oui%kQMKh4OUJuOn<84q3K;q})sa$aLRq%gqm#Qo@)z>Tw)gT4x3`;COxXyk zY&8#TZ?5J{aW#DM$b-Hz2UG__YAWFL0uEDZm{?x-p!inQb}&1gHS-l@nfIADN>w(1 zw7C>G$lhGPPMI_uF{ZKxh%_Z*T4OfO5&cXj#23&FP#H97d*ZeJioC5dEMr+mSQ$_^ z%JOcNSH``kpPMi5v4Wk{*TM3}q>-O=Kns^>)hDfWRa-Qf<8;PHKja6C8K2V7OyQ7W zsruMST09+cD3r*DuI)lgvc$A^*%=z&m8F~GLQW?-f-L|?~O$J3E;ge}mckc<9gs$npOr|Q})lMdnX`D{w9^kP+AyXt81yw`I6 zSs`v}o(i+5K8o2M6}h%Kg$}-3+p)xsJ3nD(5orCrF-@rk(Qpv(-DAUqQPi6AnldKw8=SNdglp=a_aB^`Xc)@7=#a{ z_c9`bd7<+wwAxHcrXgoYK9fz7j?XeXQIYM|td+HrGcxH>n&zc_{=i3dab}#{u~acB zsWwgH!mPz}I)#-6gDG-pJ6F|bFdgPAE2S5)8f^@(%i+MvZ+^YmZgs6|GK1Sj)x0!j zre%C}^wONRtCK~(g0@Fy1mBF!IoPsm&=$=tZjAH~&6hJz*CXkCyo7Bh9U2vt(zceW ziKQwrQD(x?V*;}|>M#`pqKDGSu9${urk=h36@=BLfeNHZ_3x161ns>M+{V(yc=2b^h5wBDqsfC0yHCpD<=Gn;+iv!&CtL$-oQw zRr^ny0&NPkDbS`sn*#s$QDAlIHVlF;32r|6Lj^nJ!ySxpIU+V#79^H3c`-z?j?xlT zo{q8Ch`ll7qqeMiCCjA&43~RjAL~xpb7yKxGTP#n2kS9r>k^|CBrr>WAdct7K$0Q9 zwFT7{K65@*GjSS)kKcLg$+3gCkCr5?d|cW7jQ>y$s?3}b1O#{*0a{_=0N(oE(k&{0 z+3dr8A^y3863^igN{{Jf>ckgh&Wae``%fODUHk=6#id#rI!`+rD#a{s}D{F7ejYB+*)I+qdmxC{y{HBVdlK1;cE3T^xk{NnZU zO7VNFXMb)JK5=J(1q8jqPAdPNO()Wy4w}dZuVh{ao;a?wFFp(Lk<<&zpGojuc`SDb zeWXi09FTd*;;#wT${(TmdNvqbTz%P)+p^CoXMqV?(q3MEpPAZ{70CT4x=1VTh)VI& z5>|X3cS&8$gn+?bqBt@_LY|l1X<^VoDAOtUCIJ&(*~oW1F4gs$sV&?cm{Ri!RAgr= z!x1*&z9^0V!6qHyumMVfsR~QhSJ+cQ7HA8~Bay*6!~o?J%_;LaP11q(OFnOkGolhZ zQdEDY^#i+v@+v$dPPm$a(z^29YUx#+%{pzw1yylJgp_NeD~MoGqg0b{ra~s?xXkMW z<3u7%Wx~y+(*rI%RSK?OOp*W5nyX;5)U%n zXc687qE!4P+i!kFHbi7=Q^Yria%7TNVVFCfb-7N%+A<0J0$?jz318$=nNuzQRO4o( zUw!_WG!m12Dto4in9v5EBd4}P{55swEM?NQ;SSR@m**^_E7;GJ)C{)aLF#F28{D4c|u~F)aC|oYz9h_ZQISUY! zG;`U~SZgz@d&k;0)lw8wujS+5rAQ{5As$*DoaREn78wsnzeM=h7qBJet0fM$zT{{5!%aYo`Qw^%bS(IA~%Aq`4Ik8!a7?C#EMY3r5eOIl)Z$KV!cO zBP%FkF$D71@zk~*e=4t(LB#(b=(jrtZyfmCz>)q>^uMqFvHny1qWz~$fi?x&6lhbR zO@THAS}Abd+=kZIogE#)oA>OJSNi$u?%VKlCZ9X~xy|y*K6meipJTS|y3dVm_&MBJ z|2Kc~OY%zLovr3}S7Tq%>f?hl=WYYrTp2&~NuWEzX&KQbHc9S&icyxkfT^E>S&wrh zg&)xykVKCfkYdy*06WOTDe&ClolEk zgBNK&FO7yYQ-_iS-_MLpW$R%G`M>g4zb~&8sS|fVHigslcR@)}W)8O#yDPPGGy6Tw zeWg$U*ZCXhwoXTrZ-i zOFWy@c+2fgJOj+lwJ1bxny0p3>aE{j9Hf`FwkRE}QCL7VK-T_3#%_wU#v>lg%xQ6+ zT5%DYPF-{O;PIpTPgGTyhAF(cn@lV$_tAtsR3(CPUPxSrB!=-H)FY)d$ydy!{7M-q zNCmJAGo@-EkfCr?J3w$L@|0qQ%+cDjP+KTBqX&D`M`1bTQsVNb+@kn03u)yuL6;bI zC|+lVgnVRA0ZxmLFGhL3h-n5+FDZhHr=f676Q1BHK#E_4>(YV^6_mksWW4bUgndbg zr?C|(BcwbcWdYf)1&FQE`+^!Fjn-&}+P(eIHp>x1gft!}xNy*#=wwAF>%N{=0?KFE zGGaZ-VOXnGO8ti^#)2*^Co<<(*4=#C9-;Z3@9lZ&F+vsP5955PhoxiX$V96LRP#Z7 zeC}LEvC-0T8ED(OctKhiq!mVKm-?Qf8HF!PzG9@^={ZmVp>z{6HY~7@qV~E+NIX|n z4ymBl1z{-)c<{T^N{xk9^qNlGIs{WzO(zZ4WiBTe`b*O*Dvh6pMT9^tY@9QZ)H?_R z2{}^ckdLaoKZiRlxRBVIa>m8G#37_^f@q2yk6FqDGH&F(CT|lGk>k&=LaMH1ox(-% zg75|5X?`U#eT@zH<*dYbYs>`o19&VSMc7|uU zc(iUh@r*S1$%#luDQ1XfhhDy)kEY8frwSir@=;M;T;x=~wJ4(Oz^@IZZIVE6EW{Ea z+*}Q+DK|WOYwp~dRLM|TN0l5a3C^VQG^8F~g0n3=l@BB>FrISP6{%=81X)!9v?#Tl zEmC?)SXk|eBB-3j+l3$0eyKPWgC6U#iu1Qj%YBAw=K4~&FYUXtFD-`VKhn*pzOSGL zM(3leQ=X}pb^oK$AIdA$V&ebX4CNd7@W{-_^S1oKmPfaE!(Sc#nc;id^Z(lO|Cl$_ zp8uE6mTb@eYtR47=8(1L|F!4;oqf1H|F1p&@9e|v`G4*Ce`gpP8&Z%~^u^Y{}a@zWG&V2@ZneAADrc8TiV;|1)rWps)Ye z`fL5y_I;}F^?mz$ztQ{iy_3Bc_xw)J%X;+g&vn1K`%rgx*DrU?bzRl@iO$D6Z|eAK z9`ybFsjg%r4{uOoRT&)3IAaFOJ51F>`|qpuB3iyh^IXSwnfA)iP|LR?nQqRU*3i)-tD-X+JXjBGviryX5J-PFzEngj z()@%bxn`N!#SD85nTG1czQ>ehW?F|a?PP8DfefvD0;Zt#0BBwM?Z2x&R75Kd63qdH zvaiN%SA533+J;fqu-*~|Bs1PRSP$%Q_rKZ zUhL8(I%KZ*{TW*MFwG3D$&Y{gKU8Z)w49*g(x{Tb*tXAX&VX6A48CUyt!|p0<_5Il zwAKSV-Mx4VkbZl7p@ZObnDKoXTKTyYwC?YE zhm5=xov_jDOw{QK6>VrkJLdMs!>FgS< zkzskRdRIaxWFR;bn1k440(Q6_SkPVjJs^E~{G~;-w7}MqfO*nJESs3X7=ag?YqxG?G|9Ew_h?WtBK_#hZW%_S}md@;6dZF9p*!CGrOtVwRH`W95 zyK4_je(c*nIzCfGD`xCAU|T`!B-HxY zfBu{5bP+An(?dr_fU{U;MEeLb*K-3xyUq_2)AMYIA7If@V{ zN4m@w4;c`*v6{nQt3;-b)l(`e;!=%!1a+m;bsN7tw<34wI3Ma^l61o<^;V z0Y>=1a1M>@117wO>wztHdnF)!WjrdPC4FCAmqF(dUqx=gTY(!Q5ScH|7D)Gq- zt)hT94O)A~PK|{*T3s@oSofX4vET^XLfV)Sa*J`r$W%8#*i?Kc3f2Sbcw6_49|Y9h z<5NYv43ASy(|CsDG9On4Km*DO%duyM^o%ex&y0^{coikYB6#iE@vZ7)j+cn}2y%oD zW9A*WvTRilJOO*jlyN_%DRIL8?DfEAgIpRlYk zVwhgz6&(R`BtxqxA?84<|I-gu?=7Nb#+;x~q@c;+w)8kC2ad-CU(Z3{L_z3S!Fpgz z-R@U`G&g=v5iOu-GFl#<_ZcZ1zzWPZFv}qfFK1EHE7su*t)hfbXzkfsy}O7OL#`Qo zjXY&;05+IuGh;dk+;YSz;=g{#%P9_lvVI@!PH`tg?((Q=?NWJ#DX%?~R<(fW)S zrnf|FX*6UG6VDsZ&?-uZ8K~9$A-8(6h?dT1Xk;*?uOy5*M&$^n%D`#Q)fgD=xSqZq zSiM{SAdvKfCvvp9(AAb52Bv4}W#+VCW) zl1S8t1g+k0RgV6bz4>!*LWdZ>t&&dD|_sEH^_&>F6d zCSnXd)I!PGp=~3c*8>Z?H@y%@zd3%eh*qM-uI)0r-n95(*%70{>8Mh617^2dV%^xz zof%q1rhh4D{l(UoSI1k>fgkj1^*5dZEl6_q8DOJlnG)dp)rE?#&jE&Wztx zL<`f3LGg}_O(|^Z8ZjCXy`kF`i;m@iXH~R2GPH_JzXV!e`P$d2V@0%L+tYMk1ii1L zeeQ~UsLz2^DhLsrG4cjO{+glFjsA4ei-Ax!F z;UerYfe(O|*x&gkat{Cefr$@=KR$kEafLE{fiVaXhIa(02&2U3#FPyT2yk^Pp_Qx$ zm9r_ps(0jg$?4H6M&t$+2=53#=m`ghZtG=cN>ohd+$X*n-=5)>@8V+DXMb+u1JSkP z2a0Gp2D1}%-NekY)LeUq(_=(sIXi|1)!igq4@uBUAUwdvZqLyYa_K^MCbyJzY*F|D z?ayS1n4^eEfcQddhqq;D<-6Fi+Vy8gC*J$$4jIj3M;fQJuu%i_7L@h?S;fa z_h7{($Xc(m9+cqK@oEqQTJ?oFVnQ#Y;zme%G!O(s1374*2xAZ_Z@YSI;kZ;Rg_tv% z)9b;m*L-;5$2zYYe?g9y@}#1Oc^SxLri#Gweu5EU#Z0(Ib0oM@k&L@o2TAan1TBD7 zZ!Dq}ng*ozEgT-is)b93^J0b^r%J>q8q>7lu?$#FuTxz=^f@xNe>`3(qJ>a#91E$Z z!}IA$tW+@KY)08|EG;x+ydILEg)S3dRj-H^nh*nyl{qGd8QKfoA`X#b#SF*MbQfPk zp=CD({i&{(eHKXX9(Rjq;dF86kj*-lD0CN-%NM)Z#lN5}gkx#QK{-EbkOVDXq4n;n zQ$!1kk3lX8o`r!hwR|iunh9Z_SVo9PYa3xjxJCiX595ihmwgbl7RCQJJD%58TrK z_5OGE-_t+T_v?N0eOLB=y!X*wx95vJKiPA*r@Q+j-80?K?fU($S9Telf8P0q&asYv z;_?V$jx@%%8YL1DnOEB=TkKsPlfV_p(9nYPieyw(k5=&|EpENriLj;6q};A|VYxGPDZB zG#}=xgpsc$58gey;8>H#vTj4rOW@rDyxrk1-PPEg!P_U4$CG7Phbu=OxnVI$s4N3? z$`x5A!6tlYWWa8Z zxeq2=DX2{-)ZSTbT%SQxVWNnE7>ojo%DRi-wloQWFuIHA2S_tE10NzstqJYEzTx+S z*iRp7Tvw!8r2>bAP_3ees9{l34Cunm@eBeN996`nAZ8ltsfIoP-dpc#TwA1?PrNFO z@ph94!y44^wlG|!zns@P@2!X(vnMu_RwgX$2_dn-$=Kh*d7qkw9R zH+B@)XxLF=F(RgH+H$~sVgv#5whVv8A&z3?dfs|avc_q(#>SyWDTAgC0bej7mS1+` z81b7RJN+mWr$Uqz!&96joZavc5N_~yZTqXc8dqiT(nFBgMk1kx(9ob6LuH6SVTR(; zx%h+(YVouS;hpSz-hTqvSH>I9FD^BS{IHUM7bZ9ELY*8XlmLXm=kwpAp)AtOwVw#~Zpjw$$cHusS+8-WjTv3DgMaj0;A zD>{}Rk%HJ}FquxE^Q9Z^LJIFAcQr20;Hh08$bc)7z$0-a0XGgqfQyF+c4NbFh*VYL z3*p@-qG;E)4~;jrXTX%yMRZ^`SOIY{iDX0?{(y(8E+Nyv_bO&Z_cLHky2(gX-z^xOhOXPw}+vEX3Gvr~0=mP4(T@Wd`Yuj7yYFt*Nn&D_3rU)Je!v@6!6gLsehKF!g zqd4{}+J*2Q5K**i+Z)FlmlmlOplWrIu^3m#wTR8|HH>H@G$8>;fk;ONtc7Y*3bj{M z8y~}zZ@IHDJ|S`lqj+5 z#PKYNcO_opt%r7h-|Ke)YUZxSrVNx~S|m-yusNT2ifpIDLYYD35afXL=oU_#e&L~l z{CoVZ?|J!nW2j}7XiIdR#SRM7f(w?QX%WlTIqSB;6s;UslVGw+A^+C*tW+C=#Z?lB z*Kw)gw7|rMVc-;c1t-R33}t|oNh~7HP-{X23qqm5e8{2LWllk#Xw7aE~L-4UF%VvexKVc6POt>Ce$Io{E#P0xW zdA!k6#4JLKyA}L%7bZnZfkcH#g-|Z8up5R)W@kFXtjM!S$EhEG^2^mmcaE7DYD`sg z{6s_Y>lnrsaXD;T4!eg}t7&i`aq;!g{O+Id0QJT3MpqFr1O^Tr(gLQ3{b4HN*s@Za zd=;wRvLIuISaCN`Da3xS+UP7IrW=WCAyG-O2x2h?LM0-^LByE+8;KpOasjkc-9Paq z5c}QnMn@4b9}g_Fv8V{GOF9Dko!~VBgUk&_6Vr+W2Z))tXT|VyO0lQjXOb%9nB{>LyKg>dSIuzA2|zNZ>qkc2+4;dtqKAW=8`}*n^2JuUqDC` ztrP|!lTo3yAy(CMa`n#Wrw>ree=SE133ZjQ&BOx!i)*(nshzg^CG?j!VGPH8ezo+{Z&zrjWm&@ZXE23p; zK0JW{LX6KR)>AU}fM718*Ft_WynVFZDC=Nmv(RK`n|4KbeWx>@BH!3TRZ+25BcZ(8E@oi+B9)b zq{Tt}!1?5}$ztLuijhF{%Ckw>2D)jSVK*dvk{+q)hh^DUcfB$A`R> z5_2liC2&=-9M?acA!d}%tc4^5yKBJi=ic-;hZ=dt))vVfS45@}b_%snBIX({Y+}0j zjwIiGogA!gZU}Ox+c*fk&yP3qq^+WztrOEEo=mn7No3(|a2&)KHDfV(b@J9$6J9~% z?NHeLNwtwDZWZmwh%nuJCLShY5*IdIcgSM;h-&H~Ezl}HYw5>uc z;tYf&QOZt)oVCQrMQUJkqXiuFs*gL{ided-DcL?*ZRDw2g%}BUUkeG(q4zLf@Zd>^ z;nzm^ig9QY6N)SAph&oZx zcY?JBUt)S9PEh)r)xZ21Q%xY78C9m;8DQps#03{Pp=TSCIBC!lxWt?=f9@_J_ zF5e4cPaJLJd0e%rc10t>ip}Rq#gC<7%1{>|2?L_bE=RLy#qRF%I7O_<`|8p3_yE>S1P)=YfSWU668E z%z>j5k0frd1-`C1ais~bu&FzRc8|ZX+Q{>|iguch1AtE<;cFJGDsH5P#MDSDVV}pL zHuP2T+yqMxNDGh*e+@(%|BXp?WO*b*cLxR!mU_|tDb)W~y;YEyA25b5lvA6aZdOpZgHS!_0k z8T7WUhsK5=_c;6Z1PhlxFy3g%G-B_X2z0SZB{Yn}f`zRFLjrpTvx&Hc)`VBsR1NGF zF2B3lXh}8Nnr7k@AlqDmbQTlK0fh9#4J4uFQEg&->!ID$_r7nYpz>U!+6E3d!88oO zL?;wO{2G6Qs4Ia10-P@X0Wq#tP}2`rwt9C8sPRUgX;l1yu_c8&qDwWlK_}ouFxEuB z+5{KK&W5qO9+W7+eQJ#-4>j^^quK$6!FwTGK#W5qIYBF;SyXwMMB2P4B9>=Xmauu0np3xYEdp*i4R2 zw1+ag+olT=&WyM;m$mQPIxBTcpa7Sck3=WRsmGMZ(D^*-l-RiGyNo2v1PF z85FO3<@2hITZ_tulou))>0!eeB8WL)5?qXZKM5(sB++3vL1wfI`ri9?KwUcC*k4pO zG37LzbhAu)R@4I~m`^DUdx0N7>Xw}_*MkzoZc~Uo=TPI83|e~fkv~M}!m=Y74a<|0 zZvYo57gZ$2;D*j(M!ObU?oQ{ruloP+v0psexH*HD3MYbT@IQQP2t18YAT?Ixh!UG1 zJ@dT1Alwk1pm;lxkbn5t`>KtbinOBuf|Mhcze{!+?Fw8EtAu*iFvN#4D(pxTWJbHB z@4YVs)O*JpFDlZG>Kdu#Af79gWR^`l#gBYqNqSU5m*S*q?dIf9orUk2doBvZ5U+AO{yd zp_)a~5)@KM6)Sv9RT2RatP{=J5T2kYQM|Xla&WBC%rdJYhDu_`5n&nzsIwh-;leDi zGA+~%i;TVIn@x}z?K@CW5Ij;`pG@_3pF9y&jjH9;mO}gb6WDLIQ=c)kLf)P42b-)byWx<3mRqcJV|IUnAE~p%c3YmxyQWlbkCX zCjL66PD0##LwJHB4nH6l4mFGnq(ad(sX`#RUk)l_s}nV#G(}PiHqrnKTlCnxqMbh4 z!g%-Fzw(GbF?jXShF(MwiaSsVGciVIfsOdGSw>p;GtfII(F{i%B_k6J*YKkM_OoxxjkV^Glei8- zDIrjXwtxkRnqwb_6wgrVrJI4b9+qH6EKZ=M{{KfhMm{n!J+f`fZ*4iZ<%Z$U4*%Hj zt(*U9^UrL4$>vR)etpyYrpt%^(@;w zU4sLP1cX#E|HXll6e>Oe>bwH8S4fs=x)%D>Uw1Uva)$tJeq4kG-5s9{fA))_Jj2T~O2T>!4X?|(%pES1Y^!oqa*F!;&_fkzdS z!K0O;SmZ3`yqiRJv<}wv!(A7#Z{T%sRb}$>Wg?qMr%DMPb#ibGNdmleOk1w#N48Ju zT{kX(CCltl%ba`hs>@eiQE;NkCjHb$>9rIfTISAQ}QN?s%1=+PZ@xFnfU+ zEL(?HRYnh(>g-WG9(p>dOY*8>3UM)mU=&r#u}ys@`$SrAW0>8}pPd4rad1_o^zt>6 zFA51xQ-19ber0P3EK1&hf+C*+H0qP=0+QKL5&X6&{I-p)s-zy^)YdwbD3La%*j<-Q zc_;}9Br~-TR1vy3kG7?+;g^Bi-uLwqs9kz+Ri*TD)Yw15%`7vtedLVJPN>2Mk19Gc zgf?cHyAD?B1NAA?E*@J|X}ugZ9mc8<;6&$Q=wdY!_P{@-5(`C23fHhq;{tG-FVe39 zwTq6f<|#e3wT?$RDy}+|oI~%|4&}yF8Q#(ts zAeODHmXsGfBIV(7)dl@VIx}ZqG9WbN6N5sb#T$YgbUyhXfX9Jo zrfwym&20jMAPmWzm=H7p2G$*6MRJ+Vbcj6=b}*ap3Y#jl+wsV*>S{A{D`8KaigscW zER*O7EJ6~o5@V-@k;4_35ILeH>!FSGeW3?X*Nm^WByOoK^C-Ka=vb4RTBIa73$R>3 z;GF`R5ceu-1(j~S{A_D~M6@Z*pG=)y2&r$cB?qaj8nChL|cgi6iUl5SxB@ z)7EeOXAryM=xUy~RhvpUF*aNjOpIHC(xPAqIgAy-Ui%4`t*HNaS+=PyZlh9MU^hJQ zkB3(C%-B+WE02V5aed(zupeK?~JduWN-=MMhQa= zuo|UW7Y`ESNvsOPr=*9xGKF|ec!f=slR7-`KdP%O8C@a8ldbj8F6#UIHGul!_-acA7kNm9BZ7#_1|Y^|M>vH7ZVnuV1X*2jE3Kf?O-&K| zY_-vn!VN;IlBsN@xI(V#1Y9#9M~yU=vKfm~-Xva!m~84dkAc|lA8q70T(zmT!S3lI z%!tp!71(sdiO5RAgMyPlY*Sm@3fa_42rvBAr!G0v$dkEhQvrz^rIB^g(%NJj zyAb1~VnBa~8Z;PkLy(s^zk4pdw5t8X(-D!84AjRYDEx z)oj8mZ0d6byH9?n+Q@UdnHfxkUg8O`gKVl4rcjMTaaDkCL3RMgZ9TMW`u@BJP~RGF zv}AP6IM!_POx)ZekBiGhCcT1O!k&#ueOEBb;#N@UrfyS+{Y|yelG3HPi%MFG_b3)a zW(Md5pIV+W)(IKFglm#sv>w{?wtn+7AodqW8+lGQ6~EL<5u1ZpI$98a3Ez&J0`M_6 z2S}@tAWqI^n|gtvbQ#$F<=bvO)W|ctYEz}?SBkxeUP*@DQ6UPv2L!pe0ttZvdqa?y zIG^|g@NOD!wB&cWpUZtixqT&^LZuPgKCZ zxRiZzXNKvXMk}bbP5sNaT~}??i-@`82`M;r&@xhaOhAtCH*T&1Y5i`UY6;=evKj+E^&kj+Bc>@47_>Z;6O+JFZRd%m-hX3-^=>;^?tVZeDD6AZ}hyU=YgKh z-A{MVc3;``AG=n&_H}-`^L*#+9sl#6ng1VKJtk|;-6e~dmaL2lYzdNcsF0loCNb6o zB@~oI2WH2U>gY=0*0L|nIfnZC-Wzot{_}&YFV0}8-LScCp;H6N6-BZq>RK*FH4Y9} z=5(LXEH_aufF;a=V-2`J8(UTP?sC*(GR3+>v0Q{j&2~r{g#;iHfRY$P3Ptqw;Kb)Y zc35DIuc~Wz;$#kDd|{!J#by~~`Y~K>$)iZfokOPU6~eVaC0>VGddd`LpFO;KI9sS< zV+vTw9+J^P$8*Rcak`{{kzj;vqA$eE>v%#D&1{X0b-5##h2Q+llSfxoY7F#VBF>Au1_6jg^NQJq4(srGhHj7@&|3Klq!Ud2DP|Wyf;rA=dCPp_$KJ45&xJ zjYn}Ai4?RX)k)ag$r{LPV+Z=a^IBlN?BJ@(jS2NsEe16{5tn?(^N7>xNSQZraYBK} zQe*ckIcVG%w z4I9{-P%IO|RTy9dC^ht=%T*l^wRLV5tXpQfv0aL455IU-Wyk=hWFD1d zn$%grC*t6Ulp?+^ehJs8xcEjwJL-5m+t~{=nZW#C|NVo9R#lb^nD&5_olr7Y;p^0z z;gJvoC5nLRq3EH4yU8sj4L;rwraRIByf+OzIIs z%0fe0XC!OzvYnOPNYTR!Q)x25-5}_3vx$pz5^RrAuc$Jq+eB?}Z_lUr(vG<~cmcS+ zf4B$C0HtzdIVhZI?sAc`i$XZfqVAa!ON^XMEa_ch_HYu?KMVCg?KxiN^rUG z_kH0Nx;DVgki~Y(rvv-g+1*Nu?6##X)Y`$BIWy;%bey7?T=fVob5y8e%mHMtC8# zsZF4eVn}R(G=8q%x$m8O&Y3^J7wn5k_RTlH`}cTV*Y|sU&r8?-R3}RWSxj6~Cb?^6 zuFLu!B8XBPk!xy1(Ge~3UP2$W=ceHH?0EH0$5@FRE3uj$=FrHy%;Odgp|OZRM5VoX z$XaBEixXIJZC-VEU>(U4D;A#__mZef8A1@e)CwK6mQ-7f(u1H>LqJpK`9g0BtGJS0 zy0(2ZOT-wovxA- z3W%-N6x`MwuYDZW{YSDyiN(-j5!S>c4r4T`Ni?xd;&ht!Sp(+u@=meD+K+I1swF7wa*lbu%Z67rM36B`%jesC98)pM`(C81=0V_u#>bFmyxVn=iW~`jKzFHY2KVB%r zQi3qsMGYb{x~0^wp(HT@ckJYjnJa&5jFnii5=%i@gA>`0iE>n94wImtyoj=~(P;9g znZUZ^nA{e1taZ(ZEU5?fb(s;FND z&RHLZY}-ZbzKqUj#b7NvA(~W?KZ{qa!j2uUEW$e6%@R{ru4vm<(BlxNDWnM_#Wdy` z%HC2h4k8OuiP02R`P_rMCQB?`3@tvjjs9&V3P?1msBBa`p}g30WHt1|YjGiM9GX|* z%Kb)m=t!1Gx)@m;g@pm~P!nl%X-9q9tGC=Rf80_?^Hhk{)~29}`{=1}UAU56TCPF5 zb;(z>Az96E-eG|ODBk||Xynu)aYRYAyjX(`1*Yw-y)X11-S+L(Y_qj2l^ z4o348%*ydPH^KdLC;RaNZv4{lz;JCl@1*=@Ffyja=zSlWt~`>dhxxN5+HbhT2aKHhwC9o45eUT5d87~0_-|NBf}b+aFzD~t>Iil zGbak5->zlF(rzd-ZEfxUWdHQbPpxK`6oBKvaGCxh1R*rxLjF`<@)UZ?P|XeIaI9H2 z2aG|+tAG0CC%W0i)o*Sn%?bLYt7NaPPi<5^<}>l?BiL*if{}I1%F@P8IsNiiJJ~x6 zxU{tL89ipvjLDzDhbyd`1kc96xUGRA%a5&Q7Zq^hL#9B8r@^2Jv*I&dn$dWQtW)*Ye6)mbJPwLuhZjQO7wf{vN^F8DI|FgAyf3fd|eS7x)!`>5n zFQ)&$d(Xn||K9!3?jyT?ApgI1*RGv^xAWGWht7NaygSdEKlhvT|L?88RR81pb@ko4 z|8Ly!rtM$fe&_Z}w|#Tlz1uF^`r_6{wqCdO+%12-rN8CiIbS>H*Up)({b%j78#w%l z|E%PRVsT-n5A&jPLZT;U9_04$$UB__h8fP5&cf&<9Myg=orBg!w(Ek{EjxxcU;n+; zJP|Db$LC4DN%J1bGwFYyW1IFy1SNji`&v){~w8R4u_b@FU zK9w-HNiFRjaXV1}szHoY47}9DR}1Ty)TkxGlA#_WQL5ilyBULF{dv_{-tw_NQ0#M7IDOAFM%x zp1i01J$&A{5|Zl3n(%~r>06Xn3{y4-ESGk4`;*-~@h#;yuW9{4-q1#eh)Y|z8?z@M zi^E1p)Y8b>T*oYzw%947+rQq)6WszX?G#lDZYmU0`b@zIBXEaoWvm1>6{km2IR&@9 z{+4(7+^=1eC$c55A|>S1GjzjBR?&s#FQ!flqqx%tdvus!E=^zwOFs1ws59L>kuBv{ zYUcN>sFb>a-MryHwv5Pen`>sD(_E%hKLr(&<{}68)s-xs3KImzgXD~amk_9iN}VsPhP*8CC&w4TG?isF0^4(^Mhy*Z${ab3D_)t zEeI@|dDPk*Fb3&`h54aQmPnVFz7#wuOfi4)#-w<7!Mn3Ix2%&_1&2C>s$*`nj#;ei zpnkXpOE#Sdmva6HQ}x1nP3ef8GIAPA5guZMtO9Laf^+RDtQgwvG_?11vc$NQL+cGx zY6cX^lu(J0>TZ@OmvU&N!p-EZrIXBSLm6cQ z<2dwO7@4xwg38?4wMd^i4*O$iXP>-kB}<$OxU{r5E}CSu8zH$39E}a_=+;CTQ2#o$ zPDkx`i>2KVm%Op{EB6d%PwiaI67vEuEv@bs8b^t$V8YUpiATygAB~$sy-Cy-%6yvw z#{7v9VQ%kciFzr&SwFH)Ke2U_5rE`1gbm*NSph7?K)+3&+*`+-IJC15zH&{Lm=|#4 z_@9fU^u+t0M40?PVy6(5Xnk(clrRmPpMr}so1hZyQbI8^P}0=-G9Z(-8gx->sXQ@K z@9Q!0Yz>EaH`#%Gf(z=N#x&H~tX0e&K&fI+wtcSYUt<|VbS#Iba!j1?xRV6%WXif@3JV5Jy9v#jEVL`g%3L)K7yp==%zgHZQ4XJOPZfi*s}0#0xbtYkM;gF|K=1MCHl z8NJJn7$tESSJ*S|r3OO_A!6;mw6x5IJ4;=sY2eXft5o{{x#N0II;(iNZ zr2BY$rwBCrPMh9ZdFQ5pv9!i`;P^A0>|+Jwcx5A1_det5;*(n_Q>jE$PZgnf0=Oau z>yX9t9jqUE8P>mdv*Xp3U1ppU%rvvnP|yX{the1G+Z*ywpt*?W=j`w*D;p2Rf#d&n zO?G2Bw0LJ1`#}PEu7xCSPz7`mqug_W^4YNv9gG?iaL(+nuLM*#`{nA$=E>5cn=C5d z@i0a&Q7iPmG>6NmO+KQ{DX8)|960{3t68srOGixWRS#2TzWPX4IviKjz!4*<*Tc8;m zJJY&lAH+|0vX7SY7l(FDD=jZA^*(joc+J#hwAHz{xSqmn=v!Y$ESBSF{mpm4y0x2q zq&k61f-Wutf>@RKC}N3Z#q)eY1_(9%ExqB|6jpp}J$>x0o$ME@LmP0A#WPXobM!KS zp^v0id^$;v6G#d+gAJ-U3e$|qQikku!8xZE_JK2Y; z^Vgt@$g=Z|Bg)+wth=y7Vp zL`-C6Z?iok;cBTaR>oI3wK0GDFTcB!U0WTRbBW|+O2q2XP8o(5R&ZDf^-@L+#*OCk z#L$kN+&%M=zY45w_Mz&~G&N|nuz9s5`Z#kxyT+>l*~y1chg)k7sdjeiDog7X1NW(w z?B@%(ad_Nc)?Y@5Kv3g|akGj#2Pur|RfOBBZM}6aw|XD%Ykl-P$l;ehnEhMYD;Zsh;(*!FB~-=q76`+j8aKkfZh z{Qr}Cesj;|^#2dz|9`mai@W-}4(@zR{{Ob~o=E(E^#32JzgGWJy;q-+|KGObqU}#? zzi0arpx6JsJ_E1M!0R*c|78YN^OB}Z&tb!BsMsN}8Ag?TAmG#$MjXc3M<%8Rq}Q(f zp-a9+HMF7n6nCcNc=SKZzp;{+bX~gG!%~dyTg3_OC!9!S3eO?hvxUv2(CaO4j=AfK zFMa~xLO0*Q+36~azU^q@8W-&&hmtsIdWm)>OlqUI4p?~;_oVT?{r!2#*`;n&N&%okh?GK8z-B5puwUtDTo_pW+qj|~P zjk$k6YKk=twCX~ixrNO!uQ>CC(Q{Y-u$!0MU7Eh;8s}`8b^LgM z_%1^1AOVHl2y8KZubg<4~7tzh5luhD`Q~7akjZ<0tQ2%}WAndN2=a(OqC_#zT8^CohStv`HAUa|x1f z_Wa6+Oia72tVA(N@q%9?ec@bV3hop2pZ+65JJ8Kb7Ap;{g&%E3iJczN@mGveqolt= z?J~61a~7(JvrAEliDQ#|qy3fDyd<#FN?;U%D-jdN?>9M1uBN^_Aledwu2WhV)*dQW zc0;;TuEd#FuRfZ;wT!c4=IB)lRCY3&v%o|*!S7z6{u9UN`5xjE()uY7rQ=GFIh z^S4yffOcD>M0BetsM^T$yhYn>u{KST@&e@!zq@t3%8`xLIP>a!CqG=krPa`_Ia>2` z3eKp+og!J4hvlrw?9kERB+esa3T{vRvH`41yZNE&(3lTXbGLN6VO_1PM~Ab8YzM!? zSWfo6HkiN~A6X?2aPRKq7gmSn2Y7T zO8%w-D?N%*OBEc{uwuQuGZJl;KN?$|&MKHh2H4Y6R<`LU0yZeu>R0^B8%8%>@{g(#_vkoj-4uo+!Eu z6>N#DzAd-AeccExv8LK(2AJ!Zm8Ff__@+yabn=7M`O^!f4MsIfbt4|2(CYgQ8(**X zyCnTnVVQz^PklK)7uJC)mX|?>nY`vh-pIb5-id^YOK4E{eRkcw39Mr$&!2hd?*prw z@2`I5(gMHwaO7uTF90BTif(ufYeP;WJ=XustfsJH){u+f-oKL16mV&2!xdAr5V0zU z5}(PKK%!^9s(zBRC};k+6{WRgRPrCJUsQ{!>jol3c$3q?z?1}8o#(XPQJX!XjA(Bi zvsl_s)-S#R*70t>w>p2GeNqXxRJ!k23dGiPIOf>OFDZtGo@ELvhNcS{+>M=lPjzTZ z9A=zy+a!M2z=2nd8L&G-pOF;$MYZ8zc>?a($;Qm*z8_fKe0Ozdx>OWhB>mVT@r2$N YdQ&9}ot9cnNIz)Nr?85p1$XTK0FWi@=l}o! literal 0 HcmV?d00001 diff --git a/project/github_issues.json b/project/github_issues.json new file mode 100644 index 00000000000..3ee05206a3e --- /dev/null +++ b/project/github_issues.json @@ -0,0 +1,3667 @@ +[ + { + "assignees": [], + "author": { + "id": "U_kgDOCpvj3Q", + "is_bot": false, + "login": "Palafitas", + "name": "Palafitas" + }, + "body": "I'm using 'bc' to perform a calculation in a shell script and I'm getting the incorrect result from a simple calculation...\n\n80 - (30 * 0) / 50 - (80 / 100) * 38\n\nbc returns value 80\n\nReal value is 49.6\n\n\nOBS.: Can use the calculation direct in bc command to see output\nOBS.: bc version is 1.07.1", + "closed": true, + "closedAt": "2025-02-25T19:10:08Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6f65pc", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Two things.\n\nFirst, `bc` is not like other calculators that figure out what precision they need. Instead, `bc` requires you to set the precision before doing any calculation.\n\nThe way to do this is to set the special variable `scale` to an integer value, and then calculations will be done to at least that precision, in digits after the decimal point.\n\nOne quirk of `bc` is that `scale` is set to 0 by default, which means integer-only math.\n\nApplying integer-only math to the expression you gave, we get:\n\n```\n80 - (30 * 0) / 50 - (80 / 100) * 38\n80 - 0 / 50 - (80 / 100) * 38\n80 - 0 - (80 / 100) * 38\n80 - (80 / 100) * 38\n80 - 0 * 38\n80\n```\n\nNotice that `80 / 100` simplifies to 0 with integer-only arithmetic. That is expected.\n\nNow, watch what happens when we set `scale` to 1 first:\n\n```\nscale = 1\n80 - (30 * 0) / 50 - (80 / 100) * 38\n80 - 0 / 50 - (80 / 100) * 38\n80 - 0 - (80 / 100) * 38\n80 - (80 / 100) * 38\n80 - 0.8 * 38\n80 - 30.4\n49.6\n```\n\nAnd that is the value you expected.\n\nSo there is no calculation error; just be sure to set the precision with `scale` before running a calculation.\n\nSecond, this `bc` has never had a `1.07.1` version. That is, in fact, the latest version of the [GNU `bc`][1], so you are not even running this `bc`. So I am closing this issue as invalid.\n\n[1]: https://www.gnu.org/software/bc/", + "createdAt": "2025-02-25T19:10:08Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/87#issuecomment-2683017820", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6f9KsZ", + "author": { + "login": "Palafitas" + }, + "authorAssociation": "NONE", + "body": "Thanks, i solved the problem with '-l' to 'bc'\n\ne.g:\necho '1 + 1' | bc -l", + "createdAt": "2025-02-26T00:44:54Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/87#issuecomment-2683611929", + "viewerDidAuthor": false + } + ], + "createdAt": "2025-02-25T17:57:06Z", + "id": "I_kwDOCL0xJc6rnKtq", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 87, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Calculation error", + "updatedAt": "2025-02-26T00:44:54Z", + "url": "https://github.com/gavinhoward/bc/issues/87" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjI2Nzg4ODg=", + "is_bot": false, + "login": "shpati", + "name": "" + }, + "body": "Hi! \r\nI am trying to load multiple .bc files stored in the same directory as the program (from your modified function files from Carl's collection) but bc will not load them. \r\n\r\nThe command I give is: \r\n`bc -l *.bc`\r\n\r\nThe error I get is: \r\n```\r\nFatal error: cannot open file: *.bc\r\n 0: (main)\r\n```\r\nLoading files separately works, e.g. bc -l file1.bc file2.bc\r\nLoading files using wildcards works in the gnu bc, and it is practical. \r\n\r\nI am using the windows 10 terminal. ", + "closed": true, + "closedAt": "2024-11-10T14:27:05Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6TB7mr", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Hello.\r\n\r\nI am actually really surprised that GNU `bc` will load the files in the Windows 10 terminal, and that is because, as far as I know, wildcard expansion is done by the shell, not the program. So GNU `bc` doesn't actually do it, or so I thought.\r\n\r\nIf you were to run my `bc` with that command under bash on Linux, it would work fine because bash would expand the wildcard into a list of file names and pass that to my `bc`. It seems the Windows 10 terminal does not do that, but passes the wildcard to my `bc`, which does not know how to expand it.\r\n\r\nUnfortunately, wildcard expansion is a heavy feature, not one I can implement in an afternoon. I think it is out of scope for my `bc`, and I don't plan on implementing it.\r\n\r\nThere might be some way to get the Windows 10 terminal to do wildcard expansion, but if that doesn't work, you can run my `bc` under bash using the Windows Subsystem for Linux.", + "createdAt": "2024-11-10T14:27:05Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/85#issuecomment-2466757035", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6TC19F", + "author": { + "login": "shpati" + }, + "authorAssociation": "NONE", + "body": "Thanks a lot for the detailed answer Gavin! It seems like the solution is simple and does not need any change in code. You only need to change the linker used during compiling, like this: \r\n\r\n`cl example.c /link setargv.obj`\r\n\r\nCan you try it please? 🙂\r\n\r\nSource: https://learn.microsoft.com/en-us/cpp/c-language/expanding-wildcard-arguments?view=msvc-170", + "createdAt": "2024-11-11T00:00:13Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/85#issuecomment-2466996037", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6UKlNz", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I tried adding `setargv.obj` to the linker command (next to `bcrypt.lib`), and that didn't work.\r\n\r\nIf you can get it working, feel free to send me a PR, and I will probably accept it.", + "createdAt": "2024-11-19T14:00:38Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/85#issuecomment-2485801843", + "viewerDidAuthor": true + } + ], + "createdAt": "2024-11-10T09:58:36Z", + "id": "I_kwDOCL0xJc6dxwXg", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 85, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "NOT_PLANNED", + "title": "Does not load multiple .bc files using * wildcard", + "updatedAt": "2024-11-19T14:00:40Z", + "url": "https://github.com/gavinhoward/bc/issues/85" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjgyNzIwNQ==", + "is_bot": false, + "login": "DanielRuf", + "name": "Daniel Ruf" + }, + "body": "I'm new to C and I try to create a PHP extension of bc with SWIG, but as direct replacement for `eval()` in PHP.\r\n\r\nWhat is the **correct function from the bc code to parse a string** and return the calculation result or some error / null when parsing fails?\r\n\r\nI tried looking at the code, but didn't find the right one.", + "closed": true, + "closedAt": "2025-02-16T13:40:55Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6LSQRq", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I'm not sure what you're asking. `bc` is a program, not a library, and even though I *do* have a library, it does not include expression parsing.\r\n\r\nAre you wanting a library that can parse `bc` expressions? Unfortunately, this `bc` cannot do that, and to do so would require refactoring that I don't have time for.", + "createdAt": "2024-09-08T20:42:08Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2336818282", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6LSRDF", + "author": { + "login": "DanielRuf" + }, + "authorAssociation": "NONE", + "body": "Understood, so I can not do some `bc_parse(some-string-from-stdin)` with that and I have to resort to some other solution then.\r\n\r\nWhere can I find the current logic of the CLI? Maybe I can do something with that.", + "createdAt": "2024-09-08T20:56:06Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2336821445", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6LSRiv", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You are correct.\r\n\r\nHowever, what is easiest depends on what you are trying to do. Do you need the full `bc` language? Or do you just need simple expressions? Or something else?\r\n\r\nIf you need the full language, the best solution would be to run `bc` as a child process and just feed it data.\r\n\r\nIf you need simple expression parsing, then you could implement the parsing with Lex and Yacc, and then use `bcl`, the `bc` library, to do the math.\r\n\r\nIf you need something else, we can see what might work best.", + "createdAt": "2024-09-08T21:03:51Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2336823471", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6LSSix", + "author": { + "login": "DanielRuf" + }, + "authorAssociation": "NONE", + "body": "> Or do you just need simple expressions? Or something else?\r\n\r\nJust basic calculations like `eval(1+2/3*4-5)`.\r\n\r\n> If you need the full language, the best solution would be to run bc as a child process and just feed it data.\r\n\r\nUnfortunately this brings much overhead, I already tested that with `exec(\"bc ...\")` in PHP.\r\n\r\n> If you need simple expression parsing, then you could implement the parsing with Lex and Yacc, and then use bcl, the bc library, to do the math.\r\n\r\nThis sounds more like what I am looking for, even though I wanted to avoid Yacc.", + "createdAt": "2024-09-08T21:19:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2336827569", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6LSSw-", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "While refactoring to bring the full `bc` parser into the library may be too much, I may be able to whip a small expression parser in a few hours.\r\n\r\nDo you just need the four basic arithmetic operators? Do you need parentheses? Do you need square root?\r\n\r\nLet me know what you need. I may need a week to get it to you.", + "createdAt": "2024-09-08T21:22:48Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2336828478", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6LSTkN", + "author": { + "login": "DanielRuf" + }, + "authorAssociation": "NONE", + "body": "I will check that and let you know in the next days. At least parentheses are also needed.\r\n\r\nIf there is at least one function (like sqrt or max) implemened, then I can check the implementation and contribute some of my time to implement more or at least I can help with that.", + "createdAt": "2024-09-08T21:35:19Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2336831757", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6LSUHv", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "`sqrt()` is already builtin; I'll add parsing for it. I can also add parsing for `max()` and `min()`.\r\n\r\nYou can see everything that's builtin [here](https://github.com/gavinhoward/bc/blob/master/manuals/bcl.3.md).", + "createdAt": "2024-09-08T21:44:30Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2336834031", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6LTBjd", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Ack! I'm sorry! I just had something come up in my personal life that will take a lot of time to resolve!\r\n\r\nSo despite hoping to help with the parsing, I can't even help with a simple thing anymore.\r\n\r\nHowever, I can point you in the right direction. Use the [Shunting-Yard Algorithm](https://en.wikipedia.org/wiki/Shunting-yard_algorithm) like [this](https://softwareengineering.stackexchange.com/questions/254074/how-exactly-is-an-abstract-syntax-tree-created/254075#254075) to make an abstract syntax tree, and then do a post-order traversal.\r\n\r\nIf you need examples of how to use `bcl`, then [its test code](https://github.com/gavinhoward/bc/blob/master/tests/bcl.c) is a good start.\r\n\r\nAgain, I'm really sorry about this, but I figured it would be better to tell you sooner rather than later.", + "createdAt": "2024-09-09T03:03:41Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2337020125", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6LTUUy", + "author": { + "login": "DanielRuf" + }, + "authorAssociation": "NONE", + "body": "No problem and thanks for letting me know. I will try to understand and solve it.", + "createdAt": "2024-09-09T04:37:26Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/83#issuecomment-2337097010", + "viewerDidAuthor": false + } + ], + "createdAt": "2024-09-08T20:22:38Z", + "id": "I_kwDOCL0xJc6Vwp4y", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 83, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "what function to call for parsing string expressions", + "updatedAt": "2025-02-16T13:40:55Z", + "url": "https://github.com/gavinhoward/bc/issues/83" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOBqIXaQ", + "is_bot": false, + "login": "GregTonoski", + "name": "Greg Tonoski" + }, + "body": "Would you like to add elliptic curve point multiplication (https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication) to math library, perhaps?", + "closed": true, + "closedAt": "2024-08-31T18:09:54Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6Kdiqk", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I have wanted to, but I haven't *despite* wanting to. And there is a good reason: someone is going to use my `bc` to implement cryptography with vulnerabilities.\r\n\r\nIf my `bc` ships the elliptic curve arithmetic to do that, I will feel responsible. If they write the arithmetic themselves, well, they are responsible.\r\n\r\nOf course, there are other reasons to want it, but because of cryptography, I hesitate to add it.\r\n\r\nSorry!", + "createdAt": "2024-08-31T18:09:54Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/82#issuecomment-2322999972", + "viewerDidAuthor": true + } + ], + "createdAt": "2024-08-31T07:57:25Z", + "id": "I_kwDOCL0xJc6U72YL", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 82, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Feature request: elliptic curve point multiplication", + "updatedAt": "2024-08-31T18:09:55Z", + "url": "https://github.com/gavinhoward/bc/issues/82" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOBqIXaQ", + "is_bot": false, + "login": "GregTonoski", + "name": "Greg Tonoski" + }, + "body": "", + "closed": true, + "closedAt": "2024-08-30T14:14:44Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6KXcRi", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you so much for the compliment! I hardly get them nowadays. You made my day!\r\n\r\nI presume \"EOM\" means \"End of Message\" which means there is no bug? So I'm going to close this now, but if you do have a bug, feel free to reopen.", + "createdAt": "2024-08-30T14:14:44Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/80#issuecomment-2321400930", + "viewerDidAuthor": true + } + ], + "createdAt": "2024-08-30T07:30:14Z", + "id": "I_kwDOCL0xJc6UzPqQ", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 80, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Excellent. Works fine. Thank you. [EOM]", + "updatedAt": "2024-08-30T14:14:44Z", + "url": "https://github.com/gavinhoward/bc/issues/80" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjU3MDY1NjU3", + "is_bot": false, + "login": "exikyut", + "name": "" + }, + "body": "Was just playing around and happened to get my stack out of sync:\r\n\r\n```\r\n1\r\n+\r\n\r\nRuntime error: stack has too few elements\r\n 0: (main)\r\n```\r\n\r\nBut I noticed this cleared the stack:\r\n\r\n
\r\nf\r\n(no output)\r\n
\r\n\r\nTrying to improve my edge-case-fu spidey sense :) I thought I'd check how other dc implementations behave.\r\n\r\nGNU `dc` immediately showed me something might be up:\r\n\r\n```\r\n1\r\n+\r\ndc: stack empty\r\nf\r\n1\r\nq\r\n$ _\r\n```\r\n\r\nHuh.\r\n\r\nOpenBSD `dc` produced byte-identical output to the above.\r\n\r\nOK... what should arbitrate as reference here? I guess some form of going back to the beginning.\r\n\r\nHow far can we go back?\r\n\r\nApparently the first version of `dc` was written in B while UNIX was being ported. Man that would be fun to play with. Perhaps there's a printout of it starting on page 9,576 of an OCR-averse PDF on bitsavers just waiting to be found :smile: \r\n\r\nhttp://takahirox.github.io/pdp11-js/unixv6.html and http://pdp11.aiju.de/ both emulate UNIX v6 in-browser, which is nice and accessible. The `dc` in both of these has the same size and timestamp; copying from the second emulator for fun, which emulates an uppercase teletype, we get:\r\n\r\n```\r\n# DC\r\n1\r\n+\r\n( +) ?\r\nF\r\n1\r\nQ\r\n# # \r\n```\r\n\r\nHrm. That's V6 UNIX. Can we go further back?\r\n\r\nYes and no, as far as I can manage.\r\n\r\nIt looks like a V1+V2 amalgamation was put together using surviving source code and tape dumps: https://www.in-ulm.de/~mascheck/various/ancient/\r\n\r\nThe project appears to have been quietly migrated to https://github.com/DoctorWkt/unix-jun72, with terrifying instructions to \"now run `make`\" underneath a wall of \"last modified: 16 years ago\" :melting_face:, but I discovered some pre-built SIMH images at https://code.google.com/archive/p/unix-jun72/downloads, which is where the project previously lived (and is what the page in the previous paragraph links to), which still work perfectly - you just run `pdp11 simh.cfg`.\r\n\r\nUnfortunately, while the system is already saying `:login:` before you can even blink and figure out whether it worked, and the distribution includes `dc`, its `f` command appears to be broken... even though I see references to support for an `f` command [on line 949 in dc1.s](https://github.com/DoctorWkt/unix-jun72/blob/1d438bd5874ec628157fbeab370c8e3f3a3ecb8b/src/cmd/dc1.s#L949) (the source is distributed across [dc2.s](https://github.com/DoctorWkt/unix-jun72/blob/1d438bd5874ec628157fbeab370c8e3f3a3ecb8b/src/cmd/dc2.s), [dc3.s](https://github.com/DoctorWkt/unix-jun72/blob/1d438bd5874ec628157fbeab370c8e3f3a3ecb8b/src/cmd/dc3.s), [dc4.s](https://github.com/DoctorWkt/unix-jun72/blob/1d438bd5874ec628157fbeab370c8e3f3a3ecb8b/src/cmd/dc4.s) and [dc5.s](https://github.com/DoctorWkt/unix-jun72/blob/1d438bd5874ec628157fbeab370c8e3f3a3ecb8b/src/cmd/dc5.s), presumably due to memory constraints). I'm not sure if I'm falling through a `default: exit(0);`, a segfault, or a case of mismatching binary/source.\r\n\r\nThe path forward there would be figuring out how to recompile the `dc` implementation; I think this might be possible but it's beyond the scope of the cursory level of interest I approached this with.\r\n\r\nIf anyone wants a rainy day project, I would be really interested to learn more about the result of others' digging around to get the earliest surviving copies of `dc` running.\r\n\r\nZooming back out to the topic, it would **seem** that current consensus is that errors *of this type* don't consume the stack; they leave it alone. But it would be nice to formally qualify this situation better. How should that be framed? Parser consumption expectations? Stack effects by errors in general?\r\n\r\nThis bugreport is somewhat of a thought experiment. I don't have any authoritative ideas or suggestions myself.", + "closed": true, + "closedAt": "2024-08-23T03:03:02Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6Bc1ec", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for digging up the history!\r\n\r\nYou are correct that my `dc` clears the stack. When I was implementing `bc` and `dc`, I wanted to minimize the possibility that an error could screw up code later.\r\n\r\nHence, my `bc` and `dc` both [\"reset\"][1] on error, which means they clear everything and try to start completely fresh.\r\n\r\nThat said, the documentation could be clearer on that; I could make it say that errors clear the stack too. (And they do clear the stack because they have to clear the stack in `bc` since the stack is implicit.)\r\n\r\nHowever, this could go both ways:\r\n\r\n* I could declare this as a mere *documentation bug*, since `dc` is *not* standardized. In that case, I would just update the manual.\r\n* Or I could declare this a *conformance bug*, because while there is no standard, all other `dc` implementations do the opposite. In this case, I would make the change and fix the bugs that pop up.\r\n\r\nQuite frankly, I'm not looking forward to doing a full release cycle, which includes 2 weeks of fuzzing (during which my machine is unusable) and 24 hours of tests, possibly repeated. This means I want to fix the docs and call it a day, but going off of what I *want* to do is not rational.\r\n\r\nI don't know if anyone watches this repo, but this is one case where I'd like to hear comments from users.\r\n\r\n[1]: https://github.com/gavinhoward/bc/blob/master/manuals/bc/A.1.md#reset", + "createdAt": "2024-06-16T19:15:40Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2171819932", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6BfXEg", + "author": { + "login": "exikyut" + }, + "authorAssociation": "NONE", + "body": "> You are correct that my `dc` clears the stack. When I was implementing `bc` and `dc`, I wanted to minimize the possibility that an error could screw up code later.\r\n> \r\n> Hence, my `bc` and `dc` both [\"reset\"](https://github.com/gavinhoward/bc/blob/master/manuals/bc/A.1.md#reset) on error, which means they clear everything and try to start completely fresh.\r\n\r\nHuh. That makes pedagogical sense, upon consideration.\r\n\r\n> That said, the documentation could be clearer on that; I could make it say that errors clear the stack too.\r\n\r\nThat would probably be a good idea, both because `gh-dc` deviates from the norm, and because there *is* no norm; this would be the first point at which this particular graph edge / state machine transition is properly documented. Until now it's lived as an edge case in UB land.\r\n\r\n> (And they do clear the stack because they have to clear the stack in `bc` since the stack is implicit.)\r\n\r\nHuh. I wonder how other `bc`->`dc` architectural approaches have handled this situation?\r\n\r\n> However, this could go both ways:\r\n> \r\n> * I could declare this as a mere _documentation bug_, since `dc` is _not_ standardized. In that case, I would just update the manual.\r\n> * Or I could declare this a _conformance bug_, because while there is no standard, all other `dc` implementations do the opposite. In this case, I would make the change and fix the bugs that pop up.\r\n> \r\n> Quite frankly, I'm not looking forward to doing a full release cycle, which includes 2 weeks of fuzzing (during which my machine is unusable) and 24 hours of tests, possibly repeated. This means I want to fix the docs and call it a day, but going off of what I _want_ to do is not rational.\r\n\r\nGood net question. Hmm.\r\n\r\n> I don't know if anyone watches this repo, but this is one case where I'd like to hear comments from users.\r\n\r\nI am too.\r\n\r\nBut I'll add my 2¢:\r\n\r\n- Nobody has screamed until now, but `gh-dc` adoption is still rising.\r\n\r\n- Taking on the complexity of making this a `./configure`able option doesn't sound reasonable in practice.\r\n\r\n- I can only imagine a `dc` script generating different results after being switched to this implementation after some sort of upgrade process that presumably has capable humans involved in it. It would follow that said humans would presumably classify the deviation in output as the result of logic bugs and then fix them, so keeping this architectural approach is theoretically a net positive.\r\n\r\n- Applying to make `dc` a POSIX standard would make for an interesting 180-season TV series that would be excellent mid-afternoon watching while having a nap (and dreaming of how to make `dc` count to infinity twice). I'd definitely seed all 4,961 episodes.\r\n\r\n- Given that `gh-dc` is now in FreeBSD, it may well meet the theoretical/implicational interpretation (and possibly beyond) of \"significant user base\" required to [apply for OSS-Fuzz](https://google.github.io/oss-fuzz/getting-started/accepting-new-projects/) which would subject it to continual analysis and, if accepted, probably provide a slow trickle of genuinely interesting feedback. It also sounds like it would unblock a significant burnout barrier to commoditizing the process of cutting new releases - opting to letting new versions sit in OSS-Fuzz for a fortnight before releasing them (a cool strategy, and if only everything was architecturally simple enough that this could be applied everywhere) would no longer have a local performance impact.\r\n", + "createdAt": "2024-06-17T07:21:08Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2172481824", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6BmRt8", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> Nobody has screamed until now, but `gh-dc` adoption is still rising.\r\n\r\nYes, I agree. In fact, I initially wanted to dismiss your report as \"only one user,\" but I did not for this reason.\r\n\r\n> Taking on the complexity of making this a `./configure`able option doesn't sound reasonable in practice.\r\n\r\nI do not want that to be a build-time option. I have too many as it is.\r\n\r\n> I can only imagine a `dc` script generating different results after being switched to this implementation after some sort of upgrade process that presumably has capable humans involved in it. It would follow that said humans would presumably classify the deviation in output as the result of logic bugs and then fix them, so keeping this architectural approach is theoretically a net positive.\r\n\r\nTrue, although people would be better served to switch to `bc` since it's standard and portable.\r\n\r\n> Applying to make `dc` a POSIX standard would make for an interesting 180-season TV series that would be excellent mid-afternoon watching while having a nap (and dreaming of how to make dc count to infinity twice). I'd definitely seed all 4,961 episodes.\r\n\r\nThe [rationale in the `bc` standard][1] says these two things:\r\n\r\n> `dc` was not selected to be part of this volume of POSIX.1-2017 because `bc` was thought to have a more intuitive programmatic interface.\r\n\r\n> The consensus of the standard developers was that `dc` is a fundamentally less usable language and that that would be far too severe a penalty for avoiding the issue of being similar to but incompatible with C.\r\n\r\nYes, that is from the 2017 standard, but that language goes back to the beginning, I believe. This means that standardizing `dc` will not happen, barring some rich fellow deciding that it's his life mission to make it happen.\r\n\r\n> Given that `gh-dc` is now in FreeBSD, it may well meet the theoretical/implicational interpretation (and possibly beyond) of \"significant user base\" required to [apply for OSS-Fuzz](https://google.github.io/oss-fuzz/getting-started/accepting-new-projects/) which would subject it to continual analysis and, if accepted, probably provide a slow trickle of genuinely interesting feedback. It also sounds like it would unblock a significant burnout barrier to commoditizing the process of cutting new releases - opting to letting new versions sit in OSS-Fuzz for a fortnight before releasing them (a cool strategy, and if only everything was architecturally simple enough that this could be applied everywhere) would no longer have a local performance impact.\r\n\r\nI agree with this, so [I have applied][2]. We'll see where that goes.\r\n\r\n[1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html#tag_20_09_18\r\n[2]: https://github.com/google/oss-fuzz/pull/12078", + "createdAt": "2024-06-17T19:45:51Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2174294908", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6BpTwG", + "author": { + "login": "exikyut" + }, + "authorAssociation": "NONE", + "body": "> > Nobody has screamed until now, but `gh-dc` adoption is still rising.\r\n> \r\n> Yes, I agree. In fact, I initially wanted to dismiss your report as \"only one user,\" but I did not for this reason.\r\n\r\n(Sentiment of appreciation)\r\n\r\n> > Taking on the complexity of making this a `./configure`able option doesn't sound reasonable in practice.\r\n> \r\n> I do not want that to be a build-time option. I have too many as it is.\r\n\r\nI was genuinely surprised at the number of configurable options :) completely agree there haha\r\n\r\n> > I can only imagine a `dc` script generating different results after being switched to this implementation after some sort of upgrade process that presumably has capable humans involved in it. It would follow that said humans would presumably classify the deviation in output as the result of logic bugs and then fix them, so keeping this architectural approach is theoretically a net positive.\r\n> \r\n> True, although people would be better served to switch to `bc` since it's standard and portable.\r\n> \r\n> > Applying to make `dc` a POSIX standard would make for an interesting 180-season TV series that would be excellent mid-afternoon watching while having a nap (and dreaming of how to make dc count to infinity twice). I'd definitely seed all 4,961 episodes.\r\n> \r\n> The [rationale in the `bc` standard](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html#tag_20_09_18) says these two things:\r\n> \r\n> > `dc` was not selected to be part of this volume of POSIX.1-2017 because `bc` was thought to have a more intuitive programmatic interface.\r\n\r\nThanks for the TIL! I should have expected there to be extant discussion on the matter...\r\n\r\n> > The consensus of the standard developers was that `dc` is a fundamentally less usable language and that that would be far too severe a penalty for avoiding the issue of being similar to but incompatible with C.\r\n> \r\n> Yes, that is from the 2017 standard, but that language goes back to the beginning, I believe. This means that standardizing `dc` will not happen, barring some rich fellow deciding that it's his life mission to make it happen.\r\n\r\nI see. Thanks very much for the insight.\r\n\r\n> \r\n> > Given that `gh-dc` is now in FreeBSD, it may well meet the theoretical/implicational interpretation (and possibly beyond) of \"significant user base\" required to [apply for OSS-Fuzz](https://google.github.io/oss-fuzz/getting-started/accepting-new-projects/) which would subject it to continual analysis and, if accepted, probably provide a slow trickle of genuinely interesting feedback. It also sounds like it would unblock a significant burnout barrier to commoditizing the process of cutting new releases - opting to letting new versions sit in OSS-Fuzz for a fortnight before releasing them (a cool strategy, and if only everything was architecturally simple enough that this could be applied everywhere) would no longer have a local performance impact.\r\n> \r\n> I agree with this, so [I have applied](https://github.com/google/oss-fuzz/pull/12078). We'll see where that goes.\r\n\r\n**YOU GOT ACCEPTED :D :face_holding_back_tears:**\r\n\r\nI forgot that it ships in macOS, and TIL it ships in Android as well. OSS-Fuzz's scope tries to extend beyond Google-immediate interests, so this broader status quo (incl. FreeBSD) constitutes a meaningful precedent of relevance – potentially represented by the speed with which the project was accepted without further question (basically 45 minutes).", + "createdAt": "2024-06-18T06:03:35Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2175089670", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6B3Zis", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> YOU GOT ACCEPTED :D 🥹\r\n\r\nYes, unfortunately, I [ran into problems integrating fuzzers][1], and I don't know what to do next, so I have to put OSS-Fuzz on the back plate. Thus, we're back to where we started.\r\n\r\nThank you for the suggestion, though.\r\n\r\n[1]: https://github.com/google/oss-fuzz/pull/12098", + "createdAt": "2024-06-19T13:54:56Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2178783404", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6C-bO7", + "author": { + "login": "spatula75" + }, + "authorAssociation": "NONE", + "body": "I also noticed this behavioral change, because on occasion I need to add a long list of numbers in `dc`, and rather than count how many numbers I have and issuing the right number of `+` operators, I have a habit of just entering way more `+` operators than I need and then grabbing the stack top value afterward. e.g.:\r\n```\r\n1 7 8 6 4 9 1 2 3 6 4 + + + + + + + + + + + + + + + + + + p\r\n```\r\nHistorically, and with other implementations of `dc`, this would result in a lot of `dc: stack empty` messages followed by the sum at the end. Now it results in a clear stack with no result.\r\n\r\nI can certainly see the merit of returning to a clean slate on an error condition when running in an \"automated\" fashion - blowing the stack in this case would generally mean you did something wrong and the results might not be trustworthy.\r\n\r\nI guess what frustrates me is that in interactive mode, this is a significant change from historical behavior that caught me off-guard and also blows up my use case, requiring me to now count how many numbers I have on the stack, and then to supply N-1 operators to get to the result I want. It's also making my stack more \"fragile\" in the sense that I now have to be very careful about my interactions with `dc`.\r\n\r\nI agree that changing behavior based on configuration-time options sounds like overkill and a lot of added complexity, especially when some users of a system might find the new behavior desirable.\r\n\r\nI see a few other possibilities:\r\n- A command line switch to either enable or disable stack clearing when running in `dc` mode, so a user can be explicit about whether they want the new behavior or the historical behavior. Whether the switch enables the old behavior, or enables the new behavior doesn't matter much to me; I'd just add a shell alias if I needed to always supply a switch.\r\n- A rule that when running in interactive mode (ie, from a keyboard not from a pipe or a file), you get the historical (non-clearing) behavior, but in non-interactive mode you always get the new (stack-clearing) behavior.\r\n- Some hybrid of the two: maybe in interactive mode you get the historical behavior _unless_ you supply a command-line switch\r\n\r\nOf course I realize that all of these options add complexity too, but hopefully not altogether too much. Any one of them would make me a happy camper.", + "createdAt": "2024-06-28T17:58:14Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2197402555", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6DCMZY", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I am not a fan of having different behavior in interative mode vs non-interactive mode.\r\n\r\nHowever, I think `dc` implementations tend to exit on any error in non-interactive mode anyway. At least GNU `dc` does, IIRC. This one definitely does, and this behavior is documented.\r\n\r\nSo this change would only affect interactive uses anyway.\r\n\r\nI will go ahead and make the change. I will start fuzzing as well. If few or no problems appear, I will make a release.", + "createdAt": "2024-06-30T00:55:05Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 2 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2198390360", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6JdDT8", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Okay, it took me a long time to have the time for fuzzing and testing, but this change made it into 7.0.0.\r\n\r\nI think I can close this report now, but if there are still problems, feel free to reopen.", + "createdAt": "2024-08-23T03:03:02Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/79#issuecomment-2306094332", + "viewerDidAuthor": true + } + ], + "createdAt": "2024-06-16T10:02:06Z", + "id": "I_kwDOCL0xJc6MaBsK", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 79, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Stack-consumption-on-error headscratch in comparison to other `dc`s", + "updatedAt": "2024-08-23T03:03:02Z", + "url": "https://github.com/gavinhoward/bc/issues/79" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjI2NjI1MTQx", + "is_bot": false, + "login": "freebrowser1", + "name": "" + }, + "body": "Excellent software !\r\n\r\nThis `bc` is MUCH faster than the bc supplied to Linux distros. I downloaded the source package, compiled under Ubuntu ARM and it worked. I did the same on Termux on an Android cellphone (which also has the slow 1.7 version) and it was blazingly fast as well !\r\nIt can be used for other bases up till sixteen. I changed it (locally, not on this Github site) to max base 36.\r\nMaybe that can be an option to publish it here.", + "closed": true, + "closedAt": "2024-05-15T15:52:29Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc59oi_N", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for your compliments!\r\n\r\nAs it turns out, it's the accompanying `dc` that only goes up to base 16. `bc` goes up to base 36.\r\n\r\nThere is a reason for base 36: according to the `bc` standard, it must be possible to set all input bases with a one character number. This is so any input base could be set no matter the *current* input base.\r\n\r\nFor example, say you write a function that should work in multiple bases. What if it temporarily has to set a new input base. How does it do that when the input base could be anything from binary to hexadecimal?\r\n\r\nThe answer is [here][1] (scroll down to where it says, \"When either ibase or obase is assigned a single digit value...\").\r\n\r\nNow my `bc` does take that up to base 35, which is the base you can reach by using `Z` as the single digit value.\r\n\r\nTo test this, try this code:\r\n\r\n```\r\n$ bc\r\n>>> obase=Z\r\n>>> 35\r\n01 00\r\n>>> quit\r\n```\r\n\r\nI hope this helps.\r\n\r\n[1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html#tag_20_09_13_03", + "createdAt": "2024-05-13T14:35:35Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/78#issuecomment-2107781069", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc59sMoG", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I realize I forgot to include an example with `ibase`.\r\n\r\n```\r\n$ bc\r\n>>> ibase=Z\r\n>>> 10\r\n35\r\n>>> ibase=6*6\r\n>>> 10\r\n36\r\n>>> quit\r\n```\r\n\r\nSo yes, my `bc` already goes up to base 36 for `ibase` too, although you do need some special way, like `6*6`, to get it.", + "createdAt": "2024-05-13T20:24:59Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/78#issuecomment-2108738054", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5978rz", + "author": { + "login": "freebrowser1" + }, + "authorAssociation": "NONE", + "body": "I have changed a few source files (find in the files in the accompanied zip lines with //!!).\r\nThis allows using max base 36 with all digits and all UPPERCASE letters. When I and O are not wanted, use `export NO_I_O_DIGITS=1` (or any value) before executing bc and 34 = @, 35 = #.\r\n\r\n[src.zip](https://github.com/gavinhoward/bc/files/15323750/src.zip)\r\n", + "createdAt": "2024-05-15T15:31:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/78#issuecomment-2112867059", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc598Hyk", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You did not read my comments. My `bc` already supports up to base 36.\r\n\r\nYour changes are not needed.\r\n\r\nClosing.", + "createdAt": "2024-05-15T15:52:29Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/78#issuecomment-2112912548", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5-Emcm", + "author": { + "login": "freebrowser1" + }, + "authorAssociation": "NONE", + "body": "I checked again, downloaded the source kit, compiled it (Ubuntu arm64) and ran this:\r\n' bin/bc -l <<< \"ibase=obase=24; 2^G;\"'\r\nThis results in `04 17 18 16`, i.e. decimal numbers as 'digits' which should only appear with base above 36.\r\nAfter applying my changes, it issues the correct value '4HIG'.\r\n", + "createdAt": "2024-05-16T12:35:20Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/78#issuecomment-2115135270", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5-E7EK", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "This cannot be changed.\r\n\r\nThere is a [standard for `bc`][1], and in that standard, it says,\r\n\r\n> For bases greater than 16, each digit shall be written as a separate multi-digit decimal number. Each digit except the most significant fractional digit shall be preceded by a single . For bases from 17 to 100, bc shall write two-digit decimal numbers; for bases from 101 to 1000, three-digit decimal strings, and so on.\r\n\r\nSo no, as much as I would like to change it, it cannot be changed.\r\n\r\n[1]: https://pubs.opengroup.org/onlinepubs/009696799/utilities/bc.html", + "createdAt": "2024-05-16T13:15:39Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/78#issuecomment-2115219722", + "viewerDidAuthor": true + } + ], + "createdAt": "2024-05-13T07:31:19Z", + "id": "I_kwDOCL0xJc6Infdz", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 78, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "NOT_PLANNED", + "title": "Not an issue, but a change proposal", + "updatedAt": "2024-05-16T13:15:40Z", + "url": "https://github.com/gavinhoward/bc/issues/78" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOB00gDQ", + "is_bot": false, + "login": "oliverkwebb", + "name": "Oliver Webb" + }, + "body": "First I'd like to thank you for the work and care in making bc.\r\n\r\nI replaced GNU bc with your bc on my system, and ran into a error trying to run bc with some external bc libraries that define functions such as `abs()`\r\n\r\nThis is because your bc already has a built in `abs()`, and unlike the functions in the -l math library, will not let you redefine it because it appear to not just be a function, but also a lexer tokens/keyword.\r\n\r\nIs this a problem that you've ran into or considered before? ", + "closed": true, + "closedAt": "2024-05-08T17:39:46Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc59O96s", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yup! And my `bc` already has a solution:\r\n\r\n```\r\n$ bc -r abs \r\n```\r\n\r\nSee [here][1], scroll to the `-r`/`--redefine` option.\r\n\r\nIn short, it allows you to \"redefine\" keywords as functions, variables, or arrays.\r\n\r\nOf course, if that doesn't fix your problem, then it is a bug.\r\n\r\n[1]: https://github.com/gavinhoward/bc/blob/master/manuals/bc/A.1.md#options", + "createdAt": "2024-05-08T17:34:29Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/77#issuecomment-2101075628", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc59O_7j", + "author": { + "login": "oliverkwebb" + }, + "authorAssociation": "NONE", + "body": "Putting `-r abs` in my function arguments will run the library.\r\n\r\nThank you for your help", + "createdAt": "2024-05-08T17:39:46Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/77#issuecomment-2101083875", + "viewerDidAuthor": false + } + ], + "createdAt": "2024-05-08T17:29:50Z", + "id": "I_kwDOCL0xJc6IQwkm", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 77, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Allowing redefinition of builtin function such as abs() for compatibility with bc scripts", + "updatedAt": "2024-05-08T17:39:46Z", + "url": "https://github.com/gavinhoward/bc/issues/77" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjc0MzM1NDcx", + "is_bot": false, + "login": "mogando668", + "name": "" + }, + "body": "Dear Mr. Howard,\r\n\r\nFor gigantic `obase`s, like those below the line, even though they're clearly beyond the hard-coded `obase `max of `2,147,483,647`,`bc` appears to calculate the expression to full precision before erroring out, thus undermining any early exit criteria that ensure built-in named variables are within designated limits. I haven't tested against `ibase` but I suspect something similar would plague it, i.e. the right hand side expression is being calculated to full precision before any attempts to check them against caps.\r\n\r\nThe full `zsh`-based testing code and output are attached below.\r\n\r\nYours Sincerely\r\nJason K\r\n\r\nps : I've noticed the same issue plagues both `gnu-bc` I've installed via Homebrew as well as the macOS built-in `bc`. \r\n\r\n```\r\n 2 ^ 8 ^ 1 := 2 ^ 8\r\n 2 ^ 8 ^ 2 := 2 ^ 64\r\n 2 ^ 8 ^ 3 := 2 ^ 512\r\n 2 ^ 8 ^ 4 := 2 ^ 4096\r\n 2 ^ 8 ^ 5 := 2 ^ 32768\r\n 2 ^ 8 ^ 6 := 2 ^ 262144\r\n 2 ^ 8 ^ 7 := 2 ^ 2097152\r\n----------------------------\r\n 2 ^ 8 ^ 8 := 2 ^ 16777216\r\n 2 ^ 8 ^ 9 := 2 ^ 134217728\r\n 2 ^ 8 ^ 10 := 2 ^ 1073741824\r\n```\r\n\r\n\r\n```\r\nbc 1.07.1\r\nCopyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.\r\n\r\nDarwin m1mx4CT 22.3.0 Darwin Kernel Version 22.3.0: Mon Jan 30 20:38:37 PST 2023; root:xnu-8792.81.3~2/RELEASE_ARM64_T6000 arm64\r\n\r\ngbc is /usr/local/bin/gbc\r\n\r\nBC_BASE_MAX = 2147483647\r\nBC_DIM_MAX = 16777215\r\nBC_SCALE_MAX = 2147483647\r\nBC_STRING_MAX = 2147483647\r\nMAX Exponent = 9223372036854775807\r\nNumber of vars = 32767\r\n\r\n```\r\n\r\n`for __ in $( jot 10 ); do ( time ( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --preserve-status --foreground 8 dash -c 'for __; do echo \"$__\" | gbc; done' _ ) ); echo \"\\f ----------\\n\\t finished 2^8^$__ with exit status $? ... \\n --------\"; done`\r\n\r\n```\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.00s user 0.01s system 86% cpu 0.008 total\r\n\r\n ----------\r\n\t finished 2^8^1 with exit status 0 ... \r\n --------\r\nRuntime warning (func=(main), adr=13): obase too large, set to 2147483647\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.00s user 0.01s system 58% cpu 0.012 total\r\n\r\n ----------\r\n\t finished 2^8^2 with exit status 0 ... \r\n --------\r\nRuntime warning (func=(main), adr=13): obase too large, set to 2147483647\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.00s user 0.00s system 82% cpu 0.007 total\r\n\r\n ----------\r\n\t finished 2^8^3 with exit status 0 ... \r\n --------\r\nRuntime warning (func=(main), adr=13): obase too large, set to 2147483647\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.00s user 0.00s system 84% cpu 0.008 total\r\n\r\n ----------\r\n\t finished 2^8^4 with exit status 0 ... \r\n --------\r\nRuntime warning (func=(main), adr=13): obase too large, set to 2147483647\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.01s user 0.00s system 90% cpu 0.012 total\r\n\r\n ----------\r\n\t finished 2^8^5 with exit status 0 ... \r\n --------\r\nRuntime warning (func=(main), adr=13): obase too large, set to 2147483647\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.14s user 0.01s system 98% cpu 0.143 total\r\n\r\n ----------\r\n\t finished 2^8^6 with exit status 0 ... \r\n --------\r\nRuntime warning (func=(main), adr=13): obase too large, set to 2147483647\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 3.64s user 0.01s system 99% cpu 3.654 total\r\n\r\n ----------\r\n\t finished 2^8^7 with exit status 0 ... \r\n --------\r\ntimeout: sending signal TERM to command ‘dash’\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.00s user 0.00s system 0% cpu 8.009 total\r\n\r\n ----------\r\n\t finished 2^8^8 with exit status 0 ... \r\n --------\r\ntimeout: sending signal TERM to command ‘dash’\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.00s user 0.00s system 0% cpu 8.008 total\r\n\r\n ----------\r\n\t finished 2^8^9 with exit status 0 ... \r\n --------\r\nRuntime warning (func=(main), adr=13): obase too large, set to 2147483647\r\ntimeout: sending signal TERM to command ‘dash’\r\n( printf 'obase=2^8^%d\\0' \"$__\" | xargs -0 -n 1 -P 24 timeout -v --foregroun) 0.00s user 0.01s system 0% cpu 8.011 total\r\n\r\n ----------\r\n\t finished 2^8^10 with exit status 0 ... \r\n --------\r\n```", + "closed": true, + "closedAt": "2024-01-27T20:24:51Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5yCwr9", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "In general, this problem is unsolvable. It's a consequence of the limits of computing. (The technical term is \"Turing-completeness.\")\r\n\r\nFor example, to us it's obvious that `2^8^10` is out of range. But computers do not understand any \"concept\" of math, so they can't tell.\r\n\r\nAll they can do is execute the code that they are given.\r\n\r\nYou'd see an different execution time if you did this:\r\n\r\n```\r\nobase = 104438888141315250669175271071662438257996424904738378038423348328395390\\\r\n797155745684882681193499755834089010671443926283798757343818579360726323\\\r\n608785136527794595697654370999834036159013438371831442807001185594622637\\\r\n631883939771274567233468434458661749680790870580370407128404874011860911\\\r\n446797778359802900668693897688178778594690563019026094059957945343282346\\\r\n930302669644305902501597239986771421554169383555988529148631823791443449\\\r\n673408781187263949647510018904134900841706167509366833385055103297208826\\\r\n955076998361636941193301521379682583718809183365675122131849284636812555\\\r\n022599830041234478486259567449219461702380650591324561082573183538008760\\\r\n862210283427019769820231316901767800667519548507992163641937028537512478\\\r\n401490715913545998279051339961155179427110683113409058427288427979155484\\\r\n978295432353451706522326906139490598769300212296339568778287894844061600\\\r\n741294567491982305057164237715481632138063104590291613692670834285644073\\\r\n044789997190178146576347322385026725305989979599609079946920177462481771\\\r\n844986745565925017832907047311943316555080756822184657174637329688491281\\\r\n952031745700244092661691087414838507841192980452298185733897764810312608\\\r\n590300130241346718972667321649151113160292078173803343609024380470834040\\\r\n3154190336\r\n```\r\n\r\ninstead of this:\r\n\r\n```\r\nobase = 2^8^4\r\n```\r\n\r\nAgain, the computer has no idea that `2^8^4` cannot work until it calculates it. We can see it by eye (\"`8^4` is definitely greater than 64, and `2^64` is the max\"), but the computer doesn't think that like. It sees:\r\n\r\n```\r\nconstant 2\r\nconstant 8\r\nconstant 4\r\nx = exponentiation 8 4\r\nexponentiation 2 x\r\n```\r\n\r\nI hope this makes sense.", + "createdAt": "2024-01-27T20:24:51Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/75#issuecomment-1913326333", + "viewerDidAuthor": true + } + ], + "createdAt": "2024-01-27T19:16:44Z", + "id": "I_kwDOCL0xJc59ZJcH", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 75, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "bc attempts to first calculate gigantic obase before erroring out", + "updatedAt": "2024-01-27T20:24:51Z", + "url": "https://github.com/gavinhoward/bc/issues/75" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOCGPbwA", + "is_bot": false, + "login": "shuang886", + "name": "Steven Huang" + }, + "body": "Hi, just want to make sure I'm not missing something glaringly obvious...\r\n\r\nI'm trying to build just the library on macOS, so:\r\n\r\n```\r\n% ./configure -a\r\nTesting for FreeBSD...\r\nNot on FreeBSD. Using _POSIX_C_SOURCE and _XOPEN_SOURCE.\r\n\r\nTesting for Mac OSX...\r\nOn Mac OSX. Using _DARWIN_C_SOURCE.\r\n\r\nTesting for OpenBSD...\r\nNot on OpenBSD.\r\n\r\nVersion: 6.7.2\r\nBuilding bc\r\nBuilding dc\r\n\r\nBC_ENABLE_LIBRARY=1\r\n\r\nBC_ENABLE_HISTORY=0\r\nBC_ENABLE_EXTRA_MATH=1\r\nBC_ENABLE_NLS=0\r\n\r\nBC_ENABLE_AFL=0\r\n\r\nBC_NUM_KARATSUBA_LEN=32\r\n\r\nCC=c99\r\nCFLAGS= -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0\r\nHOSTCC=c99\r\nHOSTCFLAGS=\r\nCPPFLAGS=-DNDEBUG -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700\r\nLDFLAGS=-s \r\nPREFIX=/usr/local\r\nBINDIR=/usr/local/bin\r\nINCLUDEDIR=/usr/local/include\r\nLIBDIR=/usr/local/lib\r\nDATAROOTDIR=/usr/local/share\r\nDATADIR=/usr/local/share\r\nMANDIR=/usr/local/share/man\r\nMAN1DIR=/usr/local/share/man/man1\r\nMAN3DIR=/usr/local/share/man/man3\r\nNLSPATH=\r\nPC_PATH=/opt/homebrew/lib/pkgconfig\r\nEXECSUFFIX=\r\nEXECPREFIX=\r\nDESTDIR=\r\nLONG_BIT=\r\nGEN_HOST=1\r\nGEN_EMU=\r\n\r\nSetting Defaults\r\n================\r\nbc.banner=0\r\nbc.sigint_reset=1\r\ndc.sigint_reset=1\r\nbc.tty_mode=1\r\ndc.tty_mode=0\r\nbc.prompt=1\r\ndc.prompt=0\r\nbc.expr_exit=1\r\ndc.expr_exit=1\r\nbc.digit_clamp=0\r\ndc.digit_clamp=0\r\n```\r\n\r\nseems to be happy, but it doesn't actually build:\r\n\r\n```\r\n% make\r\nmkdir -p bin\r\nc99 -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=HN -DEXECPREFIX= -DMAINEXEC=bc -D_DARWIN_C_SOURCE -DBC_NUM_KARATSUBA_LEN=32 -DBC_ENABLE_NLS=0 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=0 -DBC_ENABLE_LIBRARY=1 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DNDEBUG -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -o src/args.o -c ./src//args.c\r\n./src//args.c:62:6: error: use of undeclared identifier 'vm'\r\n if (vm->exprs.v == NULL)\r\n ^\r\n./src//args.c:64:16: error: use of undeclared identifier 'vm'\r\n bc_vec_init(&vm->exprs, sizeof(uchar), BC_DTOR_NONE);\r\n ^\r\n...lots more...\r\n```\r\n\r\n`vm` appears to be defined in `src/vm.c` but inside a `#if !BC_ENABLE_LIBRARY`, while a lot of code in `src/args.c` are not correspondingly enclosed. I tried to sprinkle in some `#if !BC_ENABLE_LIBRARY` directives but that just exposed more code that needed to be `#ifdef`ed out.\r\n\r\nBuilding the executables (i.e., just plain `./configure`) compiles and runs fine.\r\n\r\nWould you mind clarifying if there's more needed than `./configure -a`? I couldn't find anything that helps in the build manual, and I get the sense that `args.c` should not have been in the `Makefile` at all...\r\n\r\nThanks!", + "closed": true, + "closedAt": "2023-11-27T21:30:42Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5s_tei", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You're not missing something glaringly obvious. That is a bug because it should build with no errors.\r\n\r\nI think I fixed it in 7807eead159b80b51b8c81680608f8187284971e; can you pull and test for me?\r\n\r\nIf that *is* the fix, then the problem was an extra slash in a path; apparently Mac OSX does not clean paths when doing a string comparison. Oops.", + "createdAt": "2023-11-27T21:24:37Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/71#issuecomment-1828640674", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5s_vWb", + "author": { + "login": "shuang886" + }, + "authorAssociation": "NONE", + "body": "Works now, thanks!", + "createdAt": "2023-11-27T21:30:42Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/71#issuecomment-1828648347", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5s_vvD", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You're welcome. I'll put out a new release with the fix.", + "createdAt": "2023-11-27T21:31:57Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/71#issuecomment-1828649923", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5s_y9T", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Ah! I made a mistake! Could you pull 7eaa40ab8cac29893155471076c621c2f9929d33 and see if that works?", + "createdAt": "2023-11-27T21:41:25Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/71#issuecomment-1828663123", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5s_zsO", + "author": { + "login": "shuang886" + }, + "authorAssociation": "NONE", + "body": "Yup, still works.", + "createdAt": "2023-11-27T21:43:29Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/71#issuecomment-1828666126", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5s_0Ig", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you, and I'm sorry.", + "createdAt": "2023-11-27T21:44:49Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "HEART", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/71#issuecomment-1828667936", + "viewerDidAuthor": true + } + ], + "createdAt": "2023-11-27T17:48:32Z", + "id": "I_kwDOCL0xJc53-Mb1", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 71, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Build errors after ./configure -a", + "updatedAt": "2023-11-27T21:44:50Z", + "url": "https://github.com/gavinhoward/bc/issues/71" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOBZsPsA", + "is_bot": false, + "login": "STSMHQ", + "name": "STSM" + }, + "body": "Hi, @gavinhoward,\r\n\r\nI read the [documentation file](https://git.gavinhoward.com/gavin/bc/src/branch/master/manuals/bc/A.1.md) and it seems that arrays can only old a single value per each index (a number or a string). Is there any workaround to be able to store more than one single value in an array?\r\n\r\n```shell\r\n# This works\r\nbc_example[0] = 1;\r\n\r\n# This doesn't\r\nbc_example[1] = [1, 2, 3];\r\nbc_example[2] = [1, \"Random\", 3, \"Another\"];\r\n\r\nprint bc_example[2][1] # Random\r\n```\r\n\r\nAs I already stated before in another issue, I'm using your amazing tool to keep track of my expenses and it would be amazing to be able to create a \"matrix\" or an \"array of arrays\" as people often call it. Although I know that my use case isn't the general one and that the type of feature that I'm requesting doesn't make much sense considering the main goal/purpose of this tool, I'm opening this issue to know if what I want is somehow possible using any syntax workaround not documented in the above file.", + "closed": true, + "closedAt": "2023-11-13T16:02:39Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5ruIip", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Unfortunately, there is not any workaround, and that is on purpose. The `bc` language is just too restricted to go any further without *serious* work.\r\n\r\nIt is *possible*, yes. However, I believe that would be a mistake.\r\n\r\nI once said this:\r\n\r\n> Good software design includes putting whatever complexity must exist where it *best fits*.\r\n>\r\n> -- [\"Justifying a Backwards Design Decision for Yao][1]\r\n\r\nSo one of the skills of a good programmer is knowing *where* complexity should go.\r\n\r\nIf you need multiple values in one array slot, it sounds like you need structs, objects, or some other compound data thing. That sort of complexity should live in a \"proper\" programming language.\r\n\r\nSo I suggest that you use a \"proper\" programming language with arbitrary-precision numbers, like Python.\r\n\r\nThat said, I don't want to just hang you out to dry with no solution!\r\n\r\nYou're using my `bc` because it was the best for the job until now, right? Can you tell me why that is?\r\n\r\nYou've mentioned that you use it for finances; unlike most other math, finances basically require base 10 math, so is that why my `bc` was best?\r\n\r\nIf so, I might have a solution for you.\r\n\r\nDo you know Python?\r\n\r\nIf so, I could learn how to create a C extension for Python, and then I could use my [`bc`'s library form][2] to create a Python extension to use my `bc`'s library. That way, you could use Python, but still have the decimal-based math you need for finances, and I wouldn't have to do a ton of work to add multi-values to `bc` while also adding my `bc` to Python.\r\n\r\nAs an extra bonus, if you use Python, you could then have your files be output to JSON or another well-known format. And hey, I may even be able to help you convert your scripts to Python if you send them to me. (Do it through email, not this bug report!)\r\n\r\nWill that work for you?\r\n\r\n[1]: https://gavinhoward.com/2023/02/justifying-a-backwards-design-decision-for-yao/#designing-for-lsp\r\n[2]: https://github.com/gavinhoward/bc/blob/master/manuals/bcl.3.md", + "createdAt": "2023-11-12T22:06:36Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/70#issuecomment-1807255721", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5rytlH", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "Hi, @gavinhoward,\r\n\r\nI'm using your `bc` tool for over a year to keep track of my expenses and everything related to my personal finances. The main reason behind this decision is what you just said, generally speaking, finances use base 10 math and `bc-gh` allows me to have arbitrary-precision numbers on it. The second big reason is **you**. The passion you put into your projects is truly amazing. I know that as long as you're alive and well, you'll keep this project running and that's a important thing for me. Also, your support as shown here in this issue is very, very good. To end, I'm a follower of your [blog](https://gavinhoward.com/) since the beginning of 2022.\r\n\r\nI don't know Python. I could learn it but I don't like much its' syntax and the biggest part of its' design choices. I'll probably take this chance to improve my NuShell knowledge and try to integrate `bc-gh` into it. With NuShell, I know that I can work with well-known formats like JSON/YAML/TOML in order to be able to implement my desired workflow. Thank you for everything and keep up the excellent work.\r\n\r\n", + "createdAt": "2023-11-13T16:02:39Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/70#issuecomment-1808456007", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5ry87l", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You flatter me! :) But more seriously, thank you for the compliments; I struggle to see worth in my code, and that helps a lot.\r\n\r\nI'm sorry I couldn't help more. But feel free to ask any questions to help with your port to NuShell. I'm happy to help with that since I was not much help here!", + "createdAt": "2023-11-13T16:35:41Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/70#issuecomment-1808518885", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5r93lR", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "> You flatter me! :) But more seriously, thank you for the compliments; I struggle to see worth in my code, and that helps a lot.\r\n\r\nYour code and your blog posts truly make a difference to my life 💙\r\n\r\n> I'm sorry I couldn't help more. But feel free to ask any questions to help with your port to NuShell. I'm happy to help with that since I was not much help here!\r\n\r\nYou don't have to be sorry. I read the documentation of NuShell and I think I'm able to implement my current workflow with `bc-gh` on it pretty easily. Thank you for all your spent time and help offered. Have a nice rest of week!", + "createdAt": "2023-11-14T21:51:18Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/70#issuecomment-1811380561", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5sEd4h", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You're welcome.\r\n\r\nHey, when you finish your NuShell implementation, I would love it if you could email it to me; I'm almost done with my new language, and I'd love to use it as a test application.", + "createdAt": "2023-11-15T19:12:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/70#issuecomment-1813110305", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5sIRpw", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "I'm still studying it. As NuShell didn't reach yet the first ever stable level, I don't know if I should implement all of my workflow directly using it. Currently, I'm just exploring the data processing pipeline features that they have against a workflow using `sed`/`awk` and your `bc-gh`, for instance. All I'm doing is pretty much pick a JSON file, iterate over it, apply some editions/additions using your `bc-gh` and then save it again to a JSON file. Hope you like NuShell as much as I do and one day in the future, it can have the same popularity as `zsh`.\r\n\r\nIf in the future I implement something that I'm proud of, I'll happily share it with you, Gavin.", + "createdAt": "2023-11-16T09:48:33Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/70#issuecomment-1814108784", + "viewerDidAuthor": false + } + ], + "createdAt": "2023-11-12T18:51:58Z", + "id": "I_kwDOCL0xJc52lbxv", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 70, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Array - Multiple values ", + "updatedAt": "2023-11-16T09:48:33Z", + "url": "https://github.com/gavinhoward/bc/issues/70" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ4MjY5Mzk5", + "is_bot": false, + "login": "TediusTimmy", + "name": "Thomas" + }, + "body": "Greetings,\r\n\r\nI am going to start with some pleasantries and BS and work from there.\r\n\r\nHello. I also like bc. I have some bc-related repos: https://github.com/TediusTimmy/GNU_bc_with_GMP and https://github.com/TediusTimmy/OpenBSD_bc_with_GMP . The first one is an example of how fast bc can be, if we just use GMP. I also fixed as many of the crashes as I was aware of (admittedly, by fixing the back-end to be more robust rather than fixing the garbage generated by the front-end; if you find a crash, please let me know). In the second repo, I have a comparison of the speed of several implementations of bc (based on my own benchmark), including yours. I found it to be roughly comparable to, but still slightly slower than, OpenBSD's bc (except on one specific task, where it even beat GMP). I also wrote a spreadsheet program to use bc-like numbers: https://github.com/TediusTimmy/BC-DeciCalc (which I _really_ need to work on the documentation for).\r\n\r\nAs for those bug-fixes in GNU bc: I really haven't been able to get ahold of Phil, or Ken. Thankfully, there were some really helpful people at Debian, and maybe one day, either https://salsa.debian.org/debian/bc/-/merge_requests/4 will be merged in, or they will just use a better bc implementation, like yours.\r\n\r\nFinally, are you aware of this: https://www.php.net/manual/en/book.bc.php ? They have forked the GNU bc code for number.c and include it in their builds. Maybe they could use the library version of your code? (My only concern would be https://bugs.php.net/bug.php?id=66364 )\r\n\r\n\r\nOn to the issue: I'm not a big fan of your `p(x,y)` function. Let me explain by way of a contrived example: `p(1024,32.1)`. Now `1024` is `2^10`, so this SHOULD give us `2^10^32.1` which is `2^(10*32.1)` or `2^321`. And that's an integer, so it should be exact. But, when we do this we find that only the first 18 digits are correct with the default scale of 20. As you manipulate the scale variable, you find a correlation between the scale variable and the number of correct digits. So, in order to compute this result to 20 digits of scale, you would need to compute the log and exponential to around 117 digits of scale. I don't think that I'm out of line to expect that when you increase the scale of a computation that maybe the last three digits change and you then get extra new good digits. With this implementation of `p(x,y)`, a good chunk of the number changes.\r\n\r\nAs I was thinking about this, four cases came up:\r\n1) If we are raising a number greater than one to a positive power, then we want to bump the scale by the length of the integer part.\r\n2) If we are raising a number greater than one to a negative power, then we can probably use `e(y*l(x))` as that result goes to zero.\r\n3) Conversely, if we are raising a number less than one to a positive power, then we can probably use `e(y*l(x))` as the result goes to zero.\r\n4) Finally, if if we are raising a number less than one to a negative power, then we need to be extra careful. We need to use the reciprocal to find the integer part, but want the reciprocal to the increased scale to have an accurate result (in my testing, it removed a problem in the unit in the last place).\r\n\r\nSo, my final function to improve `p(x,y)`, then commentary:\r\n```\r\ndefine pow(x,y){\r\n\tauto a,i,s,z\r\n\tif(0==y)return 1@scale\r\n\tif(0==x){\r\n\t\tif(y>0)return 0\r\n\t\treturn 1/0\r\n\t}\r\n\ta=y$\r\n\tif(y==a)return(x^a)@scale\r\n\tz=0\r\n\tif(x<1){\r\n\t\ty=-y\r\n\t\ta=-a\r\n\t\tz=x\r\n\t\tx=1/x\r\n\t}\r\n\tif(y<0){\r\n\t\treturn e(y*l(x))\r\n\t}\r\n\ti=x^a\r\n\ts=scale\r\n\tscale+=length(i)\r\n\tif(z){\r\n\t\tx=1/z\r\n\t\ti=x^a\r\n\t}\r\n\ti*=e((y-a)*l(x))\r\n\tscale=s\r\n\treturn i@scale\r\n}\r\n```\r\nI started with your `p(x,y)` function and then added code. We begin with some special case handling for zeros, because people will complain (I didn't realize that bc already defines `0^0==1`). Next is the detection for the easy case of an integer exponent that you already had. We then handle if x is between zero and one: we save x and proceed with the reciprocal, while negating the exponent. Remember that `l(x)==-l(1/x)`. I specifically ignore if x is negative, because we will eventually call `l(x)`, which will return an erroneous value if x is negative. If the exponent is now negative, we fall back on `e(y*l(x))`: that number is going to zero anyway. Next, we compute the integral portion of the exponent and use it to get the working scale for the fractional part of the exponent. After that, if we took the reciprocal of x, recompute the reciprocal and the integral part of the exponent at this higher scale to ensure that both are accurate. Penultimately, compute the fractional part of the exponent and multiply it by the integral part to get the complete exponent. Finally, return a result at the desired scale.\r\n", + "closed": true, + "closedAt": "2023-08-19T06:38:17Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5kV35W", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Hello.\r\n\r\n> As for those bug-fixes in GNU bc: I really haven't been able to get ahold of Phil, or Ken. Thankfully, there were some really helpful people at Debian, and maybe one day, either https://salsa.debian.org/debian/bc/-/merge_requests/4 will be merged in, or they will just use a better bc implementation, like yours.\r\n\r\nMaybe I'm selfish here, but I think they should just use mine. I tested my `bc` against all of the items at and , and not only does my `bc` not crash, ASan, UBSan, and Valgrind report no errors, not even memory leaks. (Yay for fuzzing!) If you know how I might submit a request for them to do so, please let me know. I'll even build the Debian package myself!\r\n\r\n> Finally, are you aware of this: https://www.php.net/manual/en/book.bc.php ? They have forked the GNU bc code for number.c and include it in their builds. Maybe they could use the library version of your code? \r\n\r\nI *am* aware, actually. This was in the back of my mind when I accepted a request from my FreeBSD contact to implement the `bcl` library. But I don't know how to contact them and convince them to use my library.\r\n\r\n> (My only concern would be https://bugs.php.net/bug.php?id=66364 )\r\n\r\nUnfortunately, the PHP authors are wrong; that behavior is well-documented in the [POSIX standard for `bc`][1], which says about multiplication:\r\n\r\n> The result shall be the product of the two expressions. If a and b are the scales of the two expressions, then the scale of the result shall be:\r\n>\r\n> `min(a+b,max(scale,a,b))`\r\n\r\nSo their fix for that bug report is wrong, in my opinion. Thus, I don't think they'll adopt my library because I won't patch my library for their \"bug.\"\r\n\r\n> On to the issue: I'm not a big fan of your `p(x,y)` function...\r\n\r\nYour criticisms are absolutely fair. Fair enough that I took your code (with style fixes), documented it, and pushed it as the `better_pow` branch in this repo.\r\n\r\nCan you take a look to check if the code is correct, that it works for you, and that the documentation I added in `manuals/algorithms.md` is correct? I documented it in my own words, to make sure I understood the code.\r\n\r\nFinally, last item: do you think that you'll open more issues on `bc` in the future? If so, I'll add an account for you on my website; I just need an email address.\r\n\r\n[1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html#tag_20_09_13_03", + "createdAt": "2023-08-18T07:09:12Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1683455574", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5kV5_7", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Forgot to say this:\r\n\r\n> In the second repo, I have a comparison of the speed of several implementations of bc (based on my own benchmark), including yours. I found it to be roughly comparable to, but still slightly slower than, OpenBSD's bc (except on one specific task, where it even beat GMP).\r\n\r\nThose benchmarks make sense to me, except plain OpenBSD `bc` being faster than mine; it uses plain `char` for digits, so mine should be faster. My guess is that it is parsing without many error checks.\r\n\r\nAlso, I store constants as strings, like GNU. This is because someone could change the `ibase` at any time, and if they do, that constant needs to be interpreted according to the new `ibase`. But I know for a fact that the OpenBSD `bc` has a different behavior: it will interpret the number according to the digits, no matter if the digits are invalid for the `ibase`. This allows it to precalculate, where GNU and I cannot.", + "createdAt": "2023-08-18T07:17:28Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1683464187", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5kbO1o", + "author": { + "login": "TediusTimmy" + }, + "authorAssociation": "NONE", + "body": "Many apologies. I posted that improvement and went straight to bed last night, and then life got in the way of me responding. And I am going to go straight to bed tonight, also.\r\n\r\n> If you know how I might submit a request for them to do so, please let me know.\r\n\r\nHonestly, when it comes to Debian, Philip Hands was a godsend (but, he isn't the maintainer). I tried emailing Phil Nelson and Ken Pizzini and Ryan Kavanagh, but those probably went into spam filters. Eventually, I emailed the debian-devel mailing list and someone who helps first-time contributors (Hands) picked it up and ran with it. Like any large open-source project, it has an inscrutable political organization to outsiders like us. I was lucky that they even have a merge request for the changes (which has been open for over a year).\r\n\r\nThe real problem is that GNU bc is \"good enough\". It has vulnerabilities that no one is known to have exploited (if they even are exploitable). People complain, but not loud enough to get things done. It works for its purpose, and doesn't seem to have a large user base.\r\n\r\n> But I don't know how to contact them and convince them to use my library.\r\n\r\nAgain: inscrutable political organization. I don't actually program with PHP, I also am just aware of this extension. Looking at this bug report ( https://github.com/php/php-src/issues/10967 ), maybe the internal mailing list or the RFC process is what you want. \r\n\r\n> the PHP authors are wrong\r\n\r\nYeah. Thought, looking at it again, they could have fixed the issue here ( https://github.com/php/php-src/blob/master/ext/bcmath/bcmath.c#L258 ) instead of where they did. You could convince them that this is the better place for a bodge between their code and the bc library (as the behavior is standards-driven). Though, even Debian has a bug for this: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=610988\r\n\r\n> with style fixes\r\n\r\nWhat did you change? Oh, that. I get that from a former workplace.\r\n\r\n> it uses plain char for digits\r\n\r\nIt uses the OpenSSL BIGNUM library, which is binary words ( https://github.com/openbsd/src/blob/master/usr.bin/dc/bcode.h#L24 and https://github.com/openbsd/src/blob/master/lib/libcrypto/bn/bn_local.h#L121 ). For every 64 bits of a number, they are operating on all 64 bits, and you are operating on a little over 63 bits of it and have a normalization step. The trade-off rears its ugly head when numbers get converted to/from decimal.\r\n\r\n> do you think that you'll open more issues on bc in the future\r\n\r\nI don't have any plans. This was a spur-of-the-moment thing. I had \"finished\" a pow function for the spreadsheet, and decided to rewrite it in bc. (And then, I spent a bunch of time rewriting it again, as I realized that I had missed some corner cases). I don't plan to make a habit of this.\r\n\r\nAs for reviewing things:\r\n\r\n> being non-zero is a flag for later and a value to be used\r\n\r\nI did that, didn't I? Bad me.\r\n\r\nI don't know if the algorithm needs this much detail. It is probably good to give the impression that someone put thought and care into making sure the results were accurate. Though, really it was just some rando who kept doing really large exponents and wanted some numerical stability as he cranked up the precision while looking at numbers like https://www.youtube.com/watch?v=BdHFLfv-ThQ.", + "createdAt": "2023-08-19T06:38:17Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1684860264", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5kbPwt", + "author": { + "login": "TediusTimmy" + }, + "authorAssociation": "NONE", + "body": "And I forgot to say something: I understand that the frustrating thing about the bcmath extension to PHP is that you have something that is _just better_. And you have no idea how to make things better.", + "createdAt": "2023-08-19T06:46:55Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1684864045", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5kcbqC", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> Eventually, I emailed the debian-devel mailing list and someone who helps first-time contributors (Hands) picked it up and ran with it. Like any large open-source project, it has an inscrutable political organization to outsiders like us.\r\n\r\nYeah, that sounds exhausting. Not worth it to me at the moment.\r\n\r\n> The real problem is that GNU bc is \"good enough\". It has vulnerabilities that no one is known to have exploited (if they even are exploitable). People complain, but not loud enough to get things done. It works for its purpose, and doesn't seem to have a large user base.\r\n\r\nThis is true.\r\n\r\n> Yeah. Thought, looking at it again, they could have fixed the issue here ( https://github.com/php/php-src/blob/master/ext/bcmath/bcmath.c#L258 ) instead of where they did. You could convince them that this is the better place for a bodge between their code and the bc library (as the behavior is standards-driven).\r\n\r\nEh, probably not worth it.\r\n\r\n> Though, even Debian has a bug for this: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=610988\r\n\r\nYikes. People don't read, do they? Okay, I *really* don't care about getting into Debian.\r\n\r\n> It uses the OpenSSL BIGNUM library, which is binary words\r\n\r\nOh, that was not what I understood. Oops. Those benchmarks make sense then.\r\n\r\n> I don't have any plans. This was a spur-of-the-moment thing.\r\n\r\nOkay.\r\n\r\n> As for reviewing things...I did that, didn't I? Bad me.\r\n\r\nWell, that `bc` code goes straight into the binary as a string. Using `z` as a flag and a value is useful to reduce the number of bytes used. I kept it for a reason.\r\n\r\n> I don't know if the algorithm needs this much detail. It is probably good to give the impression that someone put thought and care into making sure the results were accurate.\r\n\r\n*I* need that much detail. I *have* to understand every bit of code in this repo.\r\n\r\nTake, for example, the comment [here][1]. That was me explaining, *to myself*, an algorithm that someone else coded up. If there was a bug in that algorithm when I got it (and there was), there was no way for me to debug it unless I knew what it was supposed to be doing.\r\n\r\nIf there is a bug in your code, I need to understand your code to debug it.\r\n\r\nThat's why there is a wealth of information for developers; it's for *me*.\r\n\r\nSo I'm glad to know that the explanation is correct, but I'll keep all of it. :)\r\n\r\nI may wait a while to release a new version (I have a new PR about adding CMake support), but I will release a new version with your code within a reasonable time.\r\n\r\nThank you.\r\n\r\n[1]: https://github.com/gavinhoward/bc/blob/75cf2e3358b5a76780db0d448c02cf6f61065921/src/num.c#L3077-L3113", + "createdAt": "2023-08-20T04:43:10Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1685174914", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5nZ8wq", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "There is now a version (`6.6.1`) with your `p()` implementation. Thank you very much!", + "createdAt": "2023-09-26T05:30:27Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1734855722", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5nnXnb", + "author": { + "login": "TediusTimmy" + }, + "authorAssociation": "NONE", + "body": "You are welcome. I hope it is as useful for your other users as it is to me and not a maintenance burden on you.", + "createdAt": "2023-09-28T03:11:48Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1738373595", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5nnXzO", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "None at all now that I understand it, thanks to you!", + "createdAt": "2023-09-28T03:13:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/69#issuecomment-1738374350", + "viewerDidAuthor": true + } + ], + "createdAt": "2023-08-18T05:29:27Z", + "id": "I_kwDOCL0xJc5uoYUw", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 69, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Incoherent rambling followed by a suggestion for an improvement.", + "updatedAt": "2023-09-28T03:13:15Z", + "url": "https://github.com/gavinhoward/bc/issues/69" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjI5MDIyNQ==", + "is_bot": false, + "login": "mhorowitz", + "name": "" + }, + "body": "platform: MacOS Ventura 13.2.1 (m1 max)\r\ncompiler: c99 from Xcode 14.2.0\r\nversion: https://git.gavinhoward.com/gavin/bc.git 55a6c05b280fbfb6873e42a5825403c17417029a\r\n\r\nBuild fails:\r\n```\r\n$ ./configure -O3\r\n\r\n$ make\r\nc99 -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=32 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DNDEBUG -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -o src/program.o -c ./src//program.c\r\n./src//program.c:2994:6: error: use of undeclared identifier 'SIGWINCH'\r\n if (BC_SIG_INTERRUPT(vm))\r\n ^\r\n./include/status.h:698:45: note: expanded from macro 'BC_SIG_INTERRUPT'\r\n BC_UNLIKELY((vm)->sig != 0 && (vm)->sig != SIGWINCH)\r\n ^\r\n./src//program.c:3724:6: error: use of undeclared identifier 'SIGWINCH'\r\n if (BC_SIG_INTERRUPT(vm))\r\n ^\r\n./include/status.h:698:45: note: expanded from macro 'BC_SIG_INTERRUPT'\r\n BC_UNLIKELY((vm)->sig != 0 && (vm)->sig != SIGWINCH)\r\n ^\r\n2 errors generated.\r\nmake: *** [src/program.o] Error 1\r\n```\r\nI think ideally, configure.sh would detect this, and apply an appropriate set of flags, or the source would be changed appropriately.\r\n\r\nAs a workaround, this allows a successful build:\r\n```\r\nCFLAGS=-D_DARWIN_C_SOURCE ./configure -O3\r\n```", + "closed": true, + "closedAt": "2023-03-31T17:44:43Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5Y4XHV", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Stupid GitHub, closing the issue just because I mention the number in a commit...\r\n\r\nAnyway, yes, this is a bug, and yes, `configure.sh` should detect this.\r\n\r\nI've added 29b4b6a4f27b07c4a176258aaf831a5208d4e116 in an attempt to fix this. Unfortunately, I don't have a Mac, so you'll need to test this for me. Would you please do that? Thank you.", + "createdAt": "2023-03-31T01:36:32Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/67#issuecomment-1491169749", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5Y8585", + "author": { + "login": "mhorowitz" + }, + "authorAssociation": "NONE", + "body": "> I've added https://github.com/gavinhoward/bc/commit/29b4b6a4f27b07c4a176258aaf831a5208d4e116 in an attempt to fix this. Unfortunately, I don't have a Mac, so you'll need to test this for me. Would you please do that? Thank you.\r\n\r\nI tested it. ./configure.sh output includes\r\n\r\n On Mac OSX. Using _DARWIN_C_SOURCE.\r\n\r\nAnd make completes without error. Thanks for the quick fix!", + "createdAt": "2023-03-31T17:44:43Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/67#issuecomment-1492361017", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5Y867a", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for testing! And thank you for the report. I rely on users like you to help me with Mac OSX!", + "createdAt": "2023-03-31T17:46:45Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "ROCKET", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/67#issuecomment-1492365018", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5c_2t2", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Release `6.6.0` is out with the fix. Thank you!", + "createdAt": "2023-05-23T23:11:04Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/67#issuecomment-1560243062", + "viewerDidAuthor": true + } + ], + "createdAt": "2023-03-30T22:25:15Z", + "id": "I_kwDOCL0xJc5iQKue", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 67, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Build fails on macOS", + "updatedAt": "2023-05-23T23:11:20Z", + "url": "https://github.com/gavinhoward/bc/issues/67" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOBZsPsA", + "is_bot": false, + "login": "STSMHQ", + "name": "STSM" + }, + "body": "Hi, there,\r\n\r\nI love your command line tool and your blog (I read all your posts). You're an amazing developer. I hope one day I can be like you.\r\nI'm opening this issue to ask you if there is any way to bypass the `Math error: overflow: number cannot fit` error on your calculator. I would like to test it for benchmark purposes against Julia REPL (for example), but your `bc` gives me this error when the number has too many digits.\r\n\r\nExample Calculation: `((169287^137)^920)^13256118217109`.\r\n\r\nRegards,\r\n**STSM**", + "closed": true, + "closedAt": "2023-03-21T17:06:49Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5XyVJh", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Hello,\r\n\r\nThank you for the compliments!\r\n\r\n> I'm opening this issue to ask you if there is any way to bypass the `Math error: overflow: number cannot fit` error on your calculator.\r\n\r\nIt depends.\r\n\r\nOn the particular example you gave, my machine did not give the error. (I am running an `x86_64` Linux machine.)\r\n\r\nThe error happens in this case because `bc` limits exponents to the maximum that can fit in the `unsigned long` type. There are good reasons for this, not least of which calculating a power with an exponent larger than that takes a long time.\r\n\r\nFor example, I started running the example calculation you gave seven hours ago, and it's still going.\r\n\r\nThe other reason is that the exponent needs to be converted into an `unsigned long` to do the actual calculation, which involves running a loop.\r\n\r\nBy the way, this is also the reason that exponents need to be integers.\r\n\r\nAnyway, one way to get around the limit would be to get a computer with a 64-bit `unsigned long` type. Machines that may *not* have that could include Windows (even if 64-bit) or 32-bit machines with any OS.\r\n\r\nAs an example, here are the limits for my machine (found by the `limits` keyword):\r\n\r\n```\r\n$ bc\r\n>>> limits\r\nBC_LONG_BIT = 64\r\nBC_BASE_DIGS = 9\r\nBC_BASE_POW = 1000000000\r\nBC_OVERFLOW_MAX = 18446744073709551615\r\n\r\nBC_BASE_MAX = 1000000000\r\nBC_DIM_MAX = 18446744073709551614\r\nBC_SCALE_MAX = 18446744073709551614\r\nBC_STRING_MAX = 18446744073709551614\r\nBC_NAME_MAX = 18446744073709551614\r\nBC_NUM_MAX = 18446744073709551614\r\nBC_RAND_MAX = 18446744073709551615\r\nMAX Exponent = 18446744073709551615\r\nNumber of vars = 18446744073709551614\r\n>>> quit\r\n```\r\n\r\nThere are two to notice: `BC_LONG_BIT` and `MAX Exponent`.\r\n\r\n`BC_LONG_BIT` is 64, which means `bc` was built assuming a 64-bit `unsigned long` type. `MAX Exponent` is the actual limit to the exponent, which equals `(2^64)-1`, which is `ULONG_MAX` on a machine with a 64-bit `unsigned long`.\r\n\r\nHowever, if I tell my `bc` to assume a 32-bit `unsigned long` when I build it, using:\r\n\r\n```\r\n$ LONG_BIT=32 ./configure \r\n$ make\r\n```\r\n\r\nThen the limits look different:\r\n\r\n```\r\n$ bin/bc\r\n>>> limits\r\nBC_LONG_BIT = 32\r\nBC_BASE_DIGS = 4\r\nBC_BASE_POW = 10000\r\nBC_OVERFLOW_MAX = 4294967295\r\n\r\nBC_BASE_MAX = 10000\r\nBC_DIM_MAX = 4294967294\r\nBC_SCALE_MAX = 4294967294\r\nBC_STRING_MAX = 4294967294\r\nBC_NAME_MAX = 4294967294\r\nBC_NUM_MAX = 4294967294\r\nBC_RAND_MAX = 4294967295\r\nMAX Exponent = 4294967295\r\nNumber of vars = 18446744073709551614\r\n>>> quit\r\n```\r\n\r\n`BC_LONG_BIT` is now 32, and `MAX Exponent` is now 4294967295, which is `(2^32)-1`. Notice that 4294967295 is less than the last exponent (13256118217109) in your example calculation. This means that if 4294967295 is your `MAX Exponent`, you will get that error. And I *do* get that error when trying your example computation with that build.\r\n\r\nNow, there *is* still a way around it, but it requires some math knowledge.\r\n\r\nYou must know one fact: `(x^y)*(x^z) == x^(y+z)`.\r\n\r\nIn essence, if you multiply two powers of one number, the effect is the same as adding the exponents of those powers and then calculating the power from the sum of those exponents.\r\n\r\nUsually, you would want to just add the exponents and then calculate the power because multiplications would be much more expensive. However, in this case, we can do the opposite: split the exponent (13256118217109) into several numbers and then multiply all of those numbers together.\r\n\r\nLet's decide on one exponent to use, which I'll call `E`. I can divide 13256118217109 by `E`, and the result is the number of times that I need to multiply the power by itself. However, that will not be quite right because `E` almost certainly does not divide 13256118217109 evenly, so `13256118217109%E` won't be 0. In that case, we'll want to multiply the end result by the power where the exponent is equal to `13256118217109%E`.\r\n\r\nIt will all look like this (in `bc` code):\r\n\r\n```\r\nscale = 0\r\ns = ((169287^137)^920)\r\nn = s^E\r\nr = n\r\nt = 13256118217109 / E\r\nm = 13256118217109 % E\r\n\r\nfor (i = 1; i < t; ++i)\r\n{\r\n r *= n\r\n}\r\n\r\nr *= s^m\r\n```\r\n\r\nBut even then, we can make it faster. Since we are just multiplying the value by itself many times, we can use power again. This time, the exponents (3086 and 6172) are back within limits, so we're safe.\r\n\r\nIf we do that, we get:\r\n\r\n```\r\nscale = 0\r\ns = ((169287^137)^920)\r\nt = 13256118217109 / E\r\nm = 13256118217109 % E\r\nn = s^E\r\nr = n^t\r\nr *= s^m\r\n```\r\n\r\nAnd that should give us our answer.\r\n\r\nWe should set those exponents as best as we can to make it as efficient as possible.\r\n\r\nI know that my `bc` uses the binary representation of the exponent to calculate power. Every bit that's a 1 has an extra multiply.\r\n\r\nSo if I set one of the powers to `(2^32)-1`, I know every single bit will be 1, meaning that there will be extra multiplications. However, it will also mean I need to use an exponent of 3086 (`13256118217109/((2^32)-1)`), whereas if I set one of the powers to be `2^31`, there will only be a single 1 bit, but I will need to use an exponent of 6172.\r\n\r\nAn exponent of 6172 has the same amount of 1 bits as 3086 (it's just 3086 times 2), so it will require only one more multiply. However, `2^31` will require 30 less multiplies than `(2^32)-1`, so we'll go with that.\r\n\r\nThat gives us this code:\r\n\r\n```\r\nscale = 0\r\ne = 2^31\r\ns = ((169287^137)^920)\r\nt = 13256118217109 / e\r\nm = 13256118217109 % e\r\nn = s^e\r\nr = n^t\r\nr *= s^m\r\n```\r\n\r\nI haven't tested the above code because it will take forever. If there are problems, please let me know.\r\n\r\n> I would like to test it for benchmark purposes against Julia REPL (for example)\r\n\r\nMy `bc` will be slower than Julia. I am confident of that.\r\n\r\nThis is because my `bc` does not use the full range of hardware-native integers in order to use decimal-based math. I bet Julia does use the full range and uses binary-based math.\r\n\r\nAlso, since it's taken seven hours on my `bc` on a 64-bit machine, I am *wildly* confident that Julia will be better.\r\n\r\nYou may want a benchmark with a smaller exponent.", + "createdAt": "2023-03-16T22:04:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1472811617", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5X2u-Q", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "First of all, I just want to let you know that you're really, really amazing. The passion that you've for your project(s) and for the people that interact with them is something that melts my heart. I hope one day I can be a programmer as good as you and also, more important, have the same amount of passion that you have.\r\n\r\nEnglish is not my primary language, so this may not make any sense.\r\n\r\n> Anyway, one way to get around the limit would be to get a computer with a 64-bit unsigned long type. Machines that may not have that could include Windows (even if 64-bit) or 32-bit machines with any OS.\r\n\r\nI'm using a x64 Windows Machine, that's the reason, so. I'll start compiling your `bc` on Linux using WSL.\r\n\r\n> You must know one fact: `(x^y)*(x^z) == x^(y+z)`.\r\n> \r\n> In essence, if you multiply two powers of one number, the effect is the same as adding the exponents of those powers and then calculating the power from the sum of those exponents.\r\n\r\nI knew that, but somehow I didn't think about it. Thanks for the recap.\r\n\r\n> My `bc` will be slower than Julia. I am confident of that.\r\n>\r\n> This is because my `bc` does not use the full range of hardware-native integers in order to use decimal-based math. I bet Julia does use the full range and uses binary-based math.\r\n\r\nWell, that's kinda \"chinese\" to me. I'm not as good as you to understand that low-level programming stuff\r\n\r\n> You may want a benchmark with a smaller exponent.\r\n\r\nI'll.\r\n\r\nOn another topic, I'm using your tool to keep track of my expenses. Before closing this issue, I would like to ask you if there is any way that I can use \"import\" statements in your `bc` ecosystem.\r\n\r\nI know that I can work with more than one file at the same time using the `-f`/`-c` flags, but I'm wondering if is possible to access multiple files by only importing one - and use data from other files inside it.\r\n\r\nMy goal (if that can help you answering it) is to have a single file with functions/operations and then a bunch of other files only with data (expenses and gains) - like a local mini database - that I can call in the \"main\" `bc` file and work with.\r\n", + "createdAt": "2023-03-17T14:54:05Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1473965968", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5X5p-w", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for your compliment!\r\n\r\nJust so you know, I have [not always had this passion][1]. But I firmly believe that software is meant to serve people. That's why I focus so much on helping others.\r\n\r\nIt makes me really happy that you noticed!\r\n\r\n> I'm using a x64 Windows Machine, that's the reason, so. I'll start compiling your `bc` on Linux using WSL.\r\n\r\nYeah, sorry about that. Windows is dumb in that they decided that the `unsigned long` type should remain 32 bits. It was a stupid decision.\r\n\r\n> Well, that's kinda \"chinese\" to me. I'm not as good as you to understand that low-level programming stuff\r\n\r\nI apologize. I'll try again.\r\n\r\nUnder the hood, `bc` uses 32-bit unsigned integers (on 64-bit) as \"digits\". It turns out that the highest power of 10 that 32 bits can contain is `10^9`, or 1,000,000,000. This is one more than the maximum value that `bc` allows in each 32-bit integer. If it goes higher than this, `bc` will detect that it went higher and add the extra to the next \"digit\". This keeps each digit below 1,000,000,000.\r\n\r\nHowever, that is not optimal. I did that because `bc` needs to have decimal-based math. (In other words, the math needs to be in base 10.) If you can have your math in binary, base 2, it's much cheaper because then you can make your limit `2^32`, which is much higher than `10^9` (4,294,967,296 vs. 1,000,000,000).\r\n\r\nJulia uses base 2. This means that each \"digit\" can store more, which means the numbers are smaller (in number of digits). And smaller numbers mean faster execution.\r\n\r\nI hope that made sense.\r\n\r\n> On another topic, I'm using your tool to keep track of my expenses.\r\n\r\nI admit that's *terrifying* to me. I mean, technically, it should be safe, as long as you don't do any division or modulus in your scripts. But I don't want to screw up your finances with `bc`.\r\n\r\nI hope you remember there's **no warranty**. If there is a bug, I'll try to help, but I can't guarantee that your financial records will be correct in the presence of bugs.\r\n\r\nI *will* guarantee, though, that I know of no bugs. I have fixed all of the ones I am aware of.\r\n\r\n> Before closing this issue, I would like to ask you if there is any way that I can use \"import\" statements in your bc ecosystem.\r\n\r\nSort of.\r\n\r\n> I know that I can work with more than one file at the same time using the `-f`/`-c` flags, but I'm wondering if is possible to access multiple files by only importing one - and use data from other files inside it.\r\n\r\nWell, that's the only way.\r\n\r\nActually, it's even simpler than that. `bc` runs scripts in the order given on the command-line. For example, you could run this:\r\n\r\n```\r\n$ bc funcs.bc database.bc main.bc\r\n```\r\n\r\nAnd `bc` will run `funcs.bc`, then `database.bc`, then `main.bc`.\r\n\r\nThis means that anything in `funcs.bc` can affect the execution of `database.bc`, and anything in `funcs.bc` and `database.bc` can affect the execution of `main.bc`.\r\n\r\nThis means that you can chain together scripts in a way that acts like import. Sort of. If you would only import at the top of a file.\r\n\r\nBasically, this would mean that if `bc` had an `import` statement, the above would be equivalent to putting:\r\n\r\n```\r\nimport funcs.bc\r\nimport database.bc\r\n```\r\n\r\nat the *top* of `main.bc`.\r\n\r\nI do this myself; I have a math research project, and when I get new ideas, I start a new script. But I have all of my common functions in a `lib.bc` script, so I run it like this:\r\n\r\n```\r\n$ bc lib.bc \r\n```\r\n\r\nThis even works for global variables; if you set a variable `food_expenses` to say `101.00` at the top level of a script, that variable will equal `101.00` in later scripts.\r\n\r\nSo if I were you, I would have a `funcs.bc` script that defines all of the functions. Then I would have a `database.bc` script that has the current values of all of your expenses. It should look something like this:\r\n\r\n```\r\nfood_expenses = 101.00\r\nentertainment_expenses = 45.50\r\n```\r\n\r\nand so on.\r\n\r\nThen, in the last script, I would have the code to actually update the database, but instead of directly updating, I would have it print the new \"version\" of `database.bc` to `stdout`.\r\n\r\nThen you would run it like this:\r\n\r\n```\r\n$ bc funcs.bc database.bc main.bc > temp.bc\r\n```\r\n\r\nThen check that `temp.bc` is correct. If it is, you can remove `database.bc` and rename `temp.bc` to `database.bc`:\r\n\r\n```\r\n$ rm database.bc\r\n$ mv temp.bc database.bc\r\n```\r\n\r\nTo make the example more concrete, let's assume that you have a `funcs.bc` that looks like this:\r\n\r\n```\r\ndefine void add_to_food_expenses(expense) {\r\n # If you don't put `food_expenses` in an `auto` statement,\r\n # then the global variable will be affected.\r\n food_expenses += expense\r\n # The global `total_expenses` is also affected with an `auto`.\r\n total_expenses += expense\r\n}\r\n\r\ndefine void print_new_database() {\r\n print \"food_expenses = \", food_expenses, \"\\n\"\r\n print \"total_expenses = \", total_expenses, \"\\n\"\r\n}\r\n```\r\n\r\nThen perhaps you have a `database.bc` that looks like this:\r\n\r\n```\r\nfood_expenses = 101.00\r\ntotal_expenses = 404.40\r\n```\r\n\r\nThen you have a `main.bc` that looks like this:\r\n\r\n```\r\n# read() reads from stdin.\r\nexpense = read()\r\n\r\nadd_to_food_expenses(expense)\r\n\r\nprint_new_database()\r\n```\r\n\r\nThen running the following:\r\n\r\n```\r\n$ echo \"35.75\" | bc funcs.bc database.bc main.bc\r\n```\r\n\r\nwill print:\r\n\r\n```\r\nfood_expenses = 136.75\r\ntotal_expenses = 440.15\r\n```\r\n\r\nwhich if you redirect to `temp.bc`:\r\n\r\n```\r\n$ echo \"35.75\" | bc funcs.bc database.bc main.bc > temp.bc\r\n```\r\n\r\nwill make `temp.bc` a valid replacement for `database.bc`.\r\n\r\n(While it may be safe to redirect straight to `database.bc`, I would not suggest doing so. If `funcs.bc` has any print statements that run, `database.bc` will be overwritten before it is ever read.)\r\n\r\n> My goal (if that can help you answering it) is to have a single file with functions/operations and then a bunch of other files only with data (expenses and gains) - like a local mini database - that I can call in the \"main\" `bc` file and work with.\r\n\r\nI *think* I answered according to your goal. I hope that helps, but please come back with any questions you have.\r\n\r\n[1]: https://gavinhoward.com/2021/12/is-it-even-worth-working-on-foss-anymore/", + "createdAt": "2023-03-18T05:48:18Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1474731952", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5YHLzP", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "Hi. Sorry for the delay replying.\r\n\r\n> It makes me really happy that you noticed!\r\n\r\nOf course. I'm lacking motivation for programming - even in my university project (I'm currently in my last year of my master degree) -, specially now with all the improvements made in the IA field, but reading your blog posts and messages like this one, somehow, gives me motivation to continue.\r\n\r\nI would like to suggest, if possible, a way to interact with you in your blog (like a comments section, for example). \r\n\r\n> I hope that made sense.\r\n\r\nIt did. I studied it in my first year at university, but I didn't know that specifically, so thank you.\r\n\r\n> I hope you remember there's **no warranty**. If there is a bug, I'll try to help, but I can't guarantee that your financial records will be correct in the presence of bugs.\r\n> \r\n> I *will* guarantee, though, that I know of no bugs. I have fixed all of the ones I am aware of.\r\n\r\nAnd that's all that matters for me. There is nothing that compares to the support that you offer.\r\n\r\n> I think I answered according to your goal. I hope that helps, but please come back with any questions you have.\r\n\r\nYou did. Thanks again for the time spent on this. I use a different set of files, but the information that you gave me is going to help me improve my system. So, thanks (one more time xD).", + "createdAt": "2023-03-21T17:06:49Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1478278351", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5YIXfA", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> Sorry for the delay replying.\r\n\r\nNo worries!\r\n\r\n> Of course. I'm lacking motivation for programming - even in my university project (I'm currently in my last year of my master degree)\r\n\r\nOh, cool, what is your project? (I dropped out of a Master's; I'm kind of jealous.)\r\n\r\n> I would like to suggest, if possible, a way to interact with you in your blog (like a comments section, for example).\r\n\r\nI have thought about this many times and have always rejected the idea due to the amount of spam-busting and moderation required, at least as told by other bloggers. Oh, and I don't want people to see a buggy site if they have JavaScript turned off as comments nearly always require JavaScript.\r\n\r\nHowever, your suggestion has made me look at it again, and I had an idea.\r\n\r\nOne of the best pieces of software, at least for forums, is the software underpinning . While I have been banned from that site, I appreciate the software for its moderation capabilities. This includes invite-only registration, which would help a lot to only allow people who want to interact with me and others in a good way.\r\n\r\nI've also always wanted to run a forum site where Free Speech was honored as much as possible because [I think Free Speech is necessary to find the truth][1].\r\n\r\nSo in response to your suggestion, if the lobste.rs software will work for my purposes, I'll spin up an instance at (or something similar), and I'll send you an invite, along with anyone else whose opinions I trust. And every time I post something new, I'll put it on the instance and link to it from the post. That should allow me to have a \"comments section\" while not interfering with my current site.\r\n\r\nI think I'll also allow others to post stuff too. Maybe I'll make its theme to be anything that is intellectually stimulating. I don't know; I'm just spitballing here.\r\n\r\n> I studied it in my first year at university, but I didn't know that specifically, so thank you.\r\n\r\nYou're welcome!\r\n\r\n> And that's all that matters for me.\r\n\r\nThank goodness!\r\n\r\n> There is nothing that compares to the support that you offer.\r\n\r\nYou're welcome! And thank you. I am overjoyed to hear this, actually.\r\n\r\nI'm starting a business right now, and my product is support for Open Source software that I have written. I was wondering if that would be a good product, but if my support is good, it might work. So I'm *thrilled* that you think so!\r\n\r\n(Don't worry; I'll always support `bc` for free; it's my gift to the world. The software that I'll be supporting for pay is at .)\r\n\r\nFull disclosure: this is also why I took your suggestion for a comments section more seriously; it would be a good way for me to network with potential clients. I apologize for having less than perfect motives.\r\n\r\nAlso, to take it one step further, can I point to this interaction we had as an example of the support I will give? I think it would be great material to advertise with. No offense if you don't want that though; I know that's a selfish motive.\r\n\r\n> You did. Thanks again for the time spent on this. I use a different set of files, but the information that you gave me is going to help me improve my system. So, thanks (one more time xD).\r\n\r\nYou're welcome! Glad I could help!\r\n\r\n[1]: https://gavinhoward.com/2019/11/recommendations-and-radicalization/", + "createdAt": "2023-03-21T21:13:49Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1478588352", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5YLZeg", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "> Oh, cool, what is your project? (I dropped out of a Master's; I'm kind of jealous.)\r\n\r\nYou don't need to be. You seem to have the required knowledge to be a teacher on my university. I'm from Portugal, btw.\r\n\r\nMy project is about telemetry. I'm building a telemetry solution using OpenTelemetry and multiple analysis backends for a health company. The problem is that such project is inside DevOps field and that's not my expertice or even the field that I want to work on. I want to be a programmer, a system programmer to be more precise.\r\n\r\n> This includes invite-only registration, which would help a lot to only allow people who want to interact with me and others in a good way.\r\n\r\nThat seems a good way to implement it. I didn't know about that specific website, but after a brief usage of it, I can say that I liked the way that it works.\r\n\r\n> So in response to your suggestion, if the lobste.rs software will work for my purposes, I'll spin up an instance at https://forum.gavinhoward.com/ (or something similar), and I'll send you an invite, along with anyone else whose opinions I trust. And every time I post something new, I'll put it on the instance and link to it from the post. That should allow me to have a \"comments section\" while not interfering with my current site.\r\n\r\nThat makes a lot of sense. I appreciate the consideration for my opinion xD\r\n\r\nWhen that instance is online, let me know, please.\r\n\r\n> I'm starting a business right now, and my product is support for Open Source software that I have written. I was wondering if that would be a good product, but if my support is good, it might work. So I'm thrilled that you think so!\r\n\r\nI see.. something like the commercial support that Daniel Stenberg offers for cURL?\r\n\r\n> (Don't worry; I'll always support bc for free; it's my gift to the world. The software that I'll be supporting for pay is at https://git.yzena.com/Yzena/Yc.)\r\n\r\nThat's nice to read. I'm planning to use `bc` for a very long time :d\r\n\r\n> Full disclosure: this is also why I took your suggestion for a comments section more seriously; it would be a good way for me to network with potential clients. I apologize for having less than perfect motives.\r\n\r\nIt wasn't necessary to make that disclosure. You're too kind just for considering having to do it. \r\n\r\n> Also, to take it one step further, can I point to this interaction we had as an example of the support I will give? I think it would be great material to advertise with. No offense if you don't want that though; I know that's a selfish motive.\r\n\r\nOf course you can. I'm flattered to be part of that.\r\n\r\n> You're welcome! Glad I could help!\r\n\r\nYou always do. Thanks (one more time)!", + "createdAt": "2023-03-22T11:20:57Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1479382944", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5YagqG", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> The problem is that such project is inside DevOps field and that's not my expertice or even the field that I want to work on. I want to be a programmer, a system programmer to be more precise.\r\n\r\nOuch. I feel for you, and I feel lucky.\r\n\r\nI know this may not help, but I have personally found that my system programming skills (dev) got better after I learned system admininstration (ops).\r\n\r\nSystem administration is important to me for another reason: without it, I can't host my code or the forum that I mentioned.\r\n\r\nOnce you get your Master's, maybe you can try to do what I have done: build excellent system software and support it. That may give you the room you need to make it a career. If it is going to work for me, it will surely work for you too!\r\n\r\n> When that instance is online, let me know, please.\r\n\r\nIt's up at , but email is not working, so I need to wait. Please send me an email using the email listed at , and I'll send you an invite once email is working.\r\n\r\n> I see.. something like the commercial support that Daniel Stenberg offers for cURL?\r\n\r\nYes, basically.\r\n\r\n> Of course you can. I'm flattered to be part of that.\r\n\r\nThank you!", + "createdAt": "2023-03-24T20:02:20Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1483344518", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5YtkJ8", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "Sorry for the delay replying (again).\r\n\r\n> I know this may not help, but I have personally found that my system programming skills (dev) got better after I learned system admininstration (ops).\r\n\r\nI hope you're right.\r\n\r\n> Once you get your Master's, maybe you can try to do what I have done: build excellent system software and support it. That may give you the room you need to make it a career. If it is going to work for me, it will surely work for you too!\r\n\r\nI'm trying to learn Rust on my free time, but it's been hard - I know your opinion about Rust xD -, let's see. \r\n\r\n> It's up at https://forum.gavinhoward.com/, but email is not working, so I need to wait. Please send me an email using the email listed at https://gavinhoward.com/contact/, and I'll send you an invite once email is working.\r\n\r\nThe [forum](https://forum.gavinhoward.com/) returns a 500 error code to me and the [contact page](https://gavinhoward.com/contact/) shows me that your e-mail is `@`. I'll send an email to `` and hope it works.\r\n\r\n> Yes, basically.\r\n\r\nI see. Well, good luck for your new project. I'm pretty sure that people will love your support as much as I do.", + "createdAt": "2023-03-29T10:27:50Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1488339580", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5YwWgF", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> I'm trying to learn Rust on my free time, but it's been hard - I know your opinion about Rust xD -, let's see.\r\n\r\nRemember that my Rust opinion is personal; Rust is pretty good in general.\r\n\r\n> The [forum](https://forum.gavinhoward.com/) returns a 500 error code to me and the [contact page](https://gavinhoward.com/contact/) shows me that your e-mail is `@`.\r\n\r\nI'm having trouble with the forum. In fact, it turns out that sending email just doesn't work. My email provider is blaming the lobste.rs software, but the software has the right settings, so...\r\n\r\nI'm probably just going to have to write my own forum software. Sorry for the delay. It may be a year or so.\r\n\r\n> I'll send an email to `` and hope it works.\r\n\r\nThat is the correct address. I've redacted it because I don't want it machine-readable (to avoid spam), but it is correct.\r\n\r\n> I see. Well, good luck for your new project. I'm pretty sure that people will love your support as much as I do.\r\n\r\nThank you!", + "createdAt": "2023-03-29T18:07:27Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1489070085", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5Y0Yev", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "> Remember that my Rust opinion is personal; Rust is pretty good in general.\r\n\r\nI hope it is here to stay for the long run.\r\n\r\n> I'm probably just going to have to write my own forum software. Sorry for the delay. It may be a year or so.\r\n\r\nNo problem. I'll put a reminder on my calendar, so. See you in a year (or so). Have a nice week!", + "createdAt": "2023-03-30T11:18:53Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1490126767", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5kIVVh", + "author": { + "login": "TediusTimmy" + }, + "authorAssociation": "NONE", + "body": "Hey, I realize that you asked this five months ago, but I just saw this and I wanted to chime in, because I love REALLLY BIG NUMBERS.\r\n\r\nNow, Gavin noted that `(x^y)*(x^z) == x^(y+z)`. It is also true that `(x^y)^z == x^(y*z)`. So, we can simplify your question to `169287^1670801140084418360`. Hoo, boy is that a big number! How big is it? `2.4917161343640611*10^8735990286585912792` The number that describes how many digits are in the number has 19 digits in it.\r\n\r\nHow did I do this (and what is Julia probably doing under the covers)? The same way a slide rule works: logarithms. It is definitionally true that `a^u=e^(ln(a^u))`. So `a^u=e(u*ln(a))`. But this works in any base, so I'll choose base 10 (I hope you remember your laws of logarithms).\r\n\r\nTo follow along:\r\n```\r\nscale=40\r\n137*920*13256118217109*l(169287)/l(10)\r\n```\r\nThat should give you that exponent. Remember: the number we want is ten raised to this power. To get the leading digits, we extract the mantissa (the fractional portion of a logarithm), and then raise 10 to this power. This works because of what Gavin noted: we can separate `3.2` into `3+.2`, and we are raising ten to this power, so it becomes `(10^3)*(10^.2)`:\r\n```\r\ne(.3964985643509537948664437764527360339575*l(10))\r\n```\r\n\r\nI want to point out two things: firstly, `bc` is going to compute all of the digits of this number; secondly, it is a big number. If we pack 19 decimal digits into every 8 bytes, it will still take over 3,000 petabytes of memory to store this number. To give you a sense of scale: at the end of 2021, Internet Archive had 212 petabytes of data archived.", + "createdAt": "2023-08-16T03:29:40Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1679906145", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5kl8FL", + "author": { + "login": "STSMHQ" + }, + "authorAssociation": "NONE", + "body": "Hi, @TediusTimmy. Thank you for your explanation. It helped a lot. I didn't know some of that mathematic equivalences. Have a nice week.", + "createdAt": "2023-08-22T07:56:38Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/66#issuecomment-1687667019", + "viewerDidAuthor": false + } + ], + "createdAt": "2023-03-16T12:20:42Z", + "id": "I_kwDOCL0xJc5g_6ME", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 66, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "[QUESTION] Bypass Math Overflow for Large Computations", + "updatedAt": "2023-08-22T07:56:38Z", + "url": "https://github.com/gavinhoward/bc/issues/66" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOB5Gq1Q", + "is_bot": false, + "login": "ikolesnikes", + "name": "" + }, + "body": "bin/bc enters an infinite loop while evaluating the cube-root of 0.01\r\n\r\nbin/bc -l -e 'cbrt(0.1)'\r\nreturns .46415888336127788924 (which is expected)\r\n\r\nbin/bc -l -e 'cbrt(0.01)'\r\nfreezes\r\n\r\nLooking at the definition of root(x,n) in lib2.bc the following loop never exits\r\n\r\n\twhile(r!=q){\r\n\t\tr=q\r\n\t\tq=(p*r+x/r^p)/n\r\n\t}\r\n\r\nA simple hack makes the cbrt function working.\r\n\r\n\twhile(abs(r-q)>0.000001){\r\n\t\tr=q\r\n\t\tq=(p*r+x/r^p)/n\r\n\t}", + "closed": true, + "closedAt": "2023-03-15T21:56:14Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5XXKFy", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yes, this is a bug. I have reproduced it.\r\n\r\nYour fix pointed right to the problem, which I suspected: it ran into a pathological case where the two values, `r` and `q`, never equaled each other because they would keep switching, i.e., `r` would equal `x`, and `q` would equal `y`, then on the next iteration, `r` would equal `y`, and `q` would equal `x`.\r\n\r\nThis is the reason I hate algorithms that are calculated by series. They can easily have problems like this.\r\n\r\nI tried to fix it with 01230fcd9cfb547c5666247e1a36c624d3f2d01c. It increases the precision, but then does the comparison at a smaller precision.\r\n\r\nCan you pull and test it for me? I'll start my release process in the meantime.", + "createdAt": "2023-03-13T08:13:31Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/64#issuecomment-1465688434", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5XYwKM", + "author": { + "login": "ikolesnikes" + }, + "authorAssociation": "NONE", + "body": "I tested your solution and it worked!\r\nMaybe it's worth to add a test for this case.\r\n\r\nNever mind, you already did it.", + "createdAt": "2023-03-13T13:03:47Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/64#issuecomment-1466106508", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5XZaRe", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yes, but you are right that if I did not, I should have!\r\n\r\nI will put out a release with the fix as soon as I can. I'll close this issue at that time.", + "createdAt": "2023-03-13T14:45:27Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/64#issuecomment-1466279006", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5XrBvX", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Release `6.5.0` is out! Thank you for the report!", + "createdAt": "2023-03-15T21:56:14Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/64#issuecomment-1470897111", + "viewerDidAuthor": true + } + ], + "createdAt": "2023-03-13T06:01:54Z", + "id": "I_kwDOCL0xJc5gm5mO", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 64, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "bc freezes evaluating cbrt(0.01)", + "updatedAt": "2023-03-15T21:56:14Z", + "url": "https://github.com/gavinhoward/bc/issues/64" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjE0ODEyNjg=", + "is_bot": false, + "login": "pg83", + "name": "Anton Samokhvalov" + }, + "body": "https://github.com/gavinhoward/bc/blob/master/scripts/safe-install.sh#L28 creates hard dependency loop on previously available bc for install process, which can be not available:\r\n\r\n* in bootstrap environments\r\n* in cross-compile environments\r\n", + "closed": true, + "closedAt": "2023-02-25T15:11:27Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5WEExO", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Whoops. I did not think of that. My bad.\r\n\r\nThis should be fixed in 313738df7f6d65875dd91ef63565227d0f782472 and 349cd801d5a7f4ab2fad76096d271397aa738063. I put out `6.3.1` because I know for a fact that Linux from Scratch will need these changes too, and they usually just grab the latest release.\r\n\r\nI hope this new release works for you. Please close this issue if it does.", + "createdAt": "2023-02-24T16:05:13Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/63#issuecomment-1443908686", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5WIxOt", + "author": { + "login": "pg83" + }, + "authorAssociation": "NONE", + "body": "thanx!", + "createdAt": "2023-02-25T15:11:27Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/63#issuecomment-1445139373", + "viewerDidAuthor": false + } + ], + "createdAt": "2023-02-24T11:34:48Z", + "id": "I_kwDOCL0xJc5fRqQO", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 63, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "bc -> bc dependency loop", + "updatedAt": "2023-02-25T15:11:28Z", + "url": "https://github.com/gavinhoward/bc/issues/63" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjUzMTI5ODE2", + "is_bot": false, + "login": "enh-google", + "name": "" + }, + "body": "trying to update AOSP to 6.2.4 (https://android-review.googlesource.com/c/platform/external/bc/+/2433072) i hit:\r\n```\r\ntests/: 413 files pushed, 0 skipped. 6.5 MB/s (1197549 bytes in 0.175s)\r\nscripts/functions.sh: 1 file pushed, 0 skipped. 60.6 MB/s (14190 bytes in 0.000s)\r\n***********************************************************************\r\n\r\nRunning bc tests...\r\n\r\nRunning bc decimal...pass\r\nSkipping bc print test\r\nSkipping bc parse test\r\nSkipping bc lib2\r\nRunning bc print2...pass\r\nRunning bc length...pass\r\nRunning bc scale...pass\r\nSkipping bc shift\r\nRunning bc add...pass\r\nRunning bc subtract...pass\r\nRunning bc multiply...pass\r\nRunning bc divide...pass\r\nRunning bc modulus...pass\r\nRunning bc power...pass\r\nRunning bc sqrt...pass\r\nSkipping bc trunc\r\nSkipping bc places\r\nRunning bc vars...pass\r\nRunning bc boolean...pass\r\nRunning bc comp...pass\r\nRunning bc abs...pass\r\nRunning bc assignments...pass\r\nRunning bc functions...pass\r\nSkipping bc scientific\r\nSkipping bc engineering\r\nRunning bc globals...pass\r\nRunning bc strings...pass\r\nSkipping bc strings2 test\r\nRunning bc letters...pass\r\nRunning bc exponent...pass\r\nRunning bc log...pass\r\nRunning bc pi...pass\r\nRunning bc arctangent...pass\r\nRunning bc sine...pass\r\nRunning bc cosine...pass\r\nSkipping bc bessel test\r\nRunning bc arrays...pass\r\nRunning bc misc...pass\r\nRunning bc misc1...pass\r\nRunning bc misc2...pass\r\nRunning bc misc3...pass\r\nRunning bc misc4...pass\r\nRunning bc misc5...pass\r\nRunning bc misc6...pass\r\nRunning bc misc7...pass\r\nRunning bc misc8...pass\r\nRunning bc void...pass\r\nSkipping bc rand\r\nRunning bc recursive_arrays...pass\r\nRunning bc divmod...pass\r\nRunning bc modexp...pass\r\nSkipping bc bitfuncs\r\nSkipping bc leadingzero\r\nRunning bc is_number...pass\r\nRunning bc is_string...pass\r\nRunning bc asciify_array...pass\r\nRunning bc line_by_line1...pass\r\nRunning bc line_by_line2...pass\r\nRunning bc line_loop_quit1...pass\r\nRunning bc line_loop_quit2...pass\r\nRunning bc stdin tests...pass\r\n/data/local/tmp/bc-tests/tests/scripts.sh[66]: check_d_arg: inaccessible or not found\r\n\r\nExit Code: 127\r\n```\r\nlooking at scripts.sh, it doesn't source functions.sh where the preceding scripts do. i'm not sure why that works with bash? i didn't think bash exported functions by default, but maybe it's doing so?\r\n\r\nanyway, i tested the obvious fix (https://android-review.googlesource.com/c/platform/external/bc/+/2433072/2/tests/scripts.sh).", + "closed": true, + "closedAt": "2023-02-15T16:15:07Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5VLKwA", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Whoops. That's a bug.\r\n\r\nI tried clicking your links, but they complained that I wasn't signed in our didn't have permission.\r\n\r\nI presume your obvious fix was to source `functions.sh`? I'll do that in my repo when I get home. Do you want a tagged release?", + "createdAt": "2023-02-14T01:55:30Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/62#issuecomment-1428990976", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5VLMMt", + "author": { + "login": "enh-google" + }, + "authorAssociation": "NONE", + "body": "> I tried clicking your links, but they complained that I wasn't signed in our didn't have permission.\r\n\r\ngah, don't get me started ... the powers that be inflicted a stupid url rewriter on us recently that mean we can't give working urls to anyone. i'd tried to manually fix these, but didn't test them. fixed now (retconned above).\r\n\r\n> I presume your obvious fix was to source `functions.sh`?\r\n\r\nexactly.\r\n\r\n> I'll do that in my repo when I get home. Do you want a tagged release?\r\n\r\nyes please... our tooling isn't yet clever enough to get us back on to the next tagged release if we switch to a sha, so until we implement that, it's quite a bit more convenient if there's another tag. (especially if i happen to go under a bus :-) )", + "createdAt": "2023-02-14T02:02:08Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/62#issuecomment-1428996909", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5VLqu1", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Fixed in 714782c613ec2a4570f63c1285d38785961edb89, which should also preemptively fix any other occurrences of this same bug.\r\n\r\nI'm running a basic release process to ensure that the release still builds and tests, but I should have a tag out tomorrow morning (US time).", + "createdAt": "2023-02-14T05:04:50Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/62#issuecomment-1429121973", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5VP1W1", + "author": { + "login": "enh-google" + }, + "authorAssociation": "NONE", + "body": "> I'm running a basic release process to ensure that the release still builds and tests, but I should have a tag out tomorrow morning (US time).\r\n\r\nthanks! no hurry...", + "createdAt": "2023-02-14T18:46:00Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/62#issuecomment-1430214069", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5VQreo", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "It's out! Because I haven't been able to get an Android environment going yet, I'm still not sure this will work for you. If it does, though, please close this issue. Otherwise, I'll try something else.", + "createdAt": "2023-02-14T22:04:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/62#issuecomment-1430435752", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5VRBCe", + "author": { + "login": "enh-google" + }, + "authorAssociation": "NONE", + "body": "thanks... testing now: https://android-review.googlesource.com/c/platform/external/bc/+/2436773", + "createdAt": "2023-02-14T23:24:21Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/62#issuecomment-1430524062", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5VVNiI", + "author": { + "login": "enh-google" + }, + "authorAssociation": "NONE", + "body": "merged! thanks for your help :-)", + "createdAt": "2023-02-15T16:15:07Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/62#issuecomment-1431623816", + "viewerDidAuthor": false + } + ], + "createdAt": "2023-02-14T00:32:53Z", + "id": "I_kwDOCL0xJc5eXxKU", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 62, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "another mksh/bash difference?", + "updatedAt": "2023-02-15T16:15:07Z", + "url": "https://github.com/gavinhoward/bc/issues/62" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjUzMTI5ODE2", + "is_bot": false, + "login": "enh-google", + "name": "" + }, + "body": "i haven't been able to update for some time (5.0.1 was our last update!) because the tests fail in a weird way without much useful information. i've included the current failures for 6.2.2 below, for example.\r\n\r\nmy guess is that this is something to do with Android using mksh as its /bin/sh. the interleaved output makes it appear like there might be some disagreement about job handling between bash and mksh?\r\n\r\nare the current bc tests known to work on shells other than bash (and in particular mksh)? any ideas where i should look (or some kind of parallelism i can just disable)?\r\n```\r\n~/aosp-master-with-phones/external/bc$ ./run-bc-tests-on-android.sh \r\ntests/: 413 files pushed, 0 skipped. 0.8 MB/s (1191155 bytes in 1.372s)\r\nscripts/functions.sh: 1 file pushed, 0 skipped. 75.4 MB/s (12065 bytes in 0.000s)\r\n***********************************************************************\r\n\r\nRunning bc tests...\r\n\r\nSkipping bc lib2\r\nSkipping bc shift\r\nSkipping bc trunc\r\nSkipping bc places\r\nSkipping bc print test\r\nSkRunning bc decimal...Running bc print2...ipping bc parse test\r\nRunning bc scale...Skipping bc scientific\r\nRunning bc length...Running bc sqrt...Running bc modulus...RuRunning bc add...nning bc divide...Running bc subtract...Skipping bc engineering\r\nRunning bc multiply...Running bc power...Running bc abs...Running bc functions...pass\r\nRunning bc boolean...Running bc comp...Running bc assignments...Running bc vars...pass\r\nSkipping bc rand\r\npass\r\nSRunning bc globals...kipping bc bitfuncs\r\npass\r\nRunning bc strings...pass\r\nRunning bc cosine...pass\r\nSkipping bc strings2 test\r\nSkipping bc bessel test\r\npass\r\nRunning bc sine...Running bc misc2...RRunning bc exponent...pRunning bc log...Running bc misc8...Running bc misc...Running bc misc4...Running bc pi...upass\r\nSkipping bc leadingzero\r\nnning bc misc1...ppasRunning bc arrays...asss\r\n\r\nass\r\nRunning bc arctangent...Running bc misc6...Running bc modexp...Running bc void...Running bc misc3...Running bc letters...pass\r\npass\r\npRunning bc misc7...ass\r\npass\r\npass\r\nRunning bc divmod...Running bc recursive_arrays...Running bc misc5...pass\r\npass\r\npass\r\npass\r\npass\r\npass\r\npass\r\nppass\r\nass\r\nRunning bc is_number...pass\r\npass\r\npass\r\npass\r\nRunning bc asciify_array...Running bc line_loop_quit1...pass\r\nppass\r\npass\r\npass\r\npass\r\npass\r\nass\r\nRunning bc is_string...Running bc line_by_line1...Running bc line_by_line2...Running bc line_loop_quit2...Running bc command-line error tests...Running bc stdin tests...pass\r\nRunning bc error file 01.txt with clamping...pass\r\npass\r\npass\r\nRunning bc read...Running bc error file 02.txt with clamping...Running bc error file 03.txt with clamping...pass\r\npass\r\npass\r\npass\r\npass\r\npass\r\npass\r\npass\r\nRunning bc error file 01.txt without clamping...Running bc error file 04.txt with clamping...ppass\r\nSkipping bc script multiply.bc\r\npass\r\nass\r\nRunning bc error file 02.txt without clamping...pass\r\nRunning bc error file 05.txt with clamping...Skipping bc script divide.bc\r\nRunning bc error file 03.txt without clamping...Skipping bc script subtract.bc\r\npass\r\nRunning bc errors...Running bc read errors...pass\r\nSkipping bc script add.bc\r\nRunning bc error file 06.txt with clamping...Running bc error file 04.txt without clamping...pRunning bc error file 07.txt with clamping...ass\r\nRunning bc error file 01.txt through cat with clamping...pass\r\nRunning bc error file 08.txt with clamping...pass\r\nSkipping bc script print.bc\r\nRunning bc error file 02.txt through cat with clamping...Running bc error file 03.txt through cat with clamping...pass\r\npass\r\npass\r\nRunning bc error file 05.txt without clamping...pass\r\npass\r\nRunning bc error file 09.txt with clamping...pass\r\nRunning bc error file 07.txt without clamping...pass\r\nSkipping bc script parse.bc\r\nRunRunning bc error file 04.txt through cat wnith clamping...ing bc error file 06.txt without clamping...pass\r\nRunning bc error file 10.txt with clamping...RRunning bc empty read...Running bc error file 01.txt through cat without clamping...unning bc script array.bc...RRunning bc error file 03.txt through cat without clamping...pass\r\npaRunning bc error file 08.txt without clamping...Running bc error file 11.txt with clamping...pss\r\nunning bc script array2.bc...ass\r\npass\r\npass\r\nRunning bc error file 02.txt through cat without clamping...pass\r\npass\r\nRunning bc script atan.bc...Running bc error file 09.txt without clamping...Running bc error file 05.txt through cat with clamping...pass\r\npass\r\nRunning bc error file 10.txt without clamping...Running bc error file 06.txt through cat with clamping...Running bc error file 12.txt with clamping...RunRunning bc error file 04.txt through cat without clamping...pass\r\nSkipping bc script bessel.bc\r\npass\r\nning bc error file 07.txt through cat with clamping...Running bc script functions.bc...pass\r\nRunning bc error file 11.txt without clamping...Running bc error file 13.txt with clamping...pass\r\npass\r\nRunning bc error file 08.txt through cat with clamping...pass\r\npass\r\nRunning bc error file 14.txt with clamping...pass\r\nRunning bc read EOF...pass\r\nRunning bc error file 09.txt through cat with clamping...pass\r\npass\r\npass\r\nRunning bc error file 05.txt through cat without clamping...pass\r\npRunning bc script globals.bc...pass\r\nass\r\nRunning bc error file 15.txt with clamping...Skipping bc script: rand.bc\r\nRRunning Rbc error ufninlien g10.txt through cbca ts cwriitpht len.bc...clamping...pass\r\nunning bc error file 07.txt through cat without clamping...pass\r\nRRunning bc error file 06.txt through cat without clamping...pass\r\nRunning bc error file 11.txt through cat with clamping...unning bc error file 12.txt without clamping...pass\r\nRunning bc error file 08.txt through cat without clamping...pass\r\nRunning bc error file 16.txt with clamping...pass\r\nRunning bc error file 14.txt without clamping...pass\r\nRunning bc error file 13.txt without clamping...pass\r\nRunning bc script references.bc...Running bc error file 17.txt with clamping...Running bc error file 09.txt through cat without clamping...pass\r\npass\r\npass\r\npass\r\npass\r\npass\r\nRuRunning bc error file 15.txt without clamping...nning bc error file 18.txt with clamping...Running bc script screen.bc...pass\r\nRpass\r\npapass\r\nunning bc error file 12.txt through cat with clamping...ss\r\nRunning bc error file 11.txt through cat without clamping...Rpass\r\nunning bc error file 10.txt through cat without clamping...Running bc error file 19.txt with clamping...Skipping bc script strings2.bc\r\npass\r\nRunning bc error file 13.txt through cat with clamping...pass\r\nRunning bc error file 16.txt without clamping...pass\r\nRunning bc error file 14.txt through cat with clamping...Running bc error file 20.txt with clamping...pass\r\nRunning bc error file 17.txt without clamping...pass\r\npass\r\nRunning bc error file 21.txt with clamping...paspass\r\nRunning bc script ifs.bc...s\r\nRunning bc error file 18.txt without clamping...pass\r\nRunning bc error file 15.txt through cat with clamping...pass\r\nRunning bc script ifs2.bc...Rpass\r\npass\r\nRunning bc error file 12.txt through cat without clamping...pass\r\nunning bc error file 19.txt without clamping...Running bc erpass\r\nror file 22.txt with clamping...Running bc error file 13.txt through cat without clamping...Rpass\r\npRunning bc error file 20.txt without clamping...pass\r\nass\r\nRuRRuunning bc error file 14.txt through cat without clamping...nnning bc script afl1.bc...unning bc error file 23.txt with clning bcamp einrrg..or. file 16.txt through cat with clamping...pass\r\npass\r\nRunning bc error file 17.txt through cat with clamping...Running bc error filepass\r\npass\r\npass\r\nRunniRunning bc error file 15.txt through cat without clamping... 21.txtng bc error file 24.txt with clamping... without clamping...Running bc error file 18.txt through cat with clamping...pass\r\npass\r\npass\r\npass\r\npass\r\nRunning bc error file 25.txt with clamping...pass\r\nRunning bc error file 22.txt without clamping...Running bc error file 19.txt through cat with clamping...pass\r\nRunning bc error file 16.txt through cat without clamping...Running bc error file 23.txt without clamping...pass\r\npass\r\npass\r\nRunning bc error file 20.txt through cat with clamping...pass\r\nRunning bc error file 26.txt with clamping...Running bc error file 17.txt through cat without clamping...Running bc error file 24.txt without clamping...Running bc error file 27.txt with clamping...pass\r\nRunning bc error file 18.txt through cat without clamping...pass\r\npass\r\npass\r\nRunning bc error file 21.txt through cat with clamping...pass\r\nRunning bc error file 19.txt through cat without clamping...pass\r\nRunning bc error file 22.txt through cat with clamping...pass\r\nRunning bc error file 25.txt without clamping...Running bc error file 28.txt with clamping...pass\r\npass\r\npass\r\npass\r\npass\r\nRunning bc error file 23.txt through cat with clamping...Running bc error file 20.txt through cat without clamping...RuRunning bc error file 29.txt with clamping...Running bc error file 24.txt through cat with clamping...pass\r\nnning bc error file 26.txt without clamping...pass\r\nRunning bc error file 27.txt without clamping...pass\r\npass\r\npass\r\npass\r\nRunning bc error file 22.txt through cat without clamping...Running bc error file 30.txt with clamping...Running bc error file 21.txt through cat without clamping...Running bc error file 31.txt with clamping...pass\r\npass\r\nRunning bc error file 25.txt through cat with clamping...Running bc error file 28.txt without clamping...pass\r\nRunning bc error file 23.txt through cat without clamping...pass\r\nRunning bc error file 27.txt through cat with clamping...pass\r\nRunning bc error file 32.txt with clamping...Running bc error file 24.txt through cat without clamping...Skipping problematic bc error file 33.txt...\r\nRunning bc error file 26.txt through cat with clamping...pass\r\npass\r\npass\r\npass\r\npaRunning bc error file 29.txt withss\r\npout clamping...ass\r\npass\r\nRuRupass\r\nA test failed!\r\nRunning bc error file 25.txt through cat without clamping...Running bc error file 30.txt without clamping...passnning bc error file 28.txt through nning bc error file 31.txt without clamping...\r\ncat with clamping...pass\r\nRunning bc error file 27.txt through cat without clamping...pass\r\npass\r\nA test failed!\r\nRunning bc error file 34.txt with clamping...Running bc error file 32.txt without clamping...pass\r\npass\r\nA test failed!\r\nRunning bc error file 26.txt through cat without clampiRunning bc error file 29.txt through cat with clamping...pass\r\nng...pRunning bc error file 35.txt with clamping...pass\r\nRunning bc error file 31.txt through cat with clamping...A Running bc error file 36.txt with clamping...pass\r\nRunning bc error file 30.txt through cat with clamping...\r\nRunning bc quit test...test failed!\r\nass\r\npass\r\nA test failed!\r\npass\r\nRunning bc error file 32.txt through cat with clamping...Running bc error file 28.txt through cat without clamping...Running bc error file 34.txt without clamping...pass\r\npass\r\npass\r\npass\r\nRA pass\r\ntest failed!\r\nunning bc error file 29.txt through cat without clamping...Running bcpass\r\n error file 35.txt without clamping...Running bc error file 30.txt through cat without clamping...pass\r\nRunning bc error file 31.txt through cat without clamping...Running bc error file 36.txt without clamping...A pass\r\ntest failed!\r\npass\r\nRunning bc error file 34.txt through cat with clamping...pA Running bc error file 32.txt through cat without clamping...ass\r\ntest failed!\r\npass\r\npass\r\npass\r\npass\r\nA test failed!\r\nRuRunning bc error file 35.txt through cat with clamping...nning bc error file 36.txt through cat with clamping...Rupass\r\nnning bc environment var tests...pass\r\nA test failed!\r\nRunning bc error file 34.txt through cat without clamping...A pass\r\ntest failed!\r\npass\r\nRunning bc error file 36.txt through cat without clamping...A test failed!pass\r\nRunning bc error file 35.txt through cat witpass\r\n\r\nhout clamping...Running keyword redefinition test...paA test failed!\r\nss\r\npass\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\npass\r\nA test failed!\r\nRunning multiline comment expression file test...A test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\npass\r\nA test failed!\r\nA test failed!\r\nA Rtest ufnaniilnegd !m\r\nultiline comment expression file error test...A test failed!\r\nA test failed!\r\nA test failed!\r\npass\r\nA test failed!\r\nA test failed!\r\nRunning multiline string expression file test...A test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\npass\r\nRunning multiline string expression file error test...A test failed!\r\nA test failed!\r\npass\r\nA test failed!\r\nRunning bc line length tests...A test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\nA test failed!\r\npass\r\nA test failed!\r\nA test failed!\r\nRunning bc arg tests...pass\r\nRunning bc builtin variable arg tests...pass\r\nRunning bc directory test...pass\r\nRunning bc binary file test...pass\r\nRunning bc binary stdin test...pass\r\nRunning bc limits tests...pass\r\npass\r\nRunning bc posix_errors...pass\r\n~/aosp-master-with-phones/external/bc$ \r\n```", + "closed": true, + "closedAt": "2023-01-12T17:51:06Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5SPfLa", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> i haven't been able to update for some time (5.0.1 was our last update!)\r\n\r\nOof...I'm sorry. Have I been missing communication with you?\r\n\r\n> because the tests fail in a weird way without much useful information. i've included the current failures for 6.2.2 below, for example.\r\n\r\nI agree; that is useless.\r\n\r\n> my guess is that this is something to do with Android using mksh as its /bin/sh. the interleaved output makes it appear like there might be some disagreement about job handling between bash and mksh?\r\n\r\nI think that's a great guess, and it's my guess too because the `tests/all.sh` script does use job control. I tried to write it according to the POSIX standard, but I suspect that job control is finicky in general.\r\n\r\n> are the current bc tests known to work on shells other than bash (and in particular mksh)? any ideas where i should look (or some kind of parallelism i can just disable)?\r\n\r\nThey are known to work on `tcsh` (FreeBSD), but other than that, `bash`, and `dash`, I don't know.\r\n\r\n> any ideas where i should look (or some kind of parallelism i can just disable)?\r\n\r\nTo disable parallelism, change the last line of `run-bc-tests-on-android.sh` to:\r\n\r\n```\r\nexec adb shell $dash_t /data/local/tmp/bc-tests/tests/all.sh -n bc 0 1 0 0 0 bc\r\n```\r\n\r\nI made two changes:\r\n\r\n* Most importantly, there is a `-n` option, which is how to disable parallelism in the `tests/all.sh` script.\r\n* I also added another 0 before the last `bc` because there are now five integer positional arguments.\r\n\r\nMy hope (and it is only a hope) is that that missing integer argument is what is causing the weird failures because the script would otherwise treat the last `bc` argument as the last integer argument and cause some sort of failure. `bash` fails because it has a non-integer argument, but I don't know how `mksh` would fail in that case.\r\n\r\nThe other reason there might be failures is because I added a test that is \"problematic.\" It's my test for `malloc()` failure, and unfortunately, it only works on Linux systems with swap disabled and some other changes. I don't think it would work on Android. I did add an option to disable that test in `tests/all.sh`; that is the missing integer option, in fact. But I don't think that's the reason because I added it in the fourth position (the last is whether to time the tests), so it is a 0 in your current script.\r\n\r\nRegardless, with the parallelism disabled, you should see exactly what test is failing, and you should be able to give me that output, even if either of those are not the reason for the failure.\r\n\r\nIn the meantime, I'll work on my end. Android is a first-class user of my `bc`, and I need to start treating it that way, including setting up a building and testing environment. I'll do my best to do so myself, but if possible, can you give me a helpful link?", + "createdAt": "2023-01-12T04:16:14Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/61#issuecomment-1379791578", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5STRaK", + "author": { + "login": "enh-google" + }, + "authorAssociation": "NONE", + "body": "> > i haven't been able to update for some time (5.0.1 was our last update!)\r\n> \r\n> Oof...I'm sorry. Have I been missing communication with you?\r\n\r\nno, this is just the first time i've had time to actually look at the problem and file a bug!\r\n\r\n> > are the current bc tests known to work on shells other than bash (and in particular mksh)? any ideas where i should look (or some kind of parallelism i can just disable)?\r\n> \r\n> They are known to work on `tcsh` (FreeBSD), but other than that, `bash`, and `dash`, I don't know.\r\n\r\nyeah, there's been a lot about job control on the POSIX mailing list recently too.\r\n\r\n> > any ideas where i should look (or some kind of parallelism i can just disable)?\r\n> \r\n> To disable parallelism, change the last line of `run-bc-tests-on-android.sh` to:\r\n> \r\n> ```\r\n> exec adb shell $dash_t /data/local/tmp/bc-tests/tests/all.sh -n bc 0 1 0 0 0 bc\r\n> ```\r\n\r\nyes, that works. thanks!\r\n\r\n> In the meantime, I'll work on my end. Android is a first-class user of my `bc`, and I need to start treating it that way, including setting up a building and testing environment. I'll do my best to do so myself, but if possible, can you give me a helpful link?\r\n\r\nthere's https://source.android.com/docs/setup/build/building (and other pages about running), but it's a pretty large undertaking.\r\n\r\ntbh, i've only had two problems with bc updates:\r\n\r\n1. build changes such as the move from a shell script to a .c file for strgen. those are almost certainly easier for me to do anyway.\r\n2. test changes like this one. these have been harder for me to adapt to (although this is the first one i've failed with). there i'd say \"yes, please make sure you add options like `-n` when you make scary changes\" but one thing you haven't done but could that i think would help would be to fail hard --- making extra options optional (ho ho) makes my life harder. an error message would be more helpful, especially because changes to a row of 0s and 1s aren't necessarily immediately obvious!\r\n\r\nanyway, https://android-review.googlesource.com/c/platform/external/bc/+/2385321 works for me locally, so it should make it through CI. (and if it doesn't, that's probably a question for me anyway :-) )\r\n\r\nthanks!", + "createdAt": "2023-01-12T17:51:06Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/61#issuecomment-1380783754", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5SUcYn", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "> there's https://source.android.com/docs/setup/build/building (and other pages about running), but it's a pretty large undertaking.\r\n\r\nI'll do my best anyway. Thank you!\r\n\r\n> tbh, i've only had two problems with bc updates\r\n>\r\n> 1. build changes such as the move from a shell script to a .c file for strgen. those are almost certainly easier for me to do anyway.\r\n> 2. test changes like this one. these have been harder for me to adapt to (although this is the first one i've failed with). there i'd say \"yes, please make sure you add options like -n when you make scary changes\" but one thing you haven't done but could that i think would help would be to fail hard --- making extra options optional (ho ho) makes my life harder. an error message would be more helpful, especially because changes to a row of 0s and 1s aren't necessarily immediately obvious!\r\n\r\nI think both of these are oversights on my part. I should add sections to my `NEWS.md` entry for each version about building, packaging, and testing changes. I've never thought they were necessary to list, but here is hard evidence that yes, they are.\r\n\r\nI apologize. I will do that going forward. And I also apologize for accidentally using you as my test subject while I learn how to run a project.\r\n\r\nNow, about making things fail hard: I agree that I messed up by making arguments optional.\r\n\r\nHowever, because I have downstream users that could depend on the options *staying* optional, I'm not sure I can make them required at this point.\r\n\r\nNevertheless, I think I can do the next best thing: do error checking on each argument. This would (hopefully) allow me to add the \"fail hard\" you want (and it's a good idea!) while not causing problems for other downstream users. (Unless they have bugs in their scripts, in which case, they should be fixed anyway.)\r\n\r\nI have implemented the ideas in d5e6dbdf328407bddf53efb655abe4b9c2fcb90f, so they'll be in the next release. I hope that helps.", + "createdAt": "2023-01-12T23:06:57Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/61#issuecomment-1381090855", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5SUv2M", + "author": { + "login": "enh-google" + }, + "authorAssociation": "NONE", + "body": "> I apologize. I will do that going forward. And I also apologize for accidentally using you as my test subject while I learn how to run a project.\r\n\r\nno worries --- we're a bit of an outlier anyway. it's only when you get included in a \"ridiculously large\" meta-project (most commonly an operating system [or moral equivalent] such as android or chromium or whatever) that you tend to find people _not_ using your build system because the pain of having to duplicate your build system is still slightly less than the pain of trying to incorporate your build system into theirs!\r\n\r\n> Now, about making things fail hard: I agree that I messed up by making arguments optional.\r\n> \r\n> However, because I have downstream users that could depend on the options _staying_ optional, I'm not sure I can make them required at this point.\r\n> \r\n> Nevertheless, I think I can do the next best thing: do error checking on each argument. This would (hopefully) allow me to add the \"fail hard\" you want (and it's a good idea!) while not causing problems for other downstream users. (Unless they have bugs in their scripts, in which case, they should be fixed anyway.)\r\n\r\nyeah, maybe if you ever need more arguments, make them named? (like `--foo=bar` or `foo=bar`?)\r\n\r\n> I have implemented the ideas in [d5e6dbd](https://github.com/gavinhoward/bc/commit/d5e6dbdf328407bddf53efb655abe4b9c2fcb90f), so they'll be in the next release. I hope that helps.\r\n\r\nthanks. since you're obviously interested in the feedback, i'll try to let you know sooner next time i have an update where manual intervention is required, if i have any trouble :-)", + "createdAt": "2023-01-13T00:55:27Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/61#issuecomment-1381170572", + "viewerDidAuthor": false + } + ], + "createdAt": "2023-01-12T01:26:05Z", + "id": "I_kwDOCL0xJc5bMSgX", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 61, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "test failures on Android", + "updatedAt": "2023-01-13T00:55:28Z", + "url": "https://github.com/gavinhoward/bc/issues/61" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjUwNzg5NDY5", + "is_bot": false, + "login": "mcoret", + "name": "" + }, + "body": "Hi,\r\nI'm trying to compile the project using Visual Studio 19, and I get the following error: `error C2065: 'SIGWINCH': undeclared identifier`. I cannot find such definition in MSVC. MSYS64 version compiles without problems.\r\nThank you!", + "closed": true, + "closedAt": "2022-12-06T15:40:35Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5PvhRI", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "What version are you trying to compile?\r\n\r\nIf it's the latest `master `, I have some changes there to fix a [FreeBSD bug][1] that I suspected would break the Windows build. I guess I was right.\r\n\r\nUsually, I wait until release time to fix Windows build bugs, but I'll boot Windows and push a fix later today if that will fix your problem. I'll also have a release coming soon with new stuff.\r\n\r\nI hope this helps.\r\n\r\n[1]: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=268076", + "createdAt": "2022-12-05T17:55:25Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/60#issuecomment-1337857096", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5PvnLD", + "author": { + "login": "mcoret" + }, + "authorAssociation": "NONE", + "body": "Ah, OK, thank you again!\r\nYes, it's the `master` branch.", + "createdAt": "2022-12-05T18:11:45Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/60#issuecomment-1337881283", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5PxCgn", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I've pushed e1205eaccfa03a8dbbfd625af664f6b074b69a65 which should fix the problem for now. Can you confirm for me?", + "createdAt": "2022-12-05T22:18:12Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/60#issuecomment-1338255399", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5P2DiK", + "author": { + "login": "mcoret" + }, + "authorAssociation": "NONE", + "body": "Hi, I can confirm, everything is OK!", + "createdAt": "2022-12-06T15:40:34Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/60#issuecomment-1339570314", + "viewerDidAuthor": false + } + ], + "createdAt": "2022-12-05T17:00:01Z", + "id": "I_kwDOCL0xJc5YCR8i", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 60, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Windows MSVC compilation problem", + "updatedAt": "2022-12-06T15:40:35Z", + "url": "https://github.com/gavinhoward/bc/issues/60" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "is_bot": false, + "login": "firasuke", + "name": "Firas Khalil Khana" + }, + "body": "As in the title, what's the difference between the two? and why is `--localedir` only mentioned in `build.md` and not when running `./configure --help`?", + "closed": true, + "closedAt": "2022-11-26T16:37:39Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5PKKvC", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "So I originally added `--localedir` because it was one of the standard GNU configure options. This was before I understood that GNU does *not* use POSIX locales.\r\n\r\n`--localedir` does not make sense when a program is using POSIX locales, so I've [removed references to `LOCALEDIR` and friends from everything][1].\r\n\r\nDoes that answer your question?\r\n\r\n[1]: https://github.com/gavinhoward/bc/commit/f4816582b1264b64566fc162ef6512601077cc63", + "createdAt": "2022-11-26T15:24:49Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/58#issuecomment-1328065474", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5PKLiA", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "So `--localedir` shouldn't be used?", + "createdAt": "2022-11-26T15:45:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/58#issuecomment-1328068736", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5PKNBl", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You are correct; it should not be used.\r\n\r\nIt wasn't used to change anything in the Makefile, so it merely just didn't do anything. With the change I made, the configure script should more give an error if it is given.", + "createdAt": "2022-11-26T16:24:25Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/58#issuecomment-1328074853", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5PKNey", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Ok cool, thanks for clarifying. Closing..", + "createdAt": "2022-11-26T16:37:19Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/58#issuecomment-1328076722", + "viewerDidAuthor": false + } + ], + "createdAt": "2022-11-26T10:36:13Z", + "id": "I_kwDOCL0xJc5XU90M", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 58, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Difference between --localedir and NLSPATH", + "updatedAt": "2022-11-26T16:37:39Z", + "url": "https://github.com/gavinhoward/bc/issues/58" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "is_bot": false, + "login": "firasuke", + "name": "Firas Khalil Khana" + }, + "body": "Hey there,\r\n\r\nI've encountered an error recently where attempting to cross-compile `bc` while using `CC` as the cross compiler and `HOSTCC` as the compiler and when passing `--prefix=/usr` as a configuration flag.\r\n\r\nIt appears that `bc` is searching for header files in `$PREFIX/include`, although the help message mentions that these options control the installation directories of bc files and not the directories header/library files are searched for.\r\n\r\nThe error disappears when I remove the `--prefix=/usr` flag and the installation defaults to `/usr/local` as there's no way to change it because `--prefix` causes an error.\r\n\r\nThe error is:\r\n\r\n```C\r\n /usr/include/bits/types/time_t.h:8:9: error: unknown type name '__time64_t'\r\n 8 | typedef __time64_t time_t;\r\n | ^~~~~~~~~~\r\n```\r\n\r\nI don't recall changing the configuration flags I use for `bc` since version 4.0, did the behavior of these flags change?\r\n\r\nThanks in advance!", + "closed": true, + "closedAt": "2022-09-14T07:40:47Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5KF-Ax", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "This looks like a bug in `configure.sh`. However, I need to know now to track it down.\r\n\r\nCan you tell me what the host system is, what the target system is, what the host compiler is, and what the target compiler is?", + "createdAt": "2022-09-12T00:19:32Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1243078705", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5KGmRk", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "The host system architecture tuple is `x86_64-unknown-linux-gnu` and the target architecture tuple is `x86_64-linux-musl`.\n\nThe host compiler `HOSTCC=gcc` and the target compiler is `CC=x86_64-linux-musl-gcc`.", + "createdAt": "2022-09-12T05:35:13Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1243243620", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5KJkBF", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "I thought this will might help narrow down the cause.\r\n\r\nThe last known working version that I tried using the same configuration flags and recipe file is version `5.2.5`, so my guess would be that the change happened after that release, possibly with the latest 6.0 release.", + "createdAt": "2022-09-12T16:52:51Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1244020805", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5KKJKJ", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "I think I found the [faulty commit](https://github.com/gavinhoward/bc/commit/c36b91b024e743edb45bf607cb3c2a9f28f0cc48).", + "createdAt": "2022-09-12T19:05:19Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1244172937", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5KM5Kx", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I think you did too.\r\n\r\nThat commit appears to have been made as exploration; I should have added more to the commit message. Nevertheless, it appears to not be necessary anymore because I tested the FreeBSD port without those changes, and it worked fine.\r\n\r\nSo I committed 2b65eb21cfc575fdb04a090c687bd102a80cc43c to erase the rest of that commit. Can you pull and test it?", + "createdAt": "2022-09-13T04:49:35Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1244893873", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5KP1Kn", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "I can confirm that this indeed 2b65eb21cfc575fdb04a090c687bd102a80cc43c fixed the issue.\r\n\r\nCan you release this fix in a new bugfix version?", + "createdAt": "2022-09-13T16:34:53Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1245663911", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5KQ_MW", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Wonderful!\r\n\r\nI'll release a bug fix version as soon as I have confirmation that this fix does not break FreeBSD. I hope that will be soon.", + "createdAt": "2022-09-13T21:22:20Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1245967126", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5KShlk", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Release `6.0.3` is out. I hope it fixes your issue.\r\n\r\nIf it doesn't, please feel free to reopen.", + "createdAt": "2022-09-14T07:40:47Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1246370148", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5KV1-D", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Yup, the new release solved the issue.\r\n\r\nThanks for your time and effort!", + "createdAt": "2022-09-14T19:59:10Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 2 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/56#issuecomment-1247240067", + "viewerDidAuthor": false + } + ], + "createdAt": "2022-09-11T13:48:03Z", + "id": "I_kwDOCL0xJc5RmIzx", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 56, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Specifying `--prefix` when cross-compiling", + "updatedAt": "2022-09-14T19:59:10Z", + "url": "https://github.com/gavinhoward/bc/issues/56" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjEzNTQxNjk5", + "is_bot": false, + "login": "depler", + "name": "" + }, + "body": "Hi! Here is my command line: `bc.exe --mathlib --leading-zeroes --no-line-length --scale=100`. \r\n\r\nLast argument is ignored by some reason. As I see it `--mathlib` is overriding `scale` value", + "closed": true, + "closedAt": "2022-08-30T15:32:46Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5IMQzl", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Nice to have you back! Sorry that I rejected your original feature request for `--scale`; I was wrong to do so.\r\n\r\nI have reproduced the issue. I think you are right with what is happening.\r\n\r\nI'll get to work on fixing it.", + "createdAt": "2022-08-10T19:29:45Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/55#issuecomment-1211174117", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5IMfdA", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Stupid GitHub automatically closing issues.\r\n\r\nCan you please pull the latest `master` and check if it does what you want? In the meantime, I'll get started on the release process.", + "createdAt": "2022-08-10T20:29:31Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/55#issuecomment-1211234112", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5IMmDI", + "author": { + "login": "depler" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Yep, it works now. Thanks!", + "createdAt": "2022-08-10T20:55:12Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/55#issuecomment-1211261128", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5IMmVH", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yay! Version `6.0.2` should come out in the next day or two. Thank you for your report!", + "createdAt": "2022-08-10T20:56:21Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/55#issuecomment-1211262279", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5Iclau", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "It's taking a little longer to get the release out. There are problems with FreeBSD. I need to fix those problems before I release. I'm sorry.\r\n\r\nI'll let you know when `6.0.2` is out.", + "createdAt": "2022-08-15T17:31:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/55#issuecomment-1215452846", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5JbEBZ", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "`6.0.2` is out.\r\n\r\nThat should fix the issue for you. Feel free to reopen if it does not.", + "createdAt": "2022-08-30T15:32:46Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "ROCKET", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/55#issuecomment-1231831129", + "viewerDidAuthor": true + } + ], + "createdAt": "2022-08-10T19:09:02Z", + "id": "I_kwDOCL0xJc5Pk4LF", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 55, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Scale argument is ignored", + "updatedAt": "2022-08-30T15:32:46Z", + "url": "https://github.com/gavinhoward/bc/issues/55" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjk3Njg2MjI=", + "is_bot": false, + "login": "drawkula", + "name": "yeti" + }, + "body": "Testing on Debian11...\r\n\r\nAfter configuring with `--prefix=/tmp/bctmpdir` and a successful build, `make install` fails:\r\n```\r\n/tmp/bc $ make install\r\n./scripts/locale_install.sh /usr/share/locale/%L/%N bc \r\nmkdir: cannot create directory ‘//usr/share/locale/de_DE.utf8’: Permission denied\r\nmkdir: cannot create directory ‘//usr/share/locale/de_DE.UTF-8’: Permission denied\r\nln: failed to create symbolic link '//usr/share/locale/de_DE.utf8/bc': No such file or directory\r\nmkdir: cannot create directory ‘//usr/share/locale/en_GB.utf8’: Permission denied\r\nln: failed to create symbolic link '//usr/share/locale/en_GB.utf8/bc': No such file or directory\r\nmkdir: cannot create directory ‘//usr/share/locale/en_US.utf8’: Permission denied\r\nln: failed to create symbolic link '//usr/share/locale/en_US.utf8/bc': No such file or directory\r\n./scripts/safe-install.sh -Dm644 manuals/bc.1 /tmp/bctmpdir/share/man/man1/bc.1\r\n./scripts/safe-install.sh -Dm644 manuals/dc.1 /tmp/bctmpdir/share/man/man1/dc.1\r\n./scripts/exec-install.sh /tmp/bctmpdir/bin \"\" \"/tmp/bc/bin\"\r\n```\r\nSome paths aren't adapted to fit the `--prefix=...` setting, some others fit the desired prefix setting.", + "closed": true, + "closedAt": "2022-07-23T16:23:02Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5HDhWA", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for this report. I will look into it. Thankfully, you caught me before I made a release, which is coming soon. This will be fixed in that release, even if I have to delay it.", + "createdAt": "2022-07-22T02:07:54Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1192105344", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5HDm8x", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I noticed that you are installing `bc` in a temp directory. Is this a holding directory for a package, which will then install `bc` in its true place? Or is it something eke?\r\n\r\nI ask because locales are *special* (meaning, they are bad). They *must* be installed in one, and only one place. That place is `$NLSPATH`, which is actually a format string (the funny looking path after `./scripts/locale_install.sh` in your pasted output), but it usually points to `/usr/share/locale` with separate directories for every locale and then separate files in those directories for each program.\r\n\r\nIf locales are not installed properly in `$NLSPATH`, they will not work. This means that locales *have to* ignore `--prefix`. It's stupid, but that's POSIX for you. (This behavior is mandated by the POSIX standard.)\r\n\r\nSo if you are trying to install `bc` in `/tmp/bctmpdir`, unfortunately, you still have to install the locale files in `$NLSPATH`, anyway.\r\n\r\nIf you're installing in `/tmp/bctmpdir` to later be installed in its proper place by a package manager, then you can use the `$DESTDIR` environment variable when running `configure.sh`. If you do this, then locales will be installed at `$DESTDIR/$NLSPATH`, while other files will be installed at `$DESTDIR/$PREFIX/`, where `$PREFIX` was passed in with `--prefix=$PREFIX`. Once that is done, and the package is made, then when users install the package, the locales will be put into the correct `$NLSPATH`.\r\n\r\nIf, however, you absolutely *must* override the behavior of installing the locales in `$NLSPATH`, you can set your own `$NLSPATH` when running `configure.sh`. The `%L` in the format specifier will be replaced by the locale name, and the `%N` will be replaced by the name of the program. You probably want both of those format specifiers in there.\r\n\r\nBut I do ***NOT*** recommend this because those installed locales will not work unless your `$NLSPATH` is set to that same format during in normal usage, which it appears it is not based on the format string in your output above.\r\n\r\nI hope that explains why things are the way they are. If that is the reason you are having problems, I am willing to help you figure out what would be best for you to do.\r\n\r\nHowever, if you still believe there is a bug in the install behavior, I'll do my best to find it.\r\n\r\nPlease let me know; I would like to help in any way I can.", + "createdAt": "2022-07-22T02:57:50Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1192128305", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5HD5j0", + "author": { + "login": "drawkula" + }, + "authorAssociation": "NONE", + "body": "I just repeated the build in `/tmp` for catching the log.\r\n\r\nOriginally I wanted to have `bc`/`dc` in an own \"bonsai subtree\" in `/opt/gavinhoward-bc` for not interfering with the default `dc`/`bc` of Debian and I typically manage `/opt` via an own account not being `root` (and not my standard user account). Had I tried this as `root` I easily could have overlooked the files falling out of that subtree. I think that may surprise other users in some other contexts too or will just drop the NLS files somewhere they do not even notice.\r\n\r\nMaybe dropping them into the desired prefix too and issuing a warning is an idea?\r\n\r\nWell, so far nobody complained (or noticed it?). Maybe I'm just the one with strange ideas...\r\n\r\nIn my case, if the NLS files are dropped into that subtree with the consequence that only english works, it would be good enough. And alternatively I can just deactivate NLS.\r\n\r\nThis issue just should be about the surprise that some paths don't respect `--prefix=...` and maybe about minimising surprises.\r\n\r\nAnd it definitely is not urgent.", + "createdAt": "2022-07-22T05:42:58Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1192204532", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5HFHU6", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I agree that the surprise is bad.\r\n\r\nThe problem with putting them into the desired prefix is that they just won't work, and then I'll get bug reports about it because I know several distros that depend on the current behavior.\r\n\r\nI think there are two things I can do. First, I can ensure that locales are *not* installed if NLS is disabled. I did that. (It already did it right, thankfully.) Second, I can add warnings. I added 7 in https://github.com/gavinhoward/bc/commit/b78e8e4cfb03b1135f03426b2a4aaf848b6c4d5d.\r\n\r\nActually, there's a third thing I can do: I can have `configure.sh` output a warning to the user when the prefix does *not* match with `$NLSPATH`. That has been done in https://github.com/gavinhoward/bc/commit/6dccfebe21c62d1c043387590d23a91b8499f68c.\r\n\r\nWhat else would you like me to do or think that I should do?", + "createdAt": "2022-07-22T12:29:32Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1192523066", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5HFar1", + "author": { + "login": "drawkula" + }, + "authorAssociation": "NONE", + "body": "Thanks!\r\nThe warnings at configure-time really should help everyone.\r\n\r\nMay I add a tiny \"last\" (for in this issue) wish?\r\nCan the warning be reformatted to fit an 80 columns terminal?\r\nReformatted to be slightly below 80 CpL it will not even take more lines.\r\n", + "createdAt": "2022-07-22T13:55:53Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1192602357", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5HF6Eg", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I meant to have 80 columns or less from the beginning. Whoops.\r\n\r\nIs https://github.com/gavinhoward/bc/commit/7cdddb8cc53fc1c08fe52fcf7fedbf7c84800c7c at 80 columns or less?", + "createdAt": "2022-07-22T16:12:18Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1192730912", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5HGEY4", + "author": { + "login": "drawkula" + }, + "authorAssociation": "NONE", + "body": "Without changing the indentation 77 chars are the maximal sub-80 width that fits.\r\n```\r\n*****************************************************************************\r\n\r\nWARNING: Locales will *NOT* be installed in $PREFIX (/opt/gavinhoward-bc).\r\n\r\n This is because they *MUST* be installed at a fixed location to even\r\n work, and that fixed location is $NLSPATH ().\r\n\r\n This location is *outside* of $PREFIX. If you do not wish to install\r\n locales outside of $PREFIX, you must disable NLS with the -N or the\r\n --disable-nls options.\r\n\r\n The author apologizes for the inconvenience, but the need to install\r\n the locales at a fixed location is mandated by POSIX. It is not\r\n possible for the author to change.\r\n\r\n*****************************************************************************\r\n```\r\n", + "createdAt": "2022-07-22T17:05:23Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1192773176", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5HHHpw", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Whoops. How does https://github.com/gavinhoward/bc/commit/6035d39a68e6078f578823fe407892930fe0d955 look?", + "createdAt": "2022-07-23T03:21:18Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1193048688", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5HHS2n", + "author": { + "login": "drawkula" + }, + "authorAssociation": "NONE", + "body": "Looks good:\r\n\r\n![20220723-092628](https://user-images.githubusercontent.com/9768622/180599430-95db0a76-f00d-4dc2-bb0a-e3d679acb9f2.png)\r\n\r\nWould it make sense not to show it when `configure` is run with `--disable-nls`?", + "createdAt": "2022-07-23T09:27:41Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1193094567", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5HHW-X", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Whoops.\r\n\r\nYou are absolutely right, of course. Does https://github.com/gavinhoward/bc/commit/8d8935e44bba15e96e8db83536ba54cd1deab398 fix the issue for you?", + "createdAt": "2022-07-23T11:39:44Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1193111447", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5HHXEq", + "author": { + "login": "drawkula" + }, + "authorAssociation": "NONE", + "body": "Perfect!\r\nThanks!", + "createdAt": "2022-07-23T11:43:19Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1193111850", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5HHgig", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You're welcome.\r\n\r\nSince it appears this issue has been resolved, I'm going to close it, but if you disagree, feel free to reopen it.", + "createdAt": "2022-07-23T16:23:02Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/53#issuecomment-1193150624", + "viewerDidAuthor": true + } + ], + "createdAt": "2022-07-21T21:12:21Z", + "id": "I_kwDOCL0xJc5OTyTx", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 53, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "--prefix=... is partially ignored?", + "updatedAt": "2022-07-23T16:23:02Z", + "url": "https://github.com/gavinhoward/bc/issues/53" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "is_bot": false, + "login": "firasuke", + "name": "Firas Khalil Khana" + }, + "body": "Is it possible to provide release tarballs in `gzip` format as well for limited systems?\r\n\r\nThanks!", + "closed": true, + "closedAt": "2022-04-30T22:23:08Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5CZjfO", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yes, absolutely.\r\n\r\nJust to be sure, you mean `.tar.gz` files, correct?", + "createdAt": "2022-04-30T14:08:36Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/52#issuecomment-1113995214", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5CZoVz", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Yup, if possible.", + "createdAt": "2022-04-30T16:25:20Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/52#issuecomment-1114015091", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5CZov4", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Not a problem. I have a new release coming out soon, and I will be sure to have `.tar.gz` files for it, as well as every future release.", + "createdAt": "2022-04-30T16:38:05Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/52#issuecomment-1114016760", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5CZ0M3", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Thanks!\r\n\r\nClosing this now.", + "createdAt": "2022-04-30T22:23:08Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/52#issuecomment-1114063671", + "viewerDidAuthor": false + } + ], + "createdAt": "2022-04-30T10:20:12Z", + "id": "I_kwDOCL0xJc5I0yHJ", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 52, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Release tarballs in `gzip` format", + "updatedAt": "2022-04-30T22:23:08Z", + "url": "https://github.com/gavinhoward/bc/issues/52" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjg4MjY0OTc5", + "is_bot": false, + "login": "DelilahHoare", + "name": "Delilah Hoare" + }, + "body": "Comments delimited by `/* */` and spanning multiple lines in files result in `Parse error: comment end cannot be found`. Such comments are accepted into stdin.", + "closed": true, + "closedAt": "2022-03-05T04:53:19Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc4_JAlq", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "That does sound like a bug.\r\n\r\nCould you send me the output of `bc --version`? Also, could you send me one or more files that cause it to happen?", + "createdAt": "2022-03-04T16:41:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/50#issuecomment-1059326314", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc4_KFB6", + "author": { + "login": "DelilahHoare" + }, + "authorAssociation": "NONE", + "body": "I should clarify that this only happens when using the `-f` flag; passing the file as an argument without that flag works.\r\n\r\n```\r\nbc 5.2.2\r\nCopyright (c) 2018-2021 Gavin D. Howard and contributors\r\nReport bugs at: https://git.yzena.com/gavin/bc\r\n\r\nThis is free software with ABSOLUTELY NO WARRANTY.\r\n```\r\n\r\n[testoneline.bc](https://github.com/gavinhoward/bc/files/8189282/testoneline.bc.txt) works,\r\n[testmultiline.bc](https://github.com/gavinhoward/bc/files/8189281/testmultiline.bc.txt) doesn't. \r\n[timeconst.bc](https://github.com/gavinhoward/bc/files/8189283/timeconst.bc.txt) comes from the linux source tree and also doesn't work.\r\n\r\n", + "createdAt": "2022-03-04T23:39:16Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/50#issuecomment-1059606650", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc4_KNpz", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you. I have confirmed the bug, and I'm working on debugging and a fix.", + "createdAt": "2022-03-05T01:30:06Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/50#issuecomment-1059641971", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc4_KWij", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Okay, I have found the problem and have committed a fix in d778d0b9177c75f207dca16b57974edbb5f9e15c and dbc4dc4c4e94712fa1d4800c81e84d6da18f5188.\r\n\r\nCould you pull and test the updated commits for me, to make sure they work for you? In the meantime, I'll prepare a release with the fix.", + "createdAt": "2022-03-05T04:03:17Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/50#issuecomment-1059678371", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc4_KYdX", + "author": { + "login": "DelilahHoare" + }, + "authorAssociation": "NONE", + "body": "It's working, thanks!", + "createdAt": "2022-03-05T04:53:19Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/50#issuecomment-1059686231", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc4_KYmm", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Great! I'll have version `5.2.3` out in a few days.", + "createdAt": "2022-03-05T04:56:48Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/50#issuecomment-1059686822", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc4_QD5x", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "`5.2.3` is out!", + "createdAt": "2022-03-07T21:53:42Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/50#issuecomment-1061174897", + "viewerDidAuthor": true + } + ], + "createdAt": "2022-03-04T00:24:45Z", + "id": "I_kwDOCL0xJc5FFokp", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 50, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Multi-line comments in files result in parse error", + "updatedAt": "2022-03-07T21:53:42Z", + "url": "https://github.com/gavinhoward/bc/issues/50" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjI3OTUyNTcx", + "is_bot": false, + "login": "oguz-ismail", + "name": "" + }, + "body": "Observe:\r\n```\r\n$ bc -s <:2\r\n\r\n$ bc -s < Also, if you want a separate option to remove line limits entirely, why?\r\n\r\nThis is exactly what I want - remove line limits entirely. Environment variables are not really useful on Windows unless you heavily use scripts. Usually you just run executable with desired variables to archive functionality (or using some config file as alternative).\r\n\r\n> However, could this be implemented by something like a function in the math library such that it's not a global option affecting all numbers? Would that be better? Should we have both?\r\n\r\nFor exactly my needs global option is preferable - I just want to see all numbers in range `-1 < 0 < 1` with zero.\r\n\r\nSo if you you think that environment variables are needed - feel free to implement both. Personally I don't like to use environment switches, command arguments are more convenient for me.\r\n", + "createdAt": "2021-09-27T18:06:20Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-928139801", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc43VIy5", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Good to know. Let me get on that and see if I can come up with something that works for you.", + "createdAt": "2021-09-27T21:15:44Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-928287929", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc43Vnrz", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I have added the two command line arguments (`z` and `C`). Could you please pull and test that they do what you want?\r\n\r\nI'm not done yet, but the rest of the work is not really going to impact what you want. It's a way to query the status of those things so that I can write library functions to print them in different ways.", + "createdAt": "2021-09-27T23:07:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-928414451", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc43XcED", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I've changed the options to `-z`/`--leading-zeroes` and `-L`/`--no-line-length`.", + "createdAt": "2021-09-28T06:21:27Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-928891139", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc43YQUv", + "author": { + "login": "depler" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Working fine, thanks! Can you please add new tests to windows scripts? It is just a new lines with filename of appropriate test in `tests_bc.bat` and `tests_dc.bat`.", + "createdAt": "2021-09-28T11:34:55Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-929105199", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc43Y4pl", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I'm sorry, I feel stupid, but I'm not sure what tests you want me to add. For these features? Or more tests in general?", + "createdAt": "2021-09-28T14:12:35Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-929270373", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc43ZFR5", + "author": { + "login": "depler" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "You've added this one (and may be something else): https://github.com/gavinhoward/bc/blob/master/tests/bc/leadingzero.txt\r\nWindows script doesn't know about it yet.", + "createdAt": "2021-09-28T15:09:39Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-929322105", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc43Zugt", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I see. I've added that test to the Windows bat file, but once again, can you pull and test for me? The reason is that it needs to run the test twice, and I want to be sure that works for you.", + "createdAt": "2021-09-28T17:54:31Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-929490989", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc43btxR", + "author": { + "login": "depler" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "A few changes are needed to differ `leadingzero` test from `leadingzero_z` : https://github.com/gavinhoward/bc/pull/44\r\nOtherwise it works fine.", + "createdAt": "2021-09-29T09:35:21Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-930012241", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc43crqE", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "#44 is merged. Is there anything else that needs to change for you?", + "createdAt": "2021-09-29T15:06:22Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-930265732", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc43d-9e", + "author": { + "login": "depler" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Nope. Thanks 👍", + "createdAt": "2021-09-29T23:02:01Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/43#issuecomment-930606942", + "viewerDidAuthor": false + } + ], + "createdAt": "2021-09-27T15:12:39Z", + "id": "I_kwDOCL0xJc48GQ_o", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 43, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Additional arguments", + "updatedAt": "2021-09-29T23:02:02Z", + "url": "https://github.com/gavinhoward/bc/issues/43" + }, + { + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ2Njg2NTY1", + "is_bot": false, + "login": "rubyFeedback", + "name": "" + }, + "body": "Hey there.\n\nI am using this configure line:\n\n CC=gcc ./configure --prefix=/home/Programs/Bc/7.0.3/ -G -O3 -r\n\nThis is what LFS (Linux from Scratch) recommends, but they use the conventional\n/usr/ prefix.\n\nNow interestingly, when I use the above, I get this result - a warning:\n\n WARNING: Locales will *NOT* be installed in $PREFIX (/home/Programs/Bc/7.0.3/).\n\n This is because they *MUST* be installed at a fixed location to even\n work, and that fixed location is $NLSPATH (/usr/share/locale/%L/%N).\n\n This location is *outside* of $PREFIX. If you do not wish to install\n locales outside of $PREFIX, you must disable NLS with the -N or the\n --disable-nls options.\n\n The author apologizes for the inconvenience, but the need to install\n the locales at a fixed location is mandated by POSIX, and it is not\n possible for the author to change that requirement.\n\nThe warning makes sense on traditional systems that use /usr/ as prefix.\nGoboLinux uses versioned appdirs instead. (I am not using GoboLinux\nright now, as they use /Programs/ dir; I use a slightly modified self-compiled\nvariant instead. At the least currently.)\n\nI do not believe that POSIX mandates that /usr/share/local/ must be in\nthe way described. For instance, I am about 100% certain that symlinks \nare allowed; at the least not forbidden, so I would reason that POSIX\ncan not be cited here. GoboLinux also uses symlinks by the way; they\neven still have /usr/ etc... despite versioned appdirs.\n\nMy question is: is this warning really needed? I can install all glibc-related\nlocales into /home/Programs/Glibc/2.41/share/local/ etc... and I do not\nget any warning about this. I believe the warning has had good intentions,\nbut the explanation is a bit shaky to me, and does not seem to account\nfor e. g. alternative ways to handle a linux system. Does POSIX really\nsay that symlinks are forbidden?\n\n(Also, is it true that locales must be at a fixed location per se? Because in\nprinciple, whatever is searching for the file, could also have another \nlocation. I use the example of symlinks, but even without symlinks we \nhave things such as --libdir and various other flags that allow fine-tuning\nof various things here. Even meson-build systems allow for quite some\nflexibility here.)\n", + "closed": true, + "closedAt": "2025-04-10T16:47:30Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6mkMkS", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yes, it is necessary. I have had more people ask why locales don't work than people like you asking why there is a warning. In fact, you're the first.\n\nTo remove the warning, set `NLSPATH` on the call to `configure`, like so:\n\n```\nCC=gcc NLSPATH=/home/Programs/Bc/7.0.3/%L/%N \\\n ./configure --prefix=/home/Programs/Bc/7.0.3/ -G -O3 -r\n```\n\nThen yes, you can set up symlinks; POSIX does allow that.", + "createdAt": "2025-04-10T16:47:30Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/90#issuecomment-2794506514", + "viewerDidAuthor": true + } + ], + "createdAt": "2025-04-10T11:40:10Z", + "id": "I_kwDOCL0xJc6x8Vgk", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 90, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "locales - is the warning for non-standard prefixes still necessary?", + "updatedAt": "2025-04-10T16:47:30Z", + "url": "https://github.com/gavinhoward/bc/issues/90" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOBxD9gQ", + "is_bot": false, + "login": "tungstengmd", + "name": "harlow foxworthy" + }, + "body": "this might have been excluded for a reason but can you add the \"!\" command back ? only reason being that i wanna clear the screen on certain events", + "closed": true, + "closedAt": "2025-04-18T20:43:24Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6n20Uz", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "It was excluded for a reason, and no, I will not add it. Have your shell clear the screen.", + "createdAt": "2025-04-18T20:43:23Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/91#issuecomment-2816165171", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6n25O1", + "author": { + "login": "tungstengmd" + }, + "authorAssociation": "NONE", + "body": "had a feeling, and damn you're fast", + "createdAt": "2025-04-18T20:58:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/91#issuecomment-2816185269", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6n3ljG", + "author": { + "login": "drawkula" + }, + "authorAssociation": "NONE", + "body": "You can hardcode the sequence to clear the screen.\nTo be a bit independent of the terminal, catching what `clear` will send may be the way.\n```\n$ clear | xxd -C -p -u -\n1B5B481B5B324A\n```\nSo this ...\n```\n$ clear | xxd -C -p -u - | dc -e '16i ? P'\n```\n... demonstrates it. Capture the value, in base10 if you prefer.\n\nTBH, I miss `!` too.\n", + "createdAt": "2025-04-18T23:55:14Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/91#issuecomment-2816366790", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6n4p5E", + "author": { + "login": "tungstengmd" + }, + "authorAssociation": "NONE", + "body": "oh wait you're onto something", + "createdAt": "2025-04-19T10:18:42Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/91#issuecomment-2816646724", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6n5dwl", + "author": { + "login": "tungstengmd" + }, + "authorAssociation": "NONE", + "body": "ok so basically you can just catch command output [as hex form] in xxd and input it to dc with the input radix as 16\ntherefore bypassing the need for `!`\nthanks @drawkula", + "createdAt": "2025-04-19T20:40:25Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/91#issuecomment-2816859173", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6n-PJv", + "author": { + "login": "drawkula" + }, + "authorAssociation": "NONE", + "body": "Sure you can read ™somewhere™ which control sequence your `$TERM` will use to clear the screen and then manually turn that into this string alike integer, but you'd have to do that anew everywhere you run your code attached to a differently behaving terminal emulation. So catching the sequence from `clear`, similar `tput` commands or directly looking it up in Terminfo or Termcap terminal definitions makes it portable and I assumed catching the output of `clear` would be the easiest of these alternatives.\n\nUsing `xxd` may limit portability a bit. That's probably the weak spot of this idea. There are alternatives, but if available, `xxd` seems to fit this job best.", + "createdAt": "2025-04-21T10:18:17Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/91#issuecomment-2818110063", + "viewerDidAuthor": false + } + ], + "createdAt": "2025-04-18T20:41:22Z", + "id": "I_kwDOCL0xJc6zJ4VJ", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 91, + "projectCards": [], + "projectItems": [], + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "add ! command", + "updatedAt": "2025-04-21T10:18:18Z", + "url": "https://github.com/gavinhoward/bc/issues/91" + }, + { + "assignees": [], + "author": { + "id": "U_kgDOB8YAUQ", + "is_bot": false, + "login": "tkb-github", + "name": "" + }, + "body": "With the release of RHEL 10 and Fedora 42, we’ve tried to build 7.0.3 on both. No issues with Clang.\n\nWith GCC (v14 for RHEL 10, v15 for Fedora 42), though, the build succeeded under the [epel-10-aarch64](https://download.copr.fedorainfracloud.org/results/tkbcopr/bc-gh/epel-10-aarch64/09140402-bc-gh/) chroot but failed with [epel-10-x86_64](https://download.copr.fedorainfracloud.org/results/tkbcopr/bc-gh/epel-10-x86_64/09140402-bc-gh/), [fedora-42-x86_64](https://download.copr.fedorainfracloud.org/results/tkbcopr/bc-gh/fedora-42-x86_64/09140402-bc-gh/) and [fedora-42-aarch64](https://download.copr.fedorainfracloud.org/results/tkbcopr/bc-gh/fedora-42-aarch64/09140402-bc-gh/). Here’s excerpts from the failed builds.\n\nepel-10-x86_64:\n\n```sh\n\ngcc -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=34 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -g -flto ./gen/dc_help.o ./gen/bc_help.o ./gen/lib.o ./gen/lib2.o src/args.o src/bc.o src/bc_lex.o src/bc_parse.o src/data.o src/dc.o src/dc_lex.o src/dc_parse.o src/file.o src/history.o src/lang.o src/lex.o src/main.o src/num.o src/opt.o src/parse.o src/program.o src/rand.o src/read.o src/vector.o src/vm.o -Wl,-z,relro -Wl,--as-needed -Wl,-z,pack-relative-relocs -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-hardened-ld-errors -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes -o bin/bc\n/usr/bin/ld: /tmp/ccMAotuu.ltrans0.ltrans.o: relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIE\n/usr/bin/ld: failed to set dynamic section sizes: bad value\ncollect2: error: ld returned 1 exit status\nmake: *** [Makefile:241: bin/bc] Error 1\nerror: Bad exit status from /var/tmp/rpm-tmp.G7xvMo (%build)\n\nRPM build errors:\n Bad exit status from /var/tmp/rpm-tmp.G7xvMo (%build)\n\n```\n\nfedora-42-x86_64\n\n```sh\n\ngcc -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=34 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -g -flto -o src/data.o -c ./src/data.c\nIn file included from /usr/lib/gcc/x86_64-redhat-linux/15/include/stdint.h:11,\n from ./include/status.h:46,\n from ./include/args.h:39,\n from ./src/data.c:39:\n./src/data.c:920:29: error: â^@^XfalseULâ^@^Y undeclared here (not in a function)\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~~\n./src/data.c:920:9: note: in expansion of macro â^@^XBC_PARSE_EXPR_ENTRYâ^@^Y\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~~~~~~~~~~~~~~~~\n./src/data.c:920:43: error: â^@^XtrueULâ^@^Y undeclared here (not in a function)\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~\n./src/data.c:920:9: note: in expansion of macro â^@^XBC_PARSE_EXPR_ENTRYâ^@^Y\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~~~~~~~~~~~~~~~~\nmake: *** [Makefile:668: src/data.o] Error 1\ngcc -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=34 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -g -flto -o src/dc.o -c ./src/dc.c\nmake: *** Waiting for unfinished jobs....\ngcc -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -I./include/ -flto -o ./gen/strgen ./gen/strgen.c\ngcc -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=34 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -g -flto -o src/bc_parse.o -c ./src/bc_parse.c\nerror: Bad exit status from /var/tmp/rpm-tmp.hRViel (%build)\n\nRPM build errors:\n Bad exit status from /var/tmp/rpm-tmp.hRViel (%build)\n\n```\n\nfedora-42-aarch64\n\n```sh\n\ngcc -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=34 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -g -flto -o src/data.o -c ./src/data.c\nIn file included from /usr/lib/gcc/aarch64-redhat-linux/15/include/stdint.h:11,\n from ./include/status.h:46,\n from ./include/args.h:39,\n from ./src/data.c:39:\n./src/data.c:920:29: error: â^@^XfalseULâ^@^Y undeclared here (not in a function)\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~~\n./src/data.c:920:9: note: in expansion of macro â^@^XBC_PARSE_EXPR_ENTRYâ^@^Y\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~~~~~~~~~~~~~~~~\n./src/data.c:920:43: error: â^@^XtrueULâ^@^Y undeclared here (not in a function)\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~\n./src/data.c:920:9: note: in expansion of macro â^@^XBC_PARSE_EXPR_ENTRYâ^@^Y\n 920 | BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),\n | ^~~~~~~~~~~~~~~~~~~\nmake: *** [Makefile:668: src/data.o] Error 1\nmake: *** Waiting for unfinished jobs....\ngcc -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=34 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -g -flto -o src/dc.o -c ./src/dc.c\ngcc -DBC_ENABLED=1 -DDC_ENABLED=1 -I./include/ -DBUILD_TYPE=A -DEXECPREFIX= -DMAINEXEC=bc -DBC_NUM_KARATSUBA_LEN=34 -DBC_ENABLE_NLS=1 -DBC_ENABLE_EXTRA_MATH=1 -DBC_ENABLE_HISTORY=1 -DBC_ENABLE_LIBRARY=0 -DBC_ENABLE_MEMCHECK=0 -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -DBC_DEFAULT_BANNER=0 -DBC_DEFAULT_SIGINT_RESET=1 -DBC_DEFAULT_TTY_MODE=1 -DBC_DEFAULT_PROMPT=1 -DBC_DEFAULT_EXPR_EXIT=1 -DBC_DEFAULT_DIGIT_CLAMP=0 -DDC_DEFAULT_SIGINT_RESET=1 -DDC_DEFAULT_TTY_MODE=0 -DDC_DEFAULT_PROMPT=0 -DDC_DEFAULT_EXPR_EXIT=1 -DDC_DEFAULT_DIGIT_CLAMP=0 -DBC_ENABLE_EDITLINE=0 -DBC_ENABLE_READLINE=0 -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -O3 -g -flto -o src/bc_parse.o -c ./src/bc_parse.c\ngcc -DBC_ENABLE_AFL=0 -DBC_ENABLE_OSSFUZZ=0 -I./include/ -flto -o ./gen/strgen ./gen/strgen.c\nerror: Bad exit status from /var/tmp/rpm-tmp.5cLuhE (%build)\n\nRPM build errors:\n Bad exit status from /var/tmp/rpm-tmp.5cLuhE (%build)\n\n```", + "closed": true, + "closedAt": "2025-06-08T22:18:49Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6v8kNF", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "For epel-10-x86_64, just add `-fPIE` to the `CFLAGS`, like so:\n\n```\n$ CFLAGS=-fpie ./configure.sh\n$ make\n```\n\nFor the other two, it appears `stdbool.h` does not properly define `false` and `true`.", + "createdAt": "2025-06-07T05:46:33Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/92#issuecomment-2951889733", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6wDPLy", + "author": { + "login": "tkb-github" + }, + "authorAssociation": "NONE", + "body": "Thanks!", + "createdAt": "2025-06-08T06:52:46Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/issues/92#issuecomment-2953638642", + "viewerDidAuthor": false + } + ], + "createdAt": "2025-06-07T03:51:28Z", + "id": "I_kwDOCL0xJc66WQa1", + "isPinned": false, + "labels": [], + "milestone": null, + "number": 92, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "state": "CLOSED", + "stateReason": "COMPLETED", + "title": "Build failures under RHEL 10 & Fedora 42 with GCC", + "updatedAt": "2025-06-08T22:18:49Z", + "url": "https://github.com/gavinhoward/bc/issues/92" + } +] diff --git a/project/github_prs.json b/project/github_prs.json new file mode 100644 index 00000000000..c2ca634c355 --- /dev/null +++ b/project/github_prs.json @@ -0,0 +1,7729 @@ +[ + { + "additions": 8, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjM5MjUwOQ==", + "is_bot": false, + "login": "bolknote", + "name": "Evgeny Stepanischev" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "9f34d2427d3f13c8e95b8485f5a6041789ffe400", + "body": "Code:\r\n`define a(*t[], t[]) {}`\r\n\r\nExpected result:\r\nParse error: function parameter or auto \"t[]\" already exists\r\n\r\nActual result:\r\nParses successfully (incorrect)\r\n\r\nThe interpreter now correctly rejects functions with duplicate parameter names, even when one is a reference array (*t[]).", + "changedFiles": 3, + "closed": true, + "closedAt": "2025-03-25T04:55:24Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6j52QL", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Oh, and another thing you could get credit for: if you create `tests/bc/errors/39.txt` and put your reproducer into it, I would accept that too.", + "createdAt": "2025-03-25T02:01:13Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/89#issuecomment-2749850635", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6j6h5M", + "author": { + "login": "bolknote" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Yes, no problem! I hope I’ve managed to cover everything needed. If something isn’t quite right, please let me know!", + "createdAt": "2025-03-25T04:16:09Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/89#issuecomment-2750029388", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6j6uej", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Looks good!", + "createdAt": "2025-03-25T04:55:31Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/89#issuecomment-2750080931", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2025-03-24T22:31:38Z", + "authors": [ + { + "email": "imbolk@gmail.com", + "id": "MDQ6VXNlcjM5MjUwOQ==", + "login": "bolknote", + "name": "Evgeny Stepanischev" + } + ], + "committedDate": "2025-03-24T22:31:38Z", + "messageBody": "", + "messageHeadline": "Fix duplicate param check for ref arrays", + "oid": "97756f3dc17b74c2a9c31488e8680a03f2f016eb" + }, + { + "authoredDate": "2025-03-25T04:07:25Z", + "authors": [ + { + "email": "imbolk@gmail.com", + "id": "MDQ6VXNlcjM5MjUwOQ==", + "login": "bolknote", + "name": "Evgeny Stepanischev" + } + ], + "committedDate": "2025-03-25T04:07:25Z", + "messageBody": "", + "messageHeadline": "Fix coding style", + "oid": "facbd16ceecdd72015abe21f6f4fe4d686b8e66b" + }, + { + "authoredDate": "2025-03-25T04:10:52Z", + "authors": [ + { + "email": "imbolk@gmail.com", + "id": "MDQ6VXNlcjM5MjUwOQ==", + "login": "bolknote", + "name": "Evgeny Stepanischev" + } + ], + "committedDate": "2025-03-25T04:10:52Z", + "messageBody": "This test ensures the interpreter correctly rejects functions with\nduplicate parameter names, even when one is a reference array (*t[]).", + "messageHeadline": "Add test for duplicate ref array parameters", + "oid": "a10b2fd6a2b77325dc981a8ce296d1c22c47ba0a" + } + ], + "createdAt": "2025-03-24T22:35:24Z", + "deletions": 2, + "files": [ + { + "path": "include/lang.h", + "additions": 4, + "deletions": 0 + }, + { + "path": "src/lang.c", + "additions": 3, + "deletions": 2 + }, + { + "path": "tests/bc/errors/39.txt", + "additions": 1, + "deletions": 0 + } + ], + "fullDatabaseId": "2414968976", + "headRefName": "master", + "headRefOid": "a10b2fd6a2b77325dc981a8ce296d1c22c47ba0a", + "headRepository": { + "id": "R_kgDOOARsdw", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjM5MjUwOQ==", + "name": "Evgeny Stepanischev", + "login": "bolknote" + }, + "id": "PR_kwDOCL0xJc6P8YCQ", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [ + { + "id": "", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I'll be upfront: I have accepted this because it passes the tests, and yes, it is a bug.\r\n\r\nHowever, if you run `./scripts/format.sh` on the repo before I do that, I won't have to adjust the style, which would hide your contribution for the `if` statement in `src/lang.c`.\r\n\r\nIf you could do that, I'd appreciate it, and you would get to keep your credit. If not, no problem; just tell me.", + "submittedAt": "2025-03-25T01:55:21Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "CHANGES_REQUESTED", + "commit": { + "oid": "" + } + } + ], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "0013dbee105fad63633ffe11240b18deb3d4bf9e" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2025-03-25T04:55:24Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 89, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "CHANGES_REQUESTED", + "reviewRequests": [], + "reviews": [ + { + "id": "PRR_kwDOCL0xJc6hpxI0", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I'll be upfront: I have accepted this because it passes the tests, and yes, it is a bug.\r\n\r\nHowever, if you run `./scripts/format.sh` on the repo before I do that, I won't have to adjust the style, which would hide your contribution for the `if` statement in `src/lang.c`.\r\n\r\nIf you could do that, I'd appreciate it, and you would get to keep your credit. If not, no problem; just tell me.", + "submittedAt": "2025-03-25T01:55:21Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "CHANGES_REQUESTED", + "commit": { + "oid": "97756f3dc17b74c2a9c31488e8680a03f2f016eb" + } + } + ], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Fix duplicate param check for ref arrays", + "updatedAt": "2025-03-25T04:55:32Z", + "url": "https://github.com/gavinhoward/bc/pull/89" + }, + { + "additions": 21, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjM5MjUwOQ==", + "is_bot": false, + "login": "bolknote", + "name": "Evgeny Stepanischev" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "79d5bffaa1c74888d62c47342e5b99a96797a8b5", + "body": "```\r\nsrand = 10\r\n\r\nfor (i = 0; i < 1000000; i++) {\r\n\ta = irand(100000000)\r\n\tb = irand(100000000)\r\n\r\n\t. = new_band(a, b)\r\n}\r\n```\r\n\r\ntime bc -l band.bc\r\n\r\nreal\t0m12.768s\r\nuser\t0m12.735s\r\nsys\t0m0.030s\r\n\r\n```\r\nsrand = 10\r\n\r\nfor (i = 0; i < 1000000; i++) {\r\n\ta = irand(100000000)\r\n\tb = irand(100000000)\r\n\r\n\t. = band(a, b)\r\n}\r\n```\r\ntime bc -l band.bc\r\n\r\nreal\t0m25.416s\r\nuser\t0m25.270s\r\nsys\t0m0.119s", + "changedFiles": 1, + "closed": true, + "closedAt": "2025-03-01T05:22:26Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6gdBpI", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "After convincing myself that your changes are correct, I accept them.\r\n\r\nHowever, I *am* going to adjust the style; the lib2 file gets put into the executable as a string, and I want to eliminate useless characters.", + "createdAt": "2025-03-01T05:22:29Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/88#issuecomment-2691963464", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2025-02-27T06:55:52Z", + "authors": [ + { + "email": "imbolk@gmail.com", + "id": "MDQ6VXNlcjM5MjUwOQ==", + "login": "bolknote", + "name": "Evgeny Stepanischev" + } + ], + "committedDate": "2025-02-27T06:55:52Z", + "messageBody": "", + "messageHeadline": "The band() function has been accelerated almost 2x", + "oid": "4112814ae6456dd8d0455a1a6b1d06f7ab78d59a" + } + ], + "createdAt": "2025-02-27T07:03:09Z", + "deletions": 19, + "files": [ + { + "path": "gen/lib2.bc", + "additions": 21, + "deletions": 19 + } + ], + "fullDatabaseId": "2361404896", + "headRefName": "master", + "headRefOid": "4112814ae6456dd8d0455a1a6b1d06f7ab78d59a", + "headRepository": { + "id": "R_kgDOOARsdw", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjM5MjUwOQ==", + "name": "Evgeny Stepanischev", + "login": "bolknote" + }, + "id": "PR_kwDOCL0xJc6MwC3g", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "6c12610da98b69e873702479e49218e2944437da" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2025-03-01T05:22:26Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 88, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "The band() function has been accelerated almost 2x", + "updatedAt": "2025-03-01T05:22:30Z", + "url": "https://github.com/gavinhoward/bc/pull/88" + }, + { + "additions": 8, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ5NzIxNTU=", + "is_bot": false, + "login": "dag-erling", + "name": "Dag-Erling Smørgrav" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "ca389548763c40852040e5c028b0869b47a3710f", + "body": "Previously, we would catch `SIGWINCH` and call `el_resize()` from the signal handler. This is unsafe and led to strange behavior such as terminating on second resize. The simplest solution is to let libedit handle `SIGWINCH` itself.\r\n\r\nThis reverts 56bb18255a24 and 89d6c3451a60 and removes all traces of `SIGWINCH` from bc itself, and instead sets the `EL_SIGNAL` flag on the editline context, which causes libedit to detect and handle terminal size changes internally.", + "changedFiles": 5, + "closed": true, + "closedAt": "2025-01-09T03:21:56Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6UKjDG", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for your contribution.\r\n\r\nHowever, I cannot accept it. The man page for libedit says that it installs its own signal handler for a set of signals, one of which is `SIGINT`, which `bc` needs to treat specially. So I cannot use `EL_SIGNAL`. If libedit only handled `SIGWINCH`, this would work.", + "createdAt": "2024-11-19T13:57:00Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/86#issuecomment-2485792966", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6UKzkD", + "author": { + "login": "dag-erling" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Did you even test my patch? It works just fine, because (except for `SIGWINCH` and `SIGCONT`) libedit restores the previous signal handler and re-posts the signal after cleaning up.", + "createdAt": "2024-11-19T14:24:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/86#issuecomment-2485860611", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6ULIip", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I tested it on macOS. It did not work with `SIGINT`. I do not have access to a Linux machine, but I will later in the day.\r\n\r\nBut I do not like depending on that behavior. Signals are finicky, and that could expose platform differences.", + "createdAt": "2024-11-19T14:56:46Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/86#issuecomment-2485946537", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6ULaEs", + "author": { + "login": "dag-erling" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "I developed the patch on macOS, it works perfectly fine there and on FreeBSD. If you have an issue with it, perhaps you can describe the symptoms so I can help you figure it out instead of dismissing it out of hand?", + "createdAt": "2024-11-19T15:22:57Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/86#issuecomment-2486018348", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6UMfC7", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Please give me some leniency. Testing it is not dismissing it out of hand. I am wary of making changes that may break things. And I have little time.\r\n\r\nHowever, in this case, I decided to test my code as well and found that it had the same problem: that multiple interrupts would not be handled. I found the fix, and it works for your code.\r\n\r\nIt make still take me time to test on Linux and FreeBSD, but this patch may still be viable.", + "createdAt": "2024-11-19T17:16:46Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/86#issuecomment-2486300859", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6Zugh4", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Tested on Linux, FreeBSD, and macOS. With my fix, it works. There should be a release out soon-ish.\r\n\r\nThank you for your patience.", + "createdAt": "2025-01-09T03:22:42Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/86#issuecomment-2579105912", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6aDHFg", + "author": { + "login": "dag-erling" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Thank you!", + "createdAt": "2025-01-10T22:18:03Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/86#issuecomment-2584506720", + "viewerDidAuthor": false + } + ], + "commits": [ + { + "authoredDate": "2024-11-12T11:50:39Z", + "authors": [ + { + "email": "des@des.dev", + "id": "MDQ6VXNlcjQ5NzIxNTU=", + "login": "dag-erling", + "name": "Dag-Erling Smørgrav" + } + ], + "committedDate": "2024-11-12T11:59:50Z", + "messageBody": "Previously, we would catch SIGWINCH and call el_resize() from the signal handler. This is unsafe and led to strange behavior such as terminating on second resize. The simplest solution is to let libedit handle SIGWINCH itself.\n\nThis reverts 56bb18255a24 and 89d6c3451a60 and removes all traces of SIGWINCH from bc itself, and instead sets the EL_SIGNAL flag on the editline context, which causes libedit to detect and handle terminal size changes internally.", + "messageHeadline": "Let libedit handle terminal size changes.", + "oid": "e671399e9dc92181219da87e3aa02d44a0b4a4c3" + } + ], + "createdAt": "2024-11-12T12:02:29Z", + "deletions": 79, + "files": [ + { + "path": "include/history.h", + "additions": 0, + "deletions": 24 + }, + { + "path": "include/status.h", + "additions": 0, + "deletions": 5 + }, + { + "path": "src/history.c", + "additions": 2, + "deletions": 12 + }, + { + "path": "src/read.c", + "additions": 6, + "deletions": 12 + }, + { + "path": "src/vm.c", + "additions": 0, + "deletions": 26 + } + ], + "fullDatabaseId": "2174734014", + "headRefName": "des/sigwinch", + "headRefOid": "e671399e9dc92181219da87e3aa02d44a0b4a4c3", + "headRepository": { + "id": "R_kgDONOIgRA", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjQ5NzIxNTU=", + "name": "Dag-Erling Smørgrav", + "login": "dag-erling" + }, + "id": "PR_kwDOCL0xJc6Bn86-", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "79d5bffaa1c74888d62c47342e5b99a96797a8b5" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2025-01-09T03:21:55Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 86, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Let libedit handle terminal size changes.", + "updatedAt": "2025-01-10T22:18:04Z", + "url": "https://github.com/gavinhoward/bc/pull/86" + }, + { + "additions": 12, + "assignees": [], + "author": { + "id": "U_kgDOCgjy1g", + "is_bot": false, + "login": "henke9600", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "c5b7724ee07daa729f0123c6024223b834de42e3", + "body": "It's possible that the warning being ignored wasn't enabled in the first place, so always enabling it again is wrong.\r\n\r\nIn practice, this resulted in unexpected -Wdisabled-macro-expansion warnings when compiling against musl libc.", + "changedFiles": 3, + "closed": true, + "closedAt": "2024-09-21T19:14:25Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6M-4FI", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I have no comments. You followed style, and I agree that this was a problem. In fact, I had been intending to fix it, but I kept forgetting.\r\n\r\nThe question now is whether I should release. Do you know of any musl-based distros that use this `bc`? If not, I may not worry about releasing.", + "createdAt": "2024-09-21T19:15:47Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/84#issuecomment-2365292872", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6M-6p8", + "author": { + "login": "henke9600" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Not sure. I use it in my hobby distro, but i can live with the warning :slightly_smiling_face: ", + "createdAt": "2024-09-21T19:57:46Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/84#issuecomment-2365303420", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6M_b08", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": ":)\r\n\r\nI think I'll do a release soonish for Gentoo's sake; technically, Gentoo users can use musl.", + "createdAt": "2024-09-22T03:16:02Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/84#issuecomment-2365439292", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc6NRQWz", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "`7.0.3` is out. I hope it works for you.", + "createdAt": "2024-09-24T04:12:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/84#issuecomment-2370110899", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2024-09-21T15:30:32Z", + "authors": [ + { + "email": "henrik@lxm.se", + "id": "U_kgDOCgjy1g", + "login": "henke9600", + "name": "Henrik Lindström" + } + ], + "committedDate": "2024-09-21T15:47:44Z", + "messageBody": "It's possible that the warning being ignored wasn't enabled in the first\nplace, so always enabling it again is wrong.\n\nIn practice, this resulted in unexpected -Wdisabled-macro-expansion warnings\nwhen compiling against musl libc.\n\nSigned-off-by: Henrik Lindström ", + "messageHeadline": "Don't unconditionally enable warnings after ignoring them", + "oid": "16c4f913ed0935a878ce2644aab2ccc0da05c8d0" + } + ], + "createdAt": "2024-09-21T15:49:45Z", + "deletions": 6, + "files": [ + { + "path": "src/file.c", + "additions": 2, + "deletions": 1 + }, + { + "path": "src/program.c", + "additions": 8, + "deletions": 4 + }, + { + "path": "src/vm.c", + "additions": 2, + "deletions": 1 + } + ], + "fullDatabaseId": "2084576864", + "headRefName": "master", + "headRefOid": "16c4f913ed0935a878ce2644aab2ccc0da05c8d0", + "headRepository": { + "id": "R_kgDOL0az5w", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "U_kgDOCgjy1g", + "login": "henke9600" + }, + "id": "PR_kwDOCL0xJc58QB5g", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "e5d675785383ce6142116243aa63d21e5afb54f7" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2024-09-21T19:14:25Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 84, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Don't unconditionally enable warnings after ignoring them", + "updatedAt": "2024-09-24T04:12:15Z", + "url": "https://github.com/gavinhoward/bc/pull/84" + }, + { + "additions": 1, + "assignees": [], + "author": { + "id": "U_kgDOBqIXaQ", + "is_bot": false, + "login": "GregTonoski", + "name": "Greg Tonoski" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "324c30985c0d3d6f918fe81f2d8750c0bd1c78b1", + "body": "", + "changedFiles": 1, + "closed": true, + "closedAt": "2024-08-31T18:15:37Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc6KdjgL", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for catching that!\r\n\r\nUnfortunately, `A.1.md` is actually generated from `bc.1.md.in`. I edited `bc.1.md.in` instead and regenerated the manpages.\r\n\r\nI wasn't able to set you as the author of the commit because I don't know your email address, but I will if you want.", + "createdAt": "2024-08-31T18:16:53Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/pull/81#issuecomment-2323003403", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2024-08-31T07:52:27Z", + "authors": [ + { + "email": "111286121+GregTonoski@users.noreply.github.com", + "id": "U_kgDOBqIXaQ", + "login": "GregTonoski", + "name": "Greg Tonoski" + } + ], + "committedDate": "2024-08-31T07:52:27Z", + "messageBody": "", + "messageHeadline": "Update A.1.md minor correction - number instead of integer", + "oid": "8269063d303979de8188f4810a1c6b070494e025" + } + ], + "createdAt": "2024-08-31T07:52:34Z", + "deletions": 1, + "files": [ + { + "path": "manuals/bc/A.1.md", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "2047601609", + "headRefName": "patch-1", + "headRefOid": "8269063d303979de8188f4810a1c6b070494e025", + "headRepository": { + "id": "R_kgDOMq13Zg", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "U_kgDOBqIXaQ", + "name": "Greg Tonoski", + "login": "GregTonoski" + }, + "id": "PR_kwDOCL0xJc56C-vJ", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 81, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "Update A.1.md minor correction - number instead of integer", + "updatedAt": "2024-08-31T18:16:54Z", + "url": "https://github.com/gavinhoward/bc/pull/81" + }, + { + "additions": 1, + "assignees": [], + "author": { + "id": "U_kgDOCgjy1g", + "is_bot": false, + "login": "henke9600", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "3278daef0079c20ccaed3a8666457c531dbe576b", + "body": "This avoids the `./configure.sh: 1693: [: unexpected operator` error when using dash.", + "changedFiles": 1, + "closed": true, + "closedAt": "2024-04-30T01:57:03Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc58OZbM", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Sorry for the wait.\r\n\r\nYes, you are correct that that is a bug. Yes, your fix is correct. Accepted without comment!\r\n\r\nThank you for your contribution!", + "createdAt": "2024-04-30T01:57:40Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/76#issuecomment-2084148940", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2024-04-28T16:12:24Z", + "authors": [ + { + "email": "henrik@lxm.se", + "id": "U_kgDOCgjy1g", + "login": "henke9600", + "name": "Henrik Lindström" + } + ], + "committedDate": "2024-04-28T16:12:24Z", + "messageBody": "", + "messageHeadline": "Make configure.sh posix compliant", + "oid": "938fc2cbcace3fb1fb353a5befff1b4a81180350" + } + ], + "createdAt": "2024-04-28T16:25:19Z", + "deletions": 1, + "files": [ + { + "path": "configure.sh", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "1844494404", + "headRefName": "master", + "headRefOid": "938fc2cbcace3fb1fb353a5befff1b4a81180350", + "headRepository": { + "id": "R_kgDOL0az5w", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "U_kgDOCgjy1g", + "login": "henke9600" + }, + "id": "PR_kwDOCL0xJc5t8MBE", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "59cf3b86eb4cafb6d7aa164d988a8c14c287e7f8" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2024-04-30T01:57:03Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 76, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Make configure.sh posix compliant", + "updatedAt": "2024-04-30T01:57:41Z", + "url": "https://github.com/gavinhoward/bc/pull/76" + }, + { + "additions": 1, + "assignees": [], + "author": { + "id": "U_kgDOB2enHg", + "is_bot": false, + "login": "naggamura", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "1a381d61b079fc3548d3e4dee3a8ccd9200a3f87", + "body": "Found a printing error.\r\nTry obase=2; 2^99; 2^100; 2^105; you'll get it right away.", + "changedFiles": 1, + "closed": true, + "closedAt": "2023-12-22T15:38:08Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5vVPQZ", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "You are correct; that is a bug.\r\n\r\nYour fix is correct; I got the condition backwards. Accepted without comment.\r\n\r\nSorry for taking so long, I struggle to read my own code; this is why I put in so many \"useless\" comments!\r\n\r\nAlso, I can think of another place that this *could have been* a problem and quickly tested it.\r\n\r\nThe problem is in printing in bases above base 16, where multiple characters may be printed for one digit.\r\n\r\nGuess what? I tested your fix after accepting it (I wanted your name in the Contributors list regardless), and your fix works for that too!\r\n\r\nTry this:\r\n\r\n```\r\n$ BC_LINE_LENGTH=77 bc\r\n>>> obase=128\r\n>>> 2^126\r\n 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000\r\n>>> quit\r\n```\r\n\r\nThat's what it is with the fix. Without, the bug shows:\r\n\r\n```\r\n$ BC_LINE_LENGTH=77 bc\r\n>>> obase=128\r\n>>> 2^126\r\n 001 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 00\\\r\n0\r\n>>> quit\r\n```\r\n\r\nI checked your fix with `BC_LINE_LENGTH=78` and `BC_LINE_LENGTH=76`, and your fix properly handles both.\r\n\r\nI am confident in your fix.\r\n\r\nAnyway, I'll start my release process and put out a release with your fix ASAP.", + "createdAt": "2023-12-22T15:53:14Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/74#issuecomment-1867838489", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5vWpvU", + "author": { + "login": "naggamura" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Oh I helped... ^^; I'm happy.\r\nI'm Jonathan Kim", + "createdAt": "2023-12-23T05:14:48Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/74#issuecomment-1868209108", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5vWqt8", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yes, you did! And your fix has now passed the release process untouched.\r\n\r\nPlease don't think I'm a jerk for your previous PR; I try to not be.\r\n\r\nI just have ridiculously high standards and personal weaknesses in programming. And an eccentric style.\r\n\r\nIn fact, I [don't accept contributions at all][1] in my [next project][2]. Nothing against people, but I really struggle with patches. It's so bad that I actually can't get a programming job because of that. If you work in the industry, you're doing better than me.\r\n\r\nAnd nice to meet you. :)\r\n\r\n[1]: https://git.yzena.com/Yzena/Yc#user-content-open-source-not-open-contribution\r\n[2]: https://git.yzena.com/Yzena/Yc", + "createdAt": "2023-12-23T05:37:53Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/74#issuecomment-1868213116", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2023-12-22T13:22:27Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-22T13:22:27Z", + "messageBody": "Try obase=2; 2^105;", + "messageHeadline": "Fixed printing error.", + "oid": "930cb2fd56d7851ecc1af3de16b4b7357b0b5ba8" + } + ], + "createdAt": "2023-12-22T13:25:36Z", + "deletions": 1, + "files": [ + { + "path": "src/num.c", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "1655098845", + "headRefName": "master", + "headRefOid": "930cb2fd56d7851ecc1af3de16b4b7357b0b5ba8", + "headRepository": null, + "headRepositoryOwner": { + "id": "U_kgDOB2enHg", + "login": "naggamura" + }, + "id": "PR_kwDOCL0xJc5ips3d", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "39bd2c5622167a3c092ca9e2c38886ff288ba508" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2023-12-22T15:38:08Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 74, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Fixed printing error.", + "updatedAt": "2023-12-23T05:37:55Z", + "url": "https://github.com/gavinhoward/bc/pull/74" + }, + { + "additions": 657, + "assignees": [], + "author": { + "id": "U_kgDOB2enHg", + "is_bot": false, + "login": "naggamura", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "fcbe9d68ccc964fda12457ebbf687a27f57ff31f", + "body": "I'm sorry I missed many things on last PR.\r\nI followed your instructions step by step.\r\n\r\nImproved SQRT needs no long division in iteration.\r\nOnly one long division is needed for compose an initial estimation.\r\n\r\nNo meaningful difference for small input.\r\n\r\nFor large input, about 2.4 times faster, no meaningful difference in memory usage.\r\n\r\nHere is the result for large input.\r\n\r\n( 'CC=clang CFLAGS=-flto ./configure -O3' is used for configuring. )\r\n[stat_c1.txt](https://github.com/gavinhoward/bc/files/13696239/stat_c1.txt)\r\n[stat_c4.txt](https://github.com/gavinhoward/bc/files/13696240/stat_c4.txt)\r\n\r\nsqrt1_large.txt : by your code.\r\nsqrt2_large.txt : by my code.\r\n\r\n---------------------------------\r\n\r\nElapsed time for large input.\r\n\r\nx ../../sqrt1_large.txt\r\n+ ../../sqrt2_large.txt\r\n+--------------------------------------------------------------------------------+\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x |\r\n| + x x|\r\n| ++ x xx|\r\n|+++ x xx|\r\n|+++ x xx|\r\n|+++ xxxx|\r\n|+++ xxxx|\r\n|+++ x xxxx|\r\n|+++ x xxxx|\r\n|+++ x xxxx|\r\n|++++ x xxxx|\r\n| A| |_A| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 87.84 91.81 90.215 90.3572 1.0769137\r\n+ 50 36.96 38.71 37.805 37.8088 0.44755408\r\nDifference at 99.5% confidence\r\n -52.5484 +/- 0.523644\r\n -58.1563% +/- 0.315605%\r\n (Student's t, pooled s = 0.824636)\r\n\r\n\r\n----------------------\r\n\r\n\r\nMemory for large input.\r\n\r\nx ../../sqrt1_large.txt\r\n+ ../../sqrt2_large.txt\r\n+--------------------------------------------------------------------------------+\r\n| + |\r\n| + x |\r\n| + x |\r\n| + + x x x |\r\n| + + + x x x |\r\n| + + ++ ++ xx x x x x x |\r\n|+ ++++ +++++ + +++ x xx x x x xx xxx xx|\r\n|+ + +++++++++++++++++ * + * x xxxxxxxxx xxxx xxxx xx|\r\n| |_______AM_______| |______M__A_________| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 5376 5596 5494 5508.96 51.80535\r\n+ 50 5184 5412 5302 5301.12 44.115174\r\nDifference at 99.5% confidence\r\n -207.84 +/- 30.5525\r\n -3.77276% +/- 0.542566%\r\n (Student's t, pooled s = 48.1141)\r\n\r\n\r\n- END -", + "changedFiles": 3, + "closed": true, + "closedAt": "2023-12-20T01:50:17Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5u0b9I", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Unfortunately, you still did not check everything. That's probably my fault because I didn't tell you everything.\r\n\r\nNevertheless, this is what I found this time:\r\n\r\n* `CC=clang ./configure -pDBG; make`, my standard debug build, failed to build.\r\n* `CC=clang ./configure -gO0; make; make test`, a less strict debug build, failed the test suite.\r\n* `CC=clang ./configure -pGDH; make`, my standard release build for myself, failed to build.\r\n* `CC=clang ./configure -pGNU; make; make test`, the standard release build for Linux, failed the test suite.\r\n* `CC=gcc ./configure -pGNU; make; make test`, the same standard Linux build but with `gcc`, also failed the test suite.\r\n* `CC=clang ./configure -pBSD; make; make test`, the standard release build for FreeBSD and friends, failed the test suite.\r\n* `CC=gcc ./configure -pBSD; make; make test`, the same standard FreeBSD build but with `gcc`, also failed the test suite.\r\n\r\nIn addition, what failed on the test suite was off by a lot; the result I got for all cases was:\r\n\r\n```\r\nRunning bc sqrt...FAIL!!!\r\n12c12\r\n< .0000000000000035071355833500363\r\n---\r\n> .8915580480000035071355833500363\r\nbc failed test sqrt\r\n```\r\n\r\nAs you can see, the numbers are the same, except at the beginning, which means that answer was about as far off as it could be.\r\n\r\nIn addition, when I ran this:\r\n\r\n```\r\n$ ./configure -gO0 -v\r\n$ make\r\n$ make test\r\n```\r\n\r\nwhich is a Valgrind-enabled build, I got this:\r\n\r\n```\r\nRunning bc sqrt...==47836== Memcheck, a memory error detector\r\n==47836== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.\r\n==47836== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info\r\n==47836== Command: bin/bc -lqc ./tests/bc/sqrt.txt\r\n==47836==\r\n==47836== Invalid write of size 8\r\n==47836== at 0x484C96E: memset (vg_replace_strmem.c:1386)\r\n==47836== by 0x12A28F: bc_int_elementary_mul (num.c:4274)\r\n==47836== by 0x1253AA: bc_int_k_mul (num.c:4327)\r\n==47836== by 0x124972: bc_num_sqrt (num.c:4636)\r\n==47836== by 0x13156F: bc_program_builtin (program.c:1990)\r\n==47836== by 0x12DB0C: bc_program_exec (program.c:3332)\r\n==47836== by 0x13D623: bc_vm_process (vm.c:1046)\r\n==47836== by 0x13CCA5: bc_vm_file (vm.c:1103)\r\n==47836== by 0x13C117: bc_vm_exec (vm.c:1498)\r\n==47836== by 0x13B4E1: bc_vm_boot (vm.c:1718)\r\n==47836== by 0x10C0CC: bc_main (bc.c:62)\r\n==47836== by 0x119995: main (main.c:108)\r\n==47836== Address 0x4aa2270 is 32 bytes inside a block of size 36 alloc'd\r\n==47836== at 0x4840784: malloc (vg_replace_malloc.c:442)\r\n==47836== by 0x13A4C3: bc_vm_malloc (vm.c:810)\r\n==47836== by 0x11BA76: bc_num_init (num.c:3368)\r\n==47836== by 0x1244B1: bc_num_sqrt (num.c:4567)\r\n==47836== by 0x13156F: bc_program_builtin (program.c:1990)\r\n==47836== by 0x12DB0C: bc_program_exec (program.c:3332)\r\n==47836== by 0x13D623: bc_vm_process (vm.c:1046)\r\n==47836== by 0x13CCA5: bc_vm_file (vm.c:1103)\r\n==47836== by 0x13C117: bc_vm_exec (vm.c:1498)\r\n==47836== by 0x13B4E1: bc_vm_boot (vm.c:1718)\r\n==47836== by 0x10C0CC: bc_main (bc.c:62)\r\n==47836== by 0x119995: main (main.c:108)\r\n==47836==\r\n==47836==\r\n==47836== HEAP SUMMARY:\r\n==47836== in use at exit: 0 bytes in 0 blocks\r\n==47836== total heap usage: 1,633 allocs, 1,633 frees, 331,419 bytes allocated\r\n==47836==\r\n==47836== All heap blocks were freed -- no leaks are possible\r\n==47836==\r\n==47836== For lists of detected and suppressed errors, rerun with: -s\r\n==47836== ERROR SUMMARY: 8 errors from 1 contexts (suppressed: 0 from 0)\r\nFAIL!!!\r\nbc failed test 'sqrt' with error code 100\r\n```\r\n\r\nThat needs to be fixed, both the out-of-bounds write and the unaligned write.\r\n\r\nIf you're wondering how much testing I do, do this:\r\n\r\n* Create two clones of your branch in separate directories, which I will call `bc1/` and `bc2/`.\r\n* In `bc1/`, run `scripts/release.sh 1 1 1 1 0 1 0 0 1 0 1 0 1 0 0 1 1`.\r\n* In `bc2/`, run `scripts/release.sh 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 1`.\r\n* Run them both in separate terminals and at the same time.\r\n* Leave it overnight.\r\n\r\nYep, you heard that last bit right: my full test run is an overnight thing. And I run both because one does `clang`, and one does `gcc`.\r\n\r\nMoving on to benchmarks, I ran\r\n\r\n```\r\n$ CC=clang CFLAGS=-flto ./configure -O3\r\n$ make\r\n```\r\n\r\nin both branches. Then I ran\r\n\r\n```\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_sqrt_small > ../sqrt2_small.txt\r\n```\r\n\r\nin your branch, copied `benchmarks/bc/newton_raphson_sqrt_small.txt` to my branch and ran\r\n\r\n```\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_sqrt_small > ../sqrt1_small.txt\r\n```\r\n\r\nThese are my results:\r\n\r\n```\r\n$ ./scripts/ministat -w 80 -c99.5 -C1 ../sqrt1_small.txt ../sqrt2_small.txt\r\nx ../sqrt1_small.txt\r\n+ ../sqrt2_small.txt\r\n+--------------------------------------------------------------------------------+\r\n| + x |\r\n| + x x |\r\n| + x x |\r\n| + + + x x |\r\n| + + + x x x |\r\n| + + + + x x x |\r\n| + + + + x x x |\r\n| + + + + x x x |\r\n| + + + + x x x |\r\n| + + + + + x x x x x x |\r\n| + + + + + + x x x x x x x |\r\n| + + + + + + x x x x x x x |\r\n|+ + + + + + + * x x x x x x x|\r\n| |________A_M_____| |________MA________| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 1.45 1.52 1.48 1.4806 0.016463937\r\n+ 50 1.38 1.45 1.42 1.4164 0.015220824\r\nDifference at 99.5% confidence\r\n -0.0642 +/- 0.0100677\r\n -4.33608% +/- 0.664237%\r\n (Student's t, pooled s = 0.0158546)\r\n$ ./scripts/ministat -w 80 -c99.5 -C4 ../sqrt1_small.txt ../sqrt2_small.txt\r\nx ../sqrt1_small.txt\r\n+ ../sqrt2_small.txt\r\n+--------------------------------------------------------------------------------+\r\n| + |\r\n| + |\r\n| x + |\r\n| x x + |\r\n| x x + + |\r\n| x x +x + + + |\r\n| x + xx +x + x + + |\r\n| x *+ xx *x++ xx + + + |\r\n| xx +*+xxxx x**++ xx + + + |\r\n|x x xx +*+xxxx x***++xx*x+++++ + ++|\r\n| |__________A_|_______M|A_________| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 18956 19244 19168 19168.16 57.880722\r\n+ 50 19144 19376 19224 19232.88 54.73373\r\nDifference at 99.5% confidence\r\n 64.72 +/- 35.769\r\n 0.337643% +/- 0.186939%\r\n (Student's t, pooled s = 56.3292)\r\n```\r\n\r\nYours was slightly faster and used slightly more memory.\r\n\r\nI ran the same benchmark for large, but only for one sample each, and my numbers say that yours are accurate for that benchmark.\r\n\r\nHowever, I cannot accept code that fails tests or has memory bugs. In addition, because of the test failures, you can expect that I will run a lot more tests on your code before I accept.\r\n\r\nSo I won't close this PR, but you need to fix the problems above (by running that `release.sh` script both ways and fixing every problem) before I'll look at it again.\r\n\r\nAlso, I can't understand `sqrt_2.png`. I can follow `sqrt_1.png`, but I need you to redo `sqrt_2.png` because I also won't accept the code if I don't understand it.", + "createdAt": "2023-12-17T18:09:30Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/73#issuecomment-1859239752", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5u10BR", + "author": { + "login": "naggamura" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "BcNum.len is managed as tight as possible. So clearing upper digits is needed for like sqrt(0.000...000xyz...) \r\nPassed 'make test'\r\n---", + "createdAt": "2023-12-18T05:52:00Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/73#issuecomment-1859600465", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5u12rZ", + "author": { + "login": "naggamura" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Last push was not the latest version. Pushed again.\r\n\r\nAnyway, test again and passed all tests.\r\n\r\n...\r\n==5965== \r\n==5965== HEAP SUMMARY:\r\n==5965== in use at exit: 0 bytes in 0 blocks\r\n==5965== total heap usage: 1,520 allocs, 1,520 frees, 205,685 bytes allocated\r\n==5965== \r\n==5965== All heap blocks were freed -- no leaks are possible\r\n==5965== \r\n==5965== For counts of detected and suppressed errors, rerun with: -v\r\n==5965== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)\r\npass\r\nRunning bc directory test...pass\r\nRunning bc binary file test...pass\r\nRunning bc binary stdin test...pass\r\nRunning bc limits tests...pass\r\n\r\nAll bc tests passed.\r\n\r\n...\r\n...\r\n\r\n==6927== \r\n==6927== HEAP SUMMARY:\r\n==6927== in use at exit: 0 bytes in 0 blocks\r\n==6927== total heap usage: 73 allocs, 73 frees, 37,886 bytes allocated\r\n==6927== \r\n==6927== All heap blocks were freed -- no leaks are possible\r\n==6927== \r\n==6927== For counts of detected and suppressed errors, rerun with: -v\r\n==6927== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)\r\npass\r\nRunning dc directory test...pass\r\nRunning dc binary file test...pass\r\nRunning dc binary stdin test...pass\r\n\r\nAll dc tests passed.\r\n\r\n***********************************************************************\r\n\r\n----", + "createdAt": "2023-12-18T06:05:29Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/73#issuecomment-1859611353", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5u3LdX", + "author": { + "login": "naggamura" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Doing scripts/release.sh test...", + "createdAt": "2023-12-18T09:47:53Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/73#issuecomment-1859958615", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5u_Gjj", + "author": { + "login": "naggamura" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Passed the tests.\r\n\r\nBenchmarks\r\n\r\n[stat_small_c1.txt](https://github.com/gavinhoward/bc/files/13712108/stat_small_c1.txt)\r\n[stat_small_c4.txt](https://github.com/gavinhoward/bc/files/13712109/stat_small_c4.txt)\r\n[stat_large_c1.txt](https://github.com/gavinhoward/bc/files/13712110/stat_large_c1.txt)\r\n[stat_large_c4.txt](https://github.com/gavinhoward/bc/files/13712111/stat_large_c4.txt)\r\n", + "createdAt": "2023-12-19T03:09:54Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/73#issuecomment-1862035683", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5vCDYq", + "author": { + "login": "naggamura" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "sqrt_2.png updated.", + "createdAt": "2023-12-19T13:58:49Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/73#issuecomment-1862809130", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5vFhZX", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I have spent two full days on this since the last time I sent a message. I cannot spend any more time on this; I have a project to finish and a hard deadline.\r\n\r\nSo I have to make a final decision, which is to reject this. Thank you for your contribution, but I guess I don't want it.\r\n\r\nThere are several reasons why:\r\n\r\n* Your code still contains debug code.\r\n* You created your own functions to do things when functions to do those things already exist, which shows lack of research again. And duplication.\r\n* Your proof looks wrong to me, or I still can't understand it.\r\n* Your code passes the test suite, but it did not pass another set of tests I threw at it.\r\n* This is purely a performance PR, which is not really important to me right now.\r\n\r\nBut most of all, and this is nothing against you, I just can't read other people's code. I am unable to build a theory of mind, and this extends to reading code written by other people.\r\n\r\nThere is a reason I tend to do things by myself; I can't work on the code otherwise.\r\n\r\nSo I'm afraid I have run out of time and desire. Sorry.", + "createdAt": "2023-12-20T01:50:17Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/73#issuecomment-1863718487", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2023-12-17T12:30:19Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-17T12:30:19Z", + "messageBody": "", + "messageHeadline": "New bc_num_sqrt function needs only one long division.", + "oid": "a8821844d9f05df15fde8bed92332226e147b151" + }, + { + "authoredDate": "2023-12-18T02:46:18Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-18T02:46:18Z", + "messageBody": "Passed 'sqrt test'", + "messageHeadline": "SQRT fix: post process for numbers like 0.000000...000000xyz...", + "oid": "a4e27bb46a0fc9dc59e51ba5de153b6f2fe55f5d" + }, + { + "authoredDate": "2023-12-18T05:46:38Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-18T05:46:38Z", + "messageBody": "", + "messageHeadline": "SQRT: fixed memory bug. passed 'make test'", + "oid": "f4f8cf72d513f2986bb477d10bcd0fcb520a0e7e" + }, + { + "authoredDate": "2023-12-18T06:01:30Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-18T06:01:30Z", + "messageBody": "", + "messageHeadline": "Commit missed!!! fix again.", + "oid": "1faa1296390f5e689d78c28fa9b434516f47c15d" + }, + { + "authoredDate": "2023-12-18T09:22:18Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-18T09:22:18Z", + "messageBody": "…r running release.sh", + "messageHeadline": "Removed unused variables, explicit type conversion in assignments, fo…", + "oid": "fb9d7b88c60ecdb7ce8bdfe8a11e23d09b2342fb" + }, + { + "authoredDate": "2023-12-18T13:17:09Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-18T13:17:09Z", + "messageBody": "…unning release.sh.\n\nRunning release.sh for this commit now...", + "messageHeadline": "Fixed memory warning(passing NULL with zero length to memcpy) while r…", + "oid": "9f171378fe38619d032107d388eef06519dde4a7" + }, + { + "authoredDate": "2023-12-19T03:08:34Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-19T03:08:34Z", + "messageBody": "…old one!)\n\n2. Passed Valgrind memory test.\n./configure -gO0 -v\nmake\nmake test\n\n3. Passed\nscripts/release.sh 1 1 1 0 1 0 1 0 1 0 1 0 0 1 1 1 1\non Ubuntu 18.04.2 LTS", + "messageHeadline": "1. Simple multiplication modified based on Gavin's (much better than …", + "oid": "2b3616586454f315a5014360f7f7d5d36f10bd9a" + }, + { + "authoredDate": "2023-12-19T13:57:21Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-19T13:57:21Z", + "messageBody": "", + "messageHeadline": "Proof related to sqrt approximation updated.", + "oid": "2d7b8fe4efe528076a568b0f174c35a53e47ae93" + } + ], + "createdAt": "2023-12-17T13:16:03Z", + "deletions": 72, + "files": [ + { + "path": "sqrt_1.png", + "additions": 0, + "deletions": 0 + }, + { + "path": "sqrt_2.png", + "additions": 0, + "deletions": 0 + }, + { + "path": "src/num.c", + "additions": 657, + "deletions": 72 + } + ], + "fullDatabaseId": "1647316989", + "headRefName": "master", + "headRefOid": "2d7b8fe4efe528076a568b0f174c35a53e47ae93", + "headRepository": null, + "headRepositoryOwner": { + "id": "U_kgDOB2enHg", + "login": "naggamura" + }, + "id": "PR_kwDOCL0xJc5iMA_9", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 73, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "New bc_num_sqrt function needs only one long division.", + "updatedAt": "2023-12-20T01:50:17Z", + "url": "https://github.com/gavinhoward/bc/pull/73" + }, + { + "additions": 831, + "assignees": [], + "author": { + "id": "U_kgDOB2enHg", + "is_bot": false, + "login": "naggamura", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "5ee6a05918bd8341a7ed97d6594862ad5d713557", + "body": "Newton-Raphson approximation is applied to division and sqrt.\r\nTry 5^1000000 / 2^1000000 and sort(5^999999)\r\n", + "changedFiles": 3, + "closed": true, + "closedAt": "2023-12-14T04:47:11Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5uku2Q", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for your PR. I have some comments.\r\n\r\n* If you run `CC=clang ./configure.sh -pDBG; make`, my regular debug build, the build fails.\r\n* If you run `CC=clang ./configure.sh -pGDH; make`, my regular release build, the build fails.\r\n* If you run `CC=gcc CFLAGS=\"-pedantic -Wextra -Werror\" ./configure -O3; make`, the build fails.\r\n* If you run `CC=clang ./configure -gO3; make; make test`, a release build with debug information, the build succeeds, but the test suite fails on an assert.\r\n* You have functions that have reserved names (names that begin with an underscore); using those names is undefined behavior.\r\n* You did not follow my style even though there is a script (`scripts/format.sh`) that will style the code for you.\r\n\r\nIn addition, I can unfortunately tell that you did no research into my `bc`. If you had, you would know that [I already use Newton-Raphson for `sqrt()`][1].\r\n\r\nHowever, all of that could be safely discarded if the code shows promise. So I wrote [benchmarks to test your new code][2].\r\n\r\nI ran these commands with my code:\r\n\r\n```\r\n$ CC=clang CFLAGS=-flto ./configure -O3\r\n$ make\r\n```\r\n\r\nThen I ran the benchmarks as follows:\r\n\r\n```\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_div_small > ../div1_small.txt\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_div_large > ../div1_large.txt\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_sqrt_small > ../sqrt1_small.txt\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_sqrt_large > ../sqrt1_large.txt\r\n```\r\n\r\nThen I repeated the steps with your code:\r\n\r\n```\r\n$ CC=clang CFLAGS=-flto ./configure -O3\r\n$ make\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_div_small > ../div2_small.txt\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_div_large > ../div2_large.txt\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_sqrt_small > ../sqrt2_small.txt\r\n$ ./scripts/benchmark.sh -p1 -n50 bc newton_raphson_sqrt_large > ../sqrt2_large.txt\r\n```\r\n\r\nThe `small` benchmarks test the operation on \"small\" numbers (below `2^64`), and the `large` benchmarks test the operation on large numbers (a small number to a power up to 1,000,000).\r\n\r\nTo test how your code did, I used `ministat` in the repo, so I ran this:\r\n\r\n```\r\n$ make ministat\r\n```\r\n\r\nThen to test the time difference on `div_small`, I ran the following:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c95 -C1 ../div1_small.txt ../div2_small.txt\r\nx ../div1_small.txt\r\n+ ../div2_small.txt\r\n+--------------------------------------------------------------------------------+\r\n| + x |\r\n| + + x * |\r\n| + + * * x |\r\n| + * * * x |\r\n| + * * * x |\r\n| + * * * x |\r\n| * * * * x + |\r\n| * * * * * x + x |\r\n|* * * * * * x * + x |\r\n|* * * * * * * * * x x + +|\r\n||____|____M_AA______|___| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 3.41 3.52 3.45 3.4504 0.024071323\r\n+ 50 3.41 3.67 3.44 3.4484 0.039967334\r\nNo difference proven at 95.0% confidence\r\n```\r\n\r\nAs you can tell, there's no difference at the lowest confidence I can accept.\r\n\r\nTo test the memory difference (max RSS) for `div_small`, I ran the following:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c95 -C4 ../div1_small.txt ../div2_small.txt\r\nx ../div1_small.txt\r\n+ ../div2_small.txt\r\n+--------------------------------------------------------------------------------+\r\n| x x x+ + + x +xx xx ++ |\r\n| x x + x * x+ +++ ++ x x *+ +xx xx ++ + x + |\r\n|xx x +++ + + x x*x x* *++ ++ x x +x ** +** ** x++ +* +x + +xx ++|\r\n| |_____|_____________A____A_M___________|___| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 34792 35000 34912 34896.88 55.262136\r\n+ 50 34808 35016 34916 34910 52.956663\r\nNo difference proven at 95.0% confidence\r\n```\r\n\r\nNo memory difference. Cool.\r\n\r\nFor the elapsed time for `div_large`:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c99.5 -C1 ../div1_large.txt ../div2_large.txt\r\nx ../div1_large.txt\r\n+ ../div2_large.txt\r\n+--------------------------------------------------------------------------------+\r\n| x + |\r\n| x ++ |\r\n| x ++ |\r\n| x ++ |\r\n| x ++ |\r\n| x ++ |\r\n| x ++ |\r\n| x ++ |\r\n| x ++ |\r\n| x ++ |\r\n| xx ++ |\r\n| xx ++ |\r\n| xx ++ |\r\n| xx ++ |\r\n| xx ++ |\r\n| xx +++ |\r\n| xx ++++ |\r\n| xx ++++ |\r\n| xxx ++++ |\r\n| xxx x ++++++|\r\n||____MA_____| |A| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 13.72 21.71 13.845 14.013 1.1141964\r\n+ 50 26.7 27.64 27.005 27.0158 0.17722452\r\nDifference at 99.5% confidence\r\n 13.0028 +/- 0.506578\r\n 92.791% +/- 6.90636%\r\n (Student's t, pooled s = 0.79776)\r\n```\r\n\r\nAs you can see, there *is* a difference, with *99.5% confidence*, but in favor of the *old code*. In fact, if not for the one outlier, your code would be twice as slow.\r\n\r\nAnd if we look at the max RSS difference for `div_large`:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c99.5 -C4 ../div1_large.txt ../div2_large.txt\r\nx ../div1_large.txt\r\n+ ../div2_large.txt\r\n+--------------------------------------------------------------------------------+\r\n| + |\r\n| + |\r\n| + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| xx + |\r\n| xx ++|\r\n| xx +++|\r\n|xxx +++|\r\n|xxx +++|\r\n|xxx +++|\r\n|xxx +++|\r\n|xxx +++|\r\n|xxx +++|\r\n|xxx x +++|\r\n|xxxxx +++|\r\n||A| |A||\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 8716 8968 8796 8802.72 57.549638\r\n+ 50 13812 13960 13888 13890.08 41.837314\r\nDifference at 99.5% confidence\r\n 5087.36 +/- 31.9473\r\n 57.793% +/- 0.51%\r\n (Student's t, pooled s = 50.3106)\r\n```\r\n\r\nYour code uses 50% more memory, with 99.5% confidence.\r\n\r\nMoving onto `sqrt_small`, for elapsed time, I got this:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c99.5 -C1 ../sqrt1_small.txt ../sqrt2_small.txt\r\nx ../sqrt1_small.txt\r\n+ ../sqrt2_small.txt\r\n+--------------------------------------------------------------------------------+\r\n| x + |\r\n| xx + |\r\n| xx + |\r\n| xx + |\r\n| xx + + |\r\n| xx ++++ |\r\n| xx ++++ |\r\n|xxx ++++ |\r\n|xxx ++++ |\r\n|xxxx +++++ |\r\n|xxxx +++++ |\r\n|xxxx +++++ |\r\n|xxxxx +++++ |\r\n|xxxxx x +++++++ +|\r\n| MA| |_A_| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 1.47 1.6 1.5 1.5072 0.023822473\r\n+ 50 3.07 3.26 3.14 3.1452 0.036153866\r\nDifference at 99.5% confidence\r\n 1.638 +/- 0.0194408\r\n 108.678% +/- 1.83123%\r\n (Student's t, pooled s = 0.0306155)\r\n```\r\n\r\nYour code is twice as slow with 99.5% confidence.\r\n\r\nFor memory on `sqrt_small`, I got this:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c99.5 -C4 ../sqrt1_small.txt ../sqrt2_small.txt\r\nx ../sqrt1_small.txt\r\n+ ../sqrt2_small.txt\r\n+--------------------------------------------------------------------------------+\r\n| xx + x |\r\n| x xx + x x ++ |\r\n| x x x xx + + x x ++ |\r\n| x xxxx x xxx++ + x x +x x +++ ++ + |\r\n|xx + x x + + xxxxx + + +* *xx***+++ x+xx++***++++ ++++ ++++|\r\n| |_____________|__M__________|A_M____________| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 18964 19252 19176 19160.4 68.353224\r\n+ 50 19004 19344 19242 19231.68 71.990203\r\nDifference at 99.5% confidence\r\n 71.28 +/- 44.574\r\n 0.372017% +/- 0.233047%\r\n (Student's t, pooled s = 70.1953)\r\n```\r\n\r\nSo there's a small increase of memory in your code, even at 99.5% confidence, but that's small enough that I can ignore it.\r\n\r\nFor time on `sqrt_large`, I got this:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c99.5 -C1 ../sqrt1_large.txt ../sqrt2_large.txt\r\nx ../sqrt1_large.txt\r\n+ ../sqrt2_large.txt\r\n+--------------------------------------------------------------------------------+\r\n| xx + |\r\n| xx ++ |\r\n| xx +++ |\r\n| xx +++ |\r\n| xx +++ |\r\n| xx +++ |\r\n| xx ++++ |\r\n| xx ++++ |\r\n| xxx +++++ |\r\n|xxxx +++++ |\r\n|xxxx +++++ |\r\n|xxxx +++++ |\r\n|xxxxx +++++++|\r\n| |A| |A_| |\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 176.9 184.63 180.565 180.403 1.6383681\r\n+ 50 327.42 339.26 331.24 331.3832 2.8256482\r\nDifference at 99.5% confidence\r\n 150.98 +/- 1.4666\r\n 83.6905% +/- 1.02747%\r\n (Student's t, pooled s = 2.3096)\r\n```\r\n\r\nYour code is *almost* twice as slow at 99.5% confidence.\r\n\r\nFor memory on `sqrt_large`, I got this:\r\n\r\n```\r\n$ ./scripts/ministat -w80 -c99.5 -C4 ../sqrt1_large.txt ../sqrt2_large.txt\r\nx ../sqrt1_large.txt\r\n+ ../sqrt2_large.txt\r\n+--------------------------------------------------------------------------------+\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x + |\r\n| x ++|\r\n| x ++|\r\n| x ++|\r\n| x ++|\r\n| x ++|\r\n| x ++|\r\n| x ++|\r\n|xx ++|\r\n|xx ++|\r\n|xx ++|\r\n|xx ++|\r\n|xx ++|\r\n|xxx ++|\r\n|xxx ++|\r\n||A A||\r\n+--------------------------------------------------------------------------------+\r\n N Min Max Median Avg Stddev\r\nx 50 6952 7156 7044 7046.48 42.561955\r\n+ 50 15412 15568 15496 15485.84 51.175313\r\nDifference at 99.5% confidence\r\n 8439.36 +/- 29.887\r\n 119.767% +/- 0.679408%\r\n (Student's t, pooled s = 47.0661)\r\n```\r\n\r\nYour code uses twice as much memory at 99.5% confidence.\r\n\r\nSo on average, your code is twice as slow and uses more memory.\r\n\r\nUnfortunately, based on the poor performance of your code compared to what already exists, I can't say that it shows promise.\r\n\r\nCombined with the problems I mentioned at the beginning, I'm afraid I must reject this PR completely. Sorry.\r\n\r\n[1]: https://github.com/gavinhoward/bc/blob/master/manuals/algorithms.md#square-root\r\n[2]: https://github.com/gavinhoward/bc/commit/fcbe9d68ccc964fda12457ebbf687a27f57ff31f", + "createdAt": "2023-12-14T04:47:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + }, + { + "content": "EYES", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/pull/72#issuecomment-1855122832", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2023-12-11T20:27:06Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-11T20:27:06Z", + "messageBody": "", + "messageHeadline": "div, sqrt improved using Newton-Raphson algorithm.", + "oid": "d6e0849220eea59ff7b380dfc779a43a33a234d1" + }, + { + "authoredDate": "2023-12-12T11:49:47Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-12T11:49:47Z", + "messageBody": "", + "messageHeadline": "Make secure more", + "oid": "7a1cd5f7667308300e7f9db46b1827fbc1dc2703" + }, + { + "authoredDate": "2023-12-13T13:53:11Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-13T13:53:11Z", + "messageBody": "", + "messageHeadline": "markdown test", + "oid": "1f0cce37b56205fbc24db847d184ce452bfdb8fa" + }, + { + "authoredDate": "2023-12-13T16:30:08Z", + "authors": [ + { + "email": "jonathan@acryl.ai", + "id": "U_kgDOB2enHg", + "login": "naggamura", + "name": "jonathan" + } + ], + "committedDate": "2023-12-13T16:30:08Z", + "messageBody": "", + "messageHeadline": "Newton-Raphson div, sqrt", + "oid": "248e3b9b34cf4893f6440c169584592fc78f6090" + } + ], + "createdAt": "2023-12-13T16:38:28Z", + "deletions": 50, + "files": [ + { + "path": "newton-raphson-div.png", + "additions": 0, + "deletions": 0 + }, + { + "path": "newton-raphson-sqrt.png", + "additions": 0, + "deletions": 0 + }, + { + "path": "src/num.c", + "additions": 831, + "deletions": 50 + } + ], + "fullDatabaseId": "1642781993", + "headRefName": "newton-raphson", + "headRefOid": "248e3b9b34cf4893f6440c169584592fc78f6090", + "headRepository": null, + "headRepositoryOwner": { + "id": "U_kgDOB2enHg", + "login": "naggamura" + }, + "id": "PR_kwDOCL0xJc5h6t0p", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 72, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "Newton-Raphson divison, sqrt", + "updatedAt": "2023-12-14T04:47:11Z", + "url": "https://github.com/gavinhoward/bc/pull/72" + }, + { + "additions": 337, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjgwNzU4MA==", + "is_bot": false, + "login": "SamuelMarks", + "name": "Samuel Marks" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "3f4c8cc5f86092fa4a8d59bc99d8f10ad2894cf0", + "body": "WiP\r\n\r\nCan finish if you like. Can also send you a PR on your own website, just make me an account", + "changedFiles": 19, + "closed": true, + "closedAt": "2025-03-25T05:20:50Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5kTkGI", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for the PR!\r\n\r\nAllow me to I apologize upfront. Usually, I do not question user requests; after all, there is a user, and they have a request, so obviously, there is a need or a want.\r\n\r\n*However*, personally, [I ***hate*** CMake][1]. I hate it so much that I have spent *three years* designing and implementing a build system to remove it from my [other project][2], a build system that would allow building on Windows, Mac OSX, Linux, the BSD's, etc. And I was going to add support for that build system to `bc`, which I hoped would remove any need for people to use CMake to build `bc` cross-platform.\r\n\r\nSo, I apologize because I can tell you put a lot of work into this, but for once, I am asking you to provide justification. I won't ask for much; I just need to know why CMake is necessary and why you believe that keeping a fork would not serve. (Since a separate build system won't touch the code, it seems like an easy fork to keep.)\r\n\r\nAgain, I'm sorry.\r\n\r\nAlso, if I do decide to merge, I'm going to need you to explain the more complicated bits; I've tried to avoid complicated CMake as much as possible. But I need to be able to maintain the CMake code without your help.\r\n\r\n[1]: https://news.ycombinator.com/item?id=36469860\r\n[2]: https://git.yzena.com/Yzena/Yc", + "createdAt": "2023-08-17T19:34:43Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/68#issuecomment-1682850184", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5kVWMk", + "author": { + "login": "SamuelMarks" + }, + "authorAssociation": "NONE", + "body": "@gavinhoward I'm obsessed with interoperability. CMake is one way to achieve this. Open to your build system also, where I plan on taking `bc` to:\r\n- Windows (different MSVC versions);\r\n- MinGW (x86, x64, …)\r\n- DOS (via OpenWatcom and maybe via early MSVC versions)\r\n- Cygwin\r\n- Linux\r\n- macOS\r\n- iOS\r\n- Android\r\n- SunOS (Solaris→OpenSolaris→illumos→OpenIndiana)\r\n- *BSD (FreeBSD, OpenBSD, …)\r\n\r\n…and yes I know you support some of these targets already.\r\n\r\nThere are some other nice advantages like CPack and CTest, but honestly there are a number of other nice build generators out there and I tend to choose CMake just because it's the most popular and has a good number of generators.", + "createdAt": "2023-08-18T04:01:35Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/68#issuecomment-1683317540", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5kVpyv", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Okay, interoperability is something I can understand. But oh boy, I would love it if my build system could do all that.\r\n\r\nThat said, my build system (named Rig, by the way) won't be able to cross-compile in the first release, so some of those targets may not be possible in the first release of Rig. (OpenWatcom is the one that makes me most nervous.)\r\n\r\nSo I'll make you a deal. I'll do these things:\r\n\r\n1. Merge your PR,\r\n2. Set up Rig in my `bc` once it's ready,\r\n3. Write you a tutorial on how to use Rig for `bc`, and\r\n4. Help you understand the new build scripts,\r\n\r\nas long as you'll do the following:\r\n\r\n1. Give me your contact info because this is a pretty big commitment, and I want to be able to ask you questions, if at all possible (you can use the info at to send me that info privately),\r\n2. Point me to material that will help me set up environments for all of those platforms (so I can test `bc` and CMake on them myself),\r\n3. Explain to me any CMake code I don't understand (I'll make them reviews in the PR),\r\n4. Learn how to use Rig for `bc` once it's ready (I don't care if you use it for anything else), and\r\n5. At that point, give me your honest opinion if Rig can fully replace the CMake build.\r\n\r\nIf it can, I'd ***really*** like to remove the CMake then. If it can't, well, it can't, and CMake will stay in perpetuity.\r\n\r\nIn other words, I'll add CMake now if you'll give Rig a fair shake later.\r\n\r\nOh, and point number 2 is crucial; if I can't test `bc` on those platforms with CMake, I won't merge the PR because I would basically be committing to supporting those platforms by merging the PR, and I can't do that without the ability to test.\r\n\r\nBy the way, I only need to know how to set up environments for:\r\n\r\n* Windows (specifically different MSVC versions because I can already compile on the latest Windows 10);\r\n* MinGW\r\n* DOS (via OpenWatcom and maybe via early MSVC versions)\r\n* Cygwin\r\n* iOS (do I need a Mac computer?)\r\n* Android\r\n* SunOS (Solaris, OpenSolaris, illumos, OpenIndiana)\r\n\r\nI have the capability for the rest.", + "createdAt": "2023-08-18T06:04:29Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/68#issuecomment-1683397807", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5kX99Z", + "author": { + "login": "SamuelMarks" + }, + "authorAssociation": "NONE", + "body": "Great yeah sure I'll give it a shot. No guaranteed time commitments (because of everything going on in my life); but I'll see what I can do.\r\n\r\nMy email is samuel` `at symbol offscale.io; or you can use myfirstname mylastname` `at symbol gmail.com.\r\n\r\nI wrote some Windows Batch scripts for building on these different targets, and lots of things can run in a good CI/CD environment (e.g., GitHub Actions, Cirrus CI, &etc.): https://github.com/offscale/win-cmake-multi-build\r\n\r\nObviously still a ways to go to support all the different targets I'm interested in. But yeah something clean like your `bc` might be just complicated enough to test out my interoperability", + "createdAt": "2023-08-18T14:29:25Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/68#issuecomment-1684004697", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5kcbRH", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Okay. Thank you.\r\n\r\nPlease let me know when this PR is not WIP.", + "createdAt": "2023-08-20T04:29:28Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/68#issuecomment-1685173319", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5kc7km", + "author": { + "login": "SamuelMarks" + }, + "authorAssociation": "NONE", + "body": "Sure thing, I'll see if I can get to it later in the week. Last remaining errors:\r\n```\r\nbc.c.obj : error LNK2001: unresolved external symbol _bc_help\r\nvm.c.obj : error LNK2001: unresolved external symbol _bc_lib\r\nvm.c.obj : error LNK2001: unresolved external symbol _bc_lib_name\r\nvm.c.obj : error LNK2001: unresolved external symbol _bc_lib2\r\nvm.c.obj : error LNK2001: unresolved external symbol _bc_lib2_name\r\n```\r\n\r\nWhich should be defined in an object file that you define in your existent configure script:\r\n```sh\r\ncontents=$(replace \"$contents\" \"BC_HELP_O\" \"$bc_help\")\r\n```\r\n\r\nSo I just need to reverse-engineer it into CMake and we should be good to go™.", + "createdAt": "2023-08-20T14:58:39Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/68#issuecomment-1685305638", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc6j64Rc", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "It's been a year and a half, unfortunately, with no word since then.\r\n\r\nHowever, I have not stood still. I have [added][1] [Rig][2] [to `bc`][3], and I have [implemented the entire test suite in Rig][4].\r\n\r\nIn addition, Rig has the ability to cross compile now, and it will deactivate the tests under those conditions.\r\n\r\nSo because no progress has been made with CMake, and Rig is now working (except on Windows, but the only thing left is getting itself to bootstrap itself), I am rejecting this PR in favor of Rig.\r\n\r\n[1]: https://github.com/gavinhoward/bc/blob/master/build.gaml\r\n[2]: https://github.com/gavinhoward/bc/blob/master/build.rig\r\n[3]: https://github.com/gavinhoward/bc/blob/master/build.pkg.rig\r\n[4]: https://github.com/gavinhoward/bc/commit/77fcd66898f754cb1dbce262c6c0efd0879f855c", + "createdAt": "2025-03-25T05:20:50Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/68#issuecomment-2750121052", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2023-08-17T18:47:20Z", + "authors": [ + { + "email": "807580+SamuelMarks@users.noreply.github.com", + "id": "MDQ6VXNlcjgwNzU4MA==", + "login": "SamuelMarks", + "name": "Samuel Marks" + } + ], + "committedDate": "2023-08-17T18:47:20Z", + "messageBody": "", + "messageHeadline": "CMake support (initial)", + "oid": "4256fe30a6eee88983bbe39b606a793a47b96ec0" + }, + { + "authoredDate": "2023-08-17T20:06:53Z", + "authors": [ + { + "email": "807580+SamuelMarks@users.noreply.github.com", + "id": "MDQ6VXNlcjgwNzU4MA==", + "login": "SamuelMarks", + "name": "Samuel Marks" + } + ], + "committedDate": "2023-08-17T20:06:53Z", + "messageBody": "", + "messageHeadline": "Improve CMake suppoprt and remove extraneous code & files", + "oid": "63e687a593ca72430a23216ab35eb897a4677b36" + }, + { + "authoredDate": "2023-08-18T21:02:52Z", + "authors": [ + { + "email": "807580+SamuelMarks@users.noreply.github.com", + "id": "MDQ6VXNlcjgwNzU4MA==", + "login": "SamuelMarks", + "name": "Samuel Marks" + } + ], + "committedDate": "2023-08-18T21:02:52Z", + "messageBody": "", + "messageHeadline": "Improve CMake support", + "oid": "a2e95a6e697fa9d6557a16c17ad6bf8d048b5bd3" + }, + { + "authoredDate": "2023-08-19T00:43:54Z", + "authors": [ + { + "email": "807580+SamuelMarks@users.noreply.github.com", + "id": "MDQ6VXNlcjgwNzU4MA==", + "login": "SamuelMarks", + "name": "Samuel Marks" + } + ], + "committedDate": "2023-08-19T00:43:54Z", + "messageBody": "", + "messageHeadline": "Improve CMake support", + "oid": "b945314d5edcb660bc286f63e60a5a63697b9ee4" + } + ], + "createdAt": "2023-08-17T18:49:48Z", + "deletions": 17, + "files": [ + { + "path": ".gitignore", + "additions": 3, + "deletions": 0 + }, + { + "path": "CMakeLists.txt", + "additions": 123, + "deletions": 0 + }, + { + "path": "bcl.pc.in", + "additions": 1, + "deletions": 1 + }, + { + "path": "cmake/BundleIcon.icns", + "additions": 0, + "deletions": 0 + }, + { + "path": "cmake/CTestConfig.cmake", + "additions": 7, + "deletions": 0 + }, + { + "path": "cmake/Config.cmake.in", + "additions": 4, + "deletions": 0 + }, + { + "path": "cmake/CustomVolumeIcon.icns", + "additions": 0, + "deletions": 0 + }, + { + "path": "cmake/Info.plist", + "additions": 14, + "deletions": 0 + }, + { + "path": "cmake/MultiCPackConfig.cmake", + "additions": 6, + "deletions": 0 + }, + { + "path": "cmake/README.txt", + "additions": 5, + "deletions": 0 + }, + { + "path": "cmake/Welcome.txt", + "additions": 1, + "deletions": 0 + }, + { + "path": "cmake/config.h.in", + "additions": 11, + "deletions": 0 + }, + { + "path": "include/bc.h", + "additions": 8, + "deletions": 7 + }, + { + "path": "include/dc.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/history.h", + "additions": 6, + "deletions": 4 + }, + { + "path": "include/read.h", + "additions": 2, + "deletions": 1 + }, + { + "path": "include/vm.h", + "additions": 10, + "deletions": 2 + }, + { + "path": "src/CMakeLists.txt", + "additions": 134, + "deletions": 0 + }, + { + "path": "src/vm.c", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "1479523420", + "headRefName": "cmake", + "headRefOid": "b945314d5edcb660bc286f63e60a5a63697b9ee4", + "headRepository": { + "id": "R_kgDOKIWfvQ", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjgwNzU4MA==", + "name": "Samuel Marks", + "login": "SamuelMarks" + }, + "id": "PR_kwDOCL0xJc5YL7xc", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "DIRTY", + "mergeable": "CONFLICTING", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 68, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "CMake support", + "updatedAt": "2025-03-25T05:20:51Z", + "url": "https://github.com/gavinhoward/bc/pull/68" + }, + { + "additions": 5, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjc0MTgyNg==", + "is_bot": false, + "login": "dorjechang", + "name": "alexander naumochkin" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "71fa3cd4029d416a5272b262736c4d6ab709b6ce", + "body": "Casting int -1 to size_t produces SIZE_T_MAX so\r\nBC_NUM_PRINT_WIDTH is used instead of 0", + "changedFiles": 1, + "closed": true, + "closedAt": "2023-03-15T16:06:35Z", + "comments": [], + "commits": [ + { + "authoredDate": "2023-03-15T12:46:29Z", + "authors": [ + { + "email": "alexander.naumochkin@gmail.com", + "id": "MDQ6VXNlcjc0MTgyNg==", + "login": "dorjechang", + "name": "ash" + } + ], + "committedDate": "2023-03-15T12:46:29Z", + "messageBody": "Casting int -1 to size_t produces SIZE_T_MAX so\nBC_NUM_PRINT_WIDTH is used instead of 0", + "messageHeadline": "Fix incorrect processing of env:BC_LINE_LENGTH=0", + "oid": "31042aed8426850187b43d7e639f244354da0d6c" + } + ], + "createdAt": "2023-03-15T13:08:07Z", + "deletions": 2, + "files": [ + { + "path": "src/vm.c", + "additions": 5, + "deletions": 2 + } + ], + "fullDatabaseId": "1276831340", + "headRefName": "fix_BC_LINE_LENGTH=0", + "headRefOid": "31042aed8426850187b43d7e639f244354da0d6c", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjc0MTgyNg==", + "name": "alexander naumochkin", + "login": "dorjechang" + }, + "id": "PR_kwDOCL0xJc5MGuZs", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "0c42c52dfc0735026cb6d2534dc24436ff19778f" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2023-03-15T16:06:35Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 65, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Fix incorrect processing of env:BC_LINE_LENGTH=0", + "updatedAt": "2023-03-15T16:06:35Z", + "url": "https://github.com/gavinhoward/bc/pull/65" + }, + { + "additions": 16, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "is_bot": false, + "login": "firasuke", + "name": "Firas Khalil Khana" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "2ed62ba26831b34cae22b9e7b2f1dd2f3a74b541", + "body": "", + "changedFiles": 1, + "closed": true, + "closedAt": "2022-11-26T15:16:46Z", + "comments": [], + "commits": [ + { + "authoredDate": "2022-11-26T10:30:09Z", + "authors": [ + { + "email": "firasuke@gmail.com", + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "login": "firasuke", + "name": "Firas Khalil Khana" + } + ], + "committedDate": "2022-11-26T10:30:09Z", + "messageBody": "", + "messageHeadline": "Mention MAN3DIR in build.md", + "oid": "f62ecdabc44ca2ed32f7f0895a78099919038da9" + } + ], + "createdAt": "2022-11-26T10:30:59Z", + "deletions": 7, + "files": [ + { + "path": "manuals/build.md", + "additions": 16, + "deletions": 7 + } + ], + "fullDatabaseId": "1136437158", + "headRefName": "master", + "headRefOid": "f62ecdabc44ca2ed32f7f0895a78099919038da9", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "name": "Firas Khalil Khana", + "login": "firasuke" + }, + "id": "PR_kwDOCL0xJc5DvKem", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "09247332bf9dafef6840864598c93df92ebc0820" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2022-11-26T15:16:46Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 57, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Mention MAN3DIR in build.md", + "updatedAt": "2022-11-26T15:16:46Z", + "url": "https://github.com/gavinhoward/bc/pull/57" + }, + { + "additions": 1, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjU3MDUxMDY4", + "is_bot": false, + "login": "pacordova", + "name": "Paul Cordova" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "4355599e9a59834098ed18e670b90cec2b84120d", + "body": "On POSIX systems, `find` may have indeterministic output (I believe based on the inode on the filesystem).\r\n`sort` is needed to ensure the output is deterministic.\r\n\r\nIn my builds, this resulted in the build order in the generated `Makefile` changing around.\r\nThus building on a fresh partition made with `mkfs.ext4` would result in the binary being different each time.\r\nThe compiled binary code in the`bc` binary shuffled around depending on which files were built first.\r\nPossibly the build order in the Makefile was affecting the order in which files were linked?\r\n\r\nI added `LC_ALL=C` recommended by reproducible-builds.org. \r\nSee below for reference:\r\n- [https://reproducible-builds.org/docs/archives/](https://reproducible-builds.org/docs/archives/)\r\n- [https://reproducible-builds.org/docs/stable-inputs/](https://reproducible-builds.org/docs/stable-inputs/)", + "changedFiles": 1, + "closed": true, + "closedAt": "2022-08-03T02:35:23Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5Huq4A", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "The only hangup I would have had is if the way you did it was not portable to POSIX `sh`. I consulted the standard, and your solution is portable!\r\n\r\nI agree that reproducible builds are *very* important. So thank you for your contribution! I have accepted it, and it will be in the release out in a day or two. I just have to make sure everything builds correctly.", + "createdAt": "2022-08-03T02:37:10Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/54#issuecomment-1203416576", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5HuvNl", + "author": { + "login": "pacordova" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "No problem! Thank you for accepting my pull request!\r\nOne additional comment:\r\nWith this change I do get reproducible builds, although I do not use `-flto`\r\nYour recommended optimization of `-O3` I think should be ok, but I do know that Link Time Optimization (LTO) and Profile Guided Optimization (PGO) can both potentially break build determinism.\r\nEither way the end user should be able get reproducible builds if they want it with this change.\r\nThe CFLAGS I was testing with were `CFLAGS='-march=x86-64 -pipe -Os -fstack-protector-strong -fstack-clash-protection'` with GCC 11.2.0.", + "createdAt": "2022-08-03T03:13:48Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/54#issuecomment-1203434341", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5Hwkv2", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you!", + "createdAt": "2022-08-03T12:57:26Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/54#issuecomment-1203915766", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2022-08-02T16:49:50Z", + "authors": [ + { + "email": "pac3nc@virginia.edu", + "id": "MDQ6VXNlcjU3MDUxMDY4", + "login": "pacordova", + "name": "pac" + } + ], + "committedDate": "2022-08-02T16:49:50Z", + "messageBody": "find has indeterministic output based on the inode on the filesystem,\nso sort is needed to ensure the output is deterministic", + "messageHeadline": "improve reproducibility", + "oid": "8c7d5fa125dae5049427cb9b0ddc9ee7bbf099b4" + }, + { + "authoredDate": "2022-08-02T23:00:34Z", + "authors": [ + { + "email": "pac3nc@virginia.edu", + "id": "MDQ6VXNlcjU3MDUxMDY4", + "login": "pacordova", + "name": "pac" + } + ], + "committedDate": "2022-08-02T23:00:34Z", + "messageBody": "", + "messageHeadline": "remove -z", + "oid": "6ea4d12e2f11e0ce0bed779d991a17230db3a889" + } + ], + "createdAt": "2022-08-02T17:17:46Z", + "deletions": 1, + "files": [ + { + "path": "configure.sh", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "1015375109", + "headRefName": "reproducible_builds", + "headRefOid": "6ea4d12e2f11e0ce0bed779d991a17230db3a889", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjU3MDUxMDY4", + "name": "Paul Cordova", + "login": "pacordova" + }, + "id": "PR_kwDOCL0xJc48hWUF", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "71215b0eb1c20aa622bd77e664ad7f099b349e91" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2022-08-03T02:35:23Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 54, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Improve Reproducibility (Reproducible Builds)", + "updatedAt": "2022-08-03T12:57:26Z", + "url": "https://github.com/gavinhoward/bc/pull/54" + }, + { + "additions": 11, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQxMzkwMDY=", + "is_bot": false, + "login": "bsdimp", + "name": "Warner Losh" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "cad172d8f0962f47b08007beedc8f4637618ffe6", + "body": "The historic gnu bc behavior was to have ^D be delete next character if\r\nthere were any characters in the input, or end of file if there\r\nweren't. This matches what emacs users expect for editing the command\r\nline. Implement this by assuming end of file if the input is empty, and\r\ndelete forward character if it isn't.\r\n\r\nSigned-off-by: Warner Losh ", + "changedFiles": 1, + "closed": true, + "closedAt": "2022-04-29T14:06:09Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc5CTTkH", + "author": { + "login": "bsdimp" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "I've been using this change in my tree for a while now since FreeBSD merged the Howard bc. If there's a way to write a test case for it, please let me know.\r\n\r\nTo test it out, it's simple: 123^B^D^M should leave you in bc and produce the answer 12. Current behavior is to exit after printing 123.", + "createdAt": "2022-04-28T15:36:16Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/51#issuecomment-1112357127", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5CVMF_", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for this submission. I have tested it, and it works as advertised. It does require a tweak to the test suite to get all of the tests to pass.\r\n\r\nHowever, there are two hangups.\r\n\r\nFirst, if I do merge this, I'm not sure it warrants another release by itself; it might be better to wait until some other change comes along.\r\n\r\nSecond, this does change the behavior of `bc` and would require a major version bump. This is also the biggest reason for wanting at least one other change; this is a small change that requires a big version bump, and I'd want something big.\r\n\r\nBut the fact that it changes behavior also gives me pause. I don't know how many people depend on the `^D` behavior for end-of-file, even when there's input, and I hesitate to make this change without knowing the numbers.\r\n\r\nHowever, I would be satisfied with just a survey of FreeBSD users, which should be the biggest portion of my userbase. (Not many Linux distros have my `bc`, and history is not available on Windows.) That is, I would be satisfied if the survey showed that the vast majority of the FreeBSD users who respond either don't care or agree with the change.\r\n\r\nI would also be satisfied with the blessing of my regular FreeBSD contact, Stefan Esser, who I believe has a good handle on what changes would be okay to make.\r\n\r\nIf you can give me either one of those two things, I'll merge. If Stefan even gives a blessing for a release, I'll do that too.", + "createdAt": "2022-04-29T03:47:48Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/51#issuecomment-1112850815", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5CW3df", + "author": { + "login": "bsdimp" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Since it's only in the command history editing, I'm having trouble understanding how it would affect tests or other input since that code path appears to be disabled when we aren't reading from a tty.\r\n\r\nAnd even if it didn't, ^D on Unix is only a tty signal of EOF. It's not used at the end of files to signify EOF, which is done by zero read.\r\n\r\nFreeBSD used gnu bc since 1998. It has the behavior I've implemented for the past at least 24 years, so it wouldn't be unreasonable to assume that it's what FreeBSD users that care one way or the other would want. Once you've started to edit the text on the line, you don't want to terminate the program and get an answer for the partially edited line.\r\n\r\nI'd argue that this is a mere bug fix to make things more compatible with bc and isn't such a gross behavior change as to warrant a major release bump, but that's just my sensibilities.\r\n\r\nI'm OK waiting on a release. I'll also chat with Stefan as well about this point.", + "createdAt": "2022-04-29T13:07:47Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/51#issuecomment-1113290591", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5CXG7p", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I have history tests, but they are only run when you run `make test_history` because they can be...flaky. No worries; I'll make the change to fix them. In fact, I might make a change to test this new behavior.\r\n\r\nYou make a compelling and convincing case that this is merely a bug fix. Stefan seems to agree that it is and that many old Unix users would expect this behavior change.\r\n\r\nIn fact, if old Unix users expect the change, then the fact that no one has said anything is probably a good indicator that no one has been using it, which means I can pull the rug out without making anybody mad.\r\n\r\nSo I'm more than satisfied. I'll make the change, and I'll make it in a bugfix release.", + "createdAt": "2022-04-29T14:06:00Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/51#issuecomment-1113353961", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5CXNGY", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I do have a question: should I remove the EOF behavior entirely?", + "createdAt": "2022-04-29T14:22:22Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/51#issuecomment-1113379224", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc5CXQAy", + "author": { + "login": "bsdimp" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "> I do have a question: should I remove the EOF behavior entirely?\r\n\r\nNo. The behavior I implemented matches gnu bc's behavior.", + "createdAt": "2022-04-29T14:28:47Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/pull/51#issuecomment-1113391154", + "viewerDidAuthor": false + }, + { + "id": "IC_kwDOCL0xJc5CXkZ_", + "author": { + "login": "stesser" + }, + "authorAssociation": "CONTRIBUTOR", + "body": " I had sent a reply to Gavin a few hours ago, and I do see that the pull request has already been merged.\r\n\r\nJust a comment regarding compatibility with the previous bc version in FreeBSD:\r\n\r\nWhile GNU bc has the requested behavior, the previous bc in FreeBSD up to 12.x did not:\r\n\r\n$ bc -v\r\nbc (BSD bc) 1.1-FreeBSD\r\n$ bc\r\n12345^B^B^B <- cursor on 3\r\n^D <- bell sound, nothing deleted\r\n\r\n1245 <- result after pressing DEL\r\n\r\nIn the FreeBSD bc (which had been obtained from OpenBSD) ^D did only signal EOF if the input line was empty, but it did not delete to the right.\r\n\r\nGNU bc actually has the line editing behavior created by this patch, and thus it is further step towards GNU bc compatibility. (And IIRC, GNU bc had been in the FreeBSD base system, a few decades ago ...)", + "createdAt": "2022-04-29T15:55:50Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/pull/51#issuecomment-1113474687", + "viewerDidAuthor": false + } + ], + "commits": [ + { + "authoredDate": "2022-04-28T15:30:25Z", + "authors": [ + { + "email": "imp@FreeBSD.org", + "id": "MDQ6VXNlcjQxMzkwMDY=", + "login": "bsdimp", + "name": "Warner Losh" + } + ], + "committedDate": "2022-04-28T15:35:21Z", + "messageBody": "The historic gnu bc behavior was to have ^D be delete next character if\nthere were any characters in the input, or end of file if there\nweren't. This matches what emacs users expect for editing the command\nline. Implement this by assuming end of file if the input is empty, and\ndelete forward character if it isn't.\n\nSigned-off-by: Warner Losh ", + "messageHeadline": "Emacs delete-next-character", + "oid": "cee56074a8fe669901e0869ee8a6e23106d1634b" + } + ], + "createdAt": "2022-04-28T15:35:29Z", + "deletions": 4, + "files": [ + { + "path": "src/history.c", + "additions": 11, + "deletions": 4 + } + ], + "fullDatabaseId": "922011328", + "headRefName": "del-forward", + "headRefOid": "cee56074a8fe669901e0869ee8a6e23106d1634b", + "headRepository": { + "id": "R_kgDOHQG2MA", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjQxMzkwMDY=", + "name": "Warner Losh", + "login": "bsdimp" + }, + "id": "PR_kwDOCL0xJc429MbA", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "f8fa6febf7521062f0c4ecb6ca4406c91c125360" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2022-04-29T14:06:09Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 51, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Emacs delete-next-character", + "updatedAt": "2022-04-29T15:55:50Z", + "url": "https://github.com/gavinhoward/bc/pull/51" + }, + { + "additions": 1, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "is_bot": false, + "login": "firasuke", + "name": "Firas Khalil Khana" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "c3b2d28b2d615ca2b84ba398d796040348c5f13a", + "body": "", + "changedFiles": 1, + "closed": true, + "closedAt": "2021-12-26T16:59:58Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc47rUun", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Whoops! Thanks for catching.", + "createdAt": "2021-12-26T17:00:08Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/49#issuecomment-1001212839", + "viewerDidAuthor": true + }, + { + "id": "IC_kwDOCL0xJc47rVpi", + "author": { + "login": "firasuke" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Glad I could help!", + "createdAt": "2021-12-26T17:27:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/49#issuecomment-1001216610", + "viewerDidAuthor": false + } + ], + "commits": [ + { + "authoredDate": "2021-12-26T16:30:19Z", + "authors": [ + { + "email": "firasuke@gmail.com", + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "login": "firasuke", + "name": "Firas Khalil Khana" + } + ], + "committedDate": "2021-12-26T16:30:19Z", + "messageBody": "", + "messageHeadline": "Add missing newline character", + "oid": "ef5412b1bc939c0dbe18c7cf523e05de8561b25f" + } + ], + "createdAt": "2021-12-26T16:30:26Z", + "deletions": 1, + "files": [ + { + "path": "configure.sh", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "810041419", + "headRefName": "patch-1", + "headRefOid": "ef5412b1bc939c0dbe18c7cf523e05de8561b25f", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjQ2MTYwNzI3", + "name": "Firas Khalil Khana", + "login": "firasuke" + }, + "id": "PR_kwDOCL0xJc4wSEBL", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "232a12f6870eaf8fed95c12aa33fb3dbd7df8715" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2021-12-26T16:59:58Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 49, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Add missing newline character", + "updatedAt": "2021-12-26T17:27:19Z", + "url": "https://github.com/gavinhoward/bc/pull/49" + }, + { + "additions": 7, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjEzNTQxNjk5", + "is_bot": false, + "login": "depler", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "289ad4a08981c4eaf1328ab9d16f184ee0466a34", + "body": "", + "changedFiles": 1, + "closed": true, + "closedAt": "2021-09-29T15:05:03Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc43crZP", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Looks good! Thank you!", + "createdAt": "2021-09-29T15:05:16Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/44#issuecomment-930264655", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2021-09-29T09:33:47Z", + "authors": [ + { + "email": "depler.mv@gmail.com", + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler", + "name": "depler" + } + ], + "committedDate": "2021-09-29T09:33:47Z", + "messageBody": "", + "messageHeadline": "tests_bc.bat fix", + "oid": "2d05fde966b12cee7e02220f1466efd7a78a56c4" + } + ], + "createdAt": "2021-09-29T09:34:23Z", + "deletions": 7, + "files": [ + { + "path": "vs/tests/tests_bc.bat", + "additions": 7, + "deletions": 7 + } + ], + "fullDatabaseId": "745557688", + "headRefName": "master", + "headRefOid": "2d05fde966b12cee7e02220f1466efd7a78a56c4", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler" + }, + "id": "PR_kwDOCL0xJc4scE64", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "74d55ddfc79df8adeb70cdb2fc81dc05f8bacbde" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2021-09-29T15:05:03Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 44, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "tests_bc.bat fix", + "updatedAt": "2021-09-29T15:05:16Z", + "url": "https://github.com/gavinhoward/bc/pull/44" + }, + { + "additions": 1017, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjEzNTQxNjk5", + "is_bot": false, + "login": "depler", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "da29d88f70dca79c8a7e274b1cb5dee3c4bccb6f", + "body": "Changes:\r\n- projects moved to subfolder `vs`\r\n- projects created from scratch\r\n- fixed release configuration in executable (code optimizations enabled)\r\n- executable is statically linked (should work without any dependencies starting on Vista and newer)\r\n- library contains configurations `ReleaseMD` and `ReleaseMT` (shared and static linkage)\r\n- added 'vs\\tests' subfolder with scripts for windows (uses original test files, see `tests_bc.bat`, `tests_dc.bat`)\r\n\r\nBy the way, did you test binaries on windows? I've found failed test for dc:\r\n\r\n```\r\nc:\\Data\\Sources\\bc\\vs\\tests>tests_dc.bat\r\nPASS: abs\r\nPASS: add\r\nPASS: arctangent\r\nPASS: arrays\r\nPASS: assignments\r\n\r\n...\r\n\r\nParse error: bad character 't'\r\n :2\r\n\r\nFAIL_RUNTIME: vars\r\n```\r\n", + "changedFiles": 15, + "closed": true, + "closedAt": "2021-09-25T21:06:56Z", + "comments": [ + { + "id": "IC_kwDOCL0xJc43Q7BQ", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I'm pulling this now because I made the fixes for all issues based on your code.\r\n\r\nI'm probably going to need your help still.", + "createdAt": "2021-09-25T21:06:52Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/38#issuecomment-927182928", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2021-09-24T22:42:26Z", + "authors": [ + { + "email": "depler.mv@gmail.com", + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler", + "name": "depler" + } + ], + "committedDate": "2021-09-24T22:42:26Z", + "messageBody": "", + "messageHeadline": "new bc.vcxproj, static linkage, release configuration", + "oid": "ae20dd7c1fedf9a7534aca4fda9783356cd15f86" + }, + { + "authoredDate": "2021-09-25T07:07:19Z", + "authors": [ + { + "email": "depler.mv@gmail.com", + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler", + "name": "depler" + } + ], + "committedDate": "2021-09-25T07:07:19Z", + "messageBody": "", + "messageHeadline": "bcl project", + "oid": "1c9479c50217773732f4111e4c3dfbc7e7415c1e" + }, + { + "authoredDate": "2021-09-25T07:15:33Z", + "authors": [ + { + "email": "depler.mv@gmail.com", + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler", + "name": "depler" + } + ], + "committedDate": "2021-09-25T07:15:33Z", + "messageBody": "", + "messageHeadline": "ReleaseMD, ReleaseMT", + "oid": "99a58fea193b6bcc1bec4adcd02c53522da20c86" + }, + { + "authoredDate": "2021-09-25T07:16:06Z", + "authors": [ + { + "email": "depler.mv@gmail.com", + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler", + "name": "depler" + } + ], + "committedDate": "2021-09-25T07:16:06Z", + "messageBody": "", + "messageHeadline": "cleanup", + "oid": "2230f31c8d4d53223a1dc13b0b399e374e57999f" + }, + { + "authoredDate": "2021-09-25T07:20:11Z", + "authors": [ + { + "email": "depler.mv@gmail.com", + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler", + "name": "depler" + } + ], + "committedDate": "2021-09-25T07:20:11Z", + "messageBody": "", + "messageHeadline": "fix", + "oid": "0a08c1a2d382fdf1406eecfc6669d8279810c51a" + }, + { + "authoredDate": "2021-09-25T10:48:31Z", + "authors": [ + { + "email": "depler.mv@gmail.com", + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler", + "name": "depler" + } + ], + "committedDate": "2021-09-25T10:48:31Z", + "messageBody": "", + "messageHeadline": "windows tests", + "oid": "2aaf6a7c624b441346200126504e713e1e324553" + } + ], + "createdAt": "2021-09-25T07:27:03Z", + "deletions": 760, + "files": [ + { + "path": "bc.vcxproj", + "additions": 0, + "deletions": 278 + }, + { + "path": "bc.vcxproj.filters", + "additions": 0, + "deletions": 182 + }, + { + "path": "bcl.sln", + "additions": 0, + "deletions": 31 + }, + { + "path": "bcl.vcxproj", + "additions": 0, + "deletions": 161 + }, + { + "path": "bcl.vcxproj.filters", + "additions": 0, + "deletions": 96 + }, + { + "path": "src/program.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "vs/.gitignore", + "additions": 7, + "deletions": 0 + }, + { + "path": "vs/bc.sln", + "additions": 11, + "deletions": 11 + }, + { + "path": "vs/bc.vcxproj", + "additions": 298, + "deletions": 0 + }, + { + "path": "vs/bc.vcxproj.filters", + "additions": 173, + "deletions": 0 + }, + { + "path": "vs/bcl.sln", + "additions": 37, + "deletions": 0 + }, + { + "path": "vs/bcl.vcxproj", + "additions": 259, + "deletions": 0 + }, + { + "path": "vs/bcl.vcxproj.filters", + "additions": 90, + "deletions": 0 + }, + { + "path": "vs/tests/tests_bc.bat", + "additions": 81, + "deletions": 0 + }, + { + "path": "vs/tests/tests_dc.bat", + "additions": 60, + "deletions": 0 + } + ], + "fullDatabaseId": "742640199", + "headRefName": "master", + "headRefOid": "2aaf6a7c624b441346200126504e713e1e324553", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjEzNTQxNjk5", + "login": "depler" + }, + "id": "PR_kwDOCL0xJc4sQ8pH", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "d3793fa5a17c198482baeee027464b98a3869270" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2021-09-25T21:06:56Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 38, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Visual Studio projects refactoring", + "updatedAt": "2021-09-25T21:06:56Z", + "url": "https://github.com/gavinhoward/bc/pull/38" + }, + { + "additions": 1, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjM4ODMzNTE=", + "is_bot": false, + "login": "ibara", + "name": "Brian Callahan" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "3317fc9138148ac48beb4886206be45ebac2a838", + "body": "on => one", + "changedFiles": 1, + "closed": true, + "closedAt": "2020-03-11T17:36:56Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDU5NzcwNjM0Nw==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/28?src=pr&el=h1) Report\n> Merging [#28](https://codecov.io/gh/gavinhoward/bc/pull/28?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/3317fc9138148ac48beb4886206be45ebac2a838&el=desc) will **not change** coverage by `%`.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/28/graphs/tree.svg?width=650&height=150&src=pr&token=7VDYTvCBQX)](https://codecov.io/gh/gavinhoward/bc/pull/28?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #28 +/- ##\n=======================================\n Coverage 99.65% 99.65% \n=======================================\n Files 16 16 \n Lines 3497 3497 \n=======================================\n Hits 3485 3485 \n Misses 12 12 \n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/28?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/28?src=pr&el=footer). Last update [3317fc9...24c93ff](https://codecov.io/gh/gavinhoward/bc/pull/28?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2020-03-11T15:39:52Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/28#issuecomment-597706347", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU5Nzc3MTUwMw==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you! Merged.", + "createdAt": "2020-03-11T17:39:45Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/28#issuecomment-597771503", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2020-03-11T15:37:45Z", + "authors": [ + { + "email": "ibara@users.noreply.github.com", + "id": "MDQ6VXNlcjM4ODMzNTE=", + "login": "ibara", + "name": "Brian Callahan" + } + ], + "committedDate": "2020-03-11T15:37:45Z", + "messageBody": "on => one", + "messageHeadline": "Fix a typo in build.md", + "oid": "24c93ffc52bfcae55f3b694e9684b49a105834e7" + } + ], + "createdAt": "2020-03-11T15:37:54Z", + "deletions": 1, + "files": [ + { + "path": "manuals/build.md", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "386765314", + "headRefName": "patch-1", + "headRefOid": "24c93ffc52bfcae55f3b694e9684b49a105834e7", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjM4ODMzNTE=", + "name": "Brian Callahan", + "login": "ibara" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mzg2NzY1MzE0", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "725f14b41767d34e6be02fa07dc2db659fa55b02" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2020-03-11T17:36:56Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 28, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Fix a typo in build.md", + "updatedAt": "2020-03-11T18:18:12Z", + "url": "https://github.com/gavinhoward/bc/pull/28" + }, + { + "additions": 86, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjMwOTE2NjEz", + "is_bot": false, + "login": "zv-io", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "358951d4fa58db3077a5675a6547c44e41101de9", + "body": "This series addresses some bugs found on Solaris as discussed with the author in IRC earlier today. The following systems have been \"loosely\" tested to compile and pass the non-external-`bc` test suite:\r\n\r\n* Solaris 10 [sun4u] (GCC `5.5.0`) in both 32- and 64- bit modes;\r\n* Solaris 11 [sun4v] (GCC `4.8.2` and `7.5.0`) in both 32- and 64- bit modes;\r\n\r\nNote: Solaris 10 requires aliasing to a POSIX-compliant shell (e.g. `/usr/xpg4/bin/sh`) or modifying the top of any scripts citing `/bin/sh` to this value.", + "changedFiles": 62, + "closed": true, + "closedAt": "2020-01-15T22:33:33Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDU3NDQ5NzI3Mw==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/27?src=pr&el=h1) Report\n> Merging [#27](https://codecov.io/gh/gavinhoward/bc/pull/27?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/358951d4fa58db3077a5675a6547c44e41101de9?src=pr&el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/27/graphs/tree.svg?width=650&token=7VDYTvCBQX&height=150&src=pr)](https://codecov.io/gh/gavinhoward/bc/pull/27?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #27 +/- ##\n=======================================\n Coverage 99.65% 99.65% \n=======================================\n Files 16 16 \n Lines 3496 3496 \n=======================================\n Hits 3484 3484 \n Misses 12 12\n```\n\n\n| [Impacted Files](https://codecov.io/gh/gavinhoward/bc/pull/27?src=pr&el=tree) | Coverage Δ | |\n|---|---|---|\n| [src/bc/parse.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL2JjL3BhcnNlLmM=) | `100% <ø> (ø)` | :arrow_up: |\n| [src/parse.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL3BhcnNlLmM=) | `100% <ø> (ø)` | :arrow_up: |\n| [src/read.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL3JlYWQuYw==) | `100% <ø> (ø)` | :arrow_up: |\n| [src/vm.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL3ZtLmM=) | `99.59% <ø> (ø)` | :arrow_up: |\n| [src/main.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL21haW4uYw==) | `100% <ø> (ø)` | :arrow_up: |\n| [src/num.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL251bS5j) | `99.41% <ø> (ø)` | :arrow_up: |\n| [src/lex.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL2xleC5j) | `100% <ø> (ø)` | :arrow_up: |\n| [src/bc/bc.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL2JjL2JjLmM=) | `100% <ø> (ø)` | :arrow_up: |\n| [src/bc/lex.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL2JjL2xleC5j) | `100% <ø> (ø)` | :arrow_up: |\n| [src/lang.c](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree#diff-c3JjL2xhbmcuYw==) | `97.33% <ø> (ø)` | :arrow_up: |\n| ... and [6 more](https://codecov.io/gh/gavinhoward/bc/pull/27/diff?src=pr&el=tree-more) | |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/27?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/27?src=pr&el=footer). Last update [358951d...a756285](https://codecov.io/gh/gavinhoward/bc/pull/27?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2020-01-15T05:02:18Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/27#issuecomment-574497273", + "viewerDidAuthor": false + } + ], + "commits": [ + { + "authoredDate": "2020-01-14T21:56:45Z", + "authors": [ + { + "email": "me@zv.io", + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io", + "name": "Zach van Rijn" + } + ], + "committedDate": "2020-01-14T22:17:19Z", + "messageBody": "", + "messageHeadline": "Fix bug caused by inconsistent preservation of line endings by 'sed'.", + "oid": "d3b3813c94d6553caad61752dd7ac99dd860e20c" + }, + { + "authoredDate": "2020-01-14T22:03:42Z", + "authors": [ + { + "email": "me@zv.io", + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io", + "name": "Zach van Rijn" + } + ], + "committedDate": "2020-01-14T22:17:26Z", + "messageBody": "…'ls' command. Improve robustness of test conditions.", + "messageHeadline": "Switch from POSIX 2008 --> 2001 build flags. Remove use of dangerous …", + "oid": "72238e589bf7e8cb6a9bb380f367c1a5edcc8b82" + }, + { + "authoredDate": "2020-01-14T22:05:02Z", + "authors": [ + { + "email": "me@zv.io", + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io", + "name": "Zach van Rijn" + } + ], + "committedDate": "2020-01-14T22:17:27Z", + "messageBody": "", + "messageHeadline": "Update copyright year 2019 --> 2020.", + "oid": "eb34ee5e9d5607c08e7080d9c44e03d393756493" + }, + { + "authoredDate": "2020-01-14T22:24:01Z", + "authors": [ + { + "email": "me@zv.io", + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io", + "name": "Zach van Rijn" + } + ], + "committedDate": "2020-01-14T22:24:01Z", + "messageBody": "…sions.", + "messageHeadline": "Explicit '-std=c99' to avoid ambiguity across different compilers/ver…", + "oid": "a38469fd93c20d1de3f972c982de3c234000116a" + }, + { + "authoredDate": "2020-01-14T22:57:04Z", + "authors": [ + { + "email": "me@zv.io", + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io", + "name": "Zach van Rijn" + } + ], + "committedDate": "2020-01-14T22:59:48Z", + "messageBody": "", + "messageHeadline": "Update documentation and prepare for release.", + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + }, + { + "authoredDate": "2020-01-15T13:56:00Z", + "authors": [ + { + "email": "me@zv.io", + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io", + "name": "Zach van Rijn" + } + ], + "committedDate": "2020-01-15T13:56:00Z", + "messageBody": "…lers/versions.\"\n\nThis reverts commit a38469fd93c20d1de3f972c982de3c234000116a.", + "messageHeadline": "Revert \"Explicit '-std=c99' to avoid ambiguity across different compi…", + "oid": "8b83e334177701cd2c05fd10090a1f582bd7e9f8" + }, + { + "authoredDate": "2020-01-15T13:57:24Z", + "authors": [ + { + "email": "me@zv.io", + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io", + "name": "Zach van Rijn" + } + ], + "committedDate": "2020-01-15T13:57:24Z", + "messageBody": "", + "messageHeadline": "Comply with versioning policy as per author feedback in PR 27.", + "oid": "a756285f60b2139fc629c3edf230c8b1f9a875ed" + } + ], + "createdAt": "2020-01-15T04:59:12Z", + "deletions": 79, + "files": [ + { + "path": "Makefile.in", + "additions": 3, + "deletions": 3 + }, + { + "path": "NEWS.md", + "additions": 6, + "deletions": 0 + }, + { + "path": "README.md", + "additions": 3, + "deletions": 2 + }, + { + "path": "configure.sh", + "additions": 12, + "deletions": 12 + }, + { + "path": "functions.sh", + "additions": 3, + "deletions": 3 + }, + { + "path": "gen/bc_help.txt", + "additions": 1, + "deletions": 1 + }, + { + "path": "gen/dc_help.txt", + "additions": 1, + "deletions": 1 + }, + { + "path": "gen/lib.bc", + "additions": 1, + "deletions": 1 + }, + { + "path": "gen/lib2.bc", + "additions": 1, + "deletions": 1 + }, + { + "path": "gen/strgen.c", + "additions": 2, + "deletions": 2 + }, + { + "path": "include/args.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/bc.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/dc.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/history.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/lang.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/lex.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/num.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/parse.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/program.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/read.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/status.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/vector.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "include/vm.h", + "additions": 1, + "deletions": 1 + }, + { + "path": "install.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "karatsuba.py", + "additions": 1, + "deletions": 1 + }, + { + "path": "link.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "locale_install.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "locale_uninstall.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "locales/en_US.msg", + "additions": 1, + "deletions": 1 + }, + { + "path": "locales/fr_FR.ISO8859-1.msg", + "additions": 1, + "deletions": 1 + }, + { + "path": "locales/fr_FR.UTF-8.msg", + "additions": 1, + "deletions": 1 + }, + { + "path": "locales/pt_PT.ISO-8859-1.msg", + "additions": 1, + "deletions": 1 + }, + { + "path": "locales/pt_PT.UTF-8.msg", + "additions": 1, + "deletions": 1 + }, + { + "path": "release.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/args.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/bc/bc.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/bc/lex.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/bc/parse.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/data.c", + "additions": 2, + "deletions": 2 + }, + { + "path": "src/dc/dc.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/dc/lex.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/dc/parse.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/history/history.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/lang.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/lex.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/main.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/num.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/parse.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/program.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/read.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/vector.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "src/vm.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/afl.py", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/all.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/bc/timeconst.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/errors.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/randmath.py", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/read.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/script.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/scripts.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/stdin.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/test.sh", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "362957298", + "headRefName": "master", + "headRefOid": "a756285f60b2139fc629c3edf230c8b1f9a875ed", + "headRepository": null, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjMwOTE2NjEz", + "login": "zv-io" + }, + "id": "MDExOlB1bGxSZXF1ZXN0MzYyOTU3Mjk4", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [ + { + "id": "", + "author": { + "login": "michaelforney" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T06:00:48Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "" + } + }, + { + "id": "", + "author": { + "login": "ibara" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T20:20:03Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "" + } + }, + { + "id": "", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T22:33:19Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "APPROVED", + "commit": { + "oid": "" + } + } + ], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "063a155d1ee6c68bfba37733777ad1331810fdf1" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2020-01-15T22:33:33Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 27, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "APPROVED", + "reviewRequests": [], + "reviews": [ + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQyOTk0NDA3", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for this PR! Unfortunately, it needs some work before I can accept it. See reviews below.", + "submittedAt": "2020-01-15T05:32:13Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "CHANGES_REQUESTED", + "commit": { + "oid": "d3b3813c94d6553caad61752dd7ac99dd860e20c" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMDAyMDEx", + "author": { + "login": "michaelforney" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T06:00:48Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMDAyNTYx", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T06:02:59Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMDEwNjM1", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T06:34:47Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMjM5MTU3", + "author": { + "login": "zv-io" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T14:04:17Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMjQ0ODg5", + "author": { + "login": "zv-io" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T14:12:43Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMjU1NTQ0", + "author": { + "login": "zv-io" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T14:27:10Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMjU2MjE0", + "author": { + "login": "zv-io" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T14:28:02Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMjczNTgx", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T14:50:50Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzMjc3MTQ4", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T14:55:18Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "f022d5dedc841bb1d23fa2e03fdc97a639de700d" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzNDk1MzQ1", + "author": { + "login": "ibara" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "", + "submittedAt": "2020-01-15T20:20:03Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "a756285f60b2139fc629c3edf230c8b1f9a875ed" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzNDk5ODcx", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T20:28:14Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "a756285f60b2139fc629c3edf230c8b1f9a875ed" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzNTY3ODE3", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T22:33:01Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "COMMENTED", + "commit": { + "oid": "a756285f60b2139fc629c3edf230c8b1f9a875ed" + } + }, + { + "id": "MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MzQzNTY3OTcx", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "", + "submittedAt": "2020-01-15T22:33:19Z", + "includesCreatedEdit": false, + "reactionGroups": [], + "state": "APPROVED", + "commit": { + "oid": "a756285f60b2139fc629c3edf230c8b1f9a875ed" + } + } + ], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Improve portability, enable build on Solaris SPARC.", + "updatedAt": "2020-01-15T22:33:33Z", + "url": "https://github.com/gavinhoward/bc/pull/27" + }, + { + "additions": 218, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjM5NzU3OTY3", + "is_bot": false, + "login": "bugcrazy", + "name": "" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "39b0dc440325511db730ad8fbd7012ba6f3f4b4d", + "body": "Portuguese Translations pt_PT and pt_BR", + "changedFiles": 8, + "closed": true, + "closedAt": "2020-01-14T15:08:19Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDU3NDAyODE2Nw==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/26?src=pr&el=h1) Report\n> Merging [#26](https://codecov.io/gh/gavinhoward/bc/pull/26?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/39b0dc440325511db730ad8fbd7012ba6f3f4b4d?src=pr&el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/26/graphs/tree.svg?width=650&token=7VDYTvCBQX&height=150&src=pr)](https://codecov.io/gh/gavinhoward/bc/pull/26?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #26 +/- ##\n=======================================\n Coverage 99.65% 99.65% \n=======================================\n Files 16 16 \n Lines 3496 3496 \n=======================================\n Hits 3484 3484 \n Misses 12 12\n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/26?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/26?src=pr&el=footer). Last update [39b0dc4...2572333](https://codecov.io/gh/gavinhoward/bc/pull/26?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2020-01-14T06:43:10Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/26#issuecomment-574028167", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU3NDIxOTEzMg==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Thank you for your translations! They look good. Release of Version `2.5.0` with the translations will happen in a few minutes.", + "createdAt": "2020-01-14T15:09:22Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/26#issuecomment-574219132", + "viewerDidAuthor": true + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU3NDIyMzU0Mw==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Version `2.5.0` is out with your translations. Thank you!", + "createdAt": "2020-01-14T15:17:19Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/pull/26#issuecomment-574223543", + "viewerDidAuthor": true + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU3NDI0MTA2Mw==", + "author": { + "login": "bugcrazy" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Thank you!", + "createdAt": "2020-01-14T15:52:18Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/26#issuecomment-574241063", + "viewerDidAuthor": false + } + ], + "commits": [ + { + "authoredDate": "2020-01-14T06:32:59Z", + "authors": [ + { + "email": "39757967+bugcrazy@users.noreply.github.com", + "id": "MDQ6VXNlcjM5NzU3OTY3", + "login": "bugcrazy", + "name": "bugcrazy" + } + ], + "committedDate": "2020-01-14T06:32:59Z", + "messageBody": "Portuguese Translations pt_PT and pt_BR", + "messageHeadline": "Portuguese Translations", + "oid": "25723337b998ced4976dc5beae8717d81056dc5f" + } + ], + "createdAt": "2020-01-14T06:40:25Z", + "deletions": 0, + "files": [ + { + "path": "locales/pt_BR.ISO-8859-1.msg", + "additions": 1, + "deletions": 0 + }, + { + "path": "locales/pt_BR.ISO-8859-15.msg", + "additions": 1, + "deletions": 0 + }, + { + "path": "locales/pt_BR.UTF-8.msg", + "additions": 1, + "deletions": 0 + }, + { + "path": "locales/pt_BR.utf8.msg", + "additions": 1, + "deletions": 0 + }, + { + "path": "locales/pt_PT.ISO-8859-1.msg", + "additions": 106, + "deletions": 0 + }, + { + "path": "locales/pt_PT.ISO-8859-15.msg", + "additions": 1, + "deletions": 0 + }, + { + "path": "locales/pt_PT.UTF-8.msg", + "additions": 106, + "deletions": 0 + }, + { + "path": "locales/pt_PT.utf8.msg", + "additions": 1, + "deletions": 0 + } + ], + "fullDatabaseId": "362470901", + "headRefName": "master", + "headRefOid": "25723337b998ced4976dc5beae8717d81056dc5f", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkyMzM3NjI4NjY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjM5NzU3OTY3", + "login": "bugcrazy" + }, + "id": "MDExOlB1bGxSZXF1ZXN0MzYyNDcwOTAx", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "c322c80e62415e69c8d65c69904a0e1ea37f4da3" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2020-01-14T15:08:19Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 26, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Portuguese Translations", + "updatedAt": "2020-01-14T15:52:18Z", + "url": "https://github.com/gavinhoward/bc/pull/26" + }, + { + "additions": 6, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjIyMjk2NzA2", + "is_bot": false, + "login": "eg15", + "name": "Eugene Gladchenko" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "38cc5145cb66ba9f1706630d5f987d60a46fb1b1", + "body": "Looks like I found a bug.\r\n\"-1000000000 < -1\" returns 0 (false) on my machine which is obviously wrong.\r\nThe fix will follow.", + "changedFiles": 4, + "closed": true, + "closedAt": "2019-11-22T04:42:08Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDU1NzE0ODY4Mw==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/25?src=pr&el=h1) Report\n> Merging [#25](https://codecov.io/gh/gavinhoward/bc/pull/25?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/38cc5145cb66ba9f1706630d5f987d60a46fb1b1?src=pr&el=desc) will **not change** coverage.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/25/graphs/tree.svg?width=650&token=7VDYTvCBQX&height=150&src=pr)](https://codecov.io/gh/gavinhoward/bc/pull/25?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #25 +/- ##\n=======================================\n Coverage 99.71% 99.71% \n=======================================\n Files 16 16 \n Lines 3478 3478 \n=======================================\n Hits 3468 3468 \n Misses 10 10\n```\n\n\n| [Impacted Files](https://codecov.io/gh/gavinhoward/bc/pull/25?src=pr&el=tree) | Coverage Δ | |\n|---|---|---|\n| [src/num.c](https://codecov.io/gh/gavinhoward/bc/pull/25/diff?src=pr&el=tree#diff-c3JjL251bS5j) | `99.41% <100%> (ø)` | :arrow_up: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/25?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/25?src=pr&el=footer). Last update [38cc514...96518d8](https://codecov.io/gh/gavinhoward/bc/pull/25?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2019-11-21T15:56:12Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/25#issuecomment-557148683", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU1NzE2MDgyMg==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Yes, you did find a bug.\r\n\r\nYour fix looks great, and your tests do as well. I just have two requests:\r\n\r\n1. Move your tests and results into files called `comp.txt` and `comp_results.txt`.\r\n2. Change the name in `tests/bc/all.txt`.\r\n\r\nI want you to do this because I am going to write a more comprehensive set of tests for comparisons in general to make sure I did not miss anything else.\r\n\r\nIf you don't have the time to do this, I could always pull it and do the change myself.", + "createdAt": "2019-11-21T16:22:26Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/25#issuecomment-557160822", + "viewerDidAuthor": true + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU1NzIwNjQwNw==", + "author": { + "login": "eg15" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "Just finished, thank you.\r\n\r\nBTW it looks like busybox guys took your code and kept the bug in their modified version.\r\nJust fixed it there as well: https://bugs.busybox.net/show_bug.cgi?id=12336\r\n\r\nThen it should be fixed in Alpine (that's where I encountered it this morning).", + "createdAt": "2019-11-21T18:10:24Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/25#issuecomment-557206407", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU1NzIzMDk2NA==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "`busybox` didn't exactly take my code; I gave them my code, when it had a lot more bugs as well. Unfortunately, they decided to go their own way with it, so I don't really contribute back. (They added even more bugs.)\r\n\r\nI will merge this when I get home from work. I should have a release out after testing, which could take up to a week. I don't expect this to take that long to test, since it's so small, but I may find other problems.", + "createdAt": "2019-11-21T19:14:33Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/25#issuecomment-557230964", + "viewerDidAuthor": true + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDU1NzM4NjYzOQ==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I pulled manually. Thank you for your help!", + "createdAt": "2019-11-22T04:44:22Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [ + { + "content": "THUMBS_UP", + "users": { + "totalCount": 1 + } + } + ], + "url": "https://github.com/gavinhoward/bc/pull/25#issuecomment-557386639", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-11-21T15:31:00Z", + "authors": [ + { + "email": "gladchenko@gmail.com", + "id": "MDQ6VXNlcjIyMjk2NzA2", + "login": "eg15", + "name": "Eugene Gladchenko" + } + ], + "committedDate": "2019-11-21T15:31:00Z", + "messageBody": "", + "messageHeadline": "Add a test to compare negative numbers", + "oid": "888c422c21b558d3778d4ad215fd54f9387a137b" + }, + { + "authoredDate": "2019-11-21T16:00:43Z", + "authors": [ + { + "email": "gladchenko@gmail.com", + "id": "MDQ6VXNlcjIyMjk2NzA2", + "login": "eg15", + "name": "Eugene Gladchenko" + } + ], + "committedDate": "2019-11-21T16:00:43Z", + "messageBody": "", + "messageHeadline": "Fix a bug in comparing negative numbers", + "oid": "ddbecaa0601375b86dffb525973148cdd0dda8f7" + }, + { + "authoredDate": "2019-11-21T18:05:15Z", + "authors": [ + { + "email": "gladchenko@gmail.com", + "id": "MDQ6VXNlcjIyMjk2NzA2", + "login": "eg15", + "name": "Eugene Gladchenko" + } + ], + "committedDate": "2019-11-21T18:05:15Z", + "messageBody": "", + "messageHeadline": "The name of the test file changed", + "oid": "96518d8fd63fca1d01b82ac78a42251844f39201" + } + ], + "createdAt": "2019-11-21T15:52:02Z", + "deletions": 1, + "files": [ + { + "path": "src/num.c", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/bc/all.txt", + "additions": 1, + "deletions": 0 + }, + { + "path": "tests/bc/comp.txt", + "additions": 2, + "deletions": 0 + }, + { + "path": "tests/bc/comp_results.txt", + "additions": 2, + "deletions": 0 + } + ], + "fullDatabaseId": "344102387", + "headRefName": "master", + "headRefOid": "96518d8fd63fca1d01b82ac78a42251844f39201", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkyMjMyMDIxNDg=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjIyMjk2NzA2", + "name": "Eugene Gladchenko", + "login": "eg15" + }, + "id": "MDExOlB1bGxSZXF1ZXN0MzQ0MTAyMzg3", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "96518d8fd63fca1d01b82ac78a42251844f39201" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2019-11-22T04:42:07Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 25, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Add a test to compare negative numbers", + "updatedAt": "2019-11-22T04:44:22Z", + "url": "https://github.com/gavinhoward/bc/pull/25" + }, + { + "additions": 43, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "b6cc5efba0e127c5a344c25505c807865494cc66", + "body": "I do not know how to restrict the pull request to just the two commits I consider relevant (probably is the GIT way to create a temporary branch for that purpose?)\r\n\r\nThe relevant commits are: \r\n\r\nca56e06\r\n684e3f6", + "changedFiles": 3, + "closed": true, + "closedAt": "2019-06-14T01:43:15Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDUwMTgzMTY1Ng==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/24?src=pr&el=h1) Report\n> Merging [#24](https://codecov.io/gh/gavinhoward/bc/pull/24?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/b6cc5efba0e127c5a344c25505c807865494cc66?src=pr&el=desc) will **increase** coverage by `<.01%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/24/graphs/tree.svg?width=650&token=7VDYTvCBQX&height=150&src=pr)](https://codecov.io/gh/gavinhoward/bc/pull/24?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #24 +/- ##\n==========================================\n+ Coverage 99.73% 99.73% +<.01% \n==========================================\n Files 16 16 \n Lines 3431 3435 +4 \n==========================================\n+ Hits 3422 3426 +4 \n Misses 9 9\n```\n\n\n| [Impacted Files](https://codecov.io/gh/gavinhoward/bc/pull/24?src=pr&el=tree) | Coverage Δ | |\n|---|---|---|\n| [src/bc/parse.c](https://codecov.io/gh/gavinhoward/bc/pull/24/diff?src=pr&el=tree#diff-c3JjL2JjL3BhcnNlLmM=) | `100% <ø> (ø)` | :arrow_up: |\n| [src/program.c](https://codecov.io/gh/gavinhoward/bc/pull/24/diff?src=pr&el=tree#diff-c3JjL3Byb2dyYW0uYw==) | `99.73% <100%> (ø)` | :arrow_up: |\n| [src/num.c](https://codecov.io/gh/gavinhoward/bc/pull/24/diff?src=pr&el=tree#diff-c3JjL251bS5j) | `99.8% <100%> (ø)` | :arrow_up: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/24?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/24?src=pr&el=footer). Last update [b6cc5ef...ca56e06](https://codecov.io/gh/gavinhoward/bc/pull/24?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2019-06-13T18:43:42Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/24#issuecomment-501831656", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDUwMTg1MDQyMQ==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I have already made these changes in my local branch. I just haven't pushed them yet. I will push them when I get home from work, and I will close this then to remind me.\r\n\r\nThank you.", + "createdAt": "2019-06-13T19:39:54Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/24#issuecomment-501850421", + "viewerDidAuthor": true + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDUwMTkzNzA0Ng==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Changes are pushed.", + "createdAt": "2019-06-14T01:43:15Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/24#issuecomment-501937046", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-06-09T11:10:39Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-09T11:10:39Z", + "messageBody": "", + "messageHeadline": "Small optimization: no data to copy for BC_RESULT_ONE or _LAST", + "oid": "b32b26ca8a533480155a427906025cbe9a0c061c" + }, + { + "authoredDate": "2019-06-10T21:15:49Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-10T21:15:49Z", + "messageBody": "", + "messageHeadline": "Make limit for extension of division results depend on BC_BASE_DIGS", + "oid": "1846088a5d37f02e608228e4214ed76464abdd05" + }, + { + "authoredDate": "2019-06-10T21:17:33Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-10T21:17:33Z", + "messageBody": "", + "messageHeadline": "Simplify and speed up parsing of decimal numbers", + "oid": "5954930eb013ed5e10bea2599735f06b05b89caa" + }, + { + "authoredDate": "2019-06-12T10:16:50Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-12T10:16:50Z", + "messageBody": "Do not allocate one BcDig per character of the string passed in.\nFor ibase between 11 and 26 (decimal) more than one BcDig may be\nneeded to store the value expressed by BC_BASE_DIGS characters.\n\nTesting for that case will probably cause more overhead than just\napplying a fudge factor (not verified - special casing the ibase\nrange that needs this factor and using a factor of 1.5 instead of\n2 might be worth the extra code complexity).", + "messageHeadline": "Fix allocation size for parsed number", + "oid": "c2dc7941ee0115ba8e820685021d70ab2ab13a91" + }, + { + "authoredDate": "2019-06-12T10:25:11Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-12T10:25:11Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' of https://github.com/gavinhoward/bc", + "oid": "036b112a9d04b56b98ba3697e1641afa6352bbeb" + }, + { + "authoredDate": "2019-06-12T12:00:07Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-12T12:00:07Z", + "messageBody": "This change improves \"make test\" performance by more than 2%.", + "messageHeadline": "Better estimate of the number of BcDigs required to store a constant", + "oid": "43caceec40e4265edc8244b092bd39ba483361c5" + }, + { + "authoredDate": "2019-06-12T21:43:54Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-12T21:43:54Z", + "messageBody": "This implementation is not optimized for speed, yet. I have plans to\nadd copy-on-write semantics for BcNums (i.e. add a reference count and\ncopy the BcNum only if its refcount is > 1 it is about to be\nmodified).\n\nThis version fails in the bc/stdin test, but diagnosing this problem\nwill have to wait for tomorrow ...", + "messageHeadline": "Implement caching of numeric constants in vectors of BcNums", + "oid": "515dfe44886667eb9fbea48c214b559549d69417" + }, + { + "authoredDate": "2019-06-13T08:23:45Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-13T08:23:45Z", + "messageBody": "Beyond the changes performed by the automatic merge, remove references\nto the constvals field in struct BcFunc.", + "messageHeadline": "Merge branch 'master' of https://github.com/gavinhoward/bc", + "oid": "cd30020d2fe2d4cef802b2e65299f4e0e1a3972f" + }, + { + "authoredDate": "2019-06-13T08:33:21Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-13T08:33:21Z", + "messageBody": "", + "messageHeadline": "Merge more changes from upstream", + "oid": "21e4395740342aa65e728d02e1a5d658a9a15bc0" + }, + { + "authoredDate": "2019-06-13T08:49:54Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-13T08:49:54Z", + "messageBody": "", + "messageHeadline": "Adjust whitespace and use value of \"base\" instead of fetching it again", + "oid": "684e3f6f8a7dd8efb5b49211ef20948710cf6457" + }, + { + "authoredDate": "2019-06-13T09:14:04Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-13T09:14:04Z", + "messageBody": "", + "messageHeadline": "Fix for failing scale(0.0000000000000000000) test case", + "oid": "25799a6fa21c69cb7f9e77e53329d3b735564c9b" + }, + { + "authoredDate": "2019-06-13T11:05:20Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-13T11:05:20Z", + "messageBody": "FreeBSD uses strict checks for base system components and the build\nfailed due to the compiler warnings being treated as errors in base.", + "messageHeadline": "Remove unused local variable declarations (fix build in FreeBSD)", + "oid": "ca56e060a471ed5476a78b38c1b2d0584777d693" + } + ], + "createdAt": "2019-06-13T18:39:56Z", + "deletions": 49, + "files": [ + { + "path": "src/bc/parse.c", + "additions": 0, + "deletions": 2 + }, + { + "path": "src/num.c", + "additions": 37, + "deletions": 39 + }, + { + "path": "src/program.c", + "additions": 6, + "deletions": 8 + } + ], + "fullDatabaseId": "288048911", + "headRefName": "master", + "headRefOid": "ca56e060a471ed5476a78b38c1b2d0584777d693", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjg4MDQ4OTEx", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "DIRTY", + "mergeable": "CONFLICTING", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 24, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "Whitespace adjustment and removal of some unused variables", + "updatedAt": "2019-06-14T01:43:15Z", + "url": "https://github.com/gavinhoward/bc/pull/24" + }, + { + "additions": 1, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "f555270c99e7d354704071628486df0870968286", + "body": "Benchmarks show a small but significant speed-up of \"make test\" if the\r\nlimit for the shifting of operands is made more strict. Many operands\r\nwill require a second iteration of the inner loop anyway, and shifting\r\nof the operands uses cycles for no gain, then.\r\n\r\nTo my surprise, BC_BASE_DIGS=4 and =9 seem to have near identical\r\nperformance after this change. Some operations (multiplication and\r\npower) ought to be faster with larger BcDigs, but at least for the\r\nperformance of \"make test\" on my system this does not seem to affect\r\nthe run-time by a significant amount.", + "changedFiles": 1, + "closed": true, + "closedAt": "2019-06-07T13:25:25Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5OTg4MzYwNQ==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "I am not planning on future releases, except for bug fixes. I will merge this now.", + "createdAt": "2019-06-07T13:25:27Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/23#issuecomment-499883605", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-06-07T07:33:26Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-07T07:33:26Z", + "messageBody": "Benchmarks show a small but significant speed-up of \"make test\" if the\nlimit for the shifting of operands is made more strict. Many operands\nwill require a second iteration of the inner loop anyway, and shifting\nof the operands uses cycles for no gain, then.\n\nTo my surprise, BC_BASE_DIGS=4 and =9 seem to have near identical\nperformance after this change. Some operations (multiplication and\npower) ought to be faster with larger BcDigs, but at least for the\nperformance of \"make test\" on my system this does not seem to affect\nthe run-time by a significant amount.", + "messageHeadline": "Small performance optimization", + "oid": "d8526df195150f9f20ed4e8430dff3457e5d2913" + } + ], + "createdAt": "2019-06-07T08:28:48Z", + "deletions": 1, + "files": [ + { + "path": "src/num.c", + "additions": 1, + "deletions": 1 + } + ], + "fullDatabaseId": "286093193", + "headRefName": "master", + "headRefOid": "d8526df195150f9f20ed4e8430dff3457e5d2913", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjg2MDkzMTkz", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "6f662190645f8fb84b36a513b1369a8bf61e215e" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2019-06-07T13:25:25Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 23, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Small performance optimization (perhaps for the next following release?)", + "updatedAt": "2019-06-07T13:25:28Z", + "url": "https://github.com/gavinhoward/bc/pull/23" + }, + { + "additions": 38, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "7373e5f89c9ce873eb1a84f129c1f9be3b1ec400", + "body": "", + "changedFiles": 1, + "closed": true, + "closedAt": "2019-06-07T04:04:59Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5OTY2Nzc4Nw==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/22?src=pr&el=h1) Report\n> Merging [#22](https://codecov.io/gh/gavinhoward/bc/pull/22?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/7373e5f89c9ce873eb1a84f129c1f9be3b1ec400?src=pr&el=desc) will **increase** coverage by `<.01%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/22/graphs/tree.svg?width=650&token=7VDYTvCBQX&height=150&src=pr)](https://codecov.io/gh/gavinhoward/bc/pull/22?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #22 +/- ##\n==========================================\n+ Coverage 99.73% 99.73% +<.01% \n==========================================\n Files 16 16 \n Lines 3392 3409 +17 \n==========================================\n+ Hits 3383 3400 +17 \n Misses 9 9\n```\n\n\n| [Impacted Files](https://codecov.io/gh/gavinhoward/bc/pull/22?src=pr&el=tree) | Coverage Δ | |\n|---|---|---|\n| [src/num.c](https://codecov.io/gh/gavinhoward/bc/pull/22/diff?src=pr&el=tree#diff-c3JjL251bS5j) | `99.8% <100%> (ø)` | :arrow_up: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/22?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/22?src=pr&el=footer). Last update [7373e5f...98719ee](https://codecov.io/gh/gavinhoward/bc/pull/22?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2019-06-06T21:06:55Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/22#issuecomment-499667787", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5OTc0OTQ5MQ==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Merging...for now. If it passes (which I think it will), it will stay.", + "createdAt": "2019-06-07T04:05:18Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/22#issuecomment-499749491", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-06-06T05:13:40Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T05:13:40Z", + "messageBody": "Since stdout is not affected by this debug print function, nchars\nshould not be modified, or printing of large numbers will be broken.", + "messageHeadline": "Resetting of nchars after printing to stderr corrupts the output", + "oid": "76794442357318437574ec8c0aa3f71903ec419a" + }, + { + "authoredDate": "2019-06-06T06:14:43Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T06:14:43Z", + "messageBody": "If the top-most BcDig contains a small value and there are lower\nnon-zero BcDigs, the integer divisor is incremented to prevent\ndivision results that do not fit into a BcDig (are > BC_BASE_POW).\n\nE.g. for 1000 / 1.1 the integer divisor will become 2 and the first\nestimate of the result will be 1000 / 2 = 500, giving a reminder of\n1000 - 500 * 1.1 = 450. The next estimate will be 700 = 500 + 450 / 2\nand so on with the reminder slowly decreasing in each iteration.\n\nSince the relative error due to the approximation of the full division\nby an integer division becomes significant for small integer divisors,\nit makes sense to extend the divisor if it i ssmall. In fact, it seems\nto pay off for all divisors that are < BC_BASE_POW / 10.", + "messageHeadline": "Fix pathological behavior in case integer is rounded up a lot", + "oid": "035ace7d24afd722ce9a3325c90213d36772e5bd" + }, + { + "authoredDate": "2019-06-06T06:25:29Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T06:25:29Z", + "messageBody": "", + "messageHeadline": "Merge branch 'div'", + "oid": "c1e655b2dd38ea27668b3a0c5b7c86ef06a8dd88" + }, + { + "authoredDate": "2019-06-06T08:21:51Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T08:21:51Z", + "messageBody": "If there was a new-line character in the string, then strrchr will\nreturn a pointer to that character. If the length of the string\nstarting at the new-line position is 1, then no text follows on the\nnew line and nchars should be set to 0,not 2.", + "messageHeadline": "Fix calculation of nchars", + "oid": "54e3cd86494fd1e2c817ea3fa49c357738da5f82" + }, + { + "authoredDate": "2019-06-06T11:32:50Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T11:32:50Z", + "messageBody": "This reverts commit 54e3cd86494fd1e2c817ea3fa49c357738da5f82.\n\nI had misread the code (thought the + 1 was outside the brackets).", + "messageHeadline": "Revert \"Fix calculation of nchars\"", + "oid": "210d9c5863215d0c371f0ec68a0fda2f601920f3" + }, + { + "authoredDate": "2019-06-06T20:07:20Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T20:07:20Z", + "messageBody": "This version does not pass all tests (hangs in divide.bc).\nI'm commiting anyway, to have a basis that is ismilar to the upstream\nrepo for further testing.", + "messageHeadline": "Merge latest upstream version.", + "oid": "94fb480d06c4e082a635d2f4866682d4f6a7b6bb" + }, + { + "authoredDate": "2019-06-06T20:50:44Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T20:50:44Z", + "messageBody": "", + "messageHeadline": "Remove debug dump of operands and intermediate results", + "oid": "59e2953c61615ff5f3deecd181f15c5249fe0bb4" + }, + { + "authoredDate": "2019-06-06T20:59:42Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T20:59:42Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' of https://github.com/gavinhoward/bc", + "oid": "6fe9b2fba0e7359152598d4e38ff93020b24b8e7" + }, + { + "authoredDate": "2019-06-06T21:01:19Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T21:01:19Z", + "messageBody": "", + "messageHeadline": "Reduce whitespace diff relative to upstream", + "oid": "595d84e4792bffa63ece31aa146ea7ccfc87ea4b" + }, + { + "authoredDate": "2019-06-06T21:03:03Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T21:03:03Z", + "messageBody": "", + "messageHeadline": "Fix lines that resulted from a mis-merge of upstream", + "oid": "98719eecc5f599365f5d2c3aa042a9cb7cdb6d6c" + } + ], + "createdAt": "2019-06-06T20:53:49Z", + "deletions": 6, + "files": [ + { + "path": "src/num.c", + "additions": 38, + "deletions": 6 + } + ], + "fullDatabaseId": "285965666", + "headRefName": "master", + "headRefOid": "98719eecc5f599365f5d2c3aa042a9cb7cdb6d6c", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjg1OTY1NjY2", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "016a5eed2e5cc0d7e65cea785e609a0bb8a0fa70" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2019-06-07T04:04:59Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 22, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "This version completes all tests on my system", + "updatedAt": "2019-06-07T04:05:18Z", + "url": "https://github.com/gavinhoward/bc/pull/22" + }, + { + "additions": 30, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "81eb6fba565695dfe054e0b3f651fa5fa089b605", + "body": "Reduce the number of iterations required for cases where the top-most BcDig of the divisor is a small value and there are lower non-zero BcDigs. This makes the performance of the division more even for all types of operands of a given length and speeds up \"make test\" by about 3% on my system. The worst case performance of the division is improved by about a factor of 20 (estimated, not measured) for operations like 1/1.000000001.", + "changedFiles": 1, + "closed": true, + "closedAt": "2019-06-06T15:34:13Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5OTM5OTU1Nw==", + "author": { + "login": "stesser" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "While here, fix calculation of vm->nchars in 2 places ...", + "createdAt": "2019-06-06T08:27:09Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/21#issuecomment-499399557", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5OTU0NzEzMA==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Rejected for reasons stated in an email.", + "createdAt": "2019-06-06T15:34:13Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/21#issuecomment-499547130", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-06-06T05:13:40Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T05:13:40Z", + "messageBody": "Since stdout is not affected by this debug print function, nchars\nshould not be modified, or printing of large numbers will be broken.", + "messageHeadline": "Resetting of nchars after printing to stderr corrupts the output", + "oid": "76794442357318437574ec8c0aa3f71903ec419a" + }, + { + "authoredDate": "2019-06-06T06:14:43Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T06:14:43Z", + "messageBody": "If the top-most BcDig contains a small value and there are lower\nnon-zero BcDigs, the integer divisor is incremented to prevent\ndivision results that do not fit into a BcDig (are > BC_BASE_POW).\n\nE.g. for 1000 / 1.1 the integer divisor will become 2 and the first\nestimate of the result will be 1000 / 2 = 500, giving a reminder of\n1000 - 500 * 1.1 = 450. The next estimate will be 700 = 500 + 450 / 2\nand so on with the reminder slowly decreasing in each iteration.\n\nSince the relative error due to the approximation of the full division\nby an integer division becomes significant for small integer divisors,\nit makes sense to extend the divisor if it i ssmall. In fact, it seems\nto pay off for all divisors that are < BC_BASE_POW / 10.", + "messageHeadline": "Fix pathological behavior in case integer is rounded up a lot", + "oid": "035ace7d24afd722ce9a3325c90213d36772e5bd" + }, + { + "authoredDate": "2019-06-06T06:25:29Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T06:25:29Z", + "messageBody": "", + "messageHeadline": "Merge branch 'div'", + "oid": "c1e655b2dd38ea27668b3a0c5b7c86ef06a8dd88" + }, + { + "authoredDate": "2019-06-06T08:21:51Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T08:21:51Z", + "messageBody": "If there was a new-line character in the string, then strrchr will\nreturn a pointer to that character. If the length of the string\nstarting at the new-line position is 1, then no text follows on the\nnew line and nchars should be set to 0,not 2.", + "messageHeadline": "Fix calculation of nchars", + "oid": "54e3cd86494fd1e2c817ea3fa49c357738da5f82" + }, + { + "authoredDate": "2019-06-06T11:32:50Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-06T11:32:50Z", + "messageBody": "This reverts commit 54e3cd86494fd1e2c817ea3fa49c357738da5f82.\n\nI had misread the code (thought the + 1 was outside the brackets).", + "messageHeadline": "Revert \"Fix calculation of nchars\"", + "oid": "210d9c5863215d0c371f0ec68a0fda2f601920f3" + } + ], + "createdAt": "2019-06-06T06:53:09Z", + "deletions": 8, + "files": [ + { + "path": "src/num.c", + "additions": 30, + "deletions": 8 + } + ], + "fullDatabaseId": "285665970", + "headRefName": "master", + "headRefOid": "210d9c5863215d0c371f0ec68a0fda2f601920f3", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjg1NjY1OTcw", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "DIRTY", + "mergeable": "CONFLICTING", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 21, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "Improve worst case behavior of the division", + "updatedAt": "2019-06-06T15:34:14Z", + "url": "https://github.com/gavinhoward/bc/pull/21" + }, + { + "additions": 91, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "7be2294e3a91ae4f93bf4db1888d89a6c0d4537b", + "body": "I had not fully understood the current division algorithm when I suggested to \"overshoot\" subtractions and to attempt convergence from both sides.\r\n\r\nAfter analysis of the current implementation I have noticed that it can be significantly simplified and at the same time sped-up (by a factor of about 2 in my tests). The run-time of \"make test\" is reduced by some 15% on my system.", + "changedFiles": 1, + "closed": true, + "closedAt": "2019-06-06T00:26:39Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5OTIyMjQ0Mw==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/20?src=pr&el=h1) Report\n> Merging [#20](https://codecov.io/gh/gavinhoward/bc/pull/20?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/7be2294e3a91ae4f93bf4db1888d89a6c0d4537b?src=pr&el=desc) will **not change** coverage.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/20/graphs/tree.svg?width=650&token=7VDYTvCBQX&height=150&src=pr)](https://codecov.io/gh/gavinhoward/bc/pull/20?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #20 +/- ##\n=======================================\n Coverage 99.73% 99.73% \n=======================================\n Files 16 16 \n Lines 3405 3405 \n=======================================\n Hits 3396 3396 \n Misses 9 9\n```\n\n\n| [Impacted Files](https://codecov.io/gh/gavinhoward/bc/pull/20?src=pr&el=tree) | Coverage Δ | |\n|---|---|---|\n| [src/num.c](https://codecov.io/gh/gavinhoward/bc/pull/20/diff?src=pr&el=tree#diff-c3JjL251bS5j) | `99.8% <100%> (ø)` | :arrow_up: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/20?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/20?src=pr&el=footer). Last update [7be2294...45edd42](https://codecov.io/gh/gavinhoward/bc/pull/20?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2019-06-05T19:28:56Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/20#issuecomment-499222443", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5OTIzNzA4NA==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Can you send me your tests?", + "createdAt": "2019-06-05T20:12:45Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/20#issuecomment-499237084", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-05-20T11:00:48Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-20T11:00:48Z", + "messageBody": "…mod per BcDig\n\nIn the last iteration of the per BcDig print loop, acc is known to be less than\npow, therefore the last div and mod operations can be skipped, resulting in a\nspeed-up of about 2% in my tests.", + "messageHeadline": "Slightly speed up printing for the obase!=10 case by skipping one div…", + "oid": "b2c2fe4f75bff27e183db6e8b4211e8f602b0e68" + }, + { + "authoredDate": "2019-06-05T10:06:38Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-05T10:06:38Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' of github.com:stesser/bc", + "oid": "caf977797a95fecc39e78b35ef964e69d7851e8a" + }, + { + "authoredDate": "2019-06-05T19:04:42Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-06-05T19:04:42Z", + "messageBody": "The run-time of \"make test\" is reduced by some 15% on my system.", + "messageHeadline": "Implement faster and simpler division algorithm", + "oid": "45edd42ef28c52287e664e2d00b5b7de31a30e22" + } + ], + "createdAt": "2019-06-05T19:25:44Z", + "deletions": 99, + "files": [ + { + "path": "src/num.c", + "additions": 91, + "deletions": 99 + } + ], + "fullDatabaseId": "285517299", + "headRefName": "master", + "headRefOid": "45edd42ef28c52287e664e2d00b5b7de31a30e22", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjg1NTE3Mjk5", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "8904602cd9be7d6433f9ed6c2caab0f9c745dd9c" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2019-06-06T00:26:39Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 20, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Speed up and simplify division", + "updatedAt": "2019-06-06T00:26:40Z", + "url": "https://github.com/gavinhoward/bc/pull/20" + }, + { + "additions": 10, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "e318529d852cee9ce40c06f1a91f0063d8e0bd62", + "body": "In the last iteration of the per BcDig print loop, \"acc\" is known to be less than \"pow\", therefore the last div and mod operations can be skipped, resulting in a speed-up of about 2% in my tests.", + "changedFiles": 1, + "closed": true, + "closedAt": "2019-05-20T14:08:11Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5Mzk1ODQwMw==", + "author": { + "login": "codecov" + }, + "authorAssociation": "NONE", + "body": "# [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/19?src=pr&el=h1) Report\n> Merging [#19](https://codecov.io/gh/gavinhoward/bc/pull/19?src=pr&el=desc) into [master](https://codecov.io/gh/gavinhoward/bc/commit/e318529d852cee9ce40c06f1a91f0063d8e0bd62?src=pr&el=desc) will **increase** coverage by `<.01%`.\n> The diff coverage is `100%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/gavinhoward/bc/pull/19/graphs/tree.svg?width=650&token=7VDYTvCBQX&height=150&src=pr)](https://codecov.io/gh/gavinhoward/bc/pull/19?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## master #19 +/- ##\n==========================================\n+ Coverage 99.88% 99.88% +<.01% \n==========================================\n Files 16 16 \n Lines 3409 3411 +2 \n==========================================\n+ Hits 3405 3407 +2 \n Misses 4 4\n```\n\n\n| [Impacted Files](https://codecov.io/gh/gavinhoward/bc/pull/19?src=pr&el=tree) | Coverage Δ | |\n|---|---|---|\n| [src/num.c](https://codecov.io/gh/gavinhoward/bc/pull/19/diff?src=pr&el=tree#diff-c3JjL251bS5j) | `99.8% <100%> (ø)` | :arrow_up: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/gavinhoward/bc/pull/19?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `Δ = absolute (impact)`, `ø = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/gavinhoward/bc/pull/19?src=pr&el=footer). Last update [e318529...b2c2fe4](https://codecov.io/gh/gavinhoward/bc/pull/19?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", + "createdAt": "2019-05-20T12:05:10Z", + "includesCreatedEdit": true, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/19#issuecomment-493958403", + "viewerDidAuthor": false + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDQ5NDAwMjk1MQ==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Oh whoops. I did not notice this PR; I merged in the patch instead, though I did list you as the author of the commit. I hope that is okay.\r\n\r\nClosing since the code is already merged.", + "createdAt": "2019-05-20T14:08:11Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/19#issuecomment-494002951", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-05-20T11:00:48Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-20T11:00:48Z", + "messageBody": "…mod per BcDig\n\nIn the last iteration of the per BcDig print loop, acc is known to be less than\npow, therefore the last div and mod operations can be skipped, resulting in a\nspeed-up of about 2% in my tests.", + "messageHeadline": "Slightly speed up printing for the obase!=10 case by skipping one div…", + "oid": "b2c2fe4f75bff27e183db6e8b4211e8f602b0e68" + } + ], + "createdAt": "2019-05-20T12:00:46Z", + "deletions": 4, + "files": [ + { + "path": "src/num.c", + "additions": 10, + "deletions": 4 + } + ], + "fullDatabaseId": "280360533", + "headRefName": "d9", + "headRefOid": "b2c2fe4f75bff27e183db6e8b4211e8f602b0e68", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0MjgwMzYwNTMz", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "DIRTY", + "mergeable": "CONFLICTING", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 19, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "Slightly speed up printing for the obase!=10 case", + "updatedAt": "2019-06-02T10:54:35Z", + "url": "https://github.com/gavinhoward/bc/pull/19" + }, + { + "additions": 11813, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "master", + "baseRefOid": "b3ba59502ee5cc81e2019a724b94b648a35d7897", + "body": "All division and modulo test cases pass with this version.\r\n\r\nMaybe the scale could be reduced (for better performance) in parts of the algorithm, but for now the functionality is there. I have optimized the pow10 function by use of a look-up table. This table will be cached and the indexing faster than repetitive multiplication, IMHO. (Should be tested, but will not be significant in the overall picture, I guess.)\r\n\r\nI have introduced a function that rounds to a given precision. This was necessary to get the division match previous results to the last relevant digit. Just cutting off excess digits gives small errors in division and modulo results.\r\n\r\nAnother new function normalizes its argument to make len == rdx (i.e. to give a value strictly less than 1 but without 0 in the uppermost BcDig of num[]). This was required for the division, which operates on \"normalized\" values and adjusts the position of the decimal point as a final step.\r\n\r\nNeither of these functions has been added to num.h, since I was not sure about your policy with regard to having all static functions in num.c declared therein).", + "changedFiles": 17, + "closed": true, + "closedAt": "2019-05-06T13:42:00Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ4NzU3MzUyNA==", + "author": { + "login": "stesser" + }, + "authorAssociation": "CONTRIBUTOR", + "body": "The power has been fixed and passes all tests.\r\nThe sqrt operator gives results that do not pass the tests but differ only in the number of decimals or the precision of the calculation.", + "createdAt": "2019-04-29T13:11:00Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/18#issuecomment-487573524", + "viewerDidAuthor": false + } + ], + "commits": [ + { + "authoredDate": "2019-04-19T08:06:46Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-19T08:06:46Z", + "messageBody": "…ot found.", + "messageHeadline": "The test should use the same file name as is created if the file is n…", + "oid": "d9bda13740c6d4f67c1d69955a4ea8e3477bad4f" + }, + { + "authoredDate": "2019-04-19T14:09:03Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-19T14:09:03Z", + "messageBody": "The output has been verified to be identical to that of the C language\nversion for all files in this project by comparing the resulting .o files.", + "messageHeadline": "Provide shell version of strgen.c to allow use without compilation.", + "oid": "7d9fb3e6ffb7008afec4c7168498751366213b0f" + }, + { + "authoredDate": "2019-04-19T14:11:23Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-19T14:11:23Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' of https://github.com/gavinhoward/bc", + "oid": "fddcd0f53021d8f3164f5618ba952ab36932d8fc" + }, + { + "authoredDate": "2019-04-19T18:39:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-19T18:39:00Z", + "messageBody": "…nature.", + "messageHeadline": "Change parameter from char* to char** as required by the function sig…", + "oid": "a010b3e82408024f12e34030591349c4a344465b" + }, + { + "authoredDate": "2019-04-19T18:41:07Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-19T18:41:07Z", + "messageBody": "", + "messageHeadline": "Fix test to work if empty or null string is passed.", + "oid": "22fd1e9277a34ead069e9dd64942ed3cd55c2ac6" + }, + { + "authoredDate": "2019-04-20T08:34:13Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T08:34:13Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' of https://github.com/gavinhoward/bc", + "oid": "461c523fcbb8ff4c758ddb6ba2d9cfcf71a0a412" + }, + { + "authoredDate": "2019-04-20T08:35:20Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T08:35:20Z", + "messageBody": "…e was broken,", + "messageHeadline": "Change reference to v.v to use bc_vec_item(&v, 0) - my previous chang…", + "oid": "52b52a81ea9ea993d9835900398ee48d6e1dc1ad" + }, + { + "authoredDate": "2019-04-20T08:37:07Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T08:37:07Z", + "messageBody": "…nset", + "messageHeadline": "Split test into two parts to prevent parse error if the variable is u…", + "oid": "04ddff0bd1de2bde9c1af167cd59488a8fa3800c" + }, + { + "authoredDate": "2019-04-20T15:11:30Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T15:11:30Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' of https://github.com/gavinhoward/bc", + "oid": "eb62a6521bcdaea48a8a69a346facf14a46604be" + }, + { + "authoredDate": "2019-04-20T16:14:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T16:14:00Z", + "messageBody": "", + "messageHeadline": "Add information about recently added message catalogs.", + "oid": "b2950329c49de32e8dccf39ad3a64c3d210c9a46" + }, + { + "authoredDate": "2019-04-20T16:16:06Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T16:16:06Z", + "messageBody": "", + "messageHeadline": "Add quotes around fr_CA and fr_CH.", + "oid": "eaf8bc5fa067eb2c55c96d14ad21ba952e83f6c5" + }, + { + "authoredDate": "2019-04-20T16:17:04Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T16:17:04Z", + "messageBody": "", + "messageHeadline": "Fix quotes around fr_CA and fr_CH.", + "oid": "7c87d5892205451fcabb38edf42ca4c948427dd7" + }, + { + "authoredDate": "2019-04-20T16:18:07Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-20T16:18:07Z", + "messageBody": "Anyway, I'm no native speaker of English and therefore the change is only\na crude example for what might be added ... ;-)", + "messageHeadline": "I think \"for\" is better than \"in\", here.", + "oid": "ecd6481f5aeabf178cc0fc7614840f08d74473b0" + }, + { + "authoredDate": "2019-04-24T09:16:49Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-24T09:16:49Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' of https://github.com/gavinhoward/bc", + "oid": "004ad884ed95213a1a14cc7a5b05353ff91fcceb" + }, + { + "authoredDate": "2019-04-24T21:28:32Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-24T21:28:32Z", + "messageBody": "…esent numbers\n\nThis code has been tested with add/sub, multiplicaton and power of integer values.\nNo tests have been performed for division and square root, yet.\n\nNumbers with fractional parts are not supported due to the missing scaling of the\n\"scale\" parameter.", + "messageHeadline": "Initial support for 32 bit integers instead of decimal digits to repr…", + "oid": "a299ffc466db2360d0cd21f8e872a4b9ccac8f0b" + }, + { + "authoredDate": "2019-04-24T23:23:08Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Eßer" + } + ], + "committedDate": "2019-04-24T23:23:08Z", + "messageBody": "This patch starts a branch exploring the possibility of using a more\npacked representation of digits in BcNum's. I am not sure this will work\nout, but it can't hurt to try, especially since Stefan was so kind to\ncome up with a patch and send it.\n\nAs of right now, the things that are known to be broken:\n\n* Printing decimal numbers\n* Power (seg fault)", + "messageHeadline": "Commit an adjusted patch sent to me by Stefan Eßer", + "oid": "4b111c28c02ac4c999ad62de5a448eb21e01489b" + }, + { + "authoredDate": "2019-04-24T23:31:23Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-24T23:31:23Z", + "messageBody": "", + "messageHeadline": "Attempt to make Stefan's work more portable", + "oid": "0700efc9bb2aad8921d035f18bb30e4e211e0115" + }, + { + "authoredDate": "2019-04-24T23:33:48Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-24T23:33:48Z", + "messageBody": "", + "messageHeadline": "Fix a bit of code that is not portable to 8-bit arches", + "oid": "d7e4d6e8e6e0c46c3ab378c8066ceedf02fe2784" + }, + { + "authoredDate": "2019-04-25T04:33:10Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T04:33:10Z", + "messageBody": "… of BcDig", + "messageHeadline": "Introduce 3 function to perform memcpy, memmove, and memset on arrays…", + "oid": "394a516fb6d95a9314783e4b920f9078b8d6217b" + }, + { + "authoredDate": "2019-04-25T05:05:24Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T05:05:24Z", + "messageBody": "", + "messageHeadline": "Modify malloc and realloc functions to operate on BcDig arrays", + "oid": "5fd43a372b887cae774309dae0482410eaa64344" + }, + { + "authoredDate": "2019-04-25T05:14:54Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T05:14:54Z", + "messageBody": "…ctions for use in vector.c", + "messageHeadline": "Add BcDig alloc functions to header and re-enable the plain alloc fun…", + "oid": "ca5a74eedef9edea724f90c386cf13322a972511" + }, + { + "authoredDate": "2019-04-25T05:42:03Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T05:42:03Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "14eff4647371265957e125e44ca8666cc845b54f" + }, + { + "authoredDate": "2019-04-25T05:56:10Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T05:56:10Z", + "messageBody": "", + "messageHeadline": "Use bc_num_set instead of memset in merged code", + "oid": "887d6b9b2fb148490d373f60cc13f42fb3a47102" + }, + { + "authoredDate": "2019-04-25T06:01:03Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T06:01:03Z", + "messageBody": "", + "messageHeadline": "Allow passing of -DBC_DEBUG_CODE on the command line", + "oid": "010dd2a01af69462ee1c94053e9f82cde65f171d" + }, + { + "authoredDate": "2019-04-25T06:09:13Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T06:09:13Z", + "messageBody": "", + "messageHeadline": "Remove duplicate definitioon of DUMP_NUM", + "oid": "a3430556302146f917be5266b7c6021ecd2e1133" + }, + { + "authoredDate": "2019-04-25T09:25:17Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T09:25:17Z", + "messageBody": "", + "messageHeadline": "Remove obsolete local variables", + "oid": "bf3b1b206e6e6a88c7ffc6ca7e10388f3fb1eb4a" + }, + { + "authoredDate": "2019-04-25T09:50:39Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T09:50:39Z", + "messageBody": "", + "messageHeadline": "Fix printing of the decimal point (occured multiple times)", + "oid": "610a8ee9e89626f9789ba63a3e5692adc19a46ef" + }, + { + "authoredDate": "2019-04-25T10:25:15Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-25T10:25:15Z", + "messageBody": "", + "messageHeadline": "Suppress printing of trailing zeroes of fractional parts of a result", + "oid": "0da1775703abdbd337f024a4b46208976b08508a" + }, + { + "authoredDate": "2019-04-25T17:33:54Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-25T17:33:54Z", + "messageBody": "", + "messageHeadline": "Fix a problem I introduced", + "oid": "b53a994e74fd2f226bac7756063b557dfd03f172" + }, + { + "authoredDate": "2019-04-25T21:18:49Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin D. Howard" + } + ], + "committedDate": "2019-04-25T21:18:49Z", + "messageBody": "A number of fixes and improvements ...", + "messageHeadline": "Merge pull request #15 from stesser/d9", + "oid": "7daf7e6cf26a6b3b11eeddd9d6bcc38bd52da3dc" + }, + { + "authoredDate": "2019-04-26T01:35:41Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T01:35:41Z", + "messageBody": "", + "messageHeadline": "Fix some style", + "oid": "af107d94c9352b37d4bf31815663fd68effa55b6" + }, + { + "authoredDate": "2019-04-26T01:43:49Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T01:43:49Z", + "messageBody": "", + "messageHeadline": "Fix some more style", + "oid": "f49fdaa396f2cda25379b056cf7ca9fffb0a68d6" + }, + { + "authoredDate": "2019-04-26T02:12:19Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T02:12:19Z", + "messageBody": "", + "messageHeadline": "Make some changes and mark functions that need work", + "oid": "fcf290110df0d7b09b5f89798888f05b8b371484" + }, + { + "authoredDate": "2019-04-26T03:13:54Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T03:13:54Z", + "messageBody": "There is still one bug: it allows in an extra 0 in the most significant\nspot if there is one, but it does produce the right numbers.", + "messageHeadline": "Make decimal parsing work", + "oid": "d43ec37d48c69660ba7098c88a8ef3002a49636d" + }, + { + "authoredDate": "2019-04-26T14:48:19Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T14:48:19Z", + "messageBody": "", + "messageHeadline": "Fix the definitions for BcDig", + "oid": "2eaeebffdce7fcd52b3a62d1537002b3580b6e28" + }, + { + "authoredDate": "2019-04-26T14:48:44Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T14:48:44Z", + "messageBody": "", + "messageHeadline": "Add more decimal tests", + "oid": "a0e90f3e79ef5b619b801753877d94992f6bdc95" + }, + { + "authoredDate": "2019-04-26T14:49:05Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T14:49:05Z", + "messageBody": "", + "messageHeadline": "Fix a warning", + "oid": "f196fbe426ea69bcf4fb3046cc4fedffd7fc54b7" + }, + { + "authoredDate": "2019-04-26T14:49:17Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T14:49:17Z", + "messageBody": "", + "messageHeadline": "Make parsing decimal work", + "oid": "3b60abb028266f4ff0e1aa3bdf42f440eae646c5" + }, + { + "authoredDate": "2019-04-26T15:46:29Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T15:46:29Z", + "messageBody": "", + "messageHeadline": "Fix a test result file", + "oid": "de5fcf3618c6a9ca342ed749459f395783de28d7" + }, + { + "authoredDate": "2019-04-26T15:47:50Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T15:47:50Z", + "messageBody": "", + "messageHeadline": "Fix another bug in the parse decimal procedure", + "oid": "6076dbb54bf4503abefeab22ee2a3edf6075e2e6" + }, + { + "authoredDate": "2019-04-26T15:48:12Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T15:48:25Z", + "messageBody": "This still uses an idea from Stefan Eßer and some code, mainly the\nbuffer for calculating the numbers. Other than that, I did it my way.\n\nThe reason for this is because I *really* want to make sure the radix is\non a BcDig boundary.", + "messageHeadline": "Make printing decimal numbers work", + "oid": "51cd7ea27608359bf4298766cbf1579da9c35242" + }, + { + "authoredDate": "2019-04-26T15:50:35Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T15:50:35Z", + "messageBody": "", + "messageHeadline": "Remove some TODO comments that are done", + "oid": "9cf865f8396f76015b63d5f719e1ba4f0504a629" + }, + { + "authoredDate": "2019-04-26T16:07:21Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T16:07:21Z", + "messageBody": "", + "messageHeadline": "Make add work", + "oid": "fba50a2a7d78923ffc98e593bff06913f283b9af" + }, + { + "authoredDate": "2019-04-26T16:07:45Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T16:07:45Z", + "messageBody": "", + "messageHeadline": "Add a useful #define", + "oid": "1c1697cdc5724c5e2a2969e59fb17059d84b2272" + }, + { + "authoredDate": "2019-04-26T16:13:45Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T16:13:45Z", + "messageBody": "", + "messageHeadline": "Make subtract work", + "oid": "e6f326ed2d30c6814fed8a26d57ac6a5847587c6" + }, + { + "authoredDate": "2019-04-26T16:17:02Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T16:17:02Z", + "messageBody": "", + "messageHeadline": "Get rid of some compiler warnings", + "oid": "6fccd22b21b7f8cbf7ab2b48af912dd1ffb8bf8c" + }, + { + "authoredDate": "2019-04-26T16:17:57Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T16:17:57Z", + "messageBody": "", + "messageHeadline": "Remove some done TODO comments", + "oid": "e2e67ecbda93721e0820a01ce4e5ce660010f7bc" + }, + { + "authoredDate": "2019-04-26T16:40:02Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T16:40:02Z", + "messageBody": "", + "messageHeadline": "Fix some compiler warnings", + "oid": "c4783ac369bf46f1fbc894979fee2040e29008eb" + }, + { + "authoredDate": "2019-04-26T20:32:07Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T20:32:07Z", + "messageBody": "", + "messageHeadline": "Some general cleanup on math", + "oid": "971a26711ea6c03cbd23fd22bc93d03ead700f14" + }, + { + "authoredDate": "2019-04-26T20:32:55Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T20:32:55Z", + "messageBody": "", + "messageHeadline": "Make shift work", + "oid": "b155866dbb923e50d104ec210d095e14083fa372" + }, + { + "authoredDate": "2019-04-26T20:33:43Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T20:33:43Z", + "messageBody": "", + "messageHeadline": "Remove a compiler warning", + "oid": "da6b543c1501f01e4b781c7b24d16b950cbf0bd1" + }, + { + "authoredDate": "2019-04-26T20:46:52Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T20:46:52Z", + "messageBody": "", + "messageHeadline": "Fix truncate and extend", + "oid": "c9bef2d421dda2b0796a9ccb6198fe98ff56dd34" + }, + { + "authoredDate": "2019-04-26T21:39:46Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T21:39:46Z", + "messageBody": "I don't think it is done, however; power still needs to be tested.", + "messageHeadline": "Make multiply pass its tests", + "oid": "48a0e4793be1f58638be5c1b8820944f92afc498" + }, + { + "authoredDate": "2019-04-26T21:41:15Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T21:41:15Z", + "messageBody": "", + "messageHeadline": "Remove some TODO comments that are done", + "oid": "74b16c3bc8ec25b8c1e562ce04d68045692e1864" + }, + { + "authoredDate": "2019-04-26T21:47:25Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T21:47:25Z", + "messageBody": "", + "messageHeadline": "Remove more TODO comments that are done", + "oid": "a3f260c53adfcdd0fcd01404e08260b65c87e1e7" + }, + { + "authoredDate": "2019-04-26T21:59:15Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T21:59:15Z", + "messageBody": "", + "messageHeadline": "Clean up some style", + "oid": "404ece77d2e3e5009511e77a5f9e56d4e1afb3f7" + }, + { + "authoredDate": "2019-04-26T21:59:33Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-26T21:59:33Z", + "messageBody": "", + "messageHeadline": "Fix various small issues", + "oid": "774454354a9354023b6fb7e3aa396b269a5562f7" + }, + { + "authoredDate": "2019-04-26T23:29:01Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-26T23:29:01Z", + "messageBody": "", + "messageHeadline": "Iterative division based on Newton Raphson algorithm", + "oid": "193f8529ad93306e39914ca7a2aa877669383f6f" + }, + { + "authoredDate": "2019-04-27T01:31:31Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T01:31:31Z", + "messageBody": "", + "messageHeadline": "Change some code back to what it was (with adjustments)", + "oid": "c25fd61637390cc993c91258dda2c01404b37147" + }, + { + "authoredDate": "2019-04-27T07:16:26Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T07:16:26Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "87c27b5715646eb4deec4a6795c17b4c5facc408" + }, + { + "authoredDate": "2019-04-27T08:39:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T08:39:00Z", + "messageBody": "", + "messageHeadline": "Fix mismerge regarding nBcDig vs. places", + "oid": "70f118574077b6e61cae08bd576ca7fccc167786" + }, + { + "authoredDate": "2019-04-27T08:40:14Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T08:40:14Z", + "messageBody": "…e current rdx", + "messageHeadline": "Fix segmentation fault that occurs if the target rdx is lower than th…", + "oid": "6189d95036f123d48d505bf4d4a49ba11ca30aee" + }, + { + "authoredDate": "2019-04-27T08:42:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T08:42:00Z", + "messageBody": "", + "messageHeadline": "Add simple debug print macro", + "oid": "cdda6e99974b8f9551ad1bc184b3c735afac6f4a" + }, + { + "authoredDate": "2019-04-27T11:47:09Z", + "authors": [ + { + "email": "root@StefanEsser.freebsd.org", + "id": "", + "login": "", + "name": "Charlie Root" + } + ], + "committedDate": "2019-04-27T11:47:09Z", + "messageBody": "", + "messageHeadline": "Fix calculation of scale in multiplications", + "oid": "ac244bdb3ebe6e6a2693f3d5c2ae13d7723b3517" + }, + { + "authoredDate": "2019-04-27T12:36:28Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T12:36:28Z", + "messageBody": "", + "messageHeadline": "Fix seg fault in bc_num_shiftLeft()", + "oid": "b1d29c24cb4bfa07f3bc3e665811ab8b100b0b5e" + }, + { + "authoredDate": "2019-04-27T12:40:58Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin D. Howard" + } + ], + "committedDate": "2019-04-27T12:40:58Z", + "messageBody": "Newton-Raphson based division", + "messageHeadline": "Merge pull request #16 from stesser/d9", + "oid": "769fcbed7a3a0005a60254c0ed5203406b533ae3" + }, + { + "authoredDate": "2019-04-27T12:41:58Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T12:41:58Z", + "messageBody": "", + "messageHeadline": "Fix some style", + "oid": "2e736dee1ae4ddadbe4305296fc98ecc9a917e45" + }, + { + "authoredDate": "2019-04-27T12:43:57Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T12:43:57Z", + "messageBody": "", + "messageHeadline": "Fix the multiplication scale back", + "oid": "cf9f246919f39e50c911c6552d9b16f05a0fc2cf" + }, + { + "authoredDate": "2019-04-27T12:51:33Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T12:51:33Z", + "messageBody": "", + "messageHeadline": "Merge branch 'master' into base9", + "oid": "5de0bd695347a0ef5bde2d526472a2a3ba6d2a17" + }, + { + "authoredDate": "2019-04-27T13:26:35Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:26:35Z", + "messageBody": "", + "messageHeadline": "Add another print debug function", + "oid": "5b40e402dc37897052129db14441695a25bd86f8" + }, + { + "authoredDate": "2019-04-27T13:28:24Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:28:24Z", + "messageBody": "", + "messageHeadline": "Change bc_num_printDigs() a bit", + "oid": "37118f4c4f26f64bb4becb0caa55149659ca8ac3" + }, + { + "authoredDate": "2019-04-27T13:28:45Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:28:45Z", + "messageBody": "", + "messageHeadline": "Fix a divide by 0", + "oid": "edd9d9dd1459746a4bb2012194a3d3c831414c68" + }, + { + "authoredDate": "2019-04-27T13:28:56Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:28:56Z", + "messageBody": "", + "messageHeadline": "Fix some style", + "oid": "034b5b9e16e57becf5121ed60ae1dac8b8dc4ece" + }, + { + "authoredDate": "2019-04-27T13:33:16Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:33:16Z", + "messageBody": "", + "messageHeadline": "Fix more style", + "oid": "c88e5231008923290d1ead34ff987fb2e17043c5" + }, + { + "authoredDate": "2019-04-27T13:34:13Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:34:13Z", + "messageBody": "", + "messageHeadline": "Fix even more style", + "oid": "20afaeab2ffca9a32e1fa65feeb33050d9c4e204" + }, + { + "authoredDate": "2019-04-27T13:53:23Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:53:23Z", + "messageBody": "", + "messageHeadline": "Move an item", + "oid": "948b639a0674f3ce836fe3ba843e2253ef798cd8" + }, + { + "authoredDate": "2019-04-27T13:53:36Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T13:53:36Z", + "messageBody": "", + "messageHeadline": "Remove two unused functions", + "oid": "2316cb42fdff7b768debf3d9c65b73c9c8fc6137" + }, + { + "authoredDate": "2019-04-27T14:09:32Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T14:09:32Z", + "messageBody": "", + "messageHeadline": "Add length and scale tests", + "oid": "805328cdb9342eb249dc398b4569190d7ca78747" + }, + { + "authoredDate": "2019-04-27T14:30:10Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-27T14:30:10Z", + "messageBody": "", + "messageHeadline": "Make length work", + "oid": "b41483b364bf8fe8841e8875febeb4d58743e32f" + }, + { + "authoredDate": "2019-04-27T21:33:08Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:33:08Z", + "messageBody": "…upstream changes", + "messageHeadline": "Updated implementation of Newton-Raphson division algorithm to match …", + "oid": "b5aeb445a556de9d9b41a7b2d196b59bcaca90ae" + }, + { + "authoredDate": "2019-04-27T21:41:21Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:41:21Z", + "messageBody": "", + "messageHeadline": "Small optimization of the division function", + "oid": "6e129fc621b358d219036e6e4d01f572adb133ff" + }, + { + "authoredDate": "2019-04-27T21:43:02Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:43:02Z", + "messageBody": "", + "messageHeadline": "Small optimization of the division function", + "oid": "217379d6199e6bb8b586716b382731882c6096fe" + }, + { + "authoredDate": "2019-04-27T21:45:48Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:45:48Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "45a56123c3c6ede3cf157419e56427a01ff48e2a" + }, + { + "authoredDate": "2019-04-28T00:04:02Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Eßer" + } + ], + "committedDate": "2019-04-28T00:04:02Z", + "messageBody": "He says that he made division work. Cool.", + "messageHeadline": "Import more code from Stefan", + "oid": "daaaaa795095115e813ad7c7afbae0937a046246" + }, + { + "authoredDate": "2019-04-28T10:30:47Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T10:30:47Z", + "messageBody": "I had missed to set scsale values in the parameters passed in by the divide\nfunction and thus got results that had 0 fractional digits.", + "messageHeadline": "Undo change to scale calculation in bc_num_m", + "oid": "d793fa5c3a03370627e45d5f03968039b10f34c6" + }, + { + "authoredDate": "2019-04-28T12:58:58Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T12:58:58Z", + "messageBody": "This function will be used in the division algorithm.", + "messageHeadline": "Add function to round number to a given number of decimal places", + "oid": "db970636e68f62f41c17c6053e5ccc242161e5a0" + }, + { + "authoredDate": "2019-04-28T13:50:14Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T13:50:14Z", + "messageBody": "I had a local change that made bc_num_invert implicily extend this variable,\nbut noticed with that change reverted that the precision of the calculation\nwas reduced to BC_BASE_POWER decimals, leading to imprecise division results.", + "messageHeadline": "Fix division: Extend variable to required number of decimal places", + "oid": "70997150a28b4df49639924431cb0706a403207f" + }, + { + "authoredDate": "2019-04-28T15:21:34Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T15:21:34Z", + "messageBody": "For now, keep the Newton-Raphson algorithm in an #if 0 block for reference and to\nallow to compare them in further tests.\n\nI have noticed segmentation faults when dividing very large numbers, which probably\nare due to missing calls of bc_num_extend() for destination variables of arithmetic\noperations. I'll try to fix the length calculations, but I do not know the exact\nsemantics of a number of low level calls.", + "messageHeadline": "Replace Newton-Raphson algorithm by Goldschmidt algorithm.", + "oid": "154b473a9c65f081d673556ce163c50754cf75de" + }, + { + "authoredDate": "2019-04-28T18:19:51Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T18:19:51Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "307ce024f26a0433460a84ad5ad22bd3ac6f094f" + }, + { + "authoredDate": "2019-04-28T19:32:13Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T19:32:13Z", + "messageBody": "", + "messageHeadline": "Optimize bc_num_pow10", + "oid": "72109f49b8cd1e877c4b4252652d73f21d0ad689" + }, + { + "authoredDate": "2019-04-28T22:59:32Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T22:59:32Z", + "messageBody": "This makes bc complete the tests without crash, but with a result that\nhas too few digits printed. This will need to be debugged next ...", + "messageHeadline": "Fix scale parameters and remove bogus bc_num_extend calls", + "oid": "4c1e43af931618094a761dff7d1e4b0374e7576d" + }, + { + "authoredDate": "2019-04-29T10:56:32Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T10:56:32Z", + "messageBody": "Now all division and multiplication tests pass.", + "messageHeadline": "Fix position of decimal point when dividing by a very small number.", + "oid": "40b53d23eb92b69a9d079ead59def298cb089370" + }, + { + "authoredDate": "2019-04-29T11:00:23Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T11:00:23Z", + "messageBody": "", + "messageHeadline": "Improve format of dumped BcNum values in debug traces", + "oid": "33a1c689f4d5cf2026c92a954c36a50f6e772c8e" + }, + { + "authoredDate": "2019-04-29T12:24:31Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T12:24:31Z", + "messageBody": "There were 4 places where \"rdx\" had to be replaced by \"scale\".\nThis version passes all tests.", + "messageHeadline": "Fix \"power\" operator (bc_num_p).", + "oid": "c66e44871c84fc81a3595d21d9174082b62da1d3" + }, + { + "authoredDate": "2019-04-29T13:06:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T13:06:00Z", + "messageBody": "Results seem to be correct except for the number of decimals calculated and returned.\nThe tests still fail for that reason, but show results that are near to what is expected.", + "messageHeadline": "Mostly fix the sqrt operation.", + "oid": "627693667ff6b0bc70f4a636bd282423af74df62" + }, + { + "authoredDate": "2019-04-29T13:36:46Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-29T13:36:46Z", + "messageBody": "", + "messageHeadline": "Start building Goldschmidt", + "oid": "fdbcd063e2eab65ca07be9f62bdd10cc965a220d" + }, + { + "authoredDate": "2019-04-29T13:56:04Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-29T13:56:04Z", + "messageBody": "", + "messageHeadline": "Add a useful function", + "oid": "08f7856b38ca730b120e450dea482d0e18fd2232" + }, + { + "authoredDate": "2019-04-29T15:10:43Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T15:10:43Z", + "messageBody": "…orithm\n\nIntroduce and use a function bc_num_int_digits() that counts the number of digits\nto the left of the decimalpoint.", + "messageHeadline": "Fix and improve the calculation of the initial value for the sqrt alg…", + "oid": "cc7cd938dadfd8ecbaf61e79f7fba8060ff7194c" + }, + { + "authoredDate": "2019-04-29T16:14:21Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-29T16:14:21Z", + "messageBody": "There are still some cases that fail, but this is mostly working, and I\nwould like to save my progress.", + "messageHeadline": "Make most of divide work", + "oid": "36ec987c22af5d7ccc3b8aef0fe9758ce85c56a0" + }, + { + "authoredDate": "2019-04-29T16:28:33Z", + "authors": [ + { + "email": "yzena.tech@gmail.com", + "id": "", + "login": "", + "name": "Gavin Howard" + } + ], + "committedDate": "2019-04-29T16:28:33Z", + "messageBody": "", + "messageHeadline": "Make divide work", + "oid": "cef0397c810152aed4116fdc56dcf920d20eda32" + } + ], + "createdAt": "2019-04-29T11:21:03Z", + "deletions": 234, + "files": [ + { + "path": "include/num.h", + "additions": 71, + "deletions": 4 + }, + { + "path": "include/status.h", + "additions": 2, + "deletions": 0 + }, + { + "path": "include/vm.h", + "additions": 0, + "deletions": 2 + }, + { + "path": "src/num.c", + "additions": 838, + "deletions": 223 + }, + { + "path": "src/program.c", + "additions": 2, + "deletions": 2 + }, + { + "path": "tests/all.sh", + "additions": 1, + "deletions": 1 + }, + { + "path": "tests/bc/all.txt", + "additions": 4, + "deletions": 2 + }, + { + "path": "tests/bc/decimal.txt", + "additions": 23, + "deletions": 0 + }, + { + "path": "tests/bc/decimal_results.txt", + "additions": 23, + "deletions": 0 + }, + { + "path": "tests/bc/divide.txt", + "additions": 31, + "deletions": 0 + }, + { + "path": "tests/bc/divide_results.txt", + "additions": 30, + "deletions": 0 + }, + { + "path": "tests/bc/length.txt", + "additions": 59, + "deletions": 0 + }, + { + "path": "tests/bc/length_results.txt", + "additions": 57, + "deletions": 0 + }, + { + "path": "tests/bc/scale.txt", + "additions": 56, + "deletions": 0 + }, + { + "path": "tests/bc/scale_results.txt", + "additions": 56, + "deletions": 0 + }, + { + "path": "tests/bc/shift.txt", + "additions": 5280, + "deletions": 0 + }, + { + "path": "tests/bc/shift_results.txt", + "additions": 5280, + "deletions": 0 + } + ], + "fullDatabaseId": "274334078", + "headRefName": "d9", + "headRefOid": "914a7f66807b3567fa438c8d668a040e9d2bcc4a", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjc0MzM0MDc4", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "914a7f66807b3567fa438c8d668a040e9d2bcc4a" + }, + "mergeStateStatus": "UNKNOWN", + "mergeable": "UNKNOWN", + "mergedAt": "2019-05-06T13:42:00Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 18, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Division and modulo pass all tests", + "updatedAt": "2019-05-06T13:42:00Z", + "url": "https://github.com/gavinhoward/bc/pull/18" + }, + { + "additions": 295, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "base9", + "baseRefOid": "e396dff5929071da830a84b64405f7a7c8e0113e", + "body": "I'm still not sure about correct scale values and situations in which bc_num_extend must be called to prepare a BcNum that is to receive the result of an arithmetic operation. This leads to overflow for large values (the algorithm is essentially correct, but variables need to be extended in some cases).", + "changedFiles": 4, + "closed": true, + "closedAt": "2019-05-06T13:42:50Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ4NzM5MDI1OA==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "How does this new algorithm compare to Newton-Raphson performance-wise?", + "createdAt": "2019-04-28T15:38:21Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/17#issuecomment-487390258", + "viewerDidAuthor": true + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDQ4NzQwNzQ5NA==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Also, would it be possible for you to fix the crashes on both algorithms? The test suite crashes on both. It would also be nice if you could put them in a #if 0 #else #endif set so I can test the changes and see which one is faster. Thank you.", + "createdAt": "2019-04-28T19:14:59Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/17#issuecomment-487407494", + "viewerDidAuthor": true + }, + { + "id": "MDEyOklzc3VlQ29tbWVudDQ4OTYyNTA2NA==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Closed by manually merging.", + "createdAt": "2019-05-06T13:42:50Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/17#issuecomment-489625064", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-04-27T21:33:08Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:33:08Z", + "messageBody": "…upstream changes", + "messageHeadline": "Updated implementation of Newton-Raphson division algorithm to match …", + "oid": "b5aeb445a556de9d9b41a7b2d196b59bcaca90ae" + }, + { + "authoredDate": "2019-04-27T21:41:21Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:41:21Z", + "messageBody": "", + "messageHeadline": "Small optimization of the division function", + "oid": "6e129fc621b358d219036e6e4d01f572adb133ff" + }, + { + "authoredDate": "2019-04-27T21:43:02Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:43:02Z", + "messageBody": "", + "messageHeadline": "Small optimization of the division function", + "oid": "217379d6199e6bb8b586716b382731882c6096fe" + }, + { + "authoredDate": "2019-04-27T21:45:48Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T21:45:48Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "45a56123c3c6ede3cf157419e56427a01ff48e2a" + }, + { + "authoredDate": "2019-04-28T10:30:47Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T10:30:47Z", + "messageBody": "I had missed to set scsale values in the parameters passed in by the divide\nfunction and thus got results that had 0 fractional digits.", + "messageHeadline": "Undo change to scale calculation in bc_num_m", + "oid": "d793fa5c3a03370627e45d5f03968039b10f34c6" + }, + { + "authoredDate": "2019-04-28T12:58:58Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T12:58:58Z", + "messageBody": "This function will be used in the division algorithm.", + "messageHeadline": "Add function to round number to a given number of decimal places", + "oid": "db970636e68f62f41c17c6053e5ccc242161e5a0" + }, + { + "authoredDate": "2019-04-28T13:50:14Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T13:50:14Z", + "messageBody": "I had a local change that made bc_num_invert implicily extend this variable,\nbut noticed with that change reverted that the precision of the calculation\nwas reduced to BC_BASE_POWER decimals, leading to imprecise division results.", + "messageHeadline": "Fix division: Extend variable to required number of decimal places", + "oid": "70997150a28b4df49639924431cb0706a403207f" + }, + { + "authoredDate": "2019-04-28T15:21:34Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T15:21:34Z", + "messageBody": "For now, keep the Newton-Raphson algorithm in an #if 0 block for reference and to\nallow to compare them in further tests.\n\nI have noticed segmentation faults when dividing very large numbers, which probably\nare due to missing calls of bc_num_extend() for destination variables of arithmetic\noperations. I'll try to fix the length calculations, but I do not know the exact\nsemantics of a number of low level calls.", + "messageHeadline": "Replace Newton-Raphson algorithm by Goldschmidt algorithm.", + "oid": "154b473a9c65f081d673556ce163c50754cf75de" + }, + { + "authoredDate": "2019-04-28T18:19:51Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T18:19:51Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "307ce024f26a0433460a84ad5ad22bd3ac6f094f" + }, + { + "authoredDate": "2019-04-28T19:32:13Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T19:32:13Z", + "messageBody": "", + "messageHeadline": "Optimize bc_num_pow10", + "oid": "72109f49b8cd1e877c4b4252652d73f21d0ad689" + }, + { + "authoredDate": "2019-04-28T22:59:32Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-28T22:59:32Z", + "messageBody": "This makes bc complete the tests without crash, but with a result that\nhas too few digits printed. This will need to be debugged next ...", + "messageHeadline": "Fix scale parameters and remove bogus bc_num_extend calls", + "oid": "4c1e43af931618094a761dff7d1e4b0374e7576d" + }, + { + "authoredDate": "2019-04-29T10:56:32Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T10:56:32Z", + "messageBody": "Now all division and multiplication tests pass.", + "messageHeadline": "Fix position of decimal point when dividing by a very small number.", + "oid": "40b53d23eb92b69a9d079ead59def298cb089370" + }, + { + "authoredDate": "2019-04-29T11:00:23Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T11:00:23Z", + "messageBody": "", + "messageHeadline": "Improve format of dumped BcNum values in debug traces", + "oid": "33a1c689f4d5cf2026c92a954c36a50f6e772c8e" + }, + { + "authoredDate": "2019-04-29T12:24:31Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T12:24:31Z", + "messageBody": "There were 4 places where \"rdx\" had to be replaced by \"scale\".\nThis version passes all tests.", + "messageHeadline": "Fix \"power\" operator (bc_num_p).", + "oid": "c66e44871c84fc81a3595d21d9174082b62da1d3" + }, + { + "authoredDate": "2019-04-29T13:06:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T13:06:00Z", + "messageBody": "Results seem to be correct except for the number of decimals calculated and returned.\nThe tests still fail for that reason, but show results that are near to what is expected.", + "messageHeadline": "Mostly fix the sqrt operation.", + "oid": "627693667ff6b0bc70f4a636bd282423af74df62" + }, + { + "authoredDate": "2019-04-29T15:10:43Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T15:10:43Z", + "messageBody": "…orithm\n\nIntroduce and use a function bc_num_int_digits() that counts the number of digits\nto the left of the decimalpoint.", + "messageHeadline": "Fix and improve the calculation of the initial value for the sqrt alg…", + "oid": "cc7cd938dadfd8ecbaf61e79f7fba8060ff7194c" + }, + { + "authoredDate": "2019-04-29T18:13:51Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T18:13:51Z", + "messageBody": "", + "messageHeadline": "Make more Sqrt tests work", + "oid": "8f7c5a565c0c8cb4f674982c6fbb3174d6eaeee9" + }, + { + "authoredDate": "2019-04-29T18:49:15Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T18:49:15Z", + "messageBody": "", + "messageHeadline": "Make all Sqrt tests work", + "oid": "1f0f69f0d249d14270fe14a993405926a536ce05" + }, + { + "authoredDate": "2019-04-29T19:28:52Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T19:28:52Z", + "messageBody": "", + "messageHeadline": "Apply existing style to my changes - no functional change", + "oid": "f76f0365e272d675c73fb62dcfa09653960106fc" + }, + { + "authoredDate": "2019-04-29T20:10:41Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-29T20:10:41Z", + "messageBody": "", + "messageHeadline": "Fix debug printing of BcNum variables", + "oid": "0dea79ffb116b3395b949b18d80473af9e969ced" + }, + { + "authoredDate": "2019-04-30T08:47:06Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-30T08:47:06Z", + "messageBody": "…uns easier to decode", + "messageHeadline": "Make debug printing of BcNum variables use signed values to make over…", + "oid": "f8610b15aeed384d520d83ba66c964abd828d096" + }, + { + "authoredDate": "2019-04-30T09:24:44Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-30T09:24:44Z", + "messageBody": "", + "messageHeadline": "Fix printing of numbers with obase != 10 (length of fractional part)", + "oid": "36220832c7341fd267fdfb4010c579c5bc840a60" + }, + { + "authoredDate": "2019-05-02T08:43:02Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-02T08:43:02Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "4534283defbcd20faf921666b0b32693633c3ec2" + }, + { + "authoredDate": "2019-05-02T08:43:21Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-02T08:43:21Z", + "messageBody": "…results.\n\nThe implementation can be changed back to a macro that accesses the array\nwithout any further computation, if the function should take non-negligible\ntime. But the function will be inlined or optimized away in most cases and\nthus should not have a significant impact on the run-time ...", + "messageHeadline": "Revert bc_num_pow10 to a function instead of an array that holds the …", + "oid": "6167e2231df4f606278ca414931612a0e7d595e1" + }, + { + "authoredDate": "2019-05-02T08:56:01Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-02T08:56:01Z", + "messageBody": "", + "messageHeadline": "Add back the forward declaration of bc_num_pow10.", + "oid": "5b2af58b477230aea07d7f69d401390d500b5a75" + }, + { + "authoredDate": "2019-05-02T11:38:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-02T11:38:00Z", + "messageBody": "", + "messageHeadline": "Allow to pass BC_BASE_POWER on the compiler command line", + "oid": "4d90ccff6ac554b33b5832d79bca935cb8d03fc3" + }, + { + "authoredDate": "2019-05-04T07:12:09Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T07:12:09Z", + "messageBody": "", + "messageHeadline": "Fix decoding of BcNum in debug print function", + "oid": "f28be31518134f169a64d4a8104414c335b5c947" + }, + { + "authoredDate": "2019-05-04T07:14:02Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T07:14:02Z", + "messageBody": "", + "messageHeadline": "Fix merge errors in idivision based on Goldschmidt algorithm", + "oid": "10bca1171455d813a70b60a6bb05538b40831c1a" + }, + { + "authoredDate": "2019-05-04T07:24:27Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T07:24:27Z", + "messageBody": "\"shift\" operations are used within all arithmetic operations\n\"print\" is a pre-requisite of generating the results file for the \"parse\" test", + "messageHeadline": "Change order of tests to first test features that later tests depend on", + "oid": "f213e28e1a70e1ca581f9d137a1498dedcf97095" + }, + { + "authoredDate": "2019-05-04T13:58:41Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T13:58:41Z", + "messageBody": "…compiler warning", + "messageHeadline": "Change type of variables in debug print function to int to silence a …", + "oid": "013aeffa913df9dd96eec9c2dacfb64c9e766868" + }, + { + "authoredDate": "2019-05-04T14:19:12Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T14:19:12Z", + "messageBody": "The correction is derived from the difference of the input parameter times it inverse.\nThis value could be used for a final Newton-Raphson step (at the cost of an additional\nmultiplication), but since we can assume that the input\tparameter was very near\tto 1.0,\nthe multiplication would only add non-zero digits beyond the current scale range.\n\nThe Goldschmidt\talgorithm is an\tinfinite series\tof ever smaller positive values\tand\nif the series is cut off at some point,\tthe result is known to be exact\tor smaller\nthan the exact value.\n\nThe correction applied is meant\tto compensate for the neglected\tseries elements.\nIf it is found that there are boundary cases where we over-compensate, then the\nNewton-Raphson step could be used to apply a slightly smaller correction.", + "messageHeadline": "Add correction to result of Goldschmidt\talgorithm", + "oid": "85f59a665e6b20380accdb7c9f5fbca0d39d693b" + }, + { + "authoredDate": "2019-05-04T14:24:40Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T14:24:40Z", + "messageBody": "After a correction is applied to the returned reciprocal to account for the finite\nnumber of elements used in teh Goldschmidt algorithm, the result should be correct\nwithout the final rounding step.\n\nWhile here also remove the assignment of 1 to a variable that is not used for the\nspecific case anymore, anyway ...", + "messageHeadline": "Adapt division algorithm to use the updated bc_num_invert()", + "oid": "7e21b3cca2b93e7d5509e05dbf3d2076dcffa74d" + }, + { + "authoredDate": "2019-05-04T15:01:21Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T15:01:21Z", + "messageBody": "", + "messageHeadline": "Fix width of value printed for base > 17", + "oid": "017f0c843a3439651ce310cdb6ffc90cc09f6203" + }, + { + "authoredDate": "2019-05-04T15:05:12Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T15:05:12Z", + "messageBody": "", + "messageHeadline": "Fix printing of fractional parts for obase > 10", + "oid": "1a503e62ff9e642740577f8df68e439a1b9e1d10" + }, + { + "authoredDate": "2019-05-04T16:02:15Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T16:02:15Z", + "messageBody": "It has been found to be too low e.g. when calculating l(256)/l(16) with scale=40.\nThe result is exact with this increased correction applied.", + "messageHeadline": "Double correction value applied in bc_num_invert()", + "oid": "b9db23ba3b452798cc5b4ded0125565e5940f3e3" + }, + { + "authoredDate": "2019-05-04T18:12:43Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T18:12:43Z", + "messageBody": "The locations with these markers should be checked, although the tests seem to\nsucceed wíthiut them.\n\nCurrently test succeed until \"reference.bc2\", which returns zeroes for some of\nthe test arrays. But these marked locations are probably not related to that\ntest failing.", + "messageHeadline": "Mark a few places where changes might be required with // ", + "oid": "276de8c876ba72f1357dd0ce7cc1ef403902cedf" + }, + { + "authoredDate": "2019-05-04T21:48:51Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T21:48:51Z", + "messageBody": "This change has been performed due to a source code analysis.\nNo tests failed with the old code (i.e., no test covered this case).", + "messageHeadline": "Fix length parameter which obviously should be scale not rdx", + "oid": "e6bd86bdb390d0a74b31aabdde56d5824f38741c" + }, + { + "authoredDate": "2019-05-04T21:50:38Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-04T21:50:38Z", + "messageBody": "", + "messageHeadline": "Add comments to the division based on the Goldschmidt algorithm", + "oid": "28ffb91991cb5ca2c8687de2ff355161088d5997" + }, + { + "authoredDate": "2019-05-05T19:54:54Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-05T19:54:54Z", + "messageBody": "… crashing\n\nThe cut-off value is arbitrary, a significantly lower limit could be applied.", + "messageHeadline": "Make shiftLeft return an error for too large shift amounts instead of…", + "oid": "e274dbe523657c7bfc4228ddbf2e6dfbbca36059" + }, + { + "authoredDate": "2019-05-05T20:00:21Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-05-05T20:00:21Z", + "messageBody": "The Goldschmidt algorithm needs larger arguments than supported by the\narray.\n\nA larger array could be used, but a disassembly showed, that the array\naccess was converted to an inlined and rolled out chain of comparisons\nand assignments.", + "messageHeadline": "Optimize bc_num_pow10() and remove the unused bc_num_pow10 array", + "oid": "914a7f66807b3567fa438c8d668a040e9d2bcc4a" + } + ], + "createdAt": "2019-04-28T15:29:42Z", + "deletions": 63, + "files": [ + { + "path": "include/num.h", + "additions": 33, + "deletions": 13 + }, + { + "path": "src/data.c", + "additions": 0, + "deletions": 19 + }, + { + "path": "src/num.c", + "additions": 260, + "deletions": 29 + }, + { + "path": "tests/bc/all.txt", + "additions": 2, + "deletions": 2 + } + ], + "fullDatabaseId": "274187961", + "headRefName": "d9", + "headRefOid": "914a7f66807b3567fa438c8d668a040e9d2bcc4a", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjc0MTg3OTYx", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": null, + "mergeStateStatus": "DIRTY", + "mergeable": "CONFLICTING", + "mergedAt": null, + "mergedBy": null, + "milestone": null, + "number": 17, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "CLOSED", + "statusCheckRollup": [], + "title": "Implementation of an alternate algorithm for reciprocal values", + "updatedAt": "2019-05-06T13:42:51Z", + "url": "https://github.com/gavinhoward/bc/pull/17" + }, + { + "additions": 147, + "assignees": [], + "author": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "is_bot": false, + "login": "stesser", + "name": "Stefan Eßer" + }, + "autoMergeRequest": null, + "baseRefName": "base9", + "baseRefOid": "c25fd61637390cc993c91258dda2c01404b37147", + "body": "The code is not cleaned up, but since you said your are waiting for it ...", + "changedFiles": 1, + "closed": true, + "closedAt": "2019-04-27T12:40:59Z", + "comments": [ + { + "id": "MDEyOklzc3VlQ29tbWVudDQ4NzI4Mjk1Ng==", + "author": { + "login": "gavinhoward" + }, + "authorAssociation": "OWNER", + "body": "Merged. Will get to work on it now.", + "createdAt": "2019-04-27T12:41:09Z", + "includesCreatedEdit": false, + "isMinimized": false, + "minimizedReason": "", + "reactionGroups": [], + "url": "https://github.com/gavinhoward/bc/pull/16#issuecomment-487282956", + "viewerDidAuthor": true + } + ], + "commits": [ + { + "authoredDate": "2019-04-26T23:29:01Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-26T23:29:01Z", + "messageBody": "", + "messageHeadline": "Iterative division based on Newton Raphson algorithm", + "oid": "193f8529ad93306e39914ca7a2aa877669383f6f" + }, + { + "authoredDate": "2019-04-27T07:16:26Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T07:16:26Z", + "messageBody": "", + "messageHeadline": "Merge branch 'base9' of https://github.com/gavinhoward/bc into d9", + "oid": "87c27b5715646eb4deec4a6795c17b4c5facc408" + }, + { + "authoredDate": "2019-04-27T08:39:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T08:39:00Z", + "messageBody": "", + "messageHeadline": "Fix mismerge regarding nBcDig vs. places", + "oid": "70f118574077b6e61cae08bd576ca7fccc167786" + }, + { + "authoredDate": "2019-04-27T08:40:14Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T08:40:14Z", + "messageBody": "…e current rdx", + "messageHeadline": "Fix segmentation fault that occurs if the target rdx is lower than th…", + "oid": "6189d95036f123d48d505bf4d4a49ba11ca30aee" + }, + { + "authoredDate": "2019-04-27T08:42:00Z", + "authors": [ + { + "email": "se@freebsd.org", + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "login": "stesser", + "name": "Stefan Esser" + } + ], + "committedDate": "2019-04-27T08:42:00Z", + "messageBody": "", + "messageHeadline": "Add simple debug print macro", + "oid": "cdda6e99974b8f9551ad1bc184b3c735afac6f4a" + }, + { + "authoredDate": "2019-04-27T11:47:09Z", + "authors": [ + { + "email": "root@StefanEsser.freebsd.org", + "id": "", + "login": "", + "name": "Charlie Root" + } + ], + "committedDate": "2019-04-27T11:47:09Z", + "messageBody": "", + "messageHeadline": "Fix calculation of scale in multiplications", + "oid": "ac244bdb3ebe6e6a2693f3d5c2ae13d7723b3517" + } + ], + "createdAt": "2019-04-26T23:33:21Z", + "deletions": 63, + "files": [ + { + "path": "src/num.c", + "additions": 147, + "deletions": 63 + } + ], + "fullDatabaseId": "274063201", + "headRefName": "d9", + "headRefOid": "ac244bdb3ebe6e6a2693f3d5c2ae13d7723b3517", + "headRepository": { + "id": "MDEwOlJlcG9zaXRvcnkxODAzNzI3NzY=", + "name": "bc" + }, + "headRepositoryOwner": { + "id": "MDQ6VXNlcjYyNjQ1NDY=", + "name": "Stefan Eßer", + "login": "stesser" + }, + "id": "MDExOlB1bGxSZXF1ZXN0Mjc0MDYzMjAx", + "isCrossRepository": true, + "isDraft": false, + "labels": [], + "latestReviews": [], + "maintainerCanModify": false, + "mergeCommit": { + "oid": "769fcbed7a3a0005a60254c0ed5203406b533ae3" + }, + "mergeStateStatus": "DIRTY", + "mergeable": "CONFLICTING", + "mergedAt": "2019-04-27T12:40:59Z", + "mergedBy": { + "id": "MDQ6VXNlcjMxNzI2ODc=", + "is_bot": false, + "login": "gavinhoward", + "name": "Gavin D. Howard" + }, + "milestone": null, + "number": 16, + "potentialMergeCommit": null, + "projectCards": [], + "projectItems": [], + "reactionGroups": [], + "reviewDecision": "", + "reviewRequests": [], + "reviews": [], + "state": "MERGED", + "statusCheckRollup": [], + "title": "Newton-Raphson based division", + "updatedAt": "2019-04-27T12:41:09Z", + "url": "https://github.com/gavinhoward/bc/pull/16" + } +] diff --git a/project/issue10.md b/project/issue10.md new file mode 100644 index 00000000000..4c417f1922a --- /dev/null +++ b/project/issue10.md @@ -0,0 +1,104 @@ +# "scale" not set correctly with -l when first command is a syntax error + +## `mathieu` + +I just hit a (small and unlikely to be triggered) problem when using the `-l` flag: + +``` +$ bc -l +>>> 2+; # or any other syntax error it seems + +Parse error: bad expression + :1 + +>>> l(1000) +6 +>>> scale +0 +``` + +The math library still gets loaded but `scale` doesn't get set (or gets reset)? + +The syntax error has to be on the first command and other kinds of errors (like say a divide by zero) don't seem to cause the problem. + +## `gavin` + +Hmm...let me investigate this and get back to you. This does seem like a bug. + +## `gavin` + +I'm not seeing the behavior. Can you send me the output of `bc -v`? + +## `gavin` + +I should also ask: what OS are you on? What version? What compiler did you use? Did you install from a package? + +Basically, send me as much info as you can. I would appreciate it. + +## `mathieu` + +Oh sorry yeah I should've given more details. + +That's on FreeBSD with the base system's bc, built with the default base compiler. + +On recent 12.2-STABLE: + +``` +$ bc -v +bc 4.0.1 +Copyright (c) 2018-2021 Gavin D. Howard and contributors +Report bugs at: https://git.yzena.com/gavin/bc + +This is free software with ABSOLUTELY NO WARRANTY. +``` + +Your bc is not default on 12.X yet but I enabled it with WITH_GH_BC=yes in /etc/src.conf to try it out. + +And on somewhat less recent 14-CURRENT: + +``` +$ bc -v +bc 4.0.0 +Copyright (c) 2018-2021 Gavin D. Howard and contributors +Report bugs at: https://git.yzena.com/gavin/bc + +This is free software with ABSOLUTELY NO WARRANTY. +``` + +Both amd64. Happens every time on both. + +I could give it a try on 13-STABLE too if that helps but I'd need to reboot something. + +The syntax error really has to be the FIRST input, even entering an empty line before it makes the problem not happen. + +I thought it could be an editline(3) problem since some programs end up using that pretty much only on the BSDs it seems, but that's not it. + +## `gavin` + +Yeah, my `bc` uses a custom history implementation, so it could be mine, but not `editline(3)`. + +I will pull up a FreeBSD VM and check it out. Sorry for the wait. + +## `gavin` + +I have confirmed the bug on FreeBSD with the port at version `4.0.1`. Since it is the port, and not the system one, I think the problem may lie with some incompatibility between my history implementation and what FreeBSD provides. + +This one may take me a long time to debug because I have to do it manually in the VM. Thank you for your patience. + +## `gavin` + +I found the problem! + +It is fixed in `299a4fd353`, but if you can pull that down and test, I would appreciate it. + +I will put out a release as soon as I can, and my FreeBSD contact will probably update 14-CURRENT soon thereafter. He will also update the port, but the version in 12.2 may not be updated for a bit. + +Feel free to reopen if the fix does not work for you. + +## `mathieu` + +Oof... yeah makes sense that an rc file could interfere with this. + +Yes, that fixes it here too. With that diff applied on both 12.2-STABLE and 14-CURRENT's versions. And everything else seems to still work fine too. + +Thanks for fixing this! You'd think it's really hard to trigger but I do enough typos and I start bc (with an alias with -l) often enough to make a quick calculation that I hit it twice and had decimals mysteriously missing before I started trying to reproduce it. diff --git a/scripts/exec-install.sh b/scripts/exec-install.sh index 581b6bd1ed2..835b7491ac6 100755 --- a/scripts/exec-install.sh +++ b/scripts/exec-install.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/format.sh b/scripts/format.sh index f76aed37818..e8836c6ba1e 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/functions.sh b/scripts/functions.sh index 1599fea4847..13ccbf8f3f3 100755 --- a/scripts/functions.sh +++ b/scripts/functions.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/karatsuba.py b/scripts/karatsuba.py index 637887986ee..c4e0720b340 100755 --- a/scripts/karatsuba.py +++ b/scripts/karatsuba.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/link.sh b/scripts/link.sh index 772de27a08c..4562677d7b3 100755 --- a/scripts/link.sh +++ b/scripts/link.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/lint.sh b/scripts/lint.sh index 14cdc5c3afc..611560ced31 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/locale_install.sh b/scripts/locale_install.sh index e891bf57db8..cec69d7201f 100755 --- a/scripts/locale_install.sh +++ b/scripts/locale_install.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/locale_uninstall.sh b/scripts/locale_uninstall.sh index 1bf292b801e..274b6bcf49f 100755 --- a/scripts/locale_uninstall.sh +++ b/scripts/locale_uninstall.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/os.c b/scripts/os.c index 212a61772cc..89c5b1b95b3 100644 --- a/scripts/os.c +++ b/scripts/os.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/scripts/release.pkg.yao b/scripts/release.pkg.yao new file mode 100644 index 00000000000..525709c2816 --- /dev/null +++ b/scripts/release.pkg.yao @@ -0,0 +1,1410 @@ +/** + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +PROG: str = path.realpath(sys.program); +REAL: str = path.realpath(PROG +~ ".."); + +SCRIPTDIR: str = path.dirname(PROG); + +WINDOWS: bool = (host.os == "Windows"); + +DEFOPT: str = if WINDOWS { "/D"; } else { "-D"; }; +C11OPT: str = if WINDOWS { "/std:c11"; } else { "-std=c11"; }; +C99OPT: str = if WINDOWS { "/std:c99"; } else { "-std=c99"; }; + +/** + * Turns a string array into a string by joining all strings together with + * spaces. + * @param arr The array to join. + * @return The joined array. + */ +fn strv2str(arr: []str) -> str +{ + ret: !str = ""; + + for item: arr + { + if ret == "" + { + ret! = item; + } + else + { + ret! = ret +~ " " +~ item; + } + } + + return ret; +} + +opts: Gaml = @(gaml){ + help: [ + "Runs the testing part of the release process.\n" + "\n" + "Usage: ", $PROG, " [-h|--help] [ \n" + ] + options: { + no64: { + help: "Turn off building and testing 64-bit builds." + long: @no-64 + type: @NONE + } + no128: { + help: "Turn off building and testing builds with 128-bit integers." + long: @no-128 + type: @NONE + } + C: { + help: "Turn off building under Clang." + short: @C + long: @no-clang + type: @NONE + } + C11: { + help: "Turn off building under C11." + long: @no-c11 + type: @NONE + } + G: { + help: "Turn off building under GCC." + short: @G + long: @no-gcc + type: @NONE + } + GEN: { + help: "Turn off running the gen script." + short: @G + long: @no-gen-script + type: @NONE + } + MAKE: { + help: "Turn off running the build with `configure.sh` and `make`." + long: @no-make + type: @NONE + } + RIG: { + help: "Turn off running the build with Rig." + long: @no-rig + type: @NONE + } + T: { + help: "Turn off running tests." + short: @T + long: @no-tests + type: @NONE + } + computed-goto: { + help: "Whether to test with computed goto or not." + long: @computed-goto + type: @NONE + } + e: { + help: "Whether to test with editline or not." + short: @e + long: @editline + type: @NONE + } + g: { + help: "Whether generate tests that are generated or not." + short: @g + long: @generate + type: @NONE + } + history: { + help: "Whether to test with history or not." + long: @history + type: @NONE + } + k: { + help: "Whether to run the Karatsuba tests or not." + short: @k + long: @karatsuba + type: @NONE + } + p: { + help: "Whether to run problematic tests or not." + short: @p + long: @problematic-tests + type: @NONE + } + r: { + help: "Whether to test with readline or not." + short: @r + long: @readline + type: @NONE + } + s: { + help: "Whether to run tests under sanitizers or not." + short: @s + long: @sanitizers + type: @NONE + } + settings: { + help: "Whether to test settings or not." + long: @settings + type: @NONE + } + v: { + help: "Whether to run under Valgrind or not." + short: @v + long: @valgrind + type: @NONE + } + } +}; + +// These are the booleans for the command-line flags. +no64: !bool = false; +no128: !bool = false; +clang: !bool = true; +c11: !bool = true; +gcc: !bool = true; +gen_host: !bool = true; +run_make: !bool = !WINDOWS; +run_rig: !bool = true; +tests: !bool = true; +computed_goto: !bool = false; +editline: !bool = false; +generated: !bool = false; +history: !bool = false; +karatsuba: !bool = false; +problematic: !bool = false; +readline: !bool = false; +sanitizers: !bool = false; +settings: !bool = false; +valgrind: !bool = false; + +defcc: str = if clang { "clang"; } else if gcc { "gcc"; } else { "c99"; }; +defbits: usize = if no64 { usize(32); } else { usize(64); }; + +cgoto_flags: []str = if !computed_goto { @[ "-DBC_NO_COMPUTED_GOTO" ]; }; + +// Set some strict warning flags. Clang's -Weverything can be way too strict, so +// we actually have to turn off some things. +CLANG_FLAGS: []str = @[ "-Weverything", "-Wno-padded", + "-Wno-unsafe-buffer-usage", + "-Wno-poison-system-directories", + "-Wno-switch-default", "-Wno-unknown-warning-option", + "-Wno-pre-c11-compat" ] +~ cgoto_flags; +GCC_FLAGS: []str = @[ "-Wno-clobbered" ] +~ cgoto_flags; + +CLANG_FLAGS_STR: str = strv2str(CLANG_FLAGS); + +GCC_FLAGS_STR: str = strv2str(GCC_FLAGS); + +// Common CFLAGS. +CFLAGS: []str = @[ "-Wall", "-Wextra", "-Werror", "-pedantic" ]; + +CFLAGS_STR: str = strv2str(CFLAGS); + +// Common debug and release flags. +DEBUG_CFLAGS: []str = CFLAGS +~ @[ "-fno-omit-frame-pointer" ]; +DEBUG_CFLAGS_STR: str = CFLAGS_STR +~ " -fno-omit-frame-pointer"; +RELEASE_CFLAGS: []str = CFLAGS +~ @[ "-DNDEBUG" ]; +RELEASE_CFLAGS_STR: str = CFLAGS_STR +~ " -DNDEBUG"; + +/** + * Print a header with a message. This is just to make it easy to track + * progress. + * @param msg The message to print in the header. + */ +fn header(msg: str) -> void +{ + io.eprint("\n*******************\n"); + io.eprint(msg); + io.eprint("\n*******************\n\n"); +} + +/** + * An easy way to call `make`. + * @param args The arguments to pass to `make`, if any. + */ +fn do_make(args: []str) -> void +{ + $ make -j64 %(args); +} + +/** + * An easy way to call Rig. + * @param args The arguments to pass to Rig, if any. + */ +fn do_rig(args: []str) -> void +{ + $ rig -j64 %(args); +} + +/** + * Runs `configure.sh`. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param gen The setting for `GEN_HOST`. + * @param long_bit The number of bits in longs. + */ +fn configure( + cflags: str, + cc: str, + flags: str, + gen: bool, + long_bit: usize +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + extra_flags: str = + if !generated + { + if !problematic { "-GP"; } else { "-G"; } + } + else if !problematic + { + "-P"; + }; + + extra_cflags: str = + if cc == "clang" + { + // We need to quiet this warning from Clang because the configure.sh + // docs have this warning, so people should know. Also, I want this + // script to work. + CLANG_FLAGS_STR +~ (if !gen_host { " -Wno-overlength-strings"; }); + } + else if cc == "gcc" + { + // We need to quiet this warning from GCC because the configure.sh docs + // have this warning, so people should know. Also, I want this script to + // work. + GCC_FLAGS_STR +~ (if !gen_host { "-Wno-overlength-strings"; }); + }; + + all_flags: str = flags +~ " " +~ extra_flags; + all_cflags: str = cflags +~ " " +~ extra_cflags; + + hdr := "Running configure.sh " +~ all_flags +~ + "..." +~ + "\n CC=\"" +~ cc +~ "\"\n" +~ + "\n CFLAGS=\"" +~ all_cflags +~ "\"\n" +~ + "\n LONG_BIT=" +~ str(long_bit) +~ + "\n GEN_HOST=" +~ str(gen); + + // Print the header and do the job. + header(hdr); + + env.set env.str("CFLAGS", str(cflags +~ extra_cflags)), + env.str("CC", cc), env.str("GEN_HOST", str(gen)), + env.str("LONG_BIT", str(long_bit)) + { + $ @(path.join(REAL, "configure.sh")) $flags $extra_flags > /dev/null + !> /dev/null; + } +} + +/** + * Build with `make`. This function also captures and outputs any warnings if + * they exist because as far as I am concerned, warnings are not acceptable for + * release. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param gen The setting for `GEN_HOST`. + * @param long_bit The number of bits in longs. + */ +fn build_make( + cflags: str, + cc: str, + flags: str, + gen: bool, + long_bit: usize +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + configure(cflags, cc, flags, gen, long_bit); + + hdr := "Building with `make`...\n CC=" +~ cc +~ + "\n CFLAGS=\"" +~ cflags +~ + "\n LONG_BIT=" +~ str(long_bit) +~ + "\n GEN_HOST=" +~ str(gen); + + header(hdr); + + res := $ make; + + if res.stderr.len != 0 + { + io.eprint(cc +~ "generated warning(s):\n\n"); + io.eprint(str(res.stderr)); + sys.exit(1); + } + + if res.exitcode != 0 + { + sys.exit(res.exitcode); + } +} + +/** + * Build with Rig. This function also captures and outputs any warnings if they + * exist because as far as I am concerned, warnings are not acceptable for + * release. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param long_bit The number of bits in longs. + */ +fn build_rig( + cflags: []str, + cc: str, + flags: []str, + long_bit: usize +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + cflags_str: str = strv2str(cflags); + + hdr := "Building with Rig...\n CC=" +~ cc +~ + "\n CFLAGS=\"" +~ cflags_str +~ + "\n LONG_BIT=" +~ str(long_bit); + + header(hdr); + + res := $ rig; + + if res.stderr.len != 0 + { + io.eprint(cc +~ "generated warning(s):\n\n"); + io.eprint(str(res.stderr)); + sys.exit(1); + } + + if res.exitcode != 0 + { + sys.exit(res.exitcode); + } +} + +/** + * Run tests with `make`. + * @param args Any arguments to pass to `make`, if any. + */ +fn run_test_make(args: []str) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header("Running `make` tests"); + + if args.len > 0 + { + do_make(args); + } + else + { + do_make(@[ "test" ]); + + if history + { + do_make(@[ "test_history" ]); + } + } +} + +/** + * Run tests with Rig. + * @param args Any arguments to pass to Rig, if any. + */ +fn run_test_rig(args: []str) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header("Running Rig tests"); + + if args.len > 0 + { + do_rig(args); + } + else + { + do_rig(@[ "test" ]); + + if history + { + do_rig(@[ "test_history" ]); + } + } +} + +/** + * Builds and runs tests using `make` with both calculators, then bc only, then + * dc only. If `tests` is false, then it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + * @param gen The setting for `GEN_HOST`. + * @param long_bit The number of bits in longs. + */ +fn run_config_tests_make( + cflags: str, + cc: str, + flags: str, + gen: bool, + long_bit: usize, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header_start: str = + if tests + { + "Running tests with configure flags and `make`"; + } + else + { + "Building with configure flags and `make`"; + }; + + header("\"" +~ header_start +~ "\" ...\n" +~ + " CC=" +~ cc +~ "\n" +~ + " CFLAGS=\"" +~ cflags +~ "\"\n" +~ + " LONG_BIT=" +~ str(long_bit) +~ "\n" +~ + " GEN_HOST=" +~ str(gen)); + + build_make(cflags, cc, flags, gen, long_bit); + + if tests + { + run_test_make(@[]); + } + + do_make(@[ "clean" ]); + + build_make(cflags, cc, flags +~ " -b", gen, long_bit); + + if tests + { + run_test_make(@[]); + } + + do_make(@[ "clean" ]); + + build_make(cflags, cc, flags +~ " -d", gen, long_bit); + + if tests + { + run_test_make(@[]); + } + + do_make(@[ "clean" ]); +} + +/** + * Builds and runs tests using Rig with both calculators, then bc only, then dc + * only. If `tests` is false, then it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + * @param long_bit The number of bits in longs. + */ +fn run_config_tests_rig( + cflags: []str, + cc: str, + flags: []str, + long_bit: usize, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header_start: str = + if tests + { + "Running tests with Rig"; + } + else + { + "Building with Rig"; + }; + + header("\"" +~ header_start +~ "\" ...\n" +~ + " CC=" +~ cc +~ "\n" +~ + " CFLAGS=\"" +~ strv2str(cflags) +~ "\"\n" +~ + " flags=\"" +~ strv2str(flags) +~ "\"\n" +~ + " LONG_BIT=" +~ str(long_bit)); + + build_rig(cflags, cc, flags, long_bit); + + if tests + { + run_test_rig(@[]); + } + + do_rig(@[ "clean" ]); + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=bc" ], long_bit); + + if tests + { + run_test_rig(@[]); + } + + do_rig(@[ "clean" ]); + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=dc" ], long_bit); + + if tests + { + run_test_rig(@[]); + } + + do_rig(@[ "clean" ]); +} + +/** + * Builds and runs tests using `run_config_tests_make()` with both calculators, + * then bc only, then dc only. If `tests` is false, then it just does the + * builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_config_series_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if !no64 + { + if !no128 + { + run_config_tests_make(cflags, cc, flags, true, usize(64)); + } + + if gen_host + { + run_config_tests_make(cflags, cc, flags, false, usize(64)); + } + + run_config_tests_make(cflags +~ " " +~ DEFOPT +~ "BC_RAND_BUILTIN=0", + cc, flags, true, usize(64)); + + // Test Editline if history is not turned off. + if editline && !(flags contains "H") + { + run_config_tests_make(cflags +~ " " +~ DEFOPT +~ + "BC_RAND_BUILTIN=0", + cc, flags +~ " -e", true, usize(64)); + } + + // Test Readline if history is not turned off. + if readline && !(flags contains "H") + { + run_config_tests_make(cflags +~ " " +~ DEFOPT +~ + "BC_RAND_BUILTIN=0", + cc, flags +~ " -r", true, usize(64)); + } + } + + run_config_tests_make(cflags, cc, flags, true, usize(32)); + + if gen_host + { + run_config_tests_make(cflags, cc, flags, false, usize(32)); + } +} + +/** + * Builds and runs tests using `run_config_tests_rig()` with both calculators, + * then bc only, then dc only. If `tests` is false, then it just does the + * builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_config_series_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if !no64 + { + if !no128 + { + run_config_tests_rig(cflags, cc, flags, usize(64)); + } + + run_config_tests_rig(cflags +~ @[ DEFOPT +~ "BC_RAND_BUILTIN=0" ], cc, + flags, usize(64)); + + // Test Editline if history is not turned off. + if editline && !(flags contains "-Dhistory=none") + { + run_config_tests_rig(cflags +~ @[ DEFOPT +~ "BC_RAND_BUILTIN=0" ], + cc, flags +~ @[ "-Dhistory=editline" ], + usize(64)); + } + + // Test Readline if history is not turned off. + if readline && !(flags contains "-Dhistory=none") + { + run_config_tests_rig(cflags +~ @[ DEFOPT +~ "BC_RAND_BUILTIN=0" ], + cc, flags +~ @[ "-Dhistory=readline" ], + usize(64)); + } + } + + run_config_tests_rig(cflags, cc, flags, usize(32)); +} + +/** + * Builds and runs tests with each setting combo running + * `run_config_series_make()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_settings_series_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if settings + { + settings_path: str = path.join(SCRIPTDIR, "release_settings_make.txt"); + settings_txt: str = io.read_file(settings_path); + lines: []str = settings_txt.split("\n"); + + for line: lines + { + run_config_series_make(cflags, cc, flags +~ " " +~ line); + } + } + else + { + run_config_series_make(cflags, cc, flags); + } +} + +/** + * Builds and runs tests with each setting combo running + * `run_config_series_rig()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_settings_series_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if settings + { + settings_path: str = path.join(SCRIPTDIR, "release_settings_rig.txt"); + settings_txt: str = io.read_file(settings_path); + lines: []str = settings_txt.split("\n"); + + for line: lines + { + opts_list: []str = + for opt: line.split(" ") + { + DEFOPT +~ opt; + }; + + run_config_series_rig(cflags, cc, flags +~ opts_list); + } + } + else + { + run_config_series_rig(cflags, cc, flags); + } +} + +/** + * Builds and runs tests with each build type running + * `run_settings_series_make()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_test_series_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + series_flags: []str = @[ "E", "H", "N", "EH", "EN", "HN", "EHN" ]; + + run_settings_series_make(cflags, cc, flags); + + for sflag: series_flags + { + run_settings_series_make(cflags, cc, flags +~ " -" +~ sflag); + } +} + +/** + * Builds and runs tests with each build type running + * `run_settings_series_rig()`. If `tests` is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_test_series_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + series_path: str = path.join(SCRIPTDIR, "release_flags_rig.txt"); + series_txt: str = io.read_file(series_path); + series_flags: []str = series_txt.split("\n"); + + run_settings_series_rig(cflags, cc, flags); + + for line: series_flags + { + opts_list: []str = + for opt: line.split(" ") + { + DEFOPT +~ opt; + }; + + run_settings_series_rig(cflags, cc, flags +~ opts_list); + } +} + +/** + * Builds and runs tests for `bcl` with `make`. If `tests` is false, it just + * does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to `configure.sh` itself. + */ +fn run_lib_tests_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + build_make(cflags +~ " -a", cc, flags, true, usize(64)); + + if tests + { + run_test_make(@[ "test" ]); + } + + build_make(cflags +~ " -a", cc, flags, true, usize(32)); + + if tests + { + run_test_make(@[ "test" ]); + } +} + +/** + * Builds and runs tests for `bcl` with Rig. If `tests` is false, it just does + * the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_lib_tests_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=library" ], usize(64)); + + if tests + { + run_test_rig(@[ "test" ]); + } + + build_rig(cflags, cc, flags +~ @[ "-Dbuild_mode=library" ], usize(32)); + + if tests + { + run_test_rig(@[ "test" ]); + } +} + +/** + * Builds and runs tests under C99, then C11, if requested, using + * `run_test_series_make()`. If run_tests is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_tests_make( + cflags: str, + cc: str, + flags: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + run_test_series_make(cflags +~ " " +~ C99OPT, cc, flags); + + if c11 + { + run_test_series_make(cflags +~ " " +~ C11OPT, cc, flags); + } +} + +/** + * Builds and runs tests under C99, then C11, if requested, using + * `run_test_series_rig()`. If run_tests is false, it just does the builds. + * @param cflags The C compiler flags. + * @param cc The C compiler. + * @param flags The flags to pass to Rig itself. + */ +fn run_tests_rig( + cflags: []str, + cc: str, + flags: []str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + run_test_series_rig(cflags +~ @[ C99OPT ], cc, flags); + + if c11 + { + run_test_series_rig(cflags +~ @[ C11OPT ], cc, flags); + } +} + +/** + * Runs the Karatsuba tests with `make`. + */ +fn karatsuba_make() -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header("Running Karatsuba tests"); + + do_make(@[ "karatsuba_test" ]); +} + +/** + * Runs the Karatsuba tests with Rig. + */ +fn karatsuba_rig() -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header("Running Karatsuba tests"); + + build_rig(RELEASE_CFLAGS, defcc, @[ "-O3" ], usize(64)); + + do_rig(@[ "karatsuba_test" ]); +} + +/** + * Builds with `make` and runs under valgrind. It runs both, bc only, then dc + * only, then the library. + */ +fn vg_make() -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + header("Running Valgrind under `make`"); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gv", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gvb", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gvd", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", "gcc", "-O3 -gva", true, + defbits); + run_test_make(@[ "test" ]); + + do_make(@[ "clean_config" ]); +} + +fn vg_rig() -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + header("Running Valgrind under Rig"); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gv" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gvb" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gvd" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], "gcc", @[ "-O3", "-gva" ], + defbits); + run_test_rig(@[ "test" ]); + + do_rig(@[ "clean_config" ]); +} + +/** + * Builds the debug series with `make` and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn debug_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if cc == "clang" && sanitizers + { + run_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=undefined", cc, "-mg"); + } + else + { + run_tests_make(DEBUG_CFLAGS_STR, cc, "-g"); + } +} + +/** + * Builds the release series with `make` and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn release_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + run_tests_make(RELEASE_CFLAGS_STR, cc, "-O3"); + run_lib_tests_make(RELEASE_CFLAGS_STR, cc, "-O3"); +} + +/** + * Builds the release debug series with `make` and runs the tests if `tests` + * allows. + * @param cc The C compiler. + */ +fn reldebug_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + if cc == "clang" && sanitizers + { + run_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=address", cc, "-mgO3"); + run_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=memory", cc, "-mgO3"); + } + else + { + run_tests_make(DEBUG_CFLAGS_STR, cc, "-gO3"); + } + + if cc == "clang" && sanitizers + { + run_lib_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=address", cc, + "-mgO3"); + run_lib_tests_make(DEBUG_CFLAGS_STR +~ " -fsanitize=memory", cc, + "-mgO3"); + } + else + { + run_lib_tests_make(DEBUG_CFLAGS_STR, cc, "-gO3"); + } +} + +/** + * Builds the min size release with `make` and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn minsize_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + run_tests_make(RELEASE_CFLAGS_STR, cc, "-Os"); + run_lib_tests_make(RELEASE_CFLAGS_STR, cc, "-Os"); +} + +/** + * Builds all sets with `make`: debug, release, release debug, and min size, and + * runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn build_set_make( + cc: str, +) -> void +{ + if !run_make + { + sys.panic("Cannot run `configure.sh` or make"); + } + + debug_make(cc); + release_make(cc); + reldebug_make(cc); + minsize_make(cc); + + if karatsuba + { + karatsuba_make(); + } + + if valgrind + { + vg_make(); + } +} + +/** + * Builds the debug series with Rig and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn debug_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if cc == "clang" && sanitizers + { + run_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=undefined" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1" ]); + } + else + { + run_tests_rig(DEBUG_CFLAGS, cc, @[ "-Ddebug=1" ]); + } +} + +/** + * Builds the release series with Rig and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn release_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + run_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=3" ]); + run_lib_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=3" ]); +} + +/** + * Builds the release debug series with Rig and runs the tests if `tests` + * allows. + * @param cc The C compiler. + */ +fn reldebug_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + if cc == "clang" && sanitizers + { + run_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=address" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + run_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=memory" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + } + else + { + run_tests_rig(DEBUG_CFLAGS, cc, @[ "-gO3" ]); + } + + if cc == "clang" && sanitizers + { + run_lib_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=address" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + run_lib_tests_rig(DEBUG_CFLAGS +~ @[ " -fsanitize=memory" ], cc, + @[ "-Dmemcheck=1", "-Ddebug=1", "-Doptimization=3" ]); + } + else + { + run_lib_tests_rig(DEBUG_CFLAGS, cc, + @[ "-Ddebug=1", "-Doptimization=3" ]); + } +} + +/** + * Builds the min size release with Rig and runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn minsize_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + run_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=s" ]); + run_lib_tests_rig(RELEASE_CFLAGS, cc, @[ "-Doptimization=s" ]); +} + +/** + * Builds all sets with Rig: debug, release, release debug, and min size, and + * runs the tests if `tests` allows. + * @param cc The C compiler. + */ +fn build_set_rig( + cc: str, +) -> void +{ + if !run_rig + { + sys.panic("Cannot run Rig"); + } + + debug_rig(cc); + release_rig(cc); + reldebug_rig(cc); + minsize_rig(cc); + + if karatsuba + { + karatsuba_rig(); + } + + if valgrind + { + vg_rig(); + } +} + +/** + * Builds all sets with `make` under all compilers. + */ +fn build_sets_make() -> void +{ + header("Running math library under --standard with Rig"); + + build_make(DEBUG_CFLAGS_STR +~ " -std=c99", defcc, "-g", true, + defbits); + + $ bin/bc -ls << @("quit\n"); + + do_rig(@[ "clean_tests" ]); + + if clang + { + build_set_make("clang"); + } + + if gcc + { + build_set_make("gcc"); + } +} + +/** + * Builds all sets with Rig under all compilers. + */ +fn build_sets_rig() -> void +{ + header("Running math library under --standard with Rig"); + + build_rig(DEBUG_CFLAGS +~ @[ "-std=c99" ], defcc, @[ "-Ddebug=1" ], + defbits); + + $ build/bc -ls << @("quit\n"); + + do_rig(@[ "clean_tests" ]); + + if clang + { + build_set_rig("clang"); + } + + if gcc + { + build_set_rig("gcc"); + } +} + +fn build_sets() -> void +{ + if !run_make + { + build_sets_rig(); + } + else if !run_rig + { + build_sets_make(); + } + else + { + parallel.map @[ "rig", "make" ]: + (builder: str) -> void + { + if builder == "rig" + { + build_sets_rig(); + } + else if builder == "make" + { + build_sets_make(); + } + else + { + sys.panic("Bad builder: " +~ builder +~ "\n"); + } + } + } + + io.eprint("\nTests successful.\n"); +} diff --git a/scripts/sqrt_frac_guess.bc b/scripts/sqrt_frac_guess.bc index acbcb368d2d..4591e95a216 100644 --- a/scripts/sqrt_frac_guess.bc +++ b/scripts/sqrt_frac_guess.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/sqrt_int_guess.bc b/scripts/sqrt_int_guess.bc index 925b7af7e10..9fabea874ae 100644 --- a/scripts/sqrt_int_guess.bc +++ b/scripts/sqrt_int_guess.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/sqrt_random.bc b/scripts/sqrt_random.bc index 1f58c2e30c5..08eeddab07a 100644 --- a/scripts/sqrt_random.bc +++ b/scripts/sqrt_random.bc @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/scripts/sqrt_random.sh b/scripts/sqrt_random.sh index e107ef532f6..0f7013da0e0 100755 --- a/scripts/sqrt_random.sh +++ b/scripts/sqrt_random.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/src/args.c b/src/args.c index 6eba802d34a..71a340bce1d 100644 --- a/src/args.c +++ b/src/args.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/bc.c b/src/bc.c index 572e42b1a16..3e324cfb8ba 100644 --- a/src/bc.c +++ b/src/bc.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/bc_fuzzer.c b/src/bc_fuzzer.c index 7d7b3292b72..9c68d6acbd1 100644 --- a/src/bc_fuzzer.c +++ b/src/bc_fuzzer.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -36,7 +36,6 @@ #include #include -#include #include #include #include diff --git a/src/bc_lex.c b/src/bc_lex.c index f83eaf73162..c53d583a018 100644 --- a/src/bc_lex.c +++ b/src/bc_lex.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/bc_parse.c b/src/bc_parse.c index cf4398709e5..f66e392a9e9 100644 --- a/src/bc_parse.c +++ b/src/bc_parse.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/data.c b/src/data.c index bb1a6796f75..00f692a4599 100644 --- a/src/data.c +++ b/src/data.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -70,8 +70,8 @@ const uchar dc_sig_msg_len = (uchar) (sizeof(dc_sig_msg) - 1); /// The copyright banner. const char bc_copyright[] = - "Copyright (c) 2018-2024 Gavin D. Howard and contributors\n" - "Report bugs at: https://git.gavinhoward.com/gavin/bc\n\n" + "Copyright (c) 2018-2025 Gavin D. Howard and contributors\n" + "Report bugs at: https://github.com/gavinhoward/bc\n\n" "This is free software with ABSOLUTELY NO WARRANTY.\n"; // clang-format on @@ -850,51 +850,51 @@ const char bc_parse_one[2] = "1"; /// A list of keywords for bc. This needs to be updated if keywords change. const BcLexKeyword bc_lex_kws[] = { - BC_LEX_KW_ENTRY("auto", 4, true), - BC_LEX_KW_ENTRY("break", 5, true), - BC_LEX_KW_ENTRY("continue", 8, false), - BC_LEX_KW_ENTRY("define", 6, true), - BC_LEX_KW_ENTRY("for", 3, true), - BC_LEX_KW_ENTRY("if", 2, true), - BC_LEX_KW_ENTRY("limits", 6, false), - BC_LEX_KW_ENTRY("return", 6, true), - BC_LEX_KW_ENTRY("while", 5, true), - BC_LEX_KW_ENTRY("halt", 4, false), - BC_LEX_KW_ENTRY("last", 4, false), - BC_LEX_KW_ENTRY("ibase", 5, true), - BC_LEX_KW_ENTRY("obase", 5, true), - BC_LEX_KW_ENTRY("scale", 5, true), + BC_LEX_KW_ENTRY("auto", 4, 1), + BC_LEX_KW_ENTRY("break", 5, 1), + BC_LEX_KW_ENTRY("continue", 8, 0), + BC_LEX_KW_ENTRY("define", 6, 1), + BC_LEX_KW_ENTRY("for", 3, 1), + BC_LEX_KW_ENTRY("if", 2, 1), + BC_LEX_KW_ENTRY("limits", 6, 0), + BC_LEX_KW_ENTRY("return", 6, 1), + BC_LEX_KW_ENTRY("while", 5, 1), + BC_LEX_KW_ENTRY("halt", 4, 0), + BC_LEX_KW_ENTRY("last", 4, 0), + BC_LEX_KW_ENTRY("ibase", 5, 1), + BC_LEX_KW_ENTRY("obase", 5, 1), + BC_LEX_KW_ENTRY("scale", 5, 1), #if BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("seed", 4, false), + BC_LEX_KW_ENTRY("seed", 4, 0), #endif // BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("length", 6, true), - BC_LEX_KW_ENTRY("print", 5, false), - BC_LEX_KW_ENTRY("sqrt", 4, true), - BC_LEX_KW_ENTRY("abs", 3, false), - BC_LEX_KW_ENTRY("is_number", 9, false), - BC_LEX_KW_ENTRY("is_string", 9, false), + BC_LEX_KW_ENTRY("length", 6, 1), + BC_LEX_KW_ENTRY("print", 5, 0), + BC_LEX_KW_ENTRY("sqrt", 4, 1), + BC_LEX_KW_ENTRY("abs", 3, 0), + BC_LEX_KW_ENTRY("is_number", 9, 0), + BC_LEX_KW_ENTRY("is_string", 9, 0), #if BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("irand", 5, false), + BC_LEX_KW_ENTRY("irand", 5, 0), #endif // BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("asciify", 7, false), - BC_LEX_KW_ENTRY("modexp", 6, false), - BC_LEX_KW_ENTRY("divmod", 6, false), - BC_LEX_KW_ENTRY("quit", 4, true), - BC_LEX_KW_ENTRY("read", 4, false), + BC_LEX_KW_ENTRY("asciify", 7, 0), + BC_LEX_KW_ENTRY("modexp", 6, 0), + BC_LEX_KW_ENTRY("divmod", 6, 0), + BC_LEX_KW_ENTRY("quit", 4, 1), + BC_LEX_KW_ENTRY("read", 4, 0), #if BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("rand", 4, false), + BC_LEX_KW_ENTRY("rand", 4, 0), #endif // BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("maxibase", 8, false), - BC_LEX_KW_ENTRY("maxobase", 8, false), - BC_LEX_KW_ENTRY("maxscale", 8, false), + BC_LEX_KW_ENTRY("maxibase", 8, 0), + BC_LEX_KW_ENTRY("maxobase", 8, 0), + BC_LEX_KW_ENTRY("maxscale", 8, 0), #if BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("maxrand", 7, false), + BC_LEX_KW_ENTRY("maxrand", 7, 0), #endif // BC_ENABLE_EXTRA_MATH - BC_LEX_KW_ENTRY("line_length", 11, false), - BC_LEX_KW_ENTRY("global_stacks", 13, false), - BC_LEX_KW_ENTRY("leading_zero", 12, false), - BC_LEX_KW_ENTRY("stream", 6, false), - BC_LEX_KW_ENTRY("else", 4, false), + BC_LEX_KW_ENTRY("line_length", 11, 0), + BC_LEX_KW_ENTRY("global_stacks", 13, 0), + BC_LEX_KW_ENTRY("leading_zero", 12, 0), + BC_LEX_KW_ENTRY("stream", 6, 0), + BC_LEX_KW_ENTRY("else", 4, 0), }; /// The length of the list of bc keywords. @@ -917,64 +917,64 @@ _Static_assert(sizeof(bc_lex_kws) / sizeof(BcLexKeyword) == BC_LEX_NKWS, const uint8_t bc_parse_exprs[] = { // Starts with BC_LEX_EOF. - BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true), + BC_PARSE_EXPR_ENTRY(0, 0, 1, 1, 1, 1, 1, 1), // Starts with BC_LEX_OP_MULTIPLY if extra math is enabled, BC_LEX_OP_DIVIDE // otherwise. - BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), + BC_PARSE_EXPR_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), // Starts with BC_LEX_OP_REL_EQ if extra math is enabled, BC_LEX_OP_REL_LT // otherwise. - BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), + BC_PARSE_EXPR_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), #if BC_ENABLE_EXTRA_MATH // Starts with BC_LEX_OP_ASSIGN_POWER. - BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), + BC_PARSE_EXPR_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), // Starts with BC_LEX_OP_ASSIGN_RSHIFT. - BC_PARSE_EXPR_ENTRY(true, true, false, false, true, true, false, false), + BC_PARSE_EXPR_ENTRY(1, 1, 0, 0, 1, 1, 0, 0), // Starts with BC_LEX_RBRACKET. - BC_PARSE_EXPR_ENTRY(false, false, false, false, true, true, true, false), + BC_PARSE_EXPR_ENTRY(0, 0, 0, 0, 1, 1, 1, 0), // Starts with BC_LEX_KW_BREAK. - BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false), + BC_PARSE_EXPR_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), // Starts with BC_LEX_KW_HALT. - BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, false), + BC_PARSE_EXPR_ENTRY(0, 1, 1, 1, 1, 1, 1, 0), // Starts with BC_LEX_KW_SQRT. - BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), + BC_PARSE_EXPR_ENTRY(1, 1, 1, 1, 1, 1, 1, 1), // Starts with BC_LEX_KW_QUIT. - BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, true), + BC_PARSE_EXPR_ENTRY(0, 1, 1, 1, 1, 1, 1, 1), // Starts with BC_LEX_KW_GLOBAL_STACKS. - BC_PARSE_EXPR_ENTRY(true, true, false, false, 0, 0, 0, 0) + BC_PARSE_EXPR_ENTRY(1, 1, 0, 0, 0, 0, 0, 0) #else // BC_ENABLE_EXTRA_MATH // Starts with BC_LEX_OP_ASSIGN_PLUS. - BC_PARSE_EXPR_ENTRY(true, true, true, false, false, true, true, false), + BC_PARSE_EXPR_ENTRY(1, 1, 1, 0, 0, 1, 1, 0), // Starts with BC_LEX_COMMA. - BC_PARSE_EXPR_ENTRY(false, false, false, false, false, true, true, true), + BC_PARSE_EXPR_ENTRY(0, 0, 0, 0, 0, 1, 1, 1), // Starts with BC_LEX_KW_AUTO. - BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false), + BC_PARSE_EXPR_ENTRY(0, 0, 0, 0, 0, 0, 0, 0), // Starts with BC_LEX_KW_WHILE. - BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, false), + BC_PARSE_EXPR_ENTRY(0, 0, 1, 1, 1, 1, 1, 0), // Starts with BC_LEX_KW_SQRT. - BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, false), + BC_PARSE_EXPR_ENTRY(1, 1, 1, 1, 1, 1, 1, 0), // Starts with BC_LEX_KW_MAXIBASE. - BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, false), + BC_PARSE_EXPR_ENTRY(1, 1, 1, 1, 1, 1, 1, 0), // Starts with BC_LEX_KW_ELSE. - BC_PARSE_EXPR_ENTRY(false, 0, 0, 0, 0, 0, 0, 0) + BC_PARSE_EXPR_ENTRY(0, 0, 0, 0, 0, 0, 0, 0) #endif // BC_ENABLE_EXTRA_MATH }; @@ -982,25 +982,25 @@ const uint8_t bc_parse_exprs[] = { /// An array of data for operators that correspond to token types. Note that a /// lower precedence *value* means a higher precedence. const uchar bc_parse_ops[] = { - BC_PARSE_OP(0, false), BC_PARSE_OP(0, false), BC_PARSE_OP(1, false), - BC_PARSE_OP(1, false), + BC_PARSE_OP(0, 0), BC_PARSE_OP(0, 0), BC_PARSE_OP(1, 0), + BC_PARSE_OP(1, 0), #if BC_ENABLE_EXTRA_MATH - BC_PARSE_OP(2, false), + BC_PARSE_OP(2, 0), #endif // BC_ENABLE_EXTRA_MATH - BC_PARSE_OP(4, false), BC_PARSE_OP(5, true), BC_PARSE_OP(5, true), - BC_PARSE_OP(5, true), BC_PARSE_OP(6, true), BC_PARSE_OP(6, true), + BC_PARSE_OP(4, 0), BC_PARSE_OP(5, 1), BC_PARSE_OP(5, 1), + BC_PARSE_OP(5, 1), BC_PARSE_OP(6, 1), BC_PARSE_OP(6, 1), #if BC_ENABLE_EXTRA_MATH - BC_PARSE_OP(3, false), BC_PARSE_OP(7, true), BC_PARSE_OP(7, true), + BC_PARSE_OP(3, 0), BC_PARSE_OP(7, 1), BC_PARSE_OP(7, 1), #endif // BC_ENABLE_EXTRA_MATH - BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), - BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), - BC_PARSE_OP(11, true), BC_PARSE_OP(10, true), BC_PARSE_OP(8, false), - BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), - BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), + BC_PARSE_OP(9, 1), BC_PARSE_OP(9, 1), BC_PARSE_OP(9, 1), + BC_PARSE_OP(9, 1), BC_PARSE_OP(9, 1), BC_PARSE_OP(9, 1), + BC_PARSE_OP(11, 1), BC_PARSE_OP(10, 1), BC_PARSE_OP(8, 0), + BC_PARSE_OP(8, 0), BC_PARSE_OP(8, 0), BC_PARSE_OP(8, 0), + BC_PARSE_OP(8, 0), BC_PARSE_OP(8, 0), #if BC_ENABLE_EXTRA_MATH - BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), + BC_PARSE_OP(8, 0), BC_PARSE_OP(8, 0), BC_PARSE_OP(8, 0), #endif // BC_ENABLE_EXTRA_MATH - BC_PARSE_OP(8, false), + BC_PARSE_OP(8, 0), }; // These identify what tokens can come after expressions in certain cases. diff --git a/src/dc.c b/src/dc.c index 37419acd4bd..1376f5e00a9 100644 --- a/src/dc.c +++ b/src/dc.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/dc_fuzzer.c b/src/dc_fuzzer.c index adaf486a668..0cb12e4fdf4 100644 --- a/src/dc_fuzzer.c +++ b/src/dc_fuzzer.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -36,7 +36,6 @@ #include #include -#include #include #include #include diff --git a/src/dc_lex.c b/src/dc_lex.c index d5131b45331..763957edc2e 100644 --- a/src/dc_lex.c +++ b/src/dc_lex.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/dc_parse.c b/src/dc_parse.c index 1996120461a..b607bfd4c39 100644 --- a/src/dc_parse.c +++ b/src/dc_parse.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/file.c b/src/file.c index 697fca8cf29..bc8097c5b8c 100644 --- a/src/file.c +++ b/src/file.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/history.c b/src/history.c index 32a19f71d77..594cc4eb46d 100644 --- a/src/history.c +++ b/src/history.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -199,6 +199,7 @@ bc_history_init(BcHistory* h) h->el = el_init(vm->name, stdin, stdout, stderr); if (BC_ERR(h->el == NULL)) bc_vm_fatalError(BC_ERR_FATAL_ALLOC_ERR); + el_set(h->el, EL_SIGNAL, 1); // I want history and a prompt. history(h->hist, &bc_history_event, H_SETSIZE, 100); @@ -264,18 +265,7 @@ bc_history_line(BcHistory* h, BcVec* vec, const char* prompt) errno = EINTR; // Get the line. - // - // XXX: Why have a macro here? Because macOS needs to be special. Honestly, - // it's starting to feel special like Windows at this point. Anyway, the - // second SIGWINCH signal of multiple will return a valid line length on - // macOS, so we need to allow for that on macOS. However, FreeBSD's editline - // is different and will mess up the terminal if we do it that way. - // - // There is one limitation with this, however: Ctrl+D won't work on macOS. - // But it's because of macOS that this problem exists, and I can't really do - // anything about it. So macOS should fix their broken editline; once they - // do, I'll fix Ctrl+D on macOS. - while (BC_HISTORY_INVALID_LINE(line, len)) + while (line == NULL && len == -1 && errno == EINTR) { line = el_gets(h->el, &len); bc_history_use_prompt = false; diff --git a/src/lang.c b/src/lang.c index 7968bcbd9df..2a62509c98b 100644 --- a/src/lang.c +++ b/src/lang.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -73,9 +73,10 @@ bc_func_insert(BcFunc* f, BcProgram* p, char* name, BcType type, size_t line) BcAuto* aptr = bc_vec_item(&f->autos, i); // If they match, barf. - if (BC_ERR(idx == aptr->idx && type == aptr->type)) + if (BC_ERR(idx == aptr->idx && + BC_IS_ARRAY(type) == BC_IS_ARRAY(aptr->type))) { - const char* array = type == BC_TYPE_ARRAY ? "[]" : ""; + const char* array = BC_IS_ARRAY(type) ? "[]" : ""; bc_error(BC_ERR_PARSE_DUP_LOCAL, line, name, array); } diff --git a/src/lex.c b/src/lex.c index 37e52c33fff..6b639a65b6a 100644 --- a/src/lex.c +++ b/src/lex.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/library.c b/src/library.c index 5451e91684a..282dddff27d 100644 --- a/src/library.c +++ b/src/library.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/main.c b/src/main.c index da4c2715602..749248048e7 100644 --- a/src/main.c +++ b/src/main.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -47,7 +47,6 @@ #include -#include #include #include #include diff --git a/src/num.c b/src/num.c index 83f84edb91f..2cdc6eea008 100644 --- a/src/num.c +++ b/src/num.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -1093,6 +1093,7 @@ bc_num_as(BcNum* a, BcNum* b, BcNum* restrict c, size_t sub) max_len = max_int + max_rdx; + // Figure out the max length and also if we need to reverse the operation. if (do_sub) { // Check whether b has to be subtracted from a or a from b. diff --git a/src/opt.c b/src/opt.c index a1c8e813b1e..6a24291ac40 100644 --- a/src/opt.c +++ b/src/opt.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/parse.c b/src/parse.c index 0107d4cdef0..02660799498 100644 --- a/src/parse.c +++ b/src/parse.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/program.c b/src/program.c index 469835d321b..af032c5f1e8 100644 --- a/src/program.c +++ b/src/program.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -623,6 +623,9 @@ bc_program_prepResult(BcProgram* p) { BcResult* res = bc_vec_pushEmpty(&p->results); + // Mark a result as not retired. + p->nresults += 1; + bc_result_clear(res); return res; @@ -646,6 +649,8 @@ bc_program_const(BcProgram* p, const char* code, size_t* bgn) BcConst* c = bc_vec_item(&p->consts, bc_program_index(code, bgn)); BcBigDig base = BC_PROG_IBASE(p); + assert(p->nresults == 1); + // Only reparse if the base changed. if (c->base != base) { @@ -673,6 +678,9 @@ bc_program_const(BcProgram* p, const char* code, size_t* bgn) bc_num_createCopy(&r->d.n, &c->num); BC_SIG_UNLOCK; + + // XXX: Make sure to clear the number of results. + p->nresults -= 1; } /** @@ -692,6 +700,8 @@ bc_program_op(BcProgram* p, uchar inst) res = bc_program_prepResult(p); + assert(p->nresults == 1); + bc_program_binOpPrep(p, &opd1, &n1, &opd2, &n2, 1); BC_SIG_LOCK; @@ -709,7 +719,7 @@ bc_program_op(BcProgram* p, uchar inst) // Run the operation. This also executes an item of an array. bc_program_ops[idx](n1, n2, &res->d.n, BC_PROG_SCALE(p)); - bc_program_retire(p, 1, 2); + bc_program_retire(p, 2); } /** @@ -1060,6 +1070,8 @@ bc_program_unary(BcProgram* p, uchar inst) res = bc_program_prepResult(p); + assert(p->nresults == 1); + bc_program_prep(p, &ptr, &num, 1); BC_SIG_LOCK; @@ -1070,7 +1082,7 @@ bc_program_unary(BcProgram* p, uchar inst) // This calls a function that is in an array. bc_program_unarys[inst - BC_INST_NEG](res, num); - bc_program_retire(p, 1, 1); + bc_program_retire(p, 1); } /** @@ -1091,6 +1103,8 @@ bc_program_logical(BcProgram* p, uchar inst) res = bc_program_prepResult(p); + assert(p->nresults == 1); + // All logical operators (except boolean not, which is taken care of by // bc_program_unary()), are binary operators. bc_program_binOpPrep(p, &opd1, &n1, &opd2, &n2, 1); @@ -1165,7 +1179,7 @@ bc_program_logical(BcProgram* p, uchar inst) if (cond) bc_num_one(&res->d.n); - bc_program_retire(p, 1, 2); + bc_program_retire(p, 2); } /** @@ -1880,6 +1894,8 @@ bc_program_return(BcProgram* p, uchar inst) res = bc_program_prepResult(p); + assert(p->nresults == 1); + // If we are returning normally... if (inst == BC_INST_RET) { @@ -1930,7 +1946,7 @@ bc_program_return(BcProgram* p, uchar inst) BC_SIG_LOCK; // When we retire, pop all of the unused results. - bc_program_retire(p, 1, nresults); + bc_program_retire(p, nresults); // Pop the globals, if necessary. if (BC_G) bc_program_popGlobals(p, false); @@ -1974,6 +1990,8 @@ bc_program_builtin(BcProgram* p, uchar inst) res = bc_program_prepResult(p); + assert(p->nresults == 1); + bc_program_operand(p, &opd, &num, 1); assert(num != NULL); @@ -2102,7 +2120,7 @@ bc_program_builtin(BcProgram* p, uchar inst) BC_SIG_UNLOCK; } - bc_program_retire(p, 1, 1); + bc_program_retire(p, 1); } /** @@ -2127,6 +2145,7 @@ bc_program_divmod(BcProgram* p) // the capacity is enough due to the line above. res2 = bc_program_prepResult(p); res = bc_program_prepResult(p); + assert(p->nresults == 2); // Prepare the operands. bc_program_binOpPrep(p, &opd1, &n1, &opd2, &n2, 2); @@ -2144,7 +2163,7 @@ bc_program_divmod(BcProgram* p) // Execute. bc_num_divmod(n1, n2, &res2->d.n, &res->d.n, BC_PROG_SCALE(p)); - bc_program_retire(p, 2, 2); + bc_program_retire(p, 2); } /** @@ -2176,6 +2195,8 @@ bc_program_modexp(BcProgram* p) res = bc_program_prepResult(p); + assert(p->nresults == 1); + // Get the first operand and typecheck. bc_program_operand(p, &r1, &n1, 3); bc_program_type_num(r1, n1); @@ -2198,7 +2219,7 @@ bc_program_modexp(BcProgram* p) bc_num_modexp(n1, n2, n3, &res->d.n); - bc_program_retire(p, 1, 3); + bc_program_retire(p, 3); } /** @@ -2737,6 +2758,9 @@ bc_program_pushSeed(BcProgram* p) BcResult* res; res = bc_program_prepResult(p); + + assert(p->nresults == 1); + res->t = BC_RESULT_SEED; BC_SIG_LOCK; @@ -2747,6 +2771,9 @@ bc_program_pushSeed(BcProgram* p) BC_SIG_UNLOCK; bc_num_createFromRNG(&res->d.n, &p->rng); + + // XXX: Clear the number of results. + p->nresults = 0; } #endif // BC_ENABLE_EXTRA_MATH @@ -2932,6 +2959,9 @@ bc_program_init(BcProgram* p) bc_map_init(&p->const_map); bc_vec_init(&p->strs, sizeof(char*), BC_DTOR_NONE); bc_map_init(&p->str_map); + + // XXX: Clear the number of results. + p->nresults = 0; } void @@ -2985,13 +3015,18 @@ bc_program_reset(BcProgram* p) if (BC_IS_DC) bc_vec_npop(&p->tail_calls, p->tail_calls.len - 1); #endif // DC_ENABLED -#if BC_ENABLED // Clear the stack if we are in bc. We have to do this in bc because bc's // stack is implicit. // // XXX: We don't do this in dc because other dc implementations don't. - if (BC_IS_BC || !BC_I) bc_vec_popAll(&p->results); + // However, we *MUST* pop the items for results that are not retired yet. + if (BC_IS_DC && BC_I) bc_vec_npop(&p->results, p->nresults); + else bc_vec_popAll(&p->results); + // Now clear how many results there are. + p->nresults = 0; + +#if BC_ENABLED // Clear the globals' stacks. if (BC_G) bc_program_popGlobals(p, true); #endif // BC_ENABLED diff --git a/src/rand.c b/src/rand.c index 0f9950788f7..3aaf905f852 100644 --- a/src/rand.c +++ b/src/rand.c @@ -13,7 +13,7 @@ * This code is under the following license: * * Copyright (c) 2014-2017 Melissa O'Neill and PCG Project contributors - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/read.c b/src/read.c index 01d80484894..650c2813bd1 100644 --- a/src/read.c +++ b/src/read.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -171,34 +171,23 @@ bc_read_chars(BcVec* vec, const char* prompt) // If interupted... if (errno == EINTR) { - int sig; - // Jump out if we are supposed to quit, which certain signals // will require. if (vm->status == (sig_atomic_t) BC_STATUS_QUIT) BC_JMP; assert(vm->sig != 0); - sig = (int) vm->sig; - // Clear the signal and status. vm->sig = 0; vm->status = (sig_atomic_t) BC_STATUS_SUCCESS; -#ifndef _WIN32 - // We don't want to print anything on a SIGWINCH. - if (sig != SIGWINCH) -#endif // _WIN32 + // Print the ready message and prompt again. + bc_file_puts(&vm->fout, bc_flush_none, bc_program_ready_msg); + if (BC_PROMPT) { - // Print the ready message and prompt again. - bc_file_puts(&vm->fout, bc_flush_none, - bc_program_ready_msg); - if (BC_PROMPT) - { - bc_file_puts(&vm->fout, bc_flush_none, prompt); - } - bc_file_flush(&vm->fout, bc_flush_none); + bc_file_puts(&vm->fout, bc_flush_none, prompt); } + bc_file_flush(&vm->fout, bc_flush_none); BC_SIG_UNLOCK; diff --git a/src/vector.c b/src/vector.c index 4b49e61968d..7d5c0bc7376 100644 --- a/src/vector.c +++ b/src/vector.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/src/vm.c b/src/vm.c index b97fa37623a..95bfd73f19e 100644 --- a/src/vm.c +++ b/src/vm.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: @@ -124,27 +124,6 @@ bc_vm_jmp(void) static void bc_vm_sig(int sig) { -#if BC_ENABLE_EDITLINE - // Editline needs this to resize the terminal. This also needs to come first - // because a resize always needs to happen. - if (sig == SIGWINCH) - { - if (BC_TTY) - { - el_resize(vm->history.el); - - // If the signal was a SIGWINCH, clear it because we don't need to - // print a stack trace in that case. - if (vm->sig == SIGWINCH) - { - vm->sig = 0; - } - } - - return; - } -#endif // BC_ENABLE_EDITLINE - // There is already a signal in flight if this is true. if (vm->status == (sig_atomic_t) BC_STATUS_QUIT || vm->sig != 0) { @@ -217,7 +196,7 @@ bc_vm_sigaction(void) struct sigaction sa; sigemptyset(&sa.sa_mask); - sa.sa_flags = BC_ENABLE_EDITLINE ? 0 : SA_NODEFER; + sa.sa_flags = SA_NODEFER; // This mess is to silence a warning on Clang with regards to glibc's // sigaction handler, which activates the warning here. @@ -234,11 +213,6 @@ bc_vm_sigaction(void) sigaction(SIGQUIT, &sa, NULL); sigaction(SIGINT, &sa, NULL); -#if BC_ENABLE_EDITLINE - // Editline needs this to resize the terminal. - if (BC_TTY) sigaction(SIGWINCH, &sa, NULL); -#endif // BC_ENABLE_EDITLINE - #if BC_ENABLE_HISTORY if (BC_TTY) sigaction(SIGHUP, &sa, NULL); #endif // BC_ENABLE_HISTORY @@ -545,7 +519,7 @@ bc_vm_envArgs(const char* const env_args_name, BcBigDig* scale, BcBigDig* ibase, if (env_args == NULL) return; - // Windows already allocates, so we don't need to. + // Windows already allocates, so we don't need to. #ifndef _WIN32 start = buf = vm->env_args_buffer = bc_vm_strdup(env_args); #else // _WIN32 diff --git a/tests/all.sh b/tests/all.sh index 28631c048e7..d5d084341e3 100755 --- a/tests/all.sh +++ b/tests/all.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -39,7 +39,7 @@ usage() { if [ $# -eq 1 ]; then printf '%s\n\n' "$1" fi - print 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [gen_tests] [run_problematic_tests] [time_tests] [exec args...]\n' \ + print 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [gen_tests] [run_problematic_tests] [exec args...]\n' \ "$script" exit 1 } @@ -102,15 +102,6 @@ else check_bool_arg "$problematic_tests" fi -if [ "$#" -lt 1 ]; then - time_tests=0 - check_bool_arg "$time_tests" -else - time_tests="$1" - shift - check_bool_arg "$time_tests" -fi - if [ "$#" -lt 1 ]; then exe="$testdir/../bin/$d" check_exec_arg "$exe" @@ -155,10 +146,10 @@ while read t; do fi if [ "$pll" -ne 0 ]; then - sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@" & + sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$exe" "$@" & pids="$pids $!" else - sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@" + sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$exe" "$@" fi done < "$testdir/$d/all.txt" @@ -174,19 +165,11 @@ fi # Script tests. if [ "$pll" -ne 0 ]; then sh "$testdir/scripts.sh" "$d" "$extra" "$run_stack_tests" "$generate_tests" \ - "$time_tests" "$exe" "$@" & + "$exe" "$@" & pids="$pids $!" else sh "$testdir/scripts.sh" -n "$d" "$extra" "$run_stack_tests" "$generate_tests" \ - "$time_tests" "$exe" "$@" -fi - -# Read tests. -if [ "$pll" -ne 0 ]; then - sh "$testdir/read.sh" "$d" "$exe" "$@" & - pids="$pids $!" -else - sh "$testdir/read.sh" "$d" "$exe" "$@" + "$exe" "$@" fi # Error tests. @@ -198,8 +181,9 @@ else fi # Test all the files in the errors directory. While the other error test (in -# tests/errors.sh) does a test for every line, this does one test per file, but -# it runs the file through stdin and as a file on the command-line. +# tests/errors.sh) does a test for every line of certain error files in the main +# directory, this does one test per file in the errors directory, but it runs +# the file through stdin and as a file on the command-line. for testfile in $testdir/$d/errors/*.txt; do b=$(basename "$testfile") @@ -213,14 +197,6 @@ for testfile in $testdir/$d/errors/*.txt; do done -# Other tests. -if [ "$pll" -ne 0 ]; then - sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@" & - pids="$pids $!" -else - sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@" -fi - if [ "$pll" -ne 0 ]; then exit_err=0 diff --git a/tests/bc/all.txt b/tests/bc/all.txt index c710534aac1..2fd582118ad 100644 --- a/tests/bc/all.txt +++ b/tests/bc/all.txt @@ -1,7 +1,132 @@ decimal -print -parse -lib2 +print_002 +print_003 +print_004 +print_005 +print_006 +print_007 +print_008 +print_009 +print_011 +print_012 +print_013 +print_014 +print_015 +print_016 +print_017 +print_018 +print_019 +print_020 +print_021 +print_022 +print_023 +print_024 +print_025 +print_026 +print_027 +print_028 +print_029 +print_030 +print_031 +print_032 +print_033 +print_034 +print_035 +print_036 +print_037 +print_038 +print_039 +print_040 +print_041 +print_042 +print_043 +print_044 +print_045 +print_046 +print_047 +print_048 +print_049 +print_050 +print_051 +print_052 +print_053 +print_054 +print_055 +print_056 +print_057 +print_058 +print_059 +print_060 +print_061 +print_062 +print_063 +print_064 +print_065 +print_066 +print_067 +print_068 +print_069 +print_070 +print_071 +print_072 +print_073 +print_074 +print_075 +print_076 +print_077 +print_078 +print_079 +print_080 +print_081 +print_082 +print_083 +print_084 +print_085 +print_086 +print_087 +print_088 +print_089 +print_090 +print_091 +print_092 +print_093 +print_094 +print_095 +print_096 +print_097 +print_098 +print_099 +print_100 +parse_02 +parse_03 +parse_04 +parse_05 +parse_06 +parse_07 +parse_08 +parse_09 +parse_11 +parse_12 +parse_13 +parse_14 +parse_15 +parse_16 +lib2_p +lib2_r +lib2_ceil +lib2_log +lib2_root +lib2_gcd +lib2_bytes +lib2_pi +lib2_tan +lib2_a2 +lib2_r2d +lib2_d2r +lib2_fac +lib2_perm +lib2_uint +lib2_rand print2 length scale diff --git a/tests/bc/errors/39.txt b/tests/bc/errors/39.txt new file mode 100644 index 00000000000..104d16136b2 --- /dev/null +++ b/tests/bc/errors/39.txt @@ -0,0 +1 @@ +define a(*t[], t[]) {} diff --git a/tests/bc/lib2.txt b/tests/bc/lib2.txt deleted file mode 100644 index 74e1256d7bb..00000000000 --- a/tests/bc/lib2.txt +++ /dev/null @@ -1,477 +0,0 @@ -p(2, 8.0000) -p(2, 8.0001) -p(2, -8.0001) -p(1024,32.1) -r(0, 0) -r(0, 1) -r(0, 100) -r(1, 0) -r(1, 3) -r(1.4, 0) -r(1.5, 0) -r(34.45, 2) -r(64.1223, 4) -r(283.1983893, 6) -r(283.1983895, 6) -r(283.1983899, 6) -r(99.999999999, 5) -r(-1, 0) -r(-1, 3) -r(-1.4, 0) -r(-1.5, 0) -r(-34.45, 2) -r(-64.1223, 4) -r(-283.1983893, 6) -r(-283.1983895, 6) -r(-283.1983899, 6) -r(-99.999999999, 5) -ceil(0, 0) -ceil(0, 1) -ceil(0, 100) -ceil(1, 0) -ceil(1, 3) -ceil(1.4, 0) -ceil(1.5, 0) -ceil(34.45, 2) -ceil(64.1223, 4) -ceil(283.1983893, 6) -ceil(283.1983895, 6) -ceil(283.1983899, 6) -ceil(99.999999999, 5) -ceil(-1, 0) -ceil(-1, 3) -ceil(-1.4, 0) -ceil(-1.5, 0) -ceil(-34.45, 2) -ceil(-64.1223, 4) -ceil(-283.1983893, 6) -ceil(-283.1983895, 6) -ceil(-283.1983899, 6) -ceil(-99.999999999, 5) -ceil(8770735.0705156250000000000, 0) -l2(0) -l2(1) -l2(2) -l2(7) -l2(7.9999999999999999999999) -l2(8) -l10(0) -l10(1) -l10(2) -l10(5) -l10(9) -l10(9.999999999999999999999) -l10(10) -l10(11) -l10(99) -l10(99.99999999999999999999) -l10(100) -l2(-1) -l2(-2) -l2(-7) -l2(-7.9999999999999999999999) -l2(-8) -l10(-1) -l10(-2) -l10(-5) -l10(-9) -l10(-9.999999999999999999999) -l10(-10) -l10(-11) -l10(-99) -l10(-99.99999999999999999999) -l10(-100) -cbrt(27) -cbrt(-27) -cbrt(4096) -cbrt(-4096) -root(0, 3) -root(0, 4) -root(0, 5) -root(0.0000000000000, 3) -root(0.0000000000000, 4) -root(0.0000000000000, 5) -root(16, 4) -root(3125, 5) -root(-3125, 5) -gcd(285, 35) -gcd(1, 6) -gcd(5, 1) -gcd(8, 12) -gcd(40, 4096) -lcm(40, 4096) -lcm(555, 55) -ubytes(0) -ubytes(1) -ubytes(2) -ubytes(254) -ubytes(255) -ubytes(256) -ubytes(65535) -ubytes(65536) -ubytes(131072) -ubytes(4294967295) -ubytes(4294967296) -ubytes(18446744073709551615) -ubytes(18446744073709551616) -sbytes(0) -sbytes(1) -sbytes(-1) -sbytes(2) -sbytes(127) -sbytes(128) -sbytes(-127) -sbytes(-128) -sbytes(-129) -sbytes(254) -sbytes(255) -sbytes(256) -sbytes(32767) -sbytes(32768) -sbytes(-32767) -sbytes(-32768) -sbytes(65535) -sbytes(65536) -sbytes(131072) -sbytes(2147483647) -sbytes(2147483648) -sbytes(2147483649) -sbytes(-2147483647) -sbytes(-2147483648) -sbytes(-2147483649) -sbytes(4294967295) -sbytes(4294967296) -sbytes(9223372036854775807) -sbytes(9223372036854775808) -sbytes(9223372036854775809) -sbytes(-9223372036854775807) -sbytes(-9223372036854775808) -sbytes(-9223372036854775809) -pi(0) -pi(1) -pi(2) -pi(5) -pi(100) -p=pi(100) -t(0) -t(1) -t(-1) -t(2) -t(-2) -t(3) -t(-3) -t(p) -t(-p) -t(p/2) -t(-p/2) -t(p/3) -t(-p/3) -t(p/4) -t(-p/4) -t(p/5) -t(-p/5) -t(p/6) -t(-p/6) -t(p/7) -t(-p/7) -t(p/8) -t(-p/8) -t(p/9) -t(-p/9) -t(p/10) -t(-p/10) -t(p/15) -t(-p/15) -a2(0, 1) -a2(1, 1) -a2(2, 1) -a2(1, 2) -a2(0, -1) -a2(1, -1) -a2(2, -1) -a2(1, -2) -a2(-1, 1) -a2(-2, 1) -a2(-1, 2) -a2(-1, -1) -a2(-2, -1) -a2(-1, -2) -a2(1, 0) -a2(2, 0) -a2(-1, 0) -a2(-2, 0) -r2d(p) -r2d(2 * p) -r2d(p / 2) -r2d(p / 4) -r2d(p / 3) -r2d(p / 5) -r2d(p / 6) -r2d(p / 10) -r2d(-p) -r2d(2 * -p) -r2d(-p / 2) -r2d(-p / 4) -r2d(-p / 3) -r2d(-p / 5) -r2d(-p / 6) -r2d(-p / 10) -d2r(180) -d2r(360) -d2r(90) -d2r(45) -d2r(120) -d2r(72) -d2r(60) -d2r(36) -d2r(-180) -d2r(-360) -d2r(-90) -d2r(-45) -d2r(-120) -d2r(-72) -d2r(-60) -d2r(-36) -f(0) -f(1) -f(2) -f(3) -f(4) -f(5) -perm(10, 2) -comb(10, 2) -perm(6, 2) -comb(6, 2) -perm(12, 10) -comb(12, 10) -perm(24, 15) -comb(24, 15) -binary(0) -hex(0) -binary(1) -hex(1) -binary(2) -hex(2) -binary(15) -hex(15) -binary(16) -hex(16) -uint(0) -int(0) -uint(1) -int(1) -int(-1) -uint(127) -int(127) -int(-127) -uint(128) -int(128) -int(-128) -uint(129) -int(129) -int(-129) -uint(255) -int(255) -int(-255) -uint(256) -int(256) -int(-256) -uint(32767) -int(32767) -int(-32767) -uint(32768) -int(32768) -int(-32768) -uint(32769) -int(32769) -int(-32769) -uint(65535) -int(65535) -int(-65535) -uint(65536) -int(65536) -int(-65536) -uint(2147483647) -int(2147483647) -int(-2147483647) -uint(2147483648) -int(2147483648) -int(-2147483648) -uint(2147483649) -int(2147483649) -int(-2147483649) -uint(4294967295) -int(4294967295) -int(-4294967295) -uint(4294967296) -int(4294967296) -int(-4294967296) -uint8(0) -int8(0) -uint16(0) -int16(0) -uint32(0) -int32(0) -uint64(0) -int64(0) -uint8(1) -int8(1) -int8(-1) -uint16(1) -int16(1) -int16(-1) -uint32(1) -int32(1) -int32(-1) -uint64(1) -int64(1) -int64(-1) -uint8(127) -int8(127) -int8(-127) -uint16(127) -int16(127) -int16(-127) -uint32(127) -int32(127) -int32(-127) -uint64(127) -int64(127) -int64(-127) -uint8(128) -int8(128) -int8(-128) -uint16(128) -int16(128) -int16(-128) -uint32(128) -int32(128) -int32(-128) -uint64(128) -int64(128) -int64(-128) -uint8(129) -int8(129) -int8(-129) -uint16(129) -int16(129) -int16(-129) -uint32(129) -int32(129) -int32(-129) -uint64(129) -int64(129) -int64(-129) -uint8(255) -int8(255) -int8(-255) -uint16(255) -int16(255) -int16(-255) -uint32(255) -int32(255) -int32(-255) -uint64(255) -int64(255) -int64(-255) -uint8(256) -int8(256) -int8(-256) -uint16(256) -int16(256) -int16(-256) -uint32(256) -int32(256) -int32(-256) -uint64(256) -int64(256) -int64(-256) -uint16(32767) -int16(32767) -int16(-32767) -uint32(32767) -int32(32767) -int32(-32767) -uint64(32767) -int64(32767) -int64(-32767) -uint16(32768) -int16(32768) -int16(-32768) -uint32(32768) -int32(32768) -int32(-32768) -uint64(32768) -int64(32768) -int64(-32768) -uint16(32769) -int16(32769) -int16(-32769) -uint32(32769) -int32(32769) -int32(-32769) -uint64(32769) -int64(32769) -int64(-32769) -uint16(65535) -int16(65535) -int16(-65535) -uint32(65535) -int32(65535) -int32(-65535) -uint64(65535) -int64(65535) -int64(-65535) -uint16(65536) -int16(65536) -int16(-65536) -uint32(65536) -int32(65536) -int32(-65536) -uint64(65536) -int64(65536) -int64(-65536) -uint32(2147483647) -int32(2147483647) -int32(-2147483647) -uint64(2147483647) -int64(2147483647) -int64(-2147483647) -uint32(2147483648) -int32(2147483648) -int32(-2147483648) -uint64(2147483648) -int64(2147483648) -int64(-2147483648) -uint32(2147483649) -int32(2147483649) -int32(-2147483649) -uint64(2147483649) -int64(2147483649) -int64(-2147483649) -uint32(4294967295) -int32(4294967295) -int32(-4294967295) -uint64(4294967295) -int64(4294967295) -int64(-4294967295) -uint32(4294967296) -int32(4294967296) -int32(-4294967296) -uint64(4294967296) -int64(4294967296) -int64(-4294967296) -uint(-3) -uint(3.928375) -int(4.000000) -b = brand() -b < 2 -b >= 0 -i = irand(maxrand() + 1) -i <= maxrand() -i >= 0 -f = frand(10) -scale(f) == 10 -fi = ifrand(123, 28) -scale(fi) == 28 -fi < 128 diff --git a/tests/bc/lib2_a2.txt b/tests/bc/lib2_a2.txt new file mode 100644 index 00000000000..a0b24942676 --- /dev/null +++ b/tests/bc/lib2_a2.txt @@ -0,0 +1,18 @@ +a2(0, 1) +a2(1, 1) +a2(2, 1) +a2(1, 2) +a2(0, -1) +a2(1, -1) +a2(2, -1) +a2(1, -2) +a2(-1, 1) +a2(-2, 1) +a2(-1, 2) +a2(-1, -1) +a2(-2, -1) +a2(-1, -2) +a2(1, 0) +a2(2, 0) +a2(-1, 0) +a2(-2, 0) diff --git a/tests/bc/lib2_a2_results.txt b/tests/bc/lib2_a2_results.txt new file mode 100644 index 00000000000..4915b6ad142 --- /dev/null +++ b/tests/bc/lib2_a2_results.txt @@ -0,0 +1,18 @@ +0 +.78539816339744830961 +1.10714871779409050301 +.46364760900080611621 +3.14159265358979323846 +2.35619449019234492884 +2.03444393579570273544 +2.67794504458898712224 +-.78539816339744830961 +-1.10714871779409050301 +-.46364760900080611621 +-2.35619449019234492884 +-2.03444393579570273544 +-2.67794504458898712224 +1.57079632679489661923 +1.57079632679489661923 +-1.57079632679489661923 +-1.57079632679489661923 diff --git a/tests/bc/lib2_bytes.txt b/tests/bc/lib2_bytes.txt new file mode 100644 index 00000000000..79183d7a88b --- /dev/null +++ b/tests/bc/lib2_bytes.txt @@ -0,0 +1,46 @@ +ubytes(0) +ubytes(1) +ubytes(2) +ubytes(254) +ubytes(255) +ubytes(256) +ubytes(65535) +ubytes(65536) +ubytes(131072) +ubytes(4294967295) +ubytes(4294967296) +ubytes(18446744073709551615) +ubytes(18446744073709551616) +sbytes(0) +sbytes(1) +sbytes(-1) +sbytes(2) +sbytes(127) +sbytes(128) +sbytes(-127) +sbytes(-128) +sbytes(-129) +sbytes(254) +sbytes(255) +sbytes(256) +sbytes(32767) +sbytes(32768) +sbytes(-32767) +sbytes(-32768) +sbytes(65535) +sbytes(65536) +sbytes(131072) +sbytes(2147483647) +sbytes(2147483648) +sbytes(2147483649) +sbytes(-2147483647) +sbytes(-2147483648) +sbytes(-2147483649) +sbytes(4294967295) +sbytes(4294967296) +sbytes(9223372036854775807) +sbytes(9223372036854775808) +sbytes(9223372036854775809) +sbytes(-9223372036854775807) +sbytes(-9223372036854775808) +sbytes(-9223372036854775809) diff --git a/tests/bc/lib2_bytes_results.txt b/tests/bc/lib2_bytes_results.txt new file mode 100644 index 00000000000..494be6df11f --- /dev/null +++ b/tests/bc/lib2_bytes_results.txt @@ -0,0 +1,46 @@ +1 +1 +1 +1 +1 +2 +2 +4 +4 +4 +8 +8 +16 +1 +1 +1 +1 +1 +2 +1 +1 +2 +2 +2 +2 +2 +4 +2 +2 +4 +4 +4 +4 +8 +8 +4 +4 +8 +8 +8 +8 +16 +16 +8 +8 +16 diff --git a/tests/bc/lib2_ceil.txt b/tests/bc/lib2_ceil.txt new file mode 100644 index 00000000000..6da43cc7082 --- /dev/null +++ b/tests/bc/lib2_ceil.txt @@ -0,0 +1,24 @@ +ceil(0, 0) +ceil(0, 1) +ceil(0, 100) +ceil(1, 0) +ceil(1, 3) +ceil(1.4, 0) +ceil(1.5, 0) +ceil(34.45, 2) +ceil(64.1223, 4) +ceil(283.1983893, 6) +ceil(283.1983895, 6) +ceil(283.1983899, 6) +ceil(99.999999999, 5) +ceil(-1, 0) +ceil(-1, 3) +ceil(-1.4, 0) +ceil(-1.5, 0) +ceil(-34.45, 2) +ceil(-64.1223, 4) +ceil(-283.1983893, 6) +ceil(-283.1983895, 6) +ceil(-283.1983899, 6) +ceil(-99.999999999, 5) +ceil(8770735.0705156250000000000, 0) diff --git a/tests/bc/lib2_ceil_results.txt b/tests/bc/lib2_ceil_results.txt new file mode 100644 index 00000000000..2e9ba9c2502 --- /dev/null +++ b/tests/bc/lib2_ceil_results.txt @@ -0,0 +1,24 @@ +0 +0 +0 +1 +1.000 +2 +2 +34.45 +64.1223 +283.198390 +283.198390 +283.198390 +100.00000 +-1 +-1.000 +-2 +-2 +-34.45 +-64.1223 +-283.198390 +-283.198390 +-283.198390 +-100.00000 +8770736 diff --git a/tests/bc/lib2_d2r.txt b/tests/bc/lib2_d2r.txt new file mode 100644 index 00000000000..dd908be8ec4 --- /dev/null +++ b/tests/bc/lib2_d2r.txt @@ -0,0 +1,16 @@ +d2r(180) +d2r(360) +d2r(90) +d2r(45) +d2r(120) +d2r(72) +d2r(60) +d2r(36) +d2r(-180) +d2r(-360) +d2r(-90) +d2r(-45) +d2r(-120) +d2r(-72) +d2r(-60) +d2r(-36) diff --git a/tests/bc/lib2_d2r_results.txt b/tests/bc/lib2_d2r_results.txt new file mode 100644 index 00000000000..a6416508778 --- /dev/null +++ b/tests/bc/lib2_d2r_results.txt @@ -0,0 +1,16 @@ +3.14159265358979323846 +6.28318530717958647692 +1.57079632679489661923 +.78539816339744830961 +2.09439510239319549230 +1.25663706143591729538 +1.04719755119659774615 +.62831853071795864769 +-3.14159265358979323846 +-6.28318530717958647692 +-1.57079632679489661923 +-.78539816339744830961 +-2.09439510239319549230 +-1.25663706143591729538 +-1.04719755119659774615 +-.62831853071795864769 diff --git a/tests/bc/lib2_fac.txt b/tests/bc/lib2_fac.txt new file mode 100644 index 00000000000..1da42385ea4 --- /dev/null +++ b/tests/bc/lib2_fac.txt @@ -0,0 +1,6 @@ +f(0) +f(1) +f(2) +f(3) +f(4) +f(5) diff --git a/tests/bc/lib2_fac_results.txt b/tests/bc/lib2_fac_results.txt new file mode 100644 index 00000000000..b1fa2729fd5 --- /dev/null +++ b/tests/bc/lib2_fac_results.txt @@ -0,0 +1,6 @@ +1 +1 +2 +6 +24 +120 diff --git a/tests/bc/lib2_gcd.txt b/tests/bc/lib2_gcd.txt new file mode 100644 index 00000000000..e7e69a65a84 --- /dev/null +++ b/tests/bc/lib2_gcd.txt @@ -0,0 +1,7 @@ +gcd(285, 35) +gcd(1, 6) +gcd(5, 1) +gcd(8, 12) +gcd(40, 4096) +lcm(40, 4096) +lcm(555, 55) diff --git a/tests/bc/lib2_gcd_results.txt b/tests/bc/lib2_gcd_results.txt new file mode 100644 index 00000000000..952305d197f --- /dev/null +++ b/tests/bc/lib2_gcd_results.txt @@ -0,0 +1,7 @@ +5 +1 +1 +4 +8 +20480 +6105 diff --git a/tests/bc/lib2_log.txt b/tests/bc/lib2_log.txt new file mode 100644 index 00000000000..8b5c62e6d71 --- /dev/null +++ b/tests/bc/lib2_log.txt @@ -0,0 +1,32 @@ +l2(0) +l2(1) +l2(2) +l2(7) +l2(7.9999999999999999999999) +l2(8) +l10(0) +l10(1) +l10(2) +l10(5) +l10(9) +l10(9.999999999999999999999) +l10(10) +l10(11) +l10(99) +l10(99.99999999999999999999) +l10(100) +l2(-1) +l2(-2) +l2(-7) +l2(-7.9999999999999999999999) +l2(-8) +l10(-1) +l10(-2) +l10(-5) +l10(-9) +l10(-9.999999999999999999999) +l10(-10) +l10(-11) +l10(-99) +l10(-99.99999999999999999999) +l10(-100) diff --git a/tests/bc/lib2_log_results.txt b/tests/bc/lib2_log_results.txt new file mode 100644 index 00000000000..05e0c2b0209 --- /dev/null +++ b/tests/bc/lib2_log_results.txt @@ -0,0 +1,32 @@ +-14426950408889634073599246810018921374265.01964302164603717234 +0 +1.00000000000000000000 +2.80735492205760410744 +2.99999999999999999999 +3.00000000000000000000 +-4342944819032518276511289189166050822943.53857128275332257904 +0 +.30102999566398119521 +.69897000433601880478 +.95424250943932487459 +.99999999999999999999 +1.00000000000000000000 +1.04139268515822504075 +1.99563519459754991534 +1.99999999999999999999 +2.00000000000000000000 +-14426950408889634073599246810018921374265.01964302164603717234 +-14426950408889634073599246810018921374265.01964302164603717234 +-14426950408889634073599246810018921374265.01964302164603717234 +-144269504088896340735992468100189213742664594.88013355604393225658 +-14426950408889634073599246810018921374265.01964302164603717234 +-4342944819032518276511289189166050822943.53857128275332257904 +-4342944819032518276511289189166050822943.53857128275332257904 +-4342944819032518276511289189166050822943.53857128275332257904 +-4342944819032518276511289189166050822943.53857128275332257904 +-434294481903251827651128918916605082294396.66367028674257491242 +-4342944819032518276511289189166050822943.53857128275332257904 +-4342944819032518276511289189166050822943.53857128275332257904 +-4342944819032518276511289189166050822943.53857128275332257904 +-4342944819032518276511289189166050822943.53857128275332257904 +-4342944819032518276511289189166050822943.53857128275332257904 diff --git a/tests/bc/lib2_p.txt b/tests/bc/lib2_p.txt new file mode 100644 index 00000000000..7026d581284 --- /dev/null +++ b/tests/bc/lib2_p.txt @@ -0,0 +1,4 @@ +p(2, 8.0000) +p(2, 8.0001) +p(2, -8.0001) +p(1024,32.1) diff --git a/tests/bc/lib2_p_results.txt b/tests/bc/lib2_p_results.txt new file mode 100644 index 00000000000..54089deab2b --- /dev/null +++ b/tests/bc/lib2_p_results.txt @@ -0,0 +1,5 @@ +256.00000000000000000000 +256.01774518281640171326 +.00390597924876622489 +42719740718418201647900434123391042292054090447133055398940832156444\ +39451561281100045924173873151.99999999999999999999 diff --git a/tests/bc/lib2_perm.txt b/tests/bc/lib2_perm.txt new file mode 100644 index 00000000000..84fe6afd1e5 --- /dev/null +++ b/tests/bc/lib2_perm.txt @@ -0,0 +1,9 @@ +perm(10, 2) +comb(10, 2) +perm(6, 2) +comb(6, 2) +perm(12, 10) +comb(12, 10) +perm(24, 15) +comb(24, 15) + diff --git a/tests/bc/lib2_perm_results.txt b/tests/bc/lib2_perm_results.txt new file mode 100644 index 00000000000..bf57dc0ea5f --- /dev/null +++ b/tests/bc/lib2_perm_results.txt @@ -0,0 +1,8 @@ +90 +45 +30 +15 +239500800 +66 +1709789466857472000 +1307504 diff --git a/tests/bc/lib2_pi.txt b/tests/bc/lib2_pi.txt new file mode 100644 index 00000000000..25bef3101e0 --- /dev/null +++ b/tests/bc/lib2_pi.txt @@ -0,0 +1,5 @@ +pi(0) +pi(1) +pi(2) +pi(5) +pi(100) diff --git a/tests/bc/lib2_pi_results.txt b/tests/bc/lib2_pi_results.txt new file mode 100644 index 00000000000..90975cb6a72 --- /dev/null +++ b/tests/bc/lib2_pi_results.txt @@ -0,0 +1,6 @@ +3 +3.1 +3.14 +3.14159 +3.141592653589793238462643383279502884197169399375105820974944592307\ +8164062862089986280348253421170679 diff --git a/tests/bc/lib2_r.txt b/tests/bc/lib2_r.txt new file mode 100644 index 00000000000..2f82d85d904 --- /dev/null +++ b/tests/bc/lib2_r.txt @@ -0,0 +1,23 @@ +r(0, 0) +r(0, 1) +r(0, 100) +r(1, 0) +r(1, 3) +r(1.4, 0) +r(1.5, 0) +r(34.45, 2) +r(64.1223, 4) +r(283.1983893, 6) +r(283.1983895, 6) +r(283.1983899, 6) +r(99.999999999, 5) +r(-1, 0) +r(-1, 3) +r(-1.4, 0) +r(-1.5, 0) +r(-34.45, 2) +r(-64.1223, 4) +r(-283.1983893, 6) +r(-283.1983895, 6) +r(-283.1983899, 6) +r(-99.999999999, 5) diff --git a/tests/bc/lib2_r2d.txt b/tests/bc/lib2_r2d.txt new file mode 100644 index 00000000000..904e55df9cd --- /dev/null +++ b/tests/bc/lib2_r2d.txt @@ -0,0 +1,17 @@ +p=pi(100) +r2d(p) +r2d(2 * p) +r2d(p / 2) +r2d(p / 4) +r2d(p / 3) +r2d(p / 5) +r2d(p / 6) +r2d(p / 10) +r2d(-p) +r2d(2 * -p) +r2d(-p / 2) +r2d(-p / 4) +r2d(-p / 3) +r2d(-p / 5) +r2d(-p / 6) +r2d(-p / 10) diff --git a/tests/bc/lib2_r2d_results.txt b/tests/bc/lib2_r2d_results.txt new file mode 100644 index 00000000000..38abe6dfdd5 --- /dev/null +++ b/tests/bc/lib2_r2d_results.txt @@ -0,0 +1,16 @@ +180.00000000000000000000 +360.00000000000000000000 +89.99999999999999999992 +44.99999999999999999967 +59.99999999999999999975 +35.99999999999999999985 +29.99999999999999999959 +17.99999999999999999964 +-180.00000000000000000000 +-360.00000000000000000000 +-89.99999999999999999992 +-44.99999999999999999967 +-59.99999999999999999975 +-35.99999999999999999985 +-29.99999999999999999959 +-17.99999999999999999964 diff --git a/tests/bc/lib2_r_results.txt b/tests/bc/lib2_r_results.txt new file mode 100644 index 00000000000..4ae686836a4 --- /dev/null +++ b/tests/bc/lib2_r_results.txt @@ -0,0 +1,23 @@ +0 +0 +0 +1 +1.000 +1 +2 +34.45 +64.1223 +283.198389 +283.198390 +283.198390 +100.00000 +-1 +-1.000 +-1 +-2 +-34.45 +-64.1223 +-283.198389 +-283.198390 +-283.198390 +-100.00000 diff --git a/tests/bc/lib2_rand.txt b/tests/bc/lib2_rand.txt new file mode 100644 index 00000000000..a9d94509c79 --- /dev/null +++ b/tests/bc/lib2_rand.txt @@ -0,0 +1,11 @@ +b = brand() +b < 2 +b >= 0 +i = irand(maxrand() + 1) +i <= maxrand() +i >= 0 +f = frand(10) +scale(f) == 10 +fi = ifrand(123, 28) +scale(fi) == 28 +fi < 128 diff --git a/tests/bc/lib2_rand_results.txt b/tests/bc/lib2_rand_results.txt new file mode 100644 index 00000000000..fcb49fa9945 --- /dev/null +++ b/tests/bc/lib2_rand_results.txt @@ -0,0 +1,7 @@ +1 +1 +1 +1 +1 +1 +1 diff --git a/tests/bc/lib2_root.txt b/tests/bc/lib2_root.txt new file mode 100644 index 00000000000..6a0558414c4 --- /dev/null +++ b/tests/bc/lib2_root.txt @@ -0,0 +1,13 @@ +cbrt(27) +cbrt(-27) +cbrt(4096) +cbrt(-4096) +root(0, 3) +root(0, 4) +root(0, 5) +root(0.0000000000000, 3) +root(0.0000000000000, 4) +root(0.0000000000000, 5) +root(16, 4) +root(3125, 5) +root(-3125, 5) diff --git a/tests/bc/lib2_root_results.txt b/tests/bc/lib2_root_results.txt new file mode 100644 index 00000000000..74ebfc514ab --- /dev/null +++ b/tests/bc/lib2_root_results.txt @@ -0,0 +1,13 @@ +3.00000000000000000000 +-3.00000000000000000000 +16.00000000000000000000 +-16.00000000000000000000 +0 +0 +0 +0 +0 +0 +2.00000000000000000000 +5.00000000000000000000 +-5.00000000000000000000 diff --git a/tests/bc/lib2_tan.txt b/tests/bc/lib2_tan.txt new file mode 100644 index 00000000000..624e798b71d --- /dev/null +++ b/tests/bc/lib2_tan.txt @@ -0,0 +1,30 @@ +p=pi(100) +t(0) +t(1) +t(-1) +t(2) +t(-2) +t(3) +t(-3) +t(p) +t(-p) +t(p/2) +t(-p/2) +t(p/3) +t(-p/3) +t(p/4) +t(-p/4) +t(p/5) +t(-p/5) +t(p/6) +t(-p/6) +t(p/7) +t(-p/7) +t(p/8) +t(-p/8) +t(p/9) +t(-p/9) +t(p/10) +t(-p/10) +t(p/15) +t(-p/15) diff --git a/tests/bc/lib2_tan_results.txt b/tests/bc/lib2_tan_results.txt new file mode 100644 index 00000000000..53fafa8d496 --- /dev/null +++ b/tests/bc/lib2_tan_results.txt @@ -0,0 +1,29 @@ +0 +1.55740772465490223050 +-1.55740772465490223050 +-2.18503986326151899164 +2.18503986326151899164 +-.14254654307427780529 +.14254654307427780529 +0 +0 +769230769230769230769.23076923076923076923 +-769230769230769230769.23076923076923076923 +1.73205080756887729351 +-1.73205080756887729351 +.99999999999999999998 +-.99999999999999999998 +.72654252800536088589 +-.72654252800536088589 +.57735026918962576449 +-.57735026918962576449 +.48157461880752864432 +-.48157461880752864432 +.41421356237309504879 +-.41421356237309504879 +.36397023426620236134 +-.36397023426620236134 +.32491969623290632614 +-.32491969623290632614 +.21255656167002212525 +-.21255656167002212525 diff --git a/tests/bc/lib2_uint.txt b/tests/bc/lib2_uint.txt new file mode 100644 index 00000000000..a3c62519ca9 --- /dev/null +++ b/tests/bc/lib2_uint.txt @@ -0,0 +1,218 @@ +binary(0) +hex(0) +binary(1) +hex(1) +binary(2) +hex(2) +binary(15) +hex(15) +binary(16) +hex(16) +uint(0) +int(0) +uint(1) +int(1) +int(-1) +uint(127) +int(127) +int(-127) +uint(128) +int(128) +int(-128) +uint(129) +int(129) +int(-129) +uint(255) +int(255) +int(-255) +uint(256) +int(256) +int(-256) +uint(32767) +int(32767) +int(-32767) +uint(32768) +int(32768) +int(-32768) +uint(32769) +int(32769) +int(-32769) +uint(65535) +int(65535) +int(-65535) +uint(65536) +int(65536) +int(-65536) +uint(2147483647) +int(2147483647) +int(-2147483647) +uint(2147483648) +int(2147483648) +int(-2147483648) +uint(2147483649) +int(2147483649) +int(-2147483649) +uint(4294967295) +int(4294967295) +int(-4294967295) +uint(4294967296) +int(4294967296) +int(-4294967296) +uint8(0) +int8(0) +uint16(0) +int16(0) +uint32(0) +int32(0) +uint64(0) +int64(0) +uint8(1) +int8(1) +int8(-1) +uint16(1) +int16(1) +int16(-1) +uint32(1) +int32(1) +int32(-1) +uint64(1) +int64(1) +int64(-1) +uint8(127) +int8(127) +int8(-127) +uint16(127) +int16(127) +int16(-127) +uint32(127) +int32(127) +int32(-127) +uint64(127) +int64(127) +int64(-127) +uint8(128) +int8(128) +int8(-128) +uint16(128) +int16(128) +int16(-128) +uint32(128) +int32(128) +int32(-128) +uint64(128) +int64(128) +int64(-128) +uint8(129) +int8(129) +int8(-129) +uint16(129) +int16(129) +int16(-129) +uint32(129) +int32(129) +int32(-129) +uint64(129) +int64(129) +int64(-129) +uint8(255) +int8(255) +int8(-255) +uint16(255) +int16(255) +int16(-255) +uint32(255) +int32(255) +int32(-255) +uint64(255) +int64(255) +int64(-255) +uint8(256) +int8(256) +int8(-256) +uint16(256) +int16(256) +int16(-256) +uint32(256) +int32(256) +int32(-256) +uint64(256) +int64(256) +int64(-256) +uint16(32767) +int16(32767) +int16(-32767) +uint32(32767) +int32(32767) +int32(-32767) +uint64(32767) +int64(32767) +int64(-32767) +uint16(32768) +int16(32768) +int16(-32768) +uint32(32768) +int32(32768) +int32(-32768) +uint64(32768) +int64(32768) +int64(-32768) +uint16(32769) +int16(32769) +int16(-32769) +uint32(32769) +int32(32769) +int32(-32769) +uint64(32769) +int64(32769) +int64(-32769) +uint16(65535) +int16(65535) +int16(-65535) +uint32(65535) +int32(65535) +int32(-65535) +uint64(65535) +int64(65535) +int64(-65535) +uint16(65536) +int16(65536) +int16(-65536) +uint32(65536) +int32(65536) +int32(-65536) +uint64(65536) +int64(65536) +int64(-65536) +uint32(2147483647) +int32(2147483647) +int32(-2147483647) +uint64(2147483647) +int64(2147483647) +int64(-2147483647) +uint32(2147483648) +int32(2147483648) +int32(-2147483648) +uint64(2147483648) +int64(2147483648) +int64(-2147483648) +uint32(2147483649) +int32(2147483649) +int32(-2147483649) +uint64(2147483649) +int64(2147483649) +int64(-2147483649) +uint32(4294967295) +int32(4294967295) +int32(-4294967295) +uint64(4294967295) +int64(4294967295) +int64(-4294967295) +uint32(4294967296) +int32(4294967296) +int32(-4294967296) +uint64(4294967296) +int64(4294967296) +int64(-4294967296) +uint(-3) +uint(3.928375) +int(4.000000) diff --git a/tests/bc/lib2_results.txt b/tests/bc/lib2_uint_results.txt similarity index 72% rename from tests/bc/lib2_results.txt rename to tests/bc/lib2_uint_results.txt index e5ddb51642a..7e494e2a081 100644 --- a/tests/bc/lib2_results.txt +++ b/tests/bc/lib2_uint_results.txt @@ -1,252 +1,3 @@ -256.00000000000000000000 -256.01774518281640171326 -.00390597924876622489 -42719740718418201647900434123391042292054090447133055398940832156444\ -39451561281100045924173873151.99999999999999999999 -0 -0 -0 -1 -1.000 -1 -2 -34.45 -64.1223 -283.198389 -283.198390 -283.198390 -100.00000 --1 --1.000 --1 --2 --34.45 --64.1223 --283.198389 --283.198390 --283.198390 --100.00000 -0 -0 -0 -1 -1.000 -2 -2 -34.45 -64.1223 -283.198390 -283.198390 -283.198390 -100.00000 --1 --1.000 --2 --2 --34.45 --64.1223 --283.198390 --283.198390 --283.198390 --100.00000 -8770736 --14426950408889634073599246810018921374265.01964302164603717234 -0 -1.00000000000000000000 -2.80735492205760410744 -2.99999999999999999999 -3.00000000000000000000 --4342944819032518276511289189166050822943.53857128275332257904 -0 -.30102999566398119521 -.69897000433601880478 -.95424250943932487459 -.99999999999999999999 -1.00000000000000000000 -1.04139268515822504075 -1.99563519459754991534 -1.99999999999999999999 -2.00000000000000000000 --14426950408889634073599246810018921374265.01964302164603717234 --14426950408889634073599246810018921374265.01964302164603717234 --14426950408889634073599246810018921374265.01964302164603717234 --144269504088896340735992468100189213742664594.88013355604393225658 --14426950408889634073599246810018921374265.01964302164603717234 --4342944819032518276511289189166050822943.53857128275332257904 --4342944819032518276511289189166050822943.53857128275332257904 --4342944819032518276511289189166050822943.53857128275332257904 --4342944819032518276511289189166050822943.53857128275332257904 --434294481903251827651128918916605082294396.66367028674257491242 --4342944819032518276511289189166050822943.53857128275332257904 --4342944819032518276511289189166050822943.53857128275332257904 --4342944819032518276511289189166050822943.53857128275332257904 --4342944819032518276511289189166050822943.53857128275332257904 --4342944819032518276511289189166050822943.53857128275332257904 -3.00000000000000000000 --3.00000000000000000000 -16.00000000000000000000 --16.00000000000000000000 -0 -0 -0 -0 -0 -0 -2.00000000000000000000 -5.00000000000000000000 --5.00000000000000000000 -5 -1 -1 -4 -8 -20480 -6105 -1 -1 -1 -1 -1 -2 -2 -4 -4 -4 -8 -8 -16 -1 -1 -1 -1 -1 -2 -1 -1 -2 -2 -2 -2 -2 -4 -2 -2 -4 -4 -4 -4 -8 -8 -4 -4 -8 -8 -8 -8 -16 -16 -8 -8 -16 -3 -3.1 -3.14 -3.14159 -3.141592653589793238462643383279502884197169399375105820974944592307\ -8164062862089986280348253421170679 -0 -1.55740772465490223050 --1.55740772465490223050 --2.18503986326151899164 -2.18503986326151899164 --.14254654307427780529 -.14254654307427780529 -0 -0 -769230769230769230769.23076923076923076923 --769230769230769230769.23076923076923076923 -1.73205080756887729351 --1.73205080756887729351 -.99999999999999999998 --.99999999999999999998 -.72654252800536088589 --.72654252800536088589 -.57735026918962576449 --.57735026918962576449 -.48157461880752864432 --.48157461880752864432 -.41421356237309504879 --.41421356237309504879 -.36397023426620236134 --.36397023426620236134 -.32491969623290632614 --.32491969623290632614 -.21255656167002212525 --.21255656167002212525 -0 -.78539816339744830961 -1.10714871779409050301 -.46364760900080611621 -3.14159265358979323846 -2.35619449019234492884 -2.03444393579570273544 -2.67794504458898712224 --.78539816339744830961 --1.10714871779409050301 --.46364760900080611621 --2.35619449019234492884 --2.03444393579570273544 --2.67794504458898712224 -1.57079632679489661923 -1.57079632679489661923 --1.57079632679489661923 --1.57079632679489661923 -180.00000000000000000000 -360.00000000000000000000 -89.99999999999999999992 -44.99999999999999999967 -59.99999999999999999975 -35.99999999999999999985 -29.99999999999999999959 -17.99999999999999999964 --180.00000000000000000000 --360.00000000000000000000 --89.99999999999999999992 --44.99999999999999999967 --59.99999999999999999975 --35.99999999999999999985 --29.99999999999999999959 --17.99999999999999999964 -3.14159265358979323846 -6.28318530717958647692 -1.57079632679489661923 -.78539816339744830961 -2.09439510239319549230 -1.25663706143591729538 -1.04719755119659774615 -.62831853071795864769 --3.14159265358979323846 --6.28318530717958647692 --1.57079632679489661923 --.78539816339744830961 --2.09439510239319549230 --1.25663706143591729538 --1.04719755119659774615 --.62831853071795864769 -1 -1 -2 -6 -24 -120 -90 -45 -30 -15 -239500800 -66 -1709789466857472000 -1307504 0 0 1 @@ -704,10 +455,3 @@ FF FF FF FF 00 00 00 00 Error: -3 is negative. Error: 3.928375 is not an integer. Error: 4.000000 is not an integer. -1 -1 -1 -1 -1 -1 -1 diff --git a/tests/bc/scripts/add.bc b/tests/bc/scripts/add_00100.bc similarity index 86% rename from tests/bc/scripts/add.bc rename to tests/bc/scripts/add_00100.bc index 9cffa2c2875..687ba889c30 100644 --- a/tests/bc/scripts/add.bc +++ b/tests/bc/scripts/add_00100.bc @@ -10,7 +10,7 @@ for (i = 0; i <= len; ++i) { a[i] } -for (i = 1; i <= 10000; ++i) { +for (i = 1; i <= 100; ++i) { for (j = 0; j < len; ++j) { a[i] + a[j] } diff --git a/tests/bc/scripts/add_00200.bc b/tests/bc/scripts/add_00200.bc new file mode 100644 index 00000000000..21112195c65 --- /dev/null +++ b/tests/bc/scripts/add_00200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 101; i <= 200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_00300.bc b/tests/bc/scripts/add_00300.bc new file mode 100644 index 00000000000..1b2cb778475 --- /dev/null +++ b/tests/bc/scripts/add_00300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 201; i <= 300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_00400.bc b/tests/bc/scripts/add_00400.bc new file mode 100644 index 00000000000..e8a8def0450 --- /dev/null +++ b/tests/bc/scripts/add_00400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 301; i <= 400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_00500.bc b/tests/bc/scripts/add_00500.bc new file mode 100644 index 00000000000..971991e0f45 --- /dev/null +++ b/tests/bc/scripts/add_00500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 401; i <= 500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_00600.bc b/tests/bc/scripts/add_00600.bc new file mode 100644 index 00000000000..dc758b170e5 --- /dev/null +++ b/tests/bc/scripts/add_00600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 501; i <= 600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_00700.bc b/tests/bc/scripts/add_00700.bc new file mode 100644 index 00000000000..6819689561d --- /dev/null +++ b/tests/bc/scripts/add_00700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 601; i <= 700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_00800.bc b/tests/bc/scripts/add_00800.bc new file mode 100644 index 00000000000..59314445795 --- /dev/null +++ b/tests/bc/scripts/add_00800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 701; i <= 800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_00900.bc b/tests/bc/scripts/add_00900.bc new file mode 100644 index 00000000000..a6cee4ff0b3 --- /dev/null +++ b/tests/bc/scripts/add_00900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 801; i <= 900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01000.bc b/tests/bc/scripts/add_01000.bc new file mode 100644 index 00000000000..6f3d42a3590 --- /dev/null +++ b/tests/bc/scripts/add_01000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 901; i <= 1000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01100.bc b/tests/bc/scripts/add_01100.bc new file mode 100644 index 00000000000..98866672d81 --- /dev/null +++ b/tests/bc/scripts/add_01100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1001; i <= 1100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01200.bc b/tests/bc/scripts/add_01200.bc new file mode 100644 index 00000000000..82b74b103fb --- /dev/null +++ b/tests/bc/scripts/add_01200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1101; i <= 1200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01300.bc b/tests/bc/scripts/add_01300.bc new file mode 100644 index 00000000000..45e0ea4637c --- /dev/null +++ b/tests/bc/scripts/add_01300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1201; i <= 1300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01400.bc b/tests/bc/scripts/add_01400.bc new file mode 100644 index 00000000000..123fba19dcc --- /dev/null +++ b/tests/bc/scripts/add_01400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1301; i <= 1400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01500.bc b/tests/bc/scripts/add_01500.bc new file mode 100644 index 00000000000..59a2a0dac4d --- /dev/null +++ b/tests/bc/scripts/add_01500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1401; i <= 1500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01600.bc b/tests/bc/scripts/add_01600.bc new file mode 100644 index 00000000000..2df24a0c006 --- /dev/null +++ b/tests/bc/scripts/add_01600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1501; i <= 1600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01700.bc b/tests/bc/scripts/add_01700.bc new file mode 100644 index 00000000000..0646f0b881c --- /dev/null +++ b/tests/bc/scripts/add_01700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1601; i <= 1700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01800.bc b/tests/bc/scripts/add_01800.bc new file mode 100644 index 00000000000..65a725c9cc0 --- /dev/null +++ b/tests/bc/scripts/add_01800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1701; i <= 1800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_01900.bc b/tests/bc/scripts/add_01900.bc new file mode 100644 index 00000000000..b73af970dd5 --- /dev/null +++ b/tests/bc/scripts/add_01900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1801; i <= 1900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02000.bc b/tests/bc/scripts/add_02000.bc new file mode 100644 index 00000000000..ea76021121c --- /dev/null +++ b/tests/bc/scripts/add_02000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1901; i <= 2000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02100.bc b/tests/bc/scripts/add_02100.bc new file mode 100644 index 00000000000..0bc93bf08aa --- /dev/null +++ b/tests/bc/scripts/add_02100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2001; i <= 2100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02200.bc b/tests/bc/scripts/add_02200.bc new file mode 100644 index 00000000000..ad1aa7a3270 --- /dev/null +++ b/tests/bc/scripts/add_02200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2101; i <= 2200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02300.bc b/tests/bc/scripts/add_02300.bc new file mode 100644 index 00000000000..8e9622db639 --- /dev/null +++ b/tests/bc/scripts/add_02300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2201; i <= 2300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02400.bc b/tests/bc/scripts/add_02400.bc new file mode 100644 index 00000000000..4cedd06b481 --- /dev/null +++ b/tests/bc/scripts/add_02400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2301; i <= 2400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02500.bc b/tests/bc/scripts/add_02500.bc new file mode 100644 index 00000000000..75b599350b6 --- /dev/null +++ b/tests/bc/scripts/add_02500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2401; i <= 2500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02600.bc b/tests/bc/scripts/add_02600.bc new file mode 100644 index 00000000000..ea371d5b3e9 --- /dev/null +++ b/tests/bc/scripts/add_02600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2501; i <= 2600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02700.bc b/tests/bc/scripts/add_02700.bc new file mode 100644 index 00000000000..6e03b41c954 --- /dev/null +++ b/tests/bc/scripts/add_02700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2601; i <= 2700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02800.bc b/tests/bc/scripts/add_02800.bc new file mode 100644 index 00000000000..91e3dc90649 --- /dev/null +++ b/tests/bc/scripts/add_02800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2701; i <= 2800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_02900.bc b/tests/bc/scripts/add_02900.bc new file mode 100644 index 00000000000..ab103da6cc1 --- /dev/null +++ b/tests/bc/scripts/add_02900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2801; i <= 2900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03000.bc b/tests/bc/scripts/add_03000.bc new file mode 100644 index 00000000000..f0149001652 --- /dev/null +++ b/tests/bc/scripts/add_03000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2901; i <= 3000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03100.bc b/tests/bc/scripts/add_03100.bc new file mode 100644 index 00000000000..371d3d6d097 --- /dev/null +++ b/tests/bc/scripts/add_03100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3001; i <= 3100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03200.bc b/tests/bc/scripts/add_03200.bc new file mode 100644 index 00000000000..d8f361df874 --- /dev/null +++ b/tests/bc/scripts/add_03200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3101; i <= 3200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03300.bc b/tests/bc/scripts/add_03300.bc new file mode 100644 index 00000000000..115f61b128c --- /dev/null +++ b/tests/bc/scripts/add_03300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3201; i <= 3300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03400.bc b/tests/bc/scripts/add_03400.bc new file mode 100644 index 00000000000..c5dbb7b1148 --- /dev/null +++ b/tests/bc/scripts/add_03400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3301; i <= 3400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03500.bc b/tests/bc/scripts/add_03500.bc new file mode 100644 index 00000000000..f487c0d05ce --- /dev/null +++ b/tests/bc/scripts/add_03500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3401; i <= 3500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03600.bc b/tests/bc/scripts/add_03600.bc new file mode 100644 index 00000000000..eab41fd22f7 --- /dev/null +++ b/tests/bc/scripts/add_03600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3501; i <= 3600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03700.bc b/tests/bc/scripts/add_03700.bc new file mode 100644 index 00000000000..40c7f6c9f72 --- /dev/null +++ b/tests/bc/scripts/add_03700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3601; i <= 3700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03800.bc b/tests/bc/scripts/add_03800.bc new file mode 100644 index 00000000000..9732ea39866 --- /dev/null +++ b/tests/bc/scripts/add_03800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3701; i <= 3800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_03900.bc b/tests/bc/scripts/add_03900.bc new file mode 100644 index 00000000000..c4bb1e4f502 --- /dev/null +++ b/tests/bc/scripts/add_03900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3801; i <= 3900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04000.bc b/tests/bc/scripts/add_04000.bc new file mode 100644 index 00000000000..9f4c832d40a --- /dev/null +++ b/tests/bc/scripts/add_04000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3901; i <= 4000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04100.bc b/tests/bc/scripts/add_04100.bc new file mode 100644 index 00000000000..a54f8711ad3 --- /dev/null +++ b/tests/bc/scripts/add_04100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4001; i <= 4100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04200.bc b/tests/bc/scripts/add_04200.bc new file mode 100644 index 00000000000..f0d7f4ac220 --- /dev/null +++ b/tests/bc/scripts/add_04200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4101; i <= 4200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04300.bc b/tests/bc/scripts/add_04300.bc new file mode 100644 index 00000000000..6f1fd34d1d8 --- /dev/null +++ b/tests/bc/scripts/add_04300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4201; i <= 4300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04400.bc b/tests/bc/scripts/add_04400.bc new file mode 100644 index 00000000000..d61ebb5cb85 --- /dev/null +++ b/tests/bc/scripts/add_04400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4301; i <= 4400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04500.bc b/tests/bc/scripts/add_04500.bc new file mode 100644 index 00000000000..dec1d8d51a0 --- /dev/null +++ b/tests/bc/scripts/add_04500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4401; i <= 4500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04600.bc b/tests/bc/scripts/add_04600.bc new file mode 100644 index 00000000000..c11374d541c --- /dev/null +++ b/tests/bc/scripts/add_04600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4501; i <= 4600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04700.bc b/tests/bc/scripts/add_04700.bc new file mode 100644 index 00000000000..f58c124a04b --- /dev/null +++ b/tests/bc/scripts/add_04700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4601; i <= 4700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04800.bc b/tests/bc/scripts/add_04800.bc new file mode 100644 index 00000000000..a814317464d --- /dev/null +++ b/tests/bc/scripts/add_04800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4701; i <= 4800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_04900.bc b/tests/bc/scripts/add_04900.bc new file mode 100644 index 00000000000..e6c45fda681 --- /dev/null +++ b/tests/bc/scripts/add_04900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4801; i <= 4900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05000.bc b/tests/bc/scripts/add_05000.bc new file mode 100644 index 00000000000..b5f942c75b9 --- /dev/null +++ b/tests/bc/scripts/add_05000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4901; i <= 5000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05100.bc b/tests/bc/scripts/add_05100.bc new file mode 100644 index 00000000000..7b6db4cab7c --- /dev/null +++ b/tests/bc/scripts/add_05100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5001; i <= 5100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05200.bc b/tests/bc/scripts/add_05200.bc new file mode 100644 index 00000000000..e00390c3a18 --- /dev/null +++ b/tests/bc/scripts/add_05200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5101; i <= 5200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05300.bc b/tests/bc/scripts/add_05300.bc new file mode 100644 index 00000000000..bba349b19f5 --- /dev/null +++ b/tests/bc/scripts/add_05300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5201; i <= 5300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05400.bc b/tests/bc/scripts/add_05400.bc new file mode 100644 index 00000000000..4d56e6444d2 --- /dev/null +++ b/tests/bc/scripts/add_05400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5301; i <= 5400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05500.bc b/tests/bc/scripts/add_05500.bc new file mode 100644 index 00000000000..f44e5da2418 --- /dev/null +++ b/tests/bc/scripts/add_05500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5401; i <= 5500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05600.bc b/tests/bc/scripts/add_05600.bc new file mode 100644 index 00000000000..7085cfb977a --- /dev/null +++ b/tests/bc/scripts/add_05600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5501; i <= 5600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05700.bc b/tests/bc/scripts/add_05700.bc new file mode 100644 index 00000000000..3cb664410ce --- /dev/null +++ b/tests/bc/scripts/add_05700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5601; i <= 5700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05800.bc b/tests/bc/scripts/add_05800.bc new file mode 100644 index 00000000000..2b2371a97db --- /dev/null +++ b/tests/bc/scripts/add_05800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5701; i <= 5800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_05900.bc b/tests/bc/scripts/add_05900.bc new file mode 100644 index 00000000000..263c186e6e4 --- /dev/null +++ b/tests/bc/scripts/add_05900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5801; i <= 5900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06000.bc b/tests/bc/scripts/add_06000.bc new file mode 100644 index 00000000000..6a0c9adba92 --- /dev/null +++ b/tests/bc/scripts/add_06000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5901; i <= 6000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06100.bc b/tests/bc/scripts/add_06100.bc new file mode 100644 index 00000000000..a39e08d837a --- /dev/null +++ b/tests/bc/scripts/add_06100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6001; i <= 6100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06200.bc b/tests/bc/scripts/add_06200.bc new file mode 100644 index 00000000000..3c027b50e4c --- /dev/null +++ b/tests/bc/scripts/add_06200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6101; i <= 6200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06300.bc b/tests/bc/scripts/add_06300.bc new file mode 100644 index 00000000000..0034dff383c --- /dev/null +++ b/tests/bc/scripts/add_06300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6201; i <= 6300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06400.bc b/tests/bc/scripts/add_06400.bc new file mode 100644 index 00000000000..e76787fff84 --- /dev/null +++ b/tests/bc/scripts/add_06400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6301; i <= 6400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06500.bc b/tests/bc/scripts/add_06500.bc new file mode 100644 index 00000000000..219b0bfb1f2 --- /dev/null +++ b/tests/bc/scripts/add_06500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6401; i <= 6500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06600.bc b/tests/bc/scripts/add_06600.bc new file mode 100644 index 00000000000..c881cdd331a --- /dev/null +++ b/tests/bc/scripts/add_06600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6501; i <= 6600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06700.bc b/tests/bc/scripts/add_06700.bc new file mode 100644 index 00000000000..89578ced832 --- /dev/null +++ b/tests/bc/scripts/add_06700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6601; i <= 6700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06800.bc b/tests/bc/scripts/add_06800.bc new file mode 100644 index 00000000000..43808bbad6d --- /dev/null +++ b/tests/bc/scripts/add_06800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6701; i <= 6800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_06900.bc b/tests/bc/scripts/add_06900.bc new file mode 100644 index 00000000000..aa3e232f95c --- /dev/null +++ b/tests/bc/scripts/add_06900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6801; i <= 6900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07000.bc b/tests/bc/scripts/add_07000.bc new file mode 100644 index 00000000000..619efe0b1fb --- /dev/null +++ b/tests/bc/scripts/add_07000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6901; i <= 7000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07100.bc b/tests/bc/scripts/add_07100.bc new file mode 100644 index 00000000000..7f62385972b --- /dev/null +++ b/tests/bc/scripts/add_07100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7001; i <= 7100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07200.bc b/tests/bc/scripts/add_07200.bc new file mode 100644 index 00000000000..9275056c7b4 --- /dev/null +++ b/tests/bc/scripts/add_07200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7101; i <= 7200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07300.bc b/tests/bc/scripts/add_07300.bc new file mode 100644 index 00000000000..aae0593d545 --- /dev/null +++ b/tests/bc/scripts/add_07300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7201; i <= 7300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07400.bc b/tests/bc/scripts/add_07400.bc new file mode 100644 index 00000000000..5ec925f7145 --- /dev/null +++ b/tests/bc/scripts/add_07400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7301; i <= 7400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07500.bc b/tests/bc/scripts/add_07500.bc new file mode 100644 index 00000000000..79e3da3795a --- /dev/null +++ b/tests/bc/scripts/add_07500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7401; i <= 7500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07600.bc b/tests/bc/scripts/add_07600.bc new file mode 100644 index 00000000000..0a6787de4f9 --- /dev/null +++ b/tests/bc/scripts/add_07600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7501; i <= 7600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07700.bc b/tests/bc/scripts/add_07700.bc new file mode 100644 index 00000000000..68a270cb214 --- /dev/null +++ b/tests/bc/scripts/add_07700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7601; i <= 7700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07800.bc b/tests/bc/scripts/add_07800.bc new file mode 100644 index 00000000000..266fb799877 --- /dev/null +++ b/tests/bc/scripts/add_07800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7701; i <= 7800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_07900.bc b/tests/bc/scripts/add_07900.bc new file mode 100644 index 00000000000..34759324fbe --- /dev/null +++ b/tests/bc/scripts/add_07900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7801; i <= 7900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08000.bc b/tests/bc/scripts/add_08000.bc new file mode 100644 index 00000000000..7194e35553b --- /dev/null +++ b/tests/bc/scripts/add_08000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7901; i <= 8000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08100.bc b/tests/bc/scripts/add_08100.bc new file mode 100644 index 00000000000..899afff7c49 --- /dev/null +++ b/tests/bc/scripts/add_08100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8001; i <= 8100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08200.bc b/tests/bc/scripts/add_08200.bc new file mode 100644 index 00000000000..7898c65c3f3 --- /dev/null +++ b/tests/bc/scripts/add_08200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8101; i <= 8200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08300.bc b/tests/bc/scripts/add_08300.bc new file mode 100644 index 00000000000..e524af4e636 --- /dev/null +++ b/tests/bc/scripts/add_08300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8201; i <= 8300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08400.bc b/tests/bc/scripts/add_08400.bc new file mode 100644 index 00000000000..e1835790b53 --- /dev/null +++ b/tests/bc/scripts/add_08400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8301; i <= 8400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08500.bc b/tests/bc/scripts/add_08500.bc new file mode 100644 index 00000000000..33a1b69888f --- /dev/null +++ b/tests/bc/scripts/add_08500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8401; i <= 8500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08600.bc b/tests/bc/scripts/add_08600.bc new file mode 100644 index 00000000000..a0a85ed50d2 --- /dev/null +++ b/tests/bc/scripts/add_08600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8501; i <= 8600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08700.bc b/tests/bc/scripts/add_08700.bc new file mode 100644 index 00000000000..cf453c39167 --- /dev/null +++ b/tests/bc/scripts/add_08700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8601; i <= 8700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08800.bc b/tests/bc/scripts/add_08800.bc new file mode 100644 index 00000000000..0714a10c14d --- /dev/null +++ b/tests/bc/scripts/add_08800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8701; i <= 8800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_08900.bc b/tests/bc/scripts/add_08900.bc new file mode 100644 index 00000000000..1cf95e2507f --- /dev/null +++ b/tests/bc/scripts/add_08900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8801; i <= 8900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09000.bc b/tests/bc/scripts/add_09000.bc new file mode 100644 index 00000000000..3838cb3e90e --- /dev/null +++ b/tests/bc/scripts/add_09000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8901; i <= 9000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09100.bc b/tests/bc/scripts/add_09100.bc new file mode 100644 index 00000000000..f5771ed8b8f --- /dev/null +++ b/tests/bc/scripts/add_09100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9001; i <= 9100; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09200.bc b/tests/bc/scripts/add_09200.bc new file mode 100644 index 00000000000..4f9e0638fdd --- /dev/null +++ b/tests/bc/scripts/add_09200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9101; i <= 9200; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09300.bc b/tests/bc/scripts/add_09300.bc new file mode 100644 index 00000000000..b4fc793980c --- /dev/null +++ b/tests/bc/scripts/add_09300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9201; i <= 9300; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09400.bc b/tests/bc/scripts/add_09400.bc new file mode 100644 index 00000000000..302f328b3c1 --- /dev/null +++ b/tests/bc/scripts/add_09400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9301; i <= 9400; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09500.bc b/tests/bc/scripts/add_09500.bc new file mode 100644 index 00000000000..a2fc67f6443 --- /dev/null +++ b/tests/bc/scripts/add_09500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9401; i <= 9500; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09600.bc b/tests/bc/scripts/add_09600.bc new file mode 100644 index 00000000000..0b36a67aeff --- /dev/null +++ b/tests/bc/scripts/add_09600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9501; i <= 9600; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09700.bc b/tests/bc/scripts/add_09700.bc new file mode 100644 index 00000000000..5f7c395c3a2 --- /dev/null +++ b/tests/bc/scripts/add_09700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9601; i <= 9700; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09800.bc b/tests/bc/scripts/add_09800.bc new file mode 100644 index 00000000000..23c044c7dbc --- /dev/null +++ b/tests/bc/scripts/add_09800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9701; i <= 9800; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_09900.bc b/tests/bc/scripts/add_09900.bc new file mode 100644 index 00000000000..42d1a28d42b --- /dev/null +++ b/tests/bc/scripts/add_09900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9801; i <= 9900; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/add_10000.bc b/tests/bc/scripts/add_10000.bc new file mode 100644 index 00000000000..518e937c48a --- /dev/null +++ b/tests/bc/scripts/add_10000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9901; i <= 10000; ++i) { + for (j = 0; j < len; ++j) { + a[i] + a[j] + } +} diff --git a/tests/bc/scripts/all.txt b/tests/bc/scripts/all.txt index 7b49f7c4e77..935f05cf9fb 100644 --- a/tests/bc/scripts/all.txt +++ b/tests/bc/scripts/all.txt @@ -1,10 +1,404 @@ -multiply.bc -divide.bc -subtract.bc -add.bc -print.bc +multiply_00100.bc +multiply_00200.bc +multiply_00300.bc +multiply_00400.bc +multiply_00500.bc +multiply_00600.bc +multiply_00700.bc +multiply_00800.bc +multiply_00900.bc +multiply_01000.bc +multiply_01100.bc +multiply_01200.bc +multiply_01300.bc +multiply_01400.bc +multiply_01500.bc +multiply_01600.bc +multiply_01700.bc +multiply_01800.bc +multiply_01900.bc +multiply_02000.bc +multiply_02100.bc +multiply_02200.bc +multiply_02300.bc +multiply_02400.bc +multiply_02500.bc +multiply_02600.bc +multiply_02700.bc +multiply_02800.bc +multiply_02900.bc +multiply_03000.bc +multiply_03100.bc +multiply_03200.bc +multiply_03300.bc +multiply_03400.bc +multiply_03500.bc +multiply_03600.bc +multiply_03700.bc +multiply_03800.bc +multiply_03900.bc +multiply_04000.bc +multiply_04100.bc +multiply_04200.bc +multiply_04300.bc +multiply_04400.bc +multiply_04500.bc +multiply_04600.bc +multiply_04700.bc +multiply_04800.bc +multiply_04900.bc +multiply_05000.bc +multiply_05100.bc +multiply_05200.bc +multiply_05300.bc +multiply_05400.bc +multiply_05500.bc +multiply_05600.bc +multiply_05700.bc +multiply_05800.bc +multiply_05900.bc +multiply_06000.bc +multiply_06100.bc +multiply_06200.bc +multiply_06300.bc +multiply_06400.bc +multiply_06500.bc +multiply_06600.bc +multiply_06700.bc +multiply_06800.bc +multiply_06900.bc +multiply_07000.bc +multiply_07100.bc +multiply_07200.bc +multiply_07300.bc +multiply_07400.bc +multiply_07500.bc +multiply_07600.bc +multiply_07700.bc +multiply_07800.bc +multiply_07900.bc +multiply_08000.bc +multiply_08100.bc +multiply_08200.bc +multiply_08300.bc +multiply_08400.bc +multiply_08500.bc +multiply_08600.bc +multiply_08700.bc +multiply_08800.bc +multiply_08900.bc +multiply_09000.bc +multiply_09100.bc +multiply_09200.bc +multiply_09300.bc +multiply_09400.bc +multiply_09500.bc +multiply_09600.bc +multiply_09700.bc +multiply_09800.bc +multiply_09900.bc +multiply_10000.bc +divide_00100.bc +divide_00200.bc +divide_00300.bc +divide_00400.bc +divide_00500.bc +divide_00600.bc +divide_00700.bc +divide_00800.bc +divide_00900.bc +divide_01000.bc +divide_01100.bc +divide_01200.bc +divide_01300.bc +divide_01400.bc +divide_01500.bc +divide_01600.bc +divide_01700.bc +divide_01800.bc +divide_01900.bc +divide_02000.bc +divide_02100.bc +divide_02200.bc +divide_02300.bc +divide_02400.bc +divide_02500.bc +divide_02600.bc +divide_02700.bc +divide_02800.bc +divide_02900.bc +divide_03000.bc +divide_03100.bc +divide_03200.bc +divide_03300.bc +divide_03400.bc +divide_03500.bc +divide_03600.bc +divide_03700.bc +divide_03800.bc +divide_03900.bc +divide_04000.bc +divide_04100.bc +divide_04200.bc +divide_04300.bc +divide_04400.bc +divide_04500.bc +divide_04600.bc +divide_04700.bc +divide_04800.bc +divide_04900.bc +divide_05000.bc +divide_05100.bc +divide_05200.bc +divide_05300.bc +divide_05400.bc +divide_05500.bc +divide_05600.bc +divide_05700.bc +divide_05800.bc +divide_05900.bc +divide_06000.bc +divide_06100.bc +divide_06200.bc +divide_06300.bc +divide_06400.bc +divide_06500.bc +divide_06600.bc +divide_06700.bc +divide_06800.bc +divide_06900.bc +divide_07000.bc +divide_07100.bc +divide_07200.bc +divide_07300.bc +divide_07400.bc +divide_07500.bc +divide_07600.bc +divide_07700.bc +divide_07800.bc +divide_07900.bc +divide_08000.bc +divide_08100.bc +divide_08200.bc +divide_08300.bc +divide_08400.bc +divide_08500.bc +divide_08600.bc +divide_08700.bc +divide_08800.bc +divide_08900.bc +divide_09000.bc +divide_09100.bc +divide_09200.bc +divide_09300.bc +divide_09400.bc +divide_09500.bc +divide_09600.bc +divide_09700.bc +divide_09800.bc +divide_09900.bc +divide_10000.bc +subtract_00100.bc +subtract_00200.bc +subtract_00300.bc +subtract_00400.bc +subtract_00500.bc +subtract_00600.bc +subtract_00700.bc +subtract_00800.bc +subtract_00900.bc +subtract_01000.bc +subtract_01100.bc +subtract_01200.bc +subtract_01300.bc +subtract_01400.bc +subtract_01500.bc +subtract_01600.bc +subtract_01700.bc +subtract_01800.bc +subtract_01900.bc +subtract_02000.bc +subtract_02100.bc +subtract_02200.bc +subtract_02300.bc +subtract_02400.bc +subtract_02500.bc +subtract_02600.bc +subtract_02700.bc +subtract_02800.bc +subtract_02900.bc +subtract_03000.bc +subtract_03100.bc +subtract_03200.bc +subtract_03300.bc +subtract_03400.bc +subtract_03500.bc +subtract_03600.bc +subtract_03700.bc +subtract_03800.bc +subtract_03900.bc +subtract_04000.bc +subtract_04100.bc +subtract_04200.bc +subtract_04300.bc +subtract_04400.bc +subtract_04500.bc +subtract_04600.bc +subtract_04700.bc +subtract_04800.bc +subtract_04900.bc +subtract_05000.bc +subtract_05100.bc +subtract_05200.bc +subtract_05300.bc +subtract_05400.bc +subtract_05500.bc +subtract_05600.bc +subtract_05700.bc +subtract_05800.bc +subtract_05900.bc +subtract_06000.bc +subtract_06100.bc +subtract_06200.bc +subtract_06300.bc +subtract_06400.bc +subtract_06500.bc +subtract_06600.bc +subtract_06700.bc +subtract_06800.bc +subtract_06900.bc +subtract_07000.bc +subtract_07100.bc +subtract_07200.bc +subtract_07300.bc +subtract_07400.bc +subtract_07500.bc +subtract_07600.bc +subtract_07700.bc +subtract_07800.bc +subtract_07900.bc +subtract_08000.bc +subtract_08100.bc +subtract_08200.bc +subtract_08300.bc +subtract_08400.bc +subtract_08500.bc +subtract_08600.bc +subtract_08700.bc +subtract_08800.bc +subtract_08900.bc +subtract_09000.bc +subtract_09100.bc +subtract_09200.bc +subtract_09300.bc +subtract_09400.bc +subtract_09500.bc +subtract_09600.bc +subtract_09700.bc +subtract_09800.bc +subtract_09900.bc +subtract_10000.bc +add_00100.bc +add_00200.bc +add_00300.bc +add_00400.bc +add_00500.bc +add_00600.bc +add_00700.bc +add_00800.bc +add_00900.bc +add_01000.bc +add_01100.bc +add_01200.bc +add_01300.bc +add_01400.bc +add_01500.bc +add_01600.bc +add_01700.bc +add_01800.bc +add_01900.bc +add_02000.bc +add_02100.bc +add_02200.bc +add_02300.bc +add_02400.bc +add_02500.bc +add_02600.bc +add_02700.bc +add_02800.bc +add_02900.bc +add_03000.bc +add_03100.bc +add_03200.bc +add_03300.bc +add_03400.bc +add_03500.bc +add_03600.bc +add_03700.bc +add_03800.bc +add_03900.bc +add_04000.bc +add_04100.bc +add_04200.bc +add_04300.bc +add_04400.bc +add_04500.bc +add_04600.bc +add_04700.bc +add_04800.bc +add_04900.bc +add_05000.bc +add_05100.bc +add_05200.bc +add_05300.bc +add_05400.bc +add_05500.bc +add_05600.bc +add_05700.bc +add_05800.bc +add_05900.bc +add_06000.bc +add_06100.bc +add_06200.bc +add_06300.bc +add_06400.bc +add_06500.bc +add_06600.bc +add_06700.bc +add_06800.bc +add_06900.bc +add_07000.bc +add_07100.bc +add_07200.bc +add_07300.bc +add_07400.bc +add_07500.bc +add_07600.bc +add_07700.bc +add_07800.bc +add_07900.bc +add_08000.bc +add_08100.bc +add_08200.bc +add_08300.bc +add_08400.bc +add_08500.bc +add_08600.bc +add_08700.bc +add_08800.bc +add_08900.bc +add_09000.bc +add_09100.bc +add_09200.bc +add_09300.bc +add_09400.bc +add_09500.bc +add_09600.bc +add_09700.bc +add_09800.bc +add_09900.bc +add_10000.bc print2.bc -parse.bc root.bc array.bc array2.bc diff --git a/tests/bc/scripts/divide.bc b/tests/bc/scripts/divide_00100.bc similarity index 90% rename from tests/bc/scripts/divide.bc rename to tests/bc/scripts/divide_00100.bc index 51a4c0082d6..d2685faf9cd 100644 --- a/tests/bc/scripts/divide.bc +++ b/tests/bc/scripts/divide_00100.bc @@ -12,7 +12,7 @@ for (i = 0; i <= len; ++i) { a[i] } -for (i = 1; i <= 10000; ++i) { +for (i = 1; i <= 100; ++i) { for (j = 0; j < len; ++j) { a[0] / a[j] a[i] / a[j] diff --git a/tests/bc/scripts/divide_00200.bc b/tests/bc/scripts/divide_00200.bc new file mode 100644 index 00000000000..027642c504d --- /dev/null +++ b/tests/bc/scripts/divide_00200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 101; i <= 200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_00300.bc b/tests/bc/scripts/divide_00300.bc new file mode 100644 index 00000000000..53a3fb2e3d3 --- /dev/null +++ b/tests/bc/scripts/divide_00300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 201; i <= 300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_00400.bc b/tests/bc/scripts/divide_00400.bc new file mode 100644 index 00000000000..15f8ba961e6 --- /dev/null +++ b/tests/bc/scripts/divide_00400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 301; i <= 400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_00500.bc b/tests/bc/scripts/divide_00500.bc new file mode 100644 index 00000000000..732bd2867a2 --- /dev/null +++ b/tests/bc/scripts/divide_00500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 401; i <= 500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_00600.bc b/tests/bc/scripts/divide_00600.bc new file mode 100644 index 00000000000..4ac87e33319 --- /dev/null +++ b/tests/bc/scripts/divide_00600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 501; i <= 600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_00700.bc b/tests/bc/scripts/divide_00700.bc new file mode 100644 index 00000000000..0b272167f0f --- /dev/null +++ b/tests/bc/scripts/divide_00700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 601; i <= 700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_00800.bc b/tests/bc/scripts/divide_00800.bc new file mode 100644 index 00000000000..0e08bb7016e --- /dev/null +++ b/tests/bc/scripts/divide_00800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 701; i <= 800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_00900.bc b/tests/bc/scripts/divide_00900.bc new file mode 100644 index 00000000000..cef55f47466 --- /dev/null +++ b/tests/bc/scripts/divide_00900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 801; i <= 900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01000.bc b/tests/bc/scripts/divide_01000.bc new file mode 100644 index 00000000000..5291d71fc31 --- /dev/null +++ b/tests/bc/scripts/divide_01000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 901; i <= 1000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01100.bc b/tests/bc/scripts/divide_01100.bc new file mode 100644 index 00000000000..ff9a49a6bd9 --- /dev/null +++ b/tests/bc/scripts/divide_01100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1001; i <= 1100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01200.bc b/tests/bc/scripts/divide_01200.bc new file mode 100644 index 00000000000..9dd0fadf3a4 --- /dev/null +++ b/tests/bc/scripts/divide_01200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1101; i <= 1200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01300.bc b/tests/bc/scripts/divide_01300.bc new file mode 100644 index 00000000000..5ac02c35a08 --- /dev/null +++ b/tests/bc/scripts/divide_01300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1201; i <= 1300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01400.bc b/tests/bc/scripts/divide_01400.bc new file mode 100644 index 00000000000..9189a546b01 --- /dev/null +++ b/tests/bc/scripts/divide_01400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1301; i <= 1400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01500.bc b/tests/bc/scripts/divide_01500.bc new file mode 100644 index 00000000000..7feed3c7389 --- /dev/null +++ b/tests/bc/scripts/divide_01500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1401; i <= 1500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01600.bc b/tests/bc/scripts/divide_01600.bc new file mode 100644 index 00000000000..4847d9dbe62 --- /dev/null +++ b/tests/bc/scripts/divide_01600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1501; i <= 1600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01700.bc b/tests/bc/scripts/divide_01700.bc new file mode 100644 index 00000000000..81db9b7b4bb --- /dev/null +++ b/tests/bc/scripts/divide_01700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1601; i <= 1700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01800.bc b/tests/bc/scripts/divide_01800.bc new file mode 100644 index 00000000000..25b7476e7d6 --- /dev/null +++ b/tests/bc/scripts/divide_01800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1701; i <= 1800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_01900.bc b/tests/bc/scripts/divide_01900.bc new file mode 100644 index 00000000000..80a8292c0b5 --- /dev/null +++ b/tests/bc/scripts/divide_01900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1801; i <= 1900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02000.bc b/tests/bc/scripts/divide_02000.bc new file mode 100644 index 00000000000..268f1636f65 --- /dev/null +++ b/tests/bc/scripts/divide_02000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1901; i <= 2000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02100.bc b/tests/bc/scripts/divide_02100.bc new file mode 100644 index 00000000000..cd5f5754685 --- /dev/null +++ b/tests/bc/scripts/divide_02100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2001; i <= 2100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02200.bc b/tests/bc/scripts/divide_02200.bc new file mode 100644 index 00000000000..40eb46b58dc --- /dev/null +++ b/tests/bc/scripts/divide_02200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2101; i <= 2200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02300.bc b/tests/bc/scripts/divide_02300.bc new file mode 100644 index 00000000000..50da630cdeb --- /dev/null +++ b/tests/bc/scripts/divide_02300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2201; i <= 2300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02400.bc b/tests/bc/scripts/divide_02400.bc new file mode 100644 index 00000000000..744e082c95b --- /dev/null +++ b/tests/bc/scripts/divide_02400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2301; i <= 2400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02500.bc b/tests/bc/scripts/divide_02500.bc new file mode 100644 index 00000000000..294f2677971 --- /dev/null +++ b/tests/bc/scripts/divide_02500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2401; i <= 2500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02600.bc b/tests/bc/scripts/divide_02600.bc new file mode 100644 index 00000000000..0adb8203d56 --- /dev/null +++ b/tests/bc/scripts/divide_02600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2501; i <= 2600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02700.bc b/tests/bc/scripts/divide_02700.bc new file mode 100644 index 00000000000..7107d6674bc --- /dev/null +++ b/tests/bc/scripts/divide_02700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2601; i <= 2700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02800.bc b/tests/bc/scripts/divide_02800.bc new file mode 100644 index 00000000000..0a818c9461c --- /dev/null +++ b/tests/bc/scripts/divide_02800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2701; i <= 2800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_02900.bc b/tests/bc/scripts/divide_02900.bc new file mode 100644 index 00000000000..8113032c261 --- /dev/null +++ b/tests/bc/scripts/divide_02900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2801; i <= 2900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03000.bc b/tests/bc/scripts/divide_03000.bc new file mode 100644 index 00000000000..772d2e8cd2c --- /dev/null +++ b/tests/bc/scripts/divide_03000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2901; i <= 3000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03100.bc b/tests/bc/scripts/divide_03100.bc new file mode 100644 index 00000000000..916759661db --- /dev/null +++ b/tests/bc/scripts/divide_03100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3001; i <= 3100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03200.bc b/tests/bc/scripts/divide_03200.bc new file mode 100644 index 00000000000..52542b9b6dd --- /dev/null +++ b/tests/bc/scripts/divide_03200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3101; i <= 3200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03300.bc b/tests/bc/scripts/divide_03300.bc new file mode 100644 index 00000000000..d2315cf2ad4 --- /dev/null +++ b/tests/bc/scripts/divide_03300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3201; i <= 3300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03400.bc b/tests/bc/scripts/divide_03400.bc new file mode 100644 index 00000000000..03cf3e5c7d6 --- /dev/null +++ b/tests/bc/scripts/divide_03400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3301; i <= 3400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03500.bc b/tests/bc/scripts/divide_03500.bc new file mode 100644 index 00000000000..8fac5cc5bb8 --- /dev/null +++ b/tests/bc/scripts/divide_03500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3401; i <= 3500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03600.bc b/tests/bc/scripts/divide_03600.bc new file mode 100644 index 00000000000..a8a3af330a2 --- /dev/null +++ b/tests/bc/scripts/divide_03600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3501; i <= 3600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03700.bc b/tests/bc/scripts/divide_03700.bc new file mode 100644 index 00000000000..9f38b3e6135 --- /dev/null +++ b/tests/bc/scripts/divide_03700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3601; i <= 3700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03800.bc b/tests/bc/scripts/divide_03800.bc new file mode 100644 index 00000000000..db59cdd0860 --- /dev/null +++ b/tests/bc/scripts/divide_03800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3701; i <= 3800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_03900.bc b/tests/bc/scripts/divide_03900.bc new file mode 100644 index 00000000000..d7de3afba71 --- /dev/null +++ b/tests/bc/scripts/divide_03900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3801; i <= 3900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04000.bc b/tests/bc/scripts/divide_04000.bc new file mode 100644 index 00000000000..86755a73ef5 --- /dev/null +++ b/tests/bc/scripts/divide_04000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3901; i <= 4000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04100.bc b/tests/bc/scripts/divide_04100.bc new file mode 100644 index 00000000000..03156cd3a74 --- /dev/null +++ b/tests/bc/scripts/divide_04100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4001; i <= 4100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04200.bc b/tests/bc/scripts/divide_04200.bc new file mode 100644 index 00000000000..2df36aa7329 --- /dev/null +++ b/tests/bc/scripts/divide_04200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4101; i <= 4200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04300.bc b/tests/bc/scripts/divide_04300.bc new file mode 100644 index 00000000000..527cbb191fa --- /dev/null +++ b/tests/bc/scripts/divide_04300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4201; i <= 4300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04400.bc b/tests/bc/scripts/divide_04400.bc new file mode 100644 index 00000000000..358cf70a6a8 --- /dev/null +++ b/tests/bc/scripts/divide_04400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4301; i <= 4400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04500.bc b/tests/bc/scripts/divide_04500.bc new file mode 100644 index 00000000000..d298c5ba180 --- /dev/null +++ b/tests/bc/scripts/divide_04500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4401; i <= 4500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04600.bc b/tests/bc/scripts/divide_04600.bc new file mode 100644 index 00000000000..b58a50a8c5a --- /dev/null +++ b/tests/bc/scripts/divide_04600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4501; i <= 4600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04700.bc b/tests/bc/scripts/divide_04700.bc new file mode 100644 index 00000000000..05a561bd145 --- /dev/null +++ b/tests/bc/scripts/divide_04700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4601; i <= 4700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04800.bc b/tests/bc/scripts/divide_04800.bc new file mode 100644 index 00000000000..5ed04489a07 --- /dev/null +++ b/tests/bc/scripts/divide_04800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4701; i <= 4800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_04900.bc b/tests/bc/scripts/divide_04900.bc new file mode 100644 index 00000000000..ff3b4681283 --- /dev/null +++ b/tests/bc/scripts/divide_04900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4801; i <= 4900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05000.bc b/tests/bc/scripts/divide_05000.bc new file mode 100644 index 00000000000..a32273f5ac3 --- /dev/null +++ b/tests/bc/scripts/divide_05000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4901; i <= 5000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05100.bc b/tests/bc/scripts/divide_05100.bc new file mode 100644 index 00000000000..9b5aa7fcf72 --- /dev/null +++ b/tests/bc/scripts/divide_05100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5001; i <= 5100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05200.bc b/tests/bc/scripts/divide_05200.bc new file mode 100644 index 00000000000..178dcac6ec5 --- /dev/null +++ b/tests/bc/scripts/divide_05200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5101; i <= 5200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05300.bc b/tests/bc/scripts/divide_05300.bc new file mode 100644 index 00000000000..49768eca051 --- /dev/null +++ b/tests/bc/scripts/divide_05300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5201; i <= 5300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05400.bc b/tests/bc/scripts/divide_05400.bc new file mode 100644 index 00000000000..c0078a2fac9 --- /dev/null +++ b/tests/bc/scripts/divide_05400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5301; i <= 5400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05500.bc b/tests/bc/scripts/divide_05500.bc new file mode 100644 index 00000000000..9d289e0f6a2 --- /dev/null +++ b/tests/bc/scripts/divide_05500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5401; i <= 5500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05600.bc b/tests/bc/scripts/divide_05600.bc new file mode 100644 index 00000000000..66193069e42 --- /dev/null +++ b/tests/bc/scripts/divide_05600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5501; i <= 5600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05700.bc b/tests/bc/scripts/divide_05700.bc new file mode 100644 index 00000000000..483622bfc21 --- /dev/null +++ b/tests/bc/scripts/divide_05700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5601; i <= 5700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05800.bc b/tests/bc/scripts/divide_05800.bc new file mode 100644 index 00000000000..c8bc59d63aa --- /dev/null +++ b/tests/bc/scripts/divide_05800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5701; i <= 5800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_05900.bc b/tests/bc/scripts/divide_05900.bc new file mode 100644 index 00000000000..13e5a0f2209 --- /dev/null +++ b/tests/bc/scripts/divide_05900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5801; i <= 5900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06000.bc b/tests/bc/scripts/divide_06000.bc new file mode 100644 index 00000000000..318fc5b25f5 --- /dev/null +++ b/tests/bc/scripts/divide_06000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5901; i <= 6000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06100.bc b/tests/bc/scripts/divide_06100.bc new file mode 100644 index 00000000000..57bf61d4730 --- /dev/null +++ b/tests/bc/scripts/divide_06100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6001; i <= 6100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06200.bc b/tests/bc/scripts/divide_06200.bc new file mode 100644 index 00000000000..ab1ac853431 --- /dev/null +++ b/tests/bc/scripts/divide_06200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6101; i <= 6200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06300.bc b/tests/bc/scripts/divide_06300.bc new file mode 100644 index 00000000000..e2a320b0abd --- /dev/null +++ b/tests/bc/scripts/divide_06300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6201; i <= 6300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06400.bc b/tests/bc/scripts/divide_06400.bc new file mode 100644 index 00000000000..f3e0557b7e8 --- /dev/null +++ b/tests/bc/scripts/divide_06400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6301; i <= 6400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06500.bc b/tests/bc/scripts/divide_06500.bc new file mode 100644 index 00000000000..62c84d07f3c --- /dev/null +++ b/tests/bc/scripts/divide_06500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6401; i <= 6500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06600.bc b/tests/bc/scripts/divide_06600.bc new file mode 100644 index 00000000000..04e1d9dcdf0 --- /dev/null +++ b/tests/bc/scripts/divide_06600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6501; i <= 6600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06700.bc b/tests/bc/scripts/divide_06700.bc new file mode 100644 index 00000000000..af23039798d --- /dev/null +++ b/tests/bc/scripts/divide_06700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6601; i <= 6700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06800.bc b/tests/bc/scripts/divide_06800.bc new file mode 100644 index 00000000000..6da3f2da386 --- /dev/null +++ b/tests/bc/scripts/divide_06800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6701; i <= 6800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_06900.bc b/tests/bc/scripts/divide_06900.bc new file mode 100644 index 00000000000..769d57fb165 --- /dev/null +++ b/tests/bc/scripts/divide_06900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6801; i <= 6900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07000.bc b/tests/bc/scripts/divide_07000.bc new file mode 100644 index 00000000000..758b61fb99e --- /dev/null +++ b/tests/bc/scripts/divide_07000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6901; i <= 7000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07100.bc b/tests/bc/scripts/divide_07100.bc new file mode 100644 index 00000000000..2ef9f19390b --- /dev/null +++ b/tests/bc/scripts/divide_07100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7001; i <= 7100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07200.bc b/tests/bc/scripts/divide_07200.bc new file mode 100644 index 00000000000..dcab8948d54 --- /dev/null +++ b/tests/bc/scripts/divide_07200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7101; i <= 7200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07300.bc b/tests/bc/scripts/divide_07300.bc new file mode 100644 index 00000000000..f8aeae59b33 --- /dev/null +++ b/tests/bc/scripts/divide_07300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7201; i <= 7300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07400.bc b/tests/bc/scripts/divide_07400.bc new file mode 100644 index 00000000000..7a26ce5583f --- /dev/null +++ b/tests/bc/scripts/divide_07400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7301; i <= 7400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07500.bc b/tests/bc/scripts/divide_07500.bc new file mode 100644 index 00000000000..0c197595ae9 --- /dev/null +++ b/tests/bc/scripts/divide_07500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7401; i <= 7500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07600.bc b/tests/bc/scripts/divide_07600.bc new file mode 100644 index 00000000000..868d0702f3d --- /dev/null +++ b/tests/bc/scripts/divide_07600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7501; i <= 7600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07700.bc b/tests/bc/scripts/divide_07700.bc new file mode 100644 index 00000000000..b30f66ebb5b --- /dev/null +++ b/tests/bc/scripts/divide_07700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7601; i <= 7700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07800.bc b/tests/bc/scripts/divide_07800.bc new file mode 100644 index 00000000000..118df8fe112 --- /dev/null +++ b/tests/bc/scripts/divide_07800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7701; i <= 7800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_07900.bc b/tests/bc/scripts/divide_07900.bc new file mode 100644 index 00000000000..42fd0771dca --- /dev/null +++ b/tests/bc/scripts/divide_07900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7801; i <= 7900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08000.bc b/tests/bc/scripts/divide_08000.bc new file mode 100644 index 00000000000..3bdaa26e707 --- /dev/null +++ b/tests/bc/scripts/divide_08000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7901; i <= 8000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08100.bc b/tests/bc/scripts/divide_08100.bc new file mode 100644 index 00000000000..f0e4592382b --- /dev/null +++ b/tests/bc/scripts/divide_08100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8001; i <= 8100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08200.bc b/tests/bc/scripts/divide_08200.bc new file mode 100644 index 00000000000..ef1bb329cff --- /dev/null +++ b/tests/bc/scripts/divide_08200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8101; i <= 8200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08300.bc b/tests/bc/scripts/divide_08300.bc new file mode 100644 index 00000000000..f3fe8a69eed --- /dev/null +++ b/tests/bc/scripts/divide_08300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8201; i <= 8300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08400.bc b/tests/bc/scripts/divide_08400.bc new file mode 100644 index 00000000000..5c9ec5c8fba --- /dev/null +++ b/tests/bc/scripts/divide_08400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8301; i <= 8400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08500.bc b/tests/bc/scripts/divide_08500.bc new file mode 100644 index 00000000000..64059da9428 --- /dev/null +++ b/tests/bc/scripts/divide_08500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8401; i <= 8500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08600.bc b/tests/bc/scripts/divide_08600.bc new file mode 100644 index 00000000000..72fe4114998 --- /dev/null +++ b/tests/bc/scripts/divide_08600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8501; i <= 8600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08700.bc b/tests/bc/scripts/divide_08700.bc new file mode 100644 index 00000000000..c1927841a49 --- /dev/null +++ b/tests/bc/scripts/divide_08700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8601; i <= 8700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08800.bc b/tests/bc/scripts/divide_08800.bc new file mode 100644 index 00000000000..4ae7fcab3dc --- /dev/null +++ b/tests/bc/scripts/divide_08800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8701; i <= 8800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_08900.bc b/tests/bc/scripts/divide_08900.bc new file mode 100644 index 00000000000..7e59baa4a15 --- /dev/null +++ b/tests/bc/scripts/divide_08900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8801; i <= 8900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09000.bc b/tests/bc/scripts/divide_09000.bc new file mode 100644 index 00000000000..26d3f62ac6a --- /dev/null +++ b/tests/bc/scripts/divide_09000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8901; i <= 9000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09100.bc b/tests/bc/scripts/divide_09100.bc new file mode 100644 index 00000000000..e8a372db80e --- /dev/null +++ b/tests/bc/scripts/divide_09100.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9001; i <= 9100; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09200.bc b/tests/bc/scripts/divide_09200.bc new file mode 100644 index 00000000000..00d391459a4 --- /dev/null +++ b/tests/bc/scripts/divide_09200.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9101; i <= 9200; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09300.bc b/tests/bc/scripts/divide_09300.bc new file mode 100644 index 00000000000..4a64b934719 --- /dev/null +++ b/tests/bc/scripts/divide_09300.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9201; i <= 9300; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09400.bc b/tests/bc/scripts/divide_09400.bc new file mode 100644 index 00000000000..55a70f7cbf4 --- /dev/null +++ b/tests/bc/scripts/divide_09400.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9301; i <= 9400; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09500.bc b/tests/bc/scripts/divide_09500.bc new file mode 100644 index 00000000000..09df2d54045 --- /dev/null +++ b/tests/bc/scripts/divide_09500.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9401; i <= 9500; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09600.bc b/tests/bc/scripts/divide_09600.bc new file mode 100644 index 00000000000..491e3c2caa3 --- /dev/null +++ b/tests/bc/scripts/divide_09600.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9501; i <= 9600; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09700.bc b/tests/bc/scripts/divide_09700.bc new file mode 100644 index 00000000000..33a183e2493 --- /dev/null +++ b/tests/bc/scripts/divide_09700.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9601; i <= 9700; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09800.bc b/tests/bc/scripts/divide_09800.bc new file mode 100644 index 00000000000..ae007e8a7a0 --- /dev/null +++ b/tests/bc/scripts/divide_09800.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9701; i <= 9800; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_09900.bc b/tests/bc/scripts/divide_09900.bc new file mode 100644 index 00000000000..e8fdc75987b --- /dev/null +++ b/tests/bc/scripts/divide_09900.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9801; i <= 9900; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/divide_10000.bc b/tests/bc/scripts/divide_10000.bc new file mode 100644 index 00000000000..f4490d7d220 --- /dev/null +++ b/tests/bc/scripts/divide_10000.bc @@ -0,0 +1,23 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 * 10^(-scale) +len = 1 + 2 * scale + +x +scale += 10 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9901; i <= 10000; ++i) { + for (j = 0; j < len; ++j) { + a[0] / a[j] + a[i] / a[j] + (a[0] * i) / a[j] + a[0] / (a[j] * i) + (a[0] * i) / (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply.bc b/tests/bc/scripts/multiply_00100.bc similarity index 89% rename from tests/bc/scripts/multiply.bc rename to tests/bc/scripts/multiply_00100.bc index 3aa64cc5e03..bc979d176c2 100644 --- a/tests/bc/scripts/multiply.bc +++ b/tests/bc/scripts/multiply_00100.bc @@ -9,7 +9,7 @@ for (i = 0; i <= len; ++i) { a[i] } -for (i = 1; i <= 10000; ++i) { +for (i = 1; i <= 100; ++i) { for (j = 0; j < len; ++j) { a[0] * a[j] a[i] * a[j] diff --git a/tests/bc/scripts/multiply_00200.bc b/tests/bc/scripts/multiply_00200.bc new file mode 100644 index 00000000000..08c36d5dd4b --- /dev/null +++ b/tests/bc/scripts/multiply_00200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 101; i <= 200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_00300.bc b/tests/bc/scripts/multiply_00300.bc new file mode 100644 index 00000000000..3c56a569d2e --- /dev/null +++ b/tests/bc/scripts/multiply_00300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 201; i <= 300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_00400.bc b/tests/bc/scripts/multiply_00400.bc new file mode 100644 index 00000000000..3dc750947ae --- /dev/null +++ b/tests/bc/scripts/multiply_00400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 301; i <= 400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_00500.bc b/tests/bc/scripts/multiply_00500.bc new file mode 100644 index 00000000000..a1f14e121cb --- /dev/null +++ b/tests/bc/scripts/multiply_00500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 401; i <= 500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_00600.bc b/tests/bc/scripts/multiply_00600.bc new file mode 100644 index 00000000000..21a017a7f7c --- /dev/null +++ b/tests/bc/scripts/multiply_00600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 501; i <= 600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_00700.bc b/tests/bc/scripts/multiply_00700.bc new file mode 100644 index 00000000000..3246b5e1a56 --- /dev/null +++ b/tests/bc/scripts/multiply_00700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 601; i <= 700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_00800.bc b/tests/bc/scripts/multiply_00800.bc new file mode 100644 index 00000000000..4bc39b0a1fe --- /dev/null +++ b/tests/bc/scripts/multiply_00800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 701; i <= 800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_00900.bc b/tests/bc/scripts/multiply_00900.bc new file mode 100644 index 00000000000..febc77dead1 --- /dev/null +++ b/tests/bc/scripts/multiply_00900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 801; i <= 900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01000.bc b/tests/bc/scripts/multiply_01000.bc new file mode 100644 index 00000000000..ba5c1d984f6 --- /dev/null +++ b/tests/bc/scripts/multiply_01000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 901; i <= 1000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01100.bc b/tests/bc/scripts/multiply_01100.bc new file mode 100644 index 00000000000..a09c3525228 --- /dev/null +++ b/tests/bc/scripts/multiply_01100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1001; i <= 1100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01200.bc b/tests/bc/scripts/multiply_01200.bc new file mode 100644 index 00000000000..7a6b04c48b9 --- /dev/null +++ b/tests/bc/scripts/multiply_01200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1101; i <= 1200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01300.bc b/tests/bc/scripts/multiply_01300.bc new file mode 100644 index 00000000000..4fab6beb0a6 --- /dev/null +++ b/tests/bc/scripts/multiply_01300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1201; i <= 1300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01400.bc b/tests/bc/scripts/multiply_01400.bc new file mode 100644 index 00000000000..954afe5473d --- /dev/null +++ b/tests/bc/scripts/multiply_01400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1301; i <= 1400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01500.bc b/tests/bc/scripts/multiply_01500.bc new file mode 100644 index 00000000000..8d150418618 --- /dev/null +++ b/tests/bc/scripts/multiply_01500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1401; i <= 1500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01600.bc b/tests/bc/scripts/multiply_01600.bc new file mode 100644 index 00000000000..45f170705f9 --- /dev/null +++ b/tests/bc/scripts/multiply_01600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1501; i <= 1600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01700.bc b/tests/bc/scripts/multiply_01700.bc new file mode 100644 index 00000000000..7eb34740139 --- /dev/null +++ b/tests/bc/scripts/multiply_01700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1601; i <= 1700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01800.bc b/tests/bc/scripts/multiply_01800.bc new file mode 100644 index 00000000000..719db5b358a --- /dev/null +++ b/tests/bc/scripts/multiply_01800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1701; i <= 1800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_01900.bc b/tests/bc/scripts/multiply_01900.bc new file mode 100644 index 00000000000..4a4a6c8b43c --- /dev/null +++ b/tests/bc/scripts/multiply_01900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1801; i <= 1900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02000.bc b/tests/bc/scripts/multiply_02000.bc new file mode 100644 index 00000000000..432e0d078de --- /dev/null +++ b/tests/bc/scripts/multiply_02000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1901; i <= 2000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02100.bc b/tests/bc/scripts/multiply_02100.bc new file mode 100644 index 00000000000..825b96a7c0d --- /dev/null +++ b/tests/bc/scripts/multiply_02100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2001; i <= 2100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02200.bc b/tests/bc/scripts/multiply_02200.bc new file mode 100644 index 00000000000..fd3d7168405 --- /dev/null +++ b/tests/bc/scripts/multiply_02200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2101; i <= 2200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02300.bc b/tests/bc/scripts/multiply_02300.bc new file mode 100644 index 00000000000..1e2adbe81fc --- /dev/null +++ b/tests/bc/scripts/multiply_02300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2201; i <= 2300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02400.bc b/tests/bc/scripts/multiply_02400.bc new file mode 100644 index 00000000000..6f648ae5eb9 --- /dev/null +++ b/tests/bc/scripts/multiply_02400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2301; i <= 2400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02500.bc b/tests/bc/scripts/multiply_02500.bc new file mode 100644 index 00000000000..6990fa78af6 --- /dev/null +++ b/tests/bc/scripts/multiply_02500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2401; i <= 2500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02600.bc b/tests/bc/scripts/multiply_02600.bc new file mode 100644 index 00000000000..22d0eca373c --- /dev/null +++ b/tests/bc/scripts/multiply_02600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2501; i <= 2600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02700.bc b/tests/bc/scripts/multiply_02700.bc new file mode 100644 index 00000000000..ea8d632288e --- /dev/null +++ b/tests/bc/scripts/multiply_02700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2601; i <= 2700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02800.bc b/tests/bc/scripts/multiply_02800.bc new file mode 100644 index 00000000000..5cd01d5012c --- /dev/null +++ b/tests/bc/scripts/multiply_02800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2701; i <= 2800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_02900.bc b/tests/bc/scripts/multiply_02900.bc new file mode 100644 index 00000000000..cdb1cb1e43c --- /dev/null +++ b/tests/bc/scripts/multiply_02900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2801; i <= 2900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03000.bc b/tests/bc/scripts/multiply_03000.bc new file mode 100644 index 00000000000..1afcd634ade --- /dev/null +++ b/tests/bc/scripts/multiply_03000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2901; i <= 3000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03100.bc b/tests/bc/scripts/multiply_03100.bc new file mode 100644 index 00000000000..a39ef85bdfc --- /dev/null +++ b/tests/bc/scripts/multiply_03100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3001; i <= 3100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03200.bc b/tests/bc/scripts/multiply_03200.bc new file mode 100644 index 00000000000..33f465a82bf --- /dev/null +++ b/tests/bc/scripts/multiply_03200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3101; i <= 3200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03300.bc b/tests/bc/scripts/multiply_03300.bc new file mode 100644 index 00000000000..2cc412b5837 --- /dev/null +++ b/tests/bc/scripts/multiply_03300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3201; i <= 3300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03400.bc b/tests/bc/scripts/multiply_03400.bc new file mode 100644 index 00000000000..40f528023e1 --- /dev/null +++ b/tests/bc/scripts/multiply_03400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3301; i <= 3400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03500.bc b/tests/bc/scripts/multiply_03500.bc new file mode 100644 index 00000000000..dce2f326a54 --- /dev/null +++ b/tests/bc/scripts/multiply_03500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3401; i <= 3500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03600.bc b/tests/bc/scripts/multiply_03600.bc new file mode 100644 index 00000000000..1223415dc67 --- /dev/null +++ b/tests/bc/scripts/multiply_03600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3501; i <= 3600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03700.bc b/tests/bc/scripts/multiply_03700.bc new file mode 100644 index 00000000000..80397b3d0cf --- /dev/null +++ b/tests/bc/scripts/multiply_03700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3601; i <= 3700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03800.bc b/tests/bc/scripts/multiply_03800.bc new file mode 100644 index 00000000000..0431d8b1c9d --- /dev/null +++ b/tests/bc/scripts/multiply_03800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3701; i <= 3800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_03900.bc b/tests/bc/scripts/multiply_03900.bc new file mode 100644 index 00000000000..0f60df9aae7 --- /dev/null +++ b/tests/bc/scripts/multiply_03900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3801; i <= 3900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04000.bc b/tests/bc/scripts/multiply_04000.bc new file mode 100644 index 00000000000..ceeafea6975 --- /dev/null +++ b/tests/bc/scripts/multiply_04000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3901; i <= 4000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04100.bc b/tests/bc/scripts/multiply_04100.bc new file mode 100644 index 00000000000..980fa7cb1c7 --- /dev/null +++ b/tests/bc/scripts/multiply_04100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4001; i <= 4100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04200.bc b/tests/bc/scripts/multiply_04200.bc new file mode 100644 index 00000000000..1b16065ce43 --- /dev/null +++ b/tests/bc/scripts/multiply_04200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4101; i <= 4200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04300.bc b/tests/bc/scripts/multiply_04300.bc new file mode 100644 index 00000000000..ae2549f392b --- /dev/null +++ b/tests/bc/scripts/multiply_04300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4201; i <= 4300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04400.bc b/tests/bc/scripts/multiply_04400.bc new file mode 100644 index 00000000000..0b22a8b36cc --- /dev/null +++ b/tests/bc/scripts/multiply_04400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4301; i <= 4400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04500.bc b/tests/bc/scripts/multiply_04500.bc new file mode 100644 index 00000000000..374b595501f --- /dev/null +++ b/tests/bc/scripts/multiply_04500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4401; i <= 4500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04600.bc b/tests/bc/scripts/multiply_04600.bc new file mode 100644 index 00000000000..f4e0150e100 --- /dev/null +++ b/tests/bc/scripts/multiply_04600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4501; i <= 4600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04700.bc b/tests/bc/scripts/multiply_04700.bc new file mode 100644 index 00000000000..351cf2ae3bd --- /dev/null +++ b/tests/bc/scripts/multiply_04700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4601; i <= 4700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04800.bc b/tests/bc/scripts/multiply_04800.bc new file mode 100644 index 00000000000..75bab62c746 --- /dev/null +++ b/tests/bc/scripts/multiply_04800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4701; i <= 4800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_04900.bc b/tests/bc/scripts/multiply_04900.bc new file mode 100644 index 00000000000..bb127c4e685 --- /dev/null +++ b/tests/bc/scripts/multiply_04900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4801; i <= 4900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05000.bc b/tests/bc/scripts/multiply_05000.bc new file mode 100644 index 00000000000..2b817f2e4f3 --- /dev/null +++ b/tests/bc/scripts/multiply_05000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4901; i <= 5000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05100.bc b/tests/bc/scripts/multiply_05100.bc new file mode 100644 index 00000000000..a5067e8d60e --- /dev/null +++ b/tests/bc/scripts/multiply_05100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5001; i <= 5100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05200.bc b/tests/bc/scripts/multiply_05200.bc new file mode 100644 index 00000000000..4cecc221252 --- /dev/null +++ b/tests/bc/scripts/multiply_05200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5101; i <= 5200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05300.bc b/tests/bc/scripts/multiply_05300.bc new file mode 100644 index 00000000000..03c475b3de2 --- /dev/null +++ b/tests/bc/scripts/multiply_05300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5201; i <= 5300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05400.bc b/tests/bc/scripts/multiply_05400.bc new file mode 100644 index 00000000000..5bfeb9c4f04 --- /dev/null +++ b/tests/bc/scripts/multiply_05400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5301; i <= 5400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05500.bc b/tests/bc/scripts/multiply_05500.bc new file mode 100644 index 00000000000..1e12f9233a3 --- /dev/null +++ b/tests/bc/scripts/multiply_05500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5401; i <= 5500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05600.bc b/tests/bc/scripts/multiply_05600.bc new file mode 100644 index 00000000000..25a60e2d25a --- /dev/null +++ b/tests/bc/scripts/multiply_05600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5501; i <= 5600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05700.bc b/tests/bc/scripts/multiply_05700.bc new file mode 100644 index 00000000000..c824af19bac --- /dev/null +++ b/tests/bc/scripts/multiply_05700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5601; i <= 5700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05800.bc b/tests/bc/scripts/multiply_05800.bc new file mode 100644 index 00000000000..a7eedc9fb73 --- /dev/null +++ b/tests/bc/scripts/multiply_05800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5701; i <= 5800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_05900.bc b/tests/bc/scripts/multiply_05900.bc new file mode 100644 index 00000000000..9bd0f704442 --- /dev/null +++ b/tests/bc/scripts/multiply_05900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5801; i <= 5900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06000.bc b/tests/bc/scripts/multiply_06000.bc new file mode 100644 index 00000000000..6353c74cbf7 --- /dev/null +++ b/tests/bc/scripts/multiply_06000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5901; i <= 6000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06100.bc b/tests/bc/scripts/multiply_06100.bc new file mode 100644 index 00000000000..d49224821a0 --- /dev/null +++ b/tests/bc/scripts/multiply_06100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6001; i <= 6100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06200.bc b/tests/bc/scripts/multiply_06200.bc new file mode 100644 index 00000000000..c4483f401a2 --- /dev/null +++ b/tests/bc/scripts/multiply_06200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6101; i <= 6200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06300.bc b/tests/bc/scripts/multiply_06300.bc new file mode 100644 index 00000000000..c86e62d3a87 --- /dev/null +++ b/tests/bc/scripts/multiply_06300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6201; i <= 6300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06400.bc b/tests/bc/scripts/multiply_06400.bc new file mode 100644 index 00000000000..0140f164f1a --- /dev/null +++ b/tests/bc/scripts/multiply_06400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6301; i <= 6400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06500.bc b/tests/bc/scripts/multiply_06500.bc new file mode 100644 index 00000000000..e9ee4fe5a89 --- /dev/null +++ b/tests/bc/scripts/multiply_06500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6401; i <= 6500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06600.bc b/tests/bc/scripts/multiply_06600.bc new file mode 100644 index 00000000000..267dcbf8aa6 --- /dev/null +++ b/tests/bc/scripts/multiply_06600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6501; i <= 6600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06700.bc b/tests/bc/scripts/multiply_06700.bc new file mode 100644 index 00000000000..851c771952e --- /dev/null +++ b/tests/bc/scripts/multiply_06700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6601; i <= 6700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06800.bc b/tests/bc/scripts/multiply_06800.bc new file mode 100644 index 00000000000..d2141d7c065 --- /dev/null +++ b/tests/bc/scripts/multiply_06800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6701; i <= 6800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_06900.bc b/tests/bc/scripts/multiply_06900.bc new file mode 100644 index 00000000000..5a9e9affde9 --- /dev/null +++ b/tests/bc/scripts/multiply_06900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6801; i <= 6900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07000.bc b/tests/bc/scripts/multiply_07000.bc new file mode 100644 index 00000000000..549a1df7221 --- /dev/null +++ b/tests/bc/scripts/multiply_07000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6901; i <= 7000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07100.bc b/tests/bc/scripts/multiply_07100.bc new file mode 100644 index 00000000000..0a664833487 --- /dev/null +++ b/tests/bc/scripts/multiply_07100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7001; i <= 7100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07200.bc b/tests/bc/scripts/multiply_07200.bc new file mode 100644 index 00000000000..913f053eab1 --- /dev/null +++ b/tests/bc/scripts/multiply_07200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7101; i <= 7200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07300.bc b/tests/bc/scripts/multiply_07300.bc new file mode 100644 index 00000000000..50643873d43 --- /dev/null +++ b/tests/bc/scripts/multiply_07300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7201; i <= 7300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07400.bc b/tests/bc/scripts/multiply_07400.bc new file mode 100644 index 00000000000..8c401f0da1d --- /dev/null +++ b/tests/bc/scripts/multiply_07400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7301; i <= 7400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07500.bc b/tests/bc/scripts/multiply_07500.bc new file mode 100644 index 00000000000..fedd47a45d4 --- /dev/null +++ b/tests/bc/scripts/multiply_07500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7401; i <= 7500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07600.bc b/tests/bc/scripts/multiply_07600.bc new file mode 100644 index 00000000000..b1b5727d031 --- /dev/null +++ b/tests/bc/scripts/multiply_07600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7501; i <= 7600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07700.bc b/tests/bc/scripts/multiply_07700.bc new file mode 100644 index 00000000000..40531a676a1 --- /dev/null +++ b/tests/bc/scripts/multiply_07700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7601; i <= 7700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07800.bc b/tests/bc/scripts/multiply_07800.bc new file mode 100644 index 00000000000..dd847d26911 --- /dev/null +++ b/tests/bc/scripts/multiply_07800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7701; i <= 7800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_07900.bc b/tests/bc/scripts/multiply_07900.bc new file mode 100644 index 00000000000..8313633df2f --- /dev/null +++ b/tests/bc/scripts/multiply_07900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7801; i <= 7900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08000.bc b/tests/bc/scripts/multiply_08000.bc new file mode 100644 index 00000000000..e496cf78b42 --- /dev/null +++ b/tests/bc/scripts/multiply_08000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7901; i <= 8000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08100.bc b/tests/bc/scripts/multiply_08100.bc new file mode 100644 index 00000000000..7f07ce4e352 --- /dev/null +++ b/tests/bc/scripts/multiply_08100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8001; i <= 8100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08200.bc b/tests/bc/scripts/multiply_08200.bc new file mode 100644 index 00000000000..0916404d35d --- /dev/null +++ b/tests/bc/scripts/multiply_08200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8101; i <= 8200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08300.bc b/tests/bc/scripts/multiply_08300.bc new file mode 100644 index 00000000000..9de6c499752 --- /dev/null +++ b/tests/bc/scripts/multiply_08300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8201; i <= 8300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08400.bc b/tests/bc/scripts/multiply_08400.bc new file mode 100644 index 00000000000..429bd41bd84 --- /dev/null +++ b/tests/bc/scripts/multiply_08400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8301; i <= 8400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08500.bc b/tests/bc/scripts/multiply_08500.bc new file mode 100644 index 00000000000..c84c3fb66c6 --- /dev/null +++ b/tests/bc/scripts/multiply_08500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8401; i <= 8500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08600.bc b/tests/bc/scripts/multiply_08600.bc new file mode 100644 index 00000000000..30492744af0 --- /dev/null +++ b/tests/bc/scripts/multiply_08600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8501; i <= 8600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08700.bc b/tests/bc/scripts/multiply_08700.bc new file mode 100644 index 00000000000..06cc0e094cf --- /dev/null +++ b/tests/bc/scripts/multiply_08700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8601; i <= 8700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08800.bc b/tests/bc/scripts/multiply_08800.bc new file mode 100644 index 00000000000..9ae52a604a0 --- /dev/null +++ b/tests/bc/scripts/multiply_08800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8701; i <= 8800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_08900.bc b/tests/bc/scripts/multiply_08900.bc new file mode 100644 index 00000000000..b1a1ccfa2dc --- /dev/null +++ b/tests/bc/scripts/multiply_08900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8801; i <= 8900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09000.bc b/tests/bc/scripts/multiply_09000.bc new file mode 100644 index 00000000000..487cb5a678b --- /dev/null +++ b/tests/bc/scripts/multiply_09000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8901; i <= 9000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09100.bc b/tests/bc/scripts/multiply_09100.bc new file mode 100644 index 00000000000..1c187475a5e --- /dev/null +++ b/tests/bc/scripts/multiply_09100.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9001; i <= 9100; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09200.bc b/tests/bc/scripts/multiply_09200.bc new file mode 100644 index 00000000000..2dbdb1bec1b --- /dev/null +++ b/tests/bc/scripts/multiply_09200.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9101; i <= 9200; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09300.bc b/tests/bc/scripts/multiply_09300.bc new file mode 100644 index 00000000000..ffc5b8cea90 --- /dev/null +++ b/tests/bc/scripts/multiply_09300.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9201; i <= 9300; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09400.bc b/tests/bc/scripts/multiply_09400.bc new file mode 100644 index 00000000000..6932c1dd73c --- /dev/null +++ b/tests/bc/scripts/multiply_09400.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9301; i <= 9400; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09500.bc b/tests/bc/scripts/multiply_09500.bc new file mode 100644 index 00000000000..2ac486b146a --- /dev/null +++ b/tests/bc/scripts/multiply_09500.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9401; i <= 9500; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09600.bc b/tests/bc/scripts/multiply_09600.bc new file mode 100644 index 00000000000..782176ba711 --- /dev/null +++ b/tests/bc/scripts/multiply_09600.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9501; i <= 9600; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09700.bc b/tests/bc/scripts/multiply_09700.bc new file mode 100644 index 00000000000..fe4135de594 --- /dev/null +++ b/tests/bc/scripts/multiply_09700.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9601; i <= 9700; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09800.bc b/tests/bc/scripts/multiply_09800.bc new file mode 100644 index 00000000000..3115b311f31 --- /dev/null +++ b/tests/bc/scripts/multiply_09800.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9701; i <= 9800; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_09900.bc b/tests/bc/scripts/multiply_09900.bc new file mode 100644 index 00000000000..abbcfeefbbe --- /dev/null +++ b/tests/bc/scripts/multiply_09900.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9801; i <= 9900; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/multiply_10000.bc b/tests/bc/scripts/multiply_10000.bc new file mode 100644 index 00000000000..e97e61623ea --- /dev/null +++ b/tests/bc/scripts/multiply_10000.bc @@ -0,0 +1,20 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9901; i <= 10000; ++i) { + for (j = 0; j < len; ++j) { + a[0] * a[j] + a[i] * a[j] + (a[0] * i) * a[j] + a[0] * (a[j] * i) + (a[0] * i) * (a[j] * i) + } +} diff --git a/tests/bc/scripts/parse.bc b/tests/bc/scripts/parse.bc deleted file mode 100644 index 179daf116ef..00000000000 --- a/tests/bc/scripts/parse.bc +++ /dev/null @@ -1,20 +0,0 @@ -#! /usr/bin/bc -q - -for (b = 2; b <= 16; ++b) { - if (b == 10) continue - obase = 10 - print "ibase = A; ibase = ", b, "\n" - print "\qibase = \q\n" - b - obase = b - for (i = 0; i <= 4096; ++i) { - i - print "0.", i, "\n" - print ".", i, "\n" - print "1.", i, "\n" - print i, ".", "\n" - print i, ".", i, "\n" - } -} - -halt diff --git a/tests/bc/scripts/parse_02.bc b/tests/bc/scripts/parse_02.bc new file mode 100644 index 00000000000..dc695e8a63e --- /dev/null +++ b/tests/bc/scripts/parse_02.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 2 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_03.bc b/tests/bc/scripts/parse_03.bc new file mode 100644 index 00000000000..8418c472184 --- /dev/null +++ b/tests/bc/scripts/parse_03.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 3 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_04.bc b/tests/bc/scripts/parse_04.bc new file mode 100644 index 00000000000..6671dc3093e --- /dev/null +++ b/tests/bc/scripts/parse_04.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 4 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_05.bc b/tests/bc/scripts/parse_05.bc new file mode 100644 index 00000000000..868c003a507 --- /dev/null +++ b/tests/bc/scripts/parse_05.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 5 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_06.bc b/tests/bc/scripts/parse_06.bc new file mode 100644 index 00000000000..ddef2fd5868 --- /dev/null +++ b/tests/bc/scripts/parse_06.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 6 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_07.bc b/tests/bc/scripts/parse_07.bc new file mode 100644 index 00000000000..83fb125d719 --- /dev/null +++ b/tests/bc/scripts/parse_07.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 7 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_08.bc b/tests/bc/scripts/parse_08.bc new file mode 100644 index 00000000000..c8f798e4e82 --- /dev/null +++ b/tests/bc/scripts/parse_08.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 8 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_09.bc b/tests/bc/scripts/parse_09.bc new file mode 100644 index 00000000000..98463b24edd --- /dev/null +++ b/tests/bc/scripts/parse_09.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 9 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_11.bc b/tests/bc/scripts/parse_11.bc new file mode 100644 index 00000000000..efaf17293ce --- /dev/null +++ b/tests/bc/scripts/parse_11.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 11 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_12.bc b/tests/bc/scripts/parse_12.bc new file mode 100644 index 00000000000..a71a05a3b9d --- /dev/null +++ b/tests/bc/scripts/parse_12.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 12 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_13.bc b/tests/bc/scripts/parse_13.bc new file mode 100644 index 00000000000..37d88e7168f --- /dev/null +++ b/tests/bc/scripts/parse_13.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 13 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_14.bc b/tests/bc/scripts/parse_14.bc new file mode 100644 index 00000000000..e824db97963 --- /dev/null +++ b/tests/bc/scripts/parse_14.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 14 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_15.bc b/tests/bc/scripts/parse_15.bc new file mode 100644 index 00000000000..ad954a2ac4a --- /dev/null +++ b/tests/bc/scripts/parse_15.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 15 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/parse_16.bc b/tests/bc/scripts/parse_16.bc new file mode 100644 index 00000000000..3a716cbe40e --- /dev/null +++ b/tests/bc/scripts/parse_16.bc @@ -0,0 +1,19 @@ +#! /usr/bin/bc -q + +b = 16 + +obase = 10 +print "ibase = A; ibase = ", b, "\n" +print "\qibase = \q\n" +b +obase = b +for (i = 0; i <= 4096; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +halt diff --git a/tests/bc/scripts/print.bc b/tests/bc/scripts/print.bc deleted file mode 100644 index 9530cbdb3fc..00000000000 --- a/tests/bc/scripts/print.bc +++ /dev/null @@ -1,25 +0,0 @@ -#! /usr/bin/bc -q - -for (b = 2; b <= 100; ++b) { - - if (b == 10) continue - - s = b * b - - print "obase = ", b, "\n" - print "\qobase = \q\n" - b - - for (i = 0; i <= s; ++i) { - i - print "0.", i, "\n" - print ".", i, "\n" - print "1.", i, "\n" - print i, ".", "\n" - print i, ".", i, "\n" - } - - 2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 -} - -halt diff --git a/tests/bc/scripts/print_002.bc b/tests/bc/scripts/print_002.bc new file mode 100644 index 00000000000..e96bd8d3f44 --- /dev/null +++ b/tests/bc/scripts/print_002.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 2 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_003.bc b/tests/bc/scripts/print_003.bc new file mode 100644 index 00000000000..46365153a3c --- /dev/null +++ b/tests/bc/scripts/print_003.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 3 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_004.bc b/tests/bc/scripts/print_004.bc new file mode 100644 index 00000000000..ff0b285930f --- /dev/null +++ b/tests/bc/scripts/print_004.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 4 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_005.bc b/tests/bc/scripts/print_005.bc new file mode 100644 index 00000000000..6a5982ae6a5 --- /dev/null +++ b/tests/bc/scripts/print_005.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 5 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_006.bc b/tests/bc/scripts/print_006.bc new file mode 100644 index 00000000000..3b9bbccb285 --- /dev/null +++ b/tests/bc/scripts/print_006.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 6 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_007.bc b/tests/bc/scripts/print_007.bc new file mode 100644 index 00000000000..f6e78479257 --- /dev/null +++ b/tests/bc/scripts/print_007.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 7 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_008.bc b/tests/bc/scripts/print_008.bc new file mode 100644 index 00000000000..a77d4175123 --- /dev/null +++ b/tests/bc/scripts/print_008.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 8 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_009.bc b/tests/bc/scripts/print_009.bc new file mode 100644 index 00000000000..1aef988112a --- /dev/null +++ b/tests/bc/scripts/print_009.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 9 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_011.bc b/tests/bc/scripts/print_011.bc new file mode 100644 index 00000000000..fb2d29293ad --- /dev/null +++ b/tests/bc/scripts/print_011.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 11 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_012.bc b/tests/bc/scripts/print_012.bc new file mode 100644 index 00000000000..466e64e2798 --- /dev/null +++ b/tests/bc/scripts/print_012.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 12 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_013.bc b/tests/bc/scripts/print_013.bc new file mode 100644 index 00000000000..55525fd1398 --- /dev/null +++ b/tests/bc/scripts/print_013.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 13 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_014.bc b/tests/bc/scripts/print_014.bc new file mode 100644 index 00000000000..dfa40541c7a --- /dev/null +++ b/tests/bc/scripts/print_014.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 14 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_015.bc b/tests/bc/scripts/print_015.bc new file mode 100644 index 00000000000..2426e409d94 --- /dev/null +++ b/tests/bc/scripts/print_015.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 15 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_016.bc b/tests/bc/scripts/print_016.bc new file mode 100644 index 00000000000..44131bfe3ab --- /dev/null +++ b/tests/bc/scripts/print_016.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 16 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_017.bc b/tests/bc/scripts/print_017.bc new file mode 100644 index 00000000000..e6c802166d2 --- /dev/null +++ b/tests/bc/scripts/print_017.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 17 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_018.bc b/tests/bc/scripts/print_018.bc new file mode 100644 index 00000000000..256c3436ab5 --- /dev/null +++ b/tests/bc/scripts/print_018.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 18 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_019.bc b/tests/bc/scripts/print_019.bc new file mode 100644 index 00000000000..a2552236a14 --- /dev/null +++ b/tests/bc/scripts/print_019.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 19 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_020.bc b/tests/bc/scripts/print_020.bc new file mode 100644 index 00000000000..df15b92c727 --- /dev/null +++ b/tests/bc/scripts/print_020.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 20 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_021.bc b/tests/bc/scripts/print_021.bc new file mode 100644 index 00000000000..83b3d2ad3c7 --- /dev/null +++ b/tests/bc/scripts/print_021.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 21 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_022.bc b/tests/bc/scripts/print_022.bc new file mode 100644 index 00000000000..9ab0d5e92f5 --- /dev/null +++ b/tests/bc/scripts/print_022.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 22 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_023.bc b/tests/bc/scripts/print_023.bc new file mode 100644 index 00000000000..4641ee25d32 --- /dev/null +++ b/tests/bc/scripts/print_023.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 23 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_024.bc b/tests/bc/scripts/print_024.bc new file mode 100644 index 00000000000..7c02ba179d7 --- /dev/null +++ b/tests/bc/scripts/print_024.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 24 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_025.bc b/tests/bc/scripts/print_025.bc new file mode 100644 index 00000000000..95883f34338 --- /dev/null +++ b/tests/bc/scripts/print_025.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 25 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_026.bc b/tests/bc/scripts/print_026.bc new file mode 100644 index 00000000000..152fe8053dd --- /dev/null +++ b/tests/bc/scripts/print_026.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 26 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_027.bc b/tests/bc/scripts/print_027.bc new file mode 100644 index 00000000000..60b56ca3112 --- /dev/null +++ b/tests/bc/scripts/print_027.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 27 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_028.bc b/tests/bc/scripts/print_028.bc new file mode 100644 index 00000000000..b41b482aaec --- /dev/null +++ b/tests/bc/scripts/print_028.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 28 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_029.bc b/tests/bc/scripts/print_029.bc new file mode 100644 index 00000000000..3637407473e --- /dev/null +++ b/tests/bc/scripts/print_029.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 29 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_030.bc b/tests/bc/scripts/print_030.bc new file mode 100644 index 00000000000..066546061a7 --- /dev/null +++ b/tests/bc/scripts/print_030.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 30 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_031.bc b/tests/bc/scripts/print_031.bc new file mode 100644 index 00000000000..5f0ba04afdc --- /dev/null +++ b/tests/bc/scripts/print_031.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 31 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_032.bc b/tests/bc/scripts/print_032.bc new file mode 100644 index 00000000000..8c1f7b83b50 --- /dev/null +++ b/tests/bc/scripts/print_032.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 32 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_033.bc b/tests/bc/scripts/print_033.bc new file mode 100644 index 00000000000..d4af3e84377 --- /dev/null +++ b/tests/bc/scripts/print_033.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 33 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_034.bc b/tests/bc/scripts/print_034.bc new file mode 100644 index 00000000000..90607dac7a1 --- /dev/null +++ b/tests/bc/scripts/print_034.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 34 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_035.bc b/tests/bc/scripts/print_035.bc new file mode 100644 index 00000000000..175054b155c --- /dev/null +++ b/tests/bc/scripts/print_035.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 35 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_036.bc b/tests/bc/scripts/print_036.bc new file mode 100644 index 00000000000..63c212f3723 --- /dev/null +++ b/tests/bc/scripts/print_036.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 36 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_037.bc b/tests/bc/scripts/print_037.bc new file mode 100644 index 00000000000..8e51d9af1c4 --- /dev/null +++ b/tests/bc/scripts/print_037.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 37 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_038.bc b/tests/bc/scripts/print_038.bc new file mode 100644 index 00000000000..7208ed1e850 --- /dev/null +++ b/tests/bc/scripts/print_038.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 38 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_039.bc b/tests/bc/scripts/print_039.bc new file mode 100644 index 00000000000..0459f33f2e0 --- /dev/null +++ b/tests/bc/scripts/print_039.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 39 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_040.bc b/tests/bc/scripts/print_040.bc new file mode 100644 index 00000000000..53df241dbaf --- /dev/null +++ b/tests/bc/scripts/print_040.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 40 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_041.bc b/tests/bc/scripts/print_041.bc new file mode 100644 index 00000000000..c539ad9592e --- /dev/null +++ b/tests/bc/scripts/print_041.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 41 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_042.bc b/tests/bc/scripts/print_042.bc new file mode 100644 index 00000000000..088c3b2f4cb --- /dev/null +++ b/tests/bc/scripts/print_042.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 42 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_043.bc b/tests/bc/scripts/print_043.bc new file mode 100644 index 00000000000..8646a8f2af4 --- /dev/null +++ b/tests/bc/scripts/print_043.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 43 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_044.bc b/tests/bc/scripts/print_044.bc new file mode 100644 index 00000000000..1bd208266f4 --- /dev/null +++ b/tests/bc/scripts/print_044.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 44 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_045.bc b/tests/bc/scripts/print_045.bc new file mode 100644 index 00000000000..7463c3e5575 --- /dev/null +++ b/tests/bc/scripts/print_045.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 45 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_046.bc b/tests/bc/scripts/print_046.bc new file mode 100644 index 00000000000..dd78294c5bb --- /dev/null +++ b/tests/bc/scripts/print_046.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 46 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_047.bc b/tests/bc/scripts/print_047.bc new file mode 100644 index 00000000000..3b065491887 --- /dev/null +++ b/tests/bc/scripts/print_047.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 47 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_048.bc b/tests/bc/scripts/print_048.bc new file mode 100644 index 00000000000..71dba3d7e53 --- /dev/null +++ b/tests/bc/scripts/print_048.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 48 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_049.bc b/tests/bc/scripts/print_049.bc new file mode 100644 index 00000000000..7ab19539ef2 --- /dev/null +++ b/tests/bc/scripts/print_049.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 49 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_050.bc b/tests/bc/scripts/print_050.bc new file mode 100644 index 00000000000..93983f5f5c6 --- /dev/null +++ b/tests/bc/scripts/print_050.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 50 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_051.bc b/tests/bc/scripts/print_051.bc new file mode 100644 index 00000000000..32f5e76a46b --- /dev/null +++ b/tests/bc/scripts/print_051.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 51 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_052.bc b/tests/bc/scripts/print_052.bc new file mode 100644 index 00000000000..662170d7845 --- /dev/null +++ b/tests/bc/scripts/print_052.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 52 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_053.bc b/tests/bc/scripts/print_053.bc new file mode 100644 index 00000000000..05986f27bd7 --- /dev/null +++ b/tests/bc/scripts/print_053.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 53 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_054.bc b/tests/bc/scripts/print_054.bc new file mode 100644 index 00000000000..92e20b70329 --- /dev/null +++ b/tests/bc/scripts/print_054.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 54 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_055.bc b/tests/bc/scripts/print_055.bc new file mode 100644 index 00000000000..014637b461c --- /dev/null +++ b/tests/bc/scripts/print_055.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 55 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_056.bc b/tests/bc/scripts/print_056.bc new file mode 100644 index 00000000000..42642cb8e29 --- /dev/null +++ b/tests/bc/scripts/print_056.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 56 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_057.bc b/tests/bc/scripts/print_057.bc new file mode 100644 index 00000000000..e4dd3d1eb8f --- /dev/null +++ b/tests/bc/scripts/print_057.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 57 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_058.bc b/tests/bc/scripts/print_058.bc new file mode 100644 index 00000000000..cc2e5e5e1da --- /dev/null +++ b/tests/bc/scripts/print_058.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 58 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_059.bc b/tests/bc/scripts/print_059.bc new file mode 100644 index 00000000000..2abe27da21d --- /dev/null +++ b/tests/bc/scripts/print_059.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 59 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_060.bc b/tests/bc/scripts/print_060.bc new file mode 100644 index 00000000000..c542d10d1e5 --- /dev/null +++ b/tests/bc/scripts/print_060.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 60 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_061.bc b/tests/bc/scripts/print_061.bc new file mode 100644 index 00000000000..bcd520e0f38 --- /dev/null +++ b/tests/bc/scripts/print_061.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 61 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_062.bc b/tests/bc/scripts/print_062.bc new file mode 100644 index 00000000000..4b9875e077c --- /dev/null +++ b/tests/bc/scripts/print_062.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 62 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_063.bc b/tests/bc/scripts/print_063.bc new file mode 100644 index 00000000000..9f4d77042b2 --- /dev/null +++ b/tests/bc/scripts/print_063.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 63 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_064.bc b/tests/bc/scripts/print_064.bc new file mode 100644 index 00000000000..8878d0a8e05 --- /dev/null +++ b/tests/bc/scripts/print_064.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 64 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_065.bc b/tests/bc/scripts/print_065.bc new file mode 100644 index 00000000000..faf3b4361d0 --- /dev/null +++ b/tests/bc/scripts/print_065.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 65 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_066.bc b/tests/bc/scripts/print_066.bc new file mode 100644 index 00000000000..07f30fa22c0 --- /dev/null +++ b/tests/bc/scripts/print_066.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 66 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_067.bc b/tests/bc/scripts/print_067.bc new file mode 100644 index 00000000000..202604d755b --- /dev/null +++ b/tests/bc/scripts/print_067.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 67 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_068.bc b/tests/bc/scripts/print_068.bc new file mode 100644 index 00000000000..f90912bef26 --- /dev/null +++ b/tests/bc/scripts/print_068.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 68 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_069.bc b/tests/bc/scripts/print_069.bc new file mode 100644 index 00000000000..175263e3907 --- /dev/null +++ b/tests/bc/scripts/print_069.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 69 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_070.bc b/tests/bc/scripts/print_070.bc new file mode 100644 index 00000000000..0786f4d3aa1 --- /dev/null +++ b/tests/bc/scripts/print_070.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 70 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_071.bc b/tests/bc/scripts/print_071.bc new file mode 100644 index 00000000000..292c38e9185 --- /dev/null +++ b/tests/bc/scripts/print_071.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 71 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_072.bc b/tests/bc/scripts/print_072.bc new file mode 100644 index 00000000000..e6506ee7ee3 --- /dev/null +++ b/tests/bc/scripts/print_072.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 72 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_073.bc b/tests/bc/scripts/print_073.bc new file mode 100644 index 00000000000..6b7d3efae5c --- /dev/null +++ b/tests/bc/scripts/print_073.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 73 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_074.bc b/tests/bc/scripts/print_074.bc new file mode 100644 index 00000000000..e61abaf98f9 --- /dev/null +++ b/tests/bc/scripts/print_074.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 74 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_075.bc b/tests/bc/scripts/print_075.bc new file mode 100644 index 00000000000..84704063a65 --- /dev/null +++ b/tests/bc/scripts/print_075.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 75 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_076.bc b/tests/bc/scripts/print_076.bc new file mode 100644 index 00000000000..3efed22515d --- /dev/null +++ b/tests/bc/scripts/print_076.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 76 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_077.bc b/tests/bc/scripts/print_077.bc new file mode 100644 index 00000000000..ef01f150c1b --- /dev/null +++ b/tests/bc/scripts/print_077.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 77 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_078.bc b/tests/bc/scripts/print_078.bc new file mode 100644 index 00000000000..8f431f54c12 --- /dev/null +++ b/tests/bc/scripts/print_078.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 78 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_079.bc b/tests/bc/scripts/print_079.bc new file mode 100644 index 00000000000..5eb213c1943 --- /dev/null +++ b/tests/bc/scripts/print_079.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 79 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_080.bc b/tests/bc/scripts/print_080.bc new file mode 100644 index 00000000000..46b1a547d3a --- /dev/null +++ b/tests/bc/scripts/print_080.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 80 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_081.bc b/tests/bc/scripts/print_081.bc new file mode 100644 index 00000000000..9b0f2415f19 --- /dev/null +++ b/tests/bc/scripts/print_081.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 81 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_082.bc b/tests/bc/scripts/print_082.bc new file mode 100644 index 00000000000..ac1cc402877 --- /dev/null +++ b/tests/bc/scripts/print_082.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 82 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_083.bc b/tests/bc/scripts/print_083.bc new file mode 100644 index 00000000000..8f6966e280f --- /dev/null +++ b/tests/bc/scripts/print_083.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 83 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_084.bc b/tests/bc/scripts/print_084.bc new file mode 100644 index 00000000000..e5e2c167c6f --- /dev/null +++ b/tests/bc/scripts/print_084.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 84 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_085.bc b/tests/bc/scripts/print_085.bc new file mode 100644 index 00000000000..3e5b50b591f --- /dev/null +++ b/tests/bc/scripts/print_085.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 85 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_086.bc b/tests/bc/scripts/print_086.bc new file mode 100644 index 00000000000..9cfcc8982fa --- /dev/null +++ b/tests/bc/scripts/print_086.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 86 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_087.bc b/tests/bc/scripts/print_087.bc new file mode 100644 index 00000000000..ed3c6687272 --- /dev/null +++ b/tests/bc/scripts/print_087.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 87 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_088.bc b/tests/bc/scripts/print_088.bc new file mode 100644 index 00000000000..1e001883e57 --- /dev/null +++ b/tests/bc/scripts/print_088.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 88 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_089.bc b/tests/bc/scripts/print_089.bc new file mode 100644 index 00000000000..4234219f487 --- /dev/null +++ b/tests/bc/scripts/print_089.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 89 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_090.bc b/tests/bc/scripts/print_090.bc new file mode 100644 index 00000000000..ebe4650c169 --- /dev/null +++ b/tests/bc/scripts/print_090.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 90 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_091.bc b/tests/bc/scripts/print_091.bc new file mode 100644 index 00000000000..5c5fd5c9525 --- /dev/null +++ b/tests/bc/scripts/print_091.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 91 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_092.bc b/tests/bc/scripts/print_092.bc new file mode 100644 index 00000000000..992a738fee4 --- /dev/null +++ b/tests/bc/scripts/print_092.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 92 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_093.bc b/tests/bc/scripts/print_093.bc new file mode 100644 index 00000000000..7e91b2b5e8f --- /dev/null +++ b/tests/bc/scripts/print_093.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 93 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_094.bc b/tests/bc/scripts/print_094.bc new file mode 100644 index 00000000000..3567fe0bf69 --- /dev/null +++ b/tests/bc/scripts/print_094.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 94 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_095.bc b/tests/bc/scripts/print_095.bc new file mode 100644 index 00000000000..1945f2daee1 --- /dev/null +++ b/tests/bc/scripts/print_095.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 95 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_096.bc b/tests/bc/scripts/print_096.bc new file mode 100644 index 00000000000..837f87a57e6 --- /dev/null +++ b/tests/bc/scripts/print_096.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 96 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_097.bc b/tests/bc/scripts/print_097.bc new file mode 100644 index 00000000000..efcf4a096ec --- /dev/null +++ b/tests/bc/scripts/print_097.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 97 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_098.bc b/tests/bc/scripts/print_098.bc new file mode 100644 index 00000000000..d14203d2965 --- /dev/null +++ b/tests/bc/scripts/print_098.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 98 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_099.bc b/tests/bc/scripts/print_099.bc new file mode 100644 index 00000000000..0bbb410318e --- /dev/null +++ b/tests/bc/scripts/print_099.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 99 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/print_100.bc b/tests/bc/scripts/print_100.bc new file mode 100644 index 00000000000..4ac46e3eba4 --- /dev/null +++ b/tests/bc/scripts/print_100.bc @@ -0,0 +1,22 @@ +#! /usr/bin/bc -q + +b = 100 + +s = b * b + +print "obase = ", b, "\n" +print "\qobase = \q\n" +b + +for (i = 0; i <= s; ++i) { + i + print "0.", i, "\n" + print ".", i, "\n" + print "1.", i, "\n" + print i, ".", "\n" + print i, ".", i, "\n" +} + +2189432174861923048671023498128347619023487610234689172304.192748960128745108927461089237469018723460 + +halt diff --git a/tests/bc/scripts/subtract.bc b/tests/bc/scripts/subtract_00100.bc similarity index 86% rename from tests/bc/scripts/subtract.bc rename to tests/bc/scripts/subtract_00100.bc index 1e592942cab..93339780f2f 100644 --- a/tests/bc/scripts/subtract.bc +++ b/tests/bc/scripts/subtract_00100.bc @@ -10,7 +10,7 @@ for (i = 0; i <= len; ++i) { a[i] } -for (i = 1; i <= 10000; ++i) { +for (i = 1; i <= 100; ++i) { for (j = 0; j < len; ++j) { a[i] - a[j] } diff --git a/tests/bc/scripts/subtract_00200.bc b/tests/bc/scripts/subtract_00200.bc new file mode 100644 index 00000000000..2bcad94d76d --- /dev/null +++ b/tests/bc/scripts/subtract_00200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 101; i <= 200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_00300.bc b/tests/bc/scripts/subtract_00300.bc new file mode 100644 index 00000000000..5d5b5fd2bf6 --- /dev/null +++ b/tests/bc/scripts/subtract_00300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 201; i <= 300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_00400.bc b/tests/bc/scripts/subtract_00400.bc new file mode 100644 index 00000000000..9298eeec000 --- /dev/null +++ b/tests/bc/scripts/subtract_00400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 301; i <= 400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_00500.bc b/tests/bc/scripts/subtract_00500.bc new file mode 100644 index 00000000000..581a8144fea --- /dev/null +++ b/tests/bc/scripts/subtract_00500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 401; i <= 500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_00600.bc b/tests/bc/scripts/subtract_00600.bc new file mode 100644 index 00000000000..2a1a5e6eb1a --- /dev/null +++ b/tests/bc/scripts/subtract_00600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 501; i <= 600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_00700.bc b/tests/bc/scripts/subtract_00700.bc new file mode 100644 index 00000000000..867277161d2 --- /dev/null +++ b/tests/bc/scripts/subtract_00700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 601; i <= 700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_00800.bc b/tests/bc/scripts/subtract_00800.bc new file mode 100644 index 00000000000..68dfd28f110 --- /dev/null +++ b/tests/bc/scripts/subtract_00800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 701; i <= 800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_00900.bc b/tests/bc/scripts/subtract_00900.bc new file mode 100644 index 00000000000..b343861ecf2 --- /dev/null +++ b/tests/bc/scripts/subtract_00900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 801; i <= 900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01000.bc b/tests/bc/scripts/subtract_01000.bc new file mode 100644 index 00000000000..4e8e5951c8d --- /dev/null +++ b/tests/bc/scripts/subtract_01000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 901; i <= 1000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01100.bc b/tests/bc/scripts/subtract_01100.bc new file mode 100644 index 00000000000..0b7d1a5ca31 --- /dev/null +++ b/tests/bc/scripts/subtract_01100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1001; i <= 1100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01200.bc b/tests/bc/scripts/subtract_01200.bc new file mode 100644 index 00000000000..bfa237043f8 --- /dev/null +++ b/tests/bc/scripts/subtract_01200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1101; i <= 1200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01300.bc b/tests/bc/scripts/subtract_01300.bc new file mode 100644 index 00000000000..c83483db9e8 --- /dev/null +++ b/tests/bc/scripts/subtract_01300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1201; i <= 1300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01400.bc b/tests/bc/scripts/subtract_01400.bc new file mode 100644 index 00000000000..e979361f49f --- /dev/null +++ b/tests/bc/scripts/subtract_01400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1301; i <= 1400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01500.bc b/tests/bc/scripts/subtract_01500.bc new file mode 100644 index 00000000000..c2ef1ee1385 --- /dev/null +++ b/tests/bc/scripts/subtract_01500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1401; i <= 1500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01600.bc b/tests/bc/scripts/subtract_01600.bc new file mode 100644 index 00000000000..2113ddefeb5 --- /dev/null +++ b/tests/bc/scripts/subtract_01600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1501; i <= 1600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01700.bc b/tests/bc/scripts/subtract_01700.bc new file mode 100644 index 00000000000..ca9505c1983 --- /dev/null +++ b/tests/bc/scripts/subtract_01700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1601; i <= 1700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01800.bc b/tests/bc/scripts/subtract_01800.bc new file mode 100644 index 00000000000..650cc6a7d55 --- /dev/null +++ b/tests/bc/scripts/subtract_01800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1701; i <= 1800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_01900.bc b/tests/bc/scripts/subtract_01900.bc new file mode 100644 index 00000000000..72c17fd1af8 --- /dev/null +++ b/tests/bc/scripts/subtract_01900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1801; i <= 1900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02000.bc b/tests/bc/scripts/subtract_02000.bc new file mode 100644 index 00000000000..579c84e67f8 --- /dev/null +++ b/tests/bc/scripts/subtract_02000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 1901; i <= 2000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02100.bc b/tests/bc/scripts/subtract_02100.bc new file mode 100644 index 00000000000..2ed9f5f0c8a --- /dev/null +++ b/tests/bc/scripts/subtract_02100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2001; i <= 2100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02200.bc b/tests/bc/scripts/subtract_02200.bc new file mode 100644 index 00000000000..0a11cab25d6 --- /dev/null +++ b/tests/bc/scripts/subtract_02200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2101; i <= 2200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02300.bc b/tests/bc/scripts/subtract_02300.bc new file mode 100644 index 00000000000..29c66c1913f --- /dev/null +++ b/tests/bc/scripts/subtract_02300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2201; i <= 2300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02400.bc b/tests/bc/scripts/subtract_02400.bc new file mode 100644 index 00000000000..b0f2f197a2c --- /dev/null +++ b/tests/bc/scripts/subtract_02400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2301; i <= 2400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02500.bc b/tests/bc/scripts/subtract_02500.bc new file mode 100644 index 00000000000..7e9d46a8bc3 --- /dev/null +++ b/tests/bc/scripts/subtract_02500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2401; i <= 2500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02600.bc b/tests/bc/scripts/subtract_02600.bc new file mode 100644 index 00000000000..49acabcf66e --- /dev/null +++ b/tests/bc/scripts/subtract_02600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2501; i <= 2600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02700.bc b/tests/bc/scripts/subtract_02700.bc new file mode 100644 index 00000000000..8d7473e93f7 --- /dev/null +++ b/tests/bc/scripts/subtract_02700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2601; i <= 2700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02800.bc b/tests/bc/scripts/subtract_02800.bc new file mode 100644 index 00000000000..588db5a26ee --- /dev/null +++ b/tests/bc/scripts/subtract_02800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2701; i <= 2800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_02900.bc b/tests/bc/scripts/subtract_02900.bc new file mode 100644 index 00000000000..1e6a4fea041 --- /dev/null +++ b/tests/bc/scripts/subtract_02900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2801; i <= 2900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03000.bc b/tests/bc/scripts/subtract_03000.bc new file mode 100644 index 00000000000..0eb1e3da7cf --- /dev/null +++ b/tests/bc/scripts/subtract_03000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 2901; i <= 3000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03100.bc b/tests/bc/scripts/subtract_03100.bc new file mode 100644 index 00000000000..6513ee49fe9 --- /dev/null +++ b/tests/bc/scripts/subtract_03100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3001; i <= 3100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03200.bc b/tests/bc/scripts/subtract_03200.bc new file mode 100644 index 00000000000..310541d4de0 --- /dev/null +++ b/tests/bc/scripts/subtract_03200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3101; i <= 3200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03300.bc b/tests/bc/scripts/subtract_03300.bc new file mode 100644 index 00000000000..c984f7c73e0 --- /dev/null +++ b/tests/bc/scripts/subtract_03300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3201; i <= 3300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03400.bc b/tests/bc/scripts/subtract_03400.bc new file mode 100644 index 00000000000..608ab651fc2 --- /dev/null +++ b/tests/bc/scripts/subtract_03400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3301; i <= 3400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03500.bc b/tests/bc/scripts/subtract_03500.bc new file mode 100644 index 00000000000..215b96d850d --- /dev/null +++ b/tests/bc/scripts/subtract_03500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3401; i <= 3500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03600.bc b/tests/bc/scripts/subtract_03600.bc new file mode 100644 index 00000000000..90d0d4d5144 --- /dev/null +++ b/tests/bc/scripts/subtract_03600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3501; i <= 3600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03700.bc b/tests/bc/scripts/subtract_03700.bc new file mode 100644 index 00000000000..511bf1ed4f9 --- /dev/null +++ b/tests/bc/scripts/subtract_03700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3601; i <= 3700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03800.bc b/tests/bc/scripts/subtract_03800.bc new file mode 100644 index 00000000000..99b69618b74 --- /dev/null +++ b/tests/bc/scripts/subtract_03800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3701; i <= 3800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_03900.bc b/tests/bc/scripts/subtract_03900.bc new file mode 100644 index 00000000000..a438bdfb86b --- /dev/null +++ b/tests/bc/scripts/subtract_03900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3801; i <= 3900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04000.bc b/tests/bc/scripts/subtract_04000.bc new file mode 100644 index 00000000000..7371044e02c --- /dev/null +++ b/tests/bc/scripts/subtract_04000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 3901; i <= 4000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04100.bc b/tests/bc/scripts/subtract_04100.bc new file mode 100644 index 00000000000..f9f47d394f6 --- /dev/null +++ b/tests/bc/scripts/subtract_04100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4001; i <= 4100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04200.bc b/tests/bc/scripts/subtract_04200.bc new file mode 100644 index 00000000000..56ff98e521b --- /dev/null +++ b/tests/bc/scripts/subtract_04200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4101; i <= 4200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04300.bc b/tests/bc/scripts/subtract_04300.bc new file mode 100644 index 00000000000..2ee5767b208 --- /dev/null +++ b/tests/bc/scripts/subtract_04300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4201; i <= 4300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04400.bc b/tests/bc/scripts/subtract_04400.bc new file mode 100644 index 00000000000..b355f189948 --- /dev/null +++ b/tests/bc/scripts/subtract_04400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4301; i <= 4400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04500.bc b/tests/bc/scripts/subtract_04500.bc new file mode 100644 index 00000000000..aa34485891c --- /dev/null +++ b/tests/bc/scripts/subtract_04500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4401; i <= 4500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04600.bc b/tests/bc/scripts/subtract_04600.bc new file mode 100644 index 00000000000..cd5bea59648 --- /dev/null +++ b/tests/bc/scripts/subtract_04600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4501; i <= 4600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04700.bc b/tests/bc/scripts/subtract_04700.bc new file mode 100644 index 00000000000..36de8058bb9 --- /dev/null +++ b/tests/bc/scripts/subtract_04700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4601; i <= 4700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04800.bc b/tests/bc/scripts/subtract_04800.bc new file mode 100644 index 00000000000..cc714dd72fd --- /dev/null +++ b/tests/bc/scripts/subtract_04800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4701; i <= 4800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_04900.bc b/tests/bc/scripts/subtract_04900.bc new file mode 100644 index 00000000000..6e8cfb8c931 --- /dev/null +++ b/tests/bc/scripts/subtract_04900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4801; i <= 4900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05000.bc b/tests/bc/scripts/subtract_05000.bc new file mode 100644 index 00000000000..f4847219bdb --- /dev/null +++ b/tests/bc/scripts/subtract_05000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 4901; i <= 5000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05100.bc b/tests/bc/scripts/subtract_05100.bc new file mode 100644 index 00000000000..bea4f5b09f2 --- /dev/null +++ b/tests/bc/scripts/subtract_05100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5001; i <= 5100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05200.bc b/tests/bc/scripts/subtract_05200.bc new file mode 100644 index 00000000000..38a7b5c6d23 --- /dev/null +++ b/tests/bc/scripts/subtract_05200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5101; i <= 5200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05300.bc b/tests/bc/scripts/subtract_05300.bc new file mode 100644 index 00000000000..9004108f3e8 --- /dev/null +++ b/tests/bc/scripts/subtract_05300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5201; i <= 5300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05400.bc b/tests/bc/scripts/subtract_05400.bc new file mode 100644 index 00000000000..eec164c504c --- /dev/null +++ b/tests/bc/scripts/subtract_05400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5301; i <= 5400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05500.bc b/tests/bc/scripts/subtract_05500.bc new file mode 100644 index 00000000000..864f05e70d2 --- /dev/null +++ b/tests/bc/scripts/subtract_05500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5401; i <= 5500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05600.bc b/tests/bc/scripts/subtract_05600.bc new file mode 100644 index 00000000000..874f45183b7 --- /dev/null +++ b/tests/bc/scripts/subtract_05600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5501; i <= 5600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05700.bc b/tests/bc/scripts/subtract_05700.bc new file mode 100644 index 00000000000..6a5c351c574 --- /dev/null +++ b/tests/bc/scripts/subtract_05700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5601; i <= 5700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05800.bc b/tests/bc/scripts/subtract_05800.bc new file mode 100644 index 00000000000..5fc99fe8450 --- /dev/null +++ b/tests/bc/scripts/subtract_05800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5701; i <= 5800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_05900.bc b/tests/bc/scripts/subtract_05900.bc new file mode 100644 index 00000000000..cb12eba549b --- /dev/null +++ b/tests/bc/scripts/subtract_05900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5801; i <= 5900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06000.bc b/tests/bc/scripts/subtract_06000.bc new file mode 100644 index 00000000000..0c85a7267eb --- /dev/null +++ b/tests/bc/scripts/subtract_06000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 5901; i <= 6000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06100.bc b/tests/bc/scripts/subtract_06100.bc new file mode 100644 index 00000000000..8f43fc2687d --- /dev/null +++ b/tests/bc/scripts/subtract_06100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6001; i <= 6100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06200.bc b/tests/bc/scripts/subtract_06200.bc new file mode 100644 index 00000000000..d508561b583 --- /dev/null +++ b/tests/bc/scripts/subtract_06200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6101; i <= 6200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06300.bc b/tests/bc/scripts/subtract_06300.bc new file mode 100644 index 00000000000..3073a3f75df --- /dev/null +++ b/tests/bc/scripts/subtract_06300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6201; i <= 6300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06400.bc b/tests/bc/scripts/subtract_06400.bc new file mode 100644 index 00000000000..ee25fc01bca --- /dev/null +++ b/tests/bc/scripts/subtract_06400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6301; i <= 6400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06500.bc b/tests/bc/scripts/subtract_06500.bc new file mode 100644 index 00000000000..ff59fcde38c --- /dev/null +++ b/tests/bc/scripts/subtract_06500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6401; i <= 6500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06600.bc b/tests/bc/scripts/subtract_06600.bc new file mode 100644 index 00000000000..8bd56c8d2df --- /dev/null +++ b/tests/bc/scripts/subtract_06600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6501; i <= 6600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06700.bc b/tests/bc/scripts/subtract_06700.bc new file mode 100644 index 00000000000..160a31bdf4a --- /dev/null +++ b/tests/bc/scripts/subtract_06700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6601; i <= 6700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06800.bc b/tests/bc/scripts/subtract_06800.bc new file mode 100644 index 00000000000..7d2bc99dec0 --- /dev/null +++ b/tests/bc/scripts/subtract_06800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6701; i <= 6800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_06900.bc b/tests/bc/scripts/subtract_06900.bc new file mode 100644 index 00000000000..716d7c27311 --- /dev/null +++ b/tests/bc/scripts/subtract_06900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6801; i <= 6900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07000.bc b/tests/bc/scripts/subtract_07000.bc new file mode 100644 index 00000000000..259dc55507f --- /dev/null +++ b/tests/bc/scripts/subtract_07000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 6901; i <= 7000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07100.bc b/tests/bc/scripts/subtract_07100.bc new file mode 100644 index 00000000000..b992c30681e --- /dev/null +++ b/tests/bc/scripts/subtract_07100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7001; i <= 7100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07200.bc b/tests/bc/scripts/subtract_07200.bc new file mode 100644 index 00000000000..afa77522e91 --- /dev/null +++ b/tests/bc/scripts/subtract_07200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7101; i <= 7200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07300.bc b/tests/bc/scripts/subtract_07300.bc new file mode 100644 index 00000000000..5dd6997fbef --- /dev/null +++ b/tests/bc/scripts/subtract_07300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7201; i <= 7300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07400.bc b/tests/bc/scripts/subtract_07400.bc new file mode 100644 index 00000000000..70b88b1bc04 --- /dev/null +++ b/tests/bc/scripts/subtract_07400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7301; i <= 7400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07500.bc b/tests/bc/scripts/subtract_07500.bc new file mode 100644 index 00000000000..806565dc5fa --- /dev/null +++ b/tests/bc/scripts/subtract_07500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7401; i <= 7500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07600.bc b/tests/bc/scripts/subtract_07600.bc new file mode 100644 index 00000000000..b063df12239 --- /dev/null +++ b/tests/bc/scripts/subtract_07600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7501; i <= 7600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07700.bc b/tests/bc/scripts/subtract_07700.bc new file mode 100644 index 00000000000..f31cb7b170a --- /dev/null +++ b/tests/bc/scripts/subtract_07700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7601; i <= 7700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07800.bc b/tests/bc/scripts/subtract_07800.bc new file mode 100644 index 00000000000..222b583de5c --- /dev/null +++ b/tests/bc/scripts/subtract_07800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7701; i <= 7800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_07900.bc b/tests/bc/scripts/subtract_07900.bc new file mode 100644 index 00000000000..8a36cb2020c --- /dev/null +++ b/tests/bc/scripts/subtract_07900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7801; i <= 7900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08000.bc b/tests/bc/scripts/subtract_08000.bc new file mode 100644 index 00000000000..8b10e064462 --- /dev/null +++ b/tests/bc/scripts/subtract_08000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 7901; i <= 8000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08100.bc b/tests/bc/scripts/subtract_08100.bc new file mode 100644 index 00000000000..b7bf9481f6f --- /dev/null +++ b/tests/bc/scripts/subtract_08100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8001; i <= 8100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08200.bc b/tests/bc/scripts/subtract_08200.bc new file mode 100644 index 00000000000..2cf2b2282ca --- /dev/null +++ b/tests/bc/scripts/subtract_08200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8101; i <= 8200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08300.bc b/tests/bc/scripts/subtract_08300.bc new file mode 100644 index 00000000000..43e1090b270 --- /dev/null +++ b/tests/bc/scripts/subtract_08300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8201; i <= 8300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08400.bc b/tests/bc/scripts/subtract_08400.bc new file mode 100644 index 00000000000..ecde1157ef8 --- /dev/null +++ b/tests/bc/scripts/subtract_08400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8301; i <= 8400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08500.bc b/tests/bc/scripts/subtract_08500.bc new file mode 100644 index 00000000000..5e6e8ac95d3 --- /dev/null +++ b/tests/bc/scripts/subtract_08500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8401; i <= 8500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08600.bc b/tests/bc/scripts/subtract_08600.bc new file mode 100644 index 00000000000..f56db3c36a3 --- /dev/null +++ b/tests/bc/scripts/subtract_08600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8501; i <= 8600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08700.bc b/tests/bc/scripts/subtract_08700.bc new file mode 100644 index 00000000000..3d5d9b94598 --- /dev/null +++ b/tests/bc/scripts/subtract_08700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8601; i <= 8700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08800.bc b/tests/bc/scripts/subtract_08800.bc new file mode 100644 index 00000000000..87a5449472d --- /dev/null +++ b/tests/bc/scripts/subtract_08800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8701; i <= 8800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_08900.bc b/tests/bc/scripts/subtract_08900.bc new file mode 100644 index 00000000000..2ac71581188 --- /dev/null +++ b/tests/bc/scripts/subtract_08900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8801; i <= 8900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09000.bc b/tests/bc/scripts/subtract_09000.bc new file mode 100644 index 00000000000..7c39d922b73 --- /dev/null +++ b/tests/bc/scripts/subtract_09000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 8901; i <= 9000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09100.bc b/tests/bc/scripts/subtract_09100.bc new file mode 100644 index 00000000000..5b8c99cf031 --- /dev/null +++ b/tests/bc/scripts/subtract_09100.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9001; i <= 9100; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09200.bc b/tests/bc/scripts/subtract_09200.bc new file mode 100644 index 00000000000..173f64d7078 --- /dev/null +++ b/tests/bc/scripts/subtract_09200.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9101; i <= 9200; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09300.bc b/tests/bc/scripts/subtract_09300.bc new file mode 100644 index 00000000000..6226e6fecb1 --- /dev/null +++ b/tests/bc/scripts/subtract_09300.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9201; i <= 9300; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09400.bc b/tests/bc/scripts/subtract_09400.bc new file mode 100644 index 00000000000..0e76fa04f14 --- /dev/null +++ b/tests/bc/scripts/subtract_09400.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9301; i <= 9400; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09500.bc b/tests/bc/scripts/subtract_09500.bc new file mode 100644 index 00000000000..b5336018e36 --- /dev/null +++ b/tests/bc/scripts/subtract_09500.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9401; i <= 9500; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09600.bc b/tests/bc/scripts/subtract_09600.bc new file mode 100644 index 00000000000..479bfe29e36 --- /dev/null +++ b/tests/bc/scripts/subtract_09600.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9501; i <= 9600; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09700.bc b/tests/bc/scripts/subtract_09700.bc new file mode 100644 index 00000000000..14c5df67605 --- /dev/null +++ b/tests/bc/scripts/subtract_09700.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9601; i <= 9700; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09800.bc b/tests/bc/scripts/subtract_09800.bc new file mode 100644 index 00000000000..5d62bae24a4 --- /dev/null +++ b/tests/bc/scripts/subtract_09800.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9701; i <= 9800; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_09900.bc b/tests/bc/scripts/subtract_09900.bc new file mode 100644 index 00000000000..d2926980b54 --- /dev/null +++ b/tests/bc/scripts/subtract_09900.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9801; i <= 9900; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/scripts/subtract_10000.bc b/tests/bc/scripts/subtract_10000.bc new file mode 100644 index 00000000000..32cafefd324 --- /dev/null +++ b/tests/bc/scripts/subtract_10000.bc @@ -0,0 +1,17 @@ +#! /usr/bin/bc -lq + +scale = 20 +x = 1234567890 / scale +len = length(x) + 1 + scale +len *= 2 + +for (i = 0; i <= len; ++i) { + a[i] = x * (10^i) + a[i] +} + +for (i = 9901; i <= 10000; ++i) { + for (j = 0; j < len; ++j) { + a[i] - a[j] + } +} diff --git a/tests/bc/timeconst.sh b/tests/bc/timeconst.sh index 35bd80d5604..39326884364 100755 --- a/tests/bc/timeconst.sh +++ b/tests/bc/timeconst.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -81,6 +81,9 @@ base=$(basename "$timeconst") # If the script does not exist, just skip. Running this test is not necessary. if [ ! -f "$timeconst" ]; then printf 'Warning: %s does not exist\n' "$timeconst" + printf '%s is not part of this bc because of license incompatibility\n' "$timeconst" + printf 'Get it at https://github.com/torvalds/linux/blob/master/kernel/time/timeconst.bc\n' + printf 'if you want to test it\n' printf 'Skipping...\n' exit 0 fi diff --git a/tests/bcl.c b/tests/bcl.c index 3a2df4488c0..fb730e773c6 100644 --- a/tests/bcl.c +++ b/tests/bcl.c @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2018-2024 Gavin D. Howard and contributors. + * Copyright (c) 2018-2025 Gavin D. Howard and contributors. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: diff --git a/tests/dc/scripts/easter.dc b/tests/dc/scripts/easter.dc new file mode 100644 index 00000000000..e2c126ba112 --- /dev/null +++ b/tests/dc/scripts/easter.dc @@ -0,0 +1,49 @@ +#! /usr/bin/dc + +# This is the actual script. +[ + ddsf + [ + lfp + [too early + ]P + q + ]s@ + 1583>@ + ddd19%1+sg100/1+d3*4/12-sx8*5+25/5-sz5*4/lx-10-sdlg11*20+lz+lx-30% + d + [30+]s@ + 0>@d + [ + [1+]s@ + lg11<@ + ]s@ + 25=@d + [1+]s@ + 24=@se44le-d + [30+]s@ + 21>@dld+7%-7+ + [March ]sm + d + [ + 31- + [April ]sm + ]s@ + 31<@dn32PsnlmPdnsn1z>p + 10P +]sp + +2021 +lpx + +2022 +lpx + +2023 +lpx + +2024 +lpx + +2025 +lpx diff --git a/tests/dc/scripts/easter.sh b/tests/dc/scripts/easter.sh deleted file mode 100755 index ee8fa1d94c8..00000000000 --- a/tests/dc/scripts/easter.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/sh -# -# SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -set -e - -script="$0" - -testdir=$(dirname "${script}") - -# Just print the usage and exit with an error. This can receive a message to -# print. -# @param 1 A message to print. -usage() { - if [ $# -eq 1 ]; then - printf '%s\n\n' "$1" - fi - printf 'usage: %s dc_exec year [options...]\n' "$script" - exit 1 -} - -. "$testdir/../../../scripts/functions.sh" - -if test $# -lt 2 -then - usage "Not enough arguments; need 2" -fi - -dc_exec="$1" -shift -check_exec_arg "$dc_exec" - -year="$1" -shift - -echo $year ' -[ - ddsf - [ - lfp - [too early - ]P - q - ]s@ - 1583>@ - ddd19%1+sg100/1+d3*4/12-sx8*5+25/5-sz5*4/lx-10-sdlg11*20+lz+lx-30% - d - [30+]s@ - 0>@d - [ - [1+]s@ - lg11<@ - ]s@ - 25=@d - [1+]s@ - 24=@se44le-d - [30+]s@ - 21>@dld+7%-7+ - [March ]sm - d - [ - 31- - [April ]sm - ]s@ - 31<@psnlmPpsn1z>p -]sp -lpx' | "$dc_exec" "$@" | tr '\012' ' ' -echo '' diff --git a/tests/dc/scripts/easter.txt b/tests/dc/scripts/easter.txt new file mode 100644 index 00000000000..0aef9531346 --- /dev/null +++ b/tests/dc/scripts/easter.txt @@ -0,0 +1,5 @@ +4 April 2021 +17 April 2022 +9 April 2023 +31 March 2024 +20 April 2025 diff --git a/tests/dc/scripts/prime.dc b/tests/dc/scripts/prime.dc index cc769d2bbee..6902aaef8f0 100644 --- a/tests/dc/scripts/prime.dc +++ b/tests/dc/scripts/prime.dc @@ -1 +1 @@ -0k2p3p[dl!d2+s!%0=@l!l^!<#]s#[s/0ds^]s@[p]s&[ddvs^3s!l# x0<&2+d100000>.]ds.x +0k2p3p[dl!d2+s!%0=@l!l^!<#]s#[s/0ds^]s@[p]s&[ddvs^3s!l# x0<&2+d10000>.]ds.x diff --git a/tests/error.sh b/tests/error.sh index 15cbd5577ed..aa229a91680 100755 --- a/tests/error.sh +++ b/tests/error.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -100,8 +100,6 @@ fi if [ "$d" = "bc" ]; then opts="-l" halt="halt" - read_call="read()" - read_expr="${read_call}\n5+5;" else opts="-x" halt="q" diff --git a/tests/errors.sh b/tests/errors.sh index 47053f9c7b4..93e4f5d0ded 100755 --- a/tests/errors.sh +++ b/tests/errors.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -89,8 +89,6 @@ read_errors="read_errors" if [ "$d" = "bc" ]; then opts="-l" halt="halt" - read_call="read()" - read_expr="${read_call}\n5+5;" else opts="-x" halt="q" diff --git a/tests/extra_required.txt b/tests/extra_required.txt index 038e6775d64..b335af4d57b 100644 --- a/tests/extra_required.txt +++ b/tests/extra_required.txt @@ -1,5 +1,20 @@ engineering -lib2 +lib2_p +lib2_r +lib2_ceil +lib2_log +lib2_root +lib2_gcd +lib2_bytes +lib2_pi +lib2_tan +lib2_a2 +lib2_r2d +lib2_d2r +lib2_fac +lib2_perm +lib2_uint +lib2_rand fib places rand diff --git a/tests/history.py b/tests/history.py index a3b722386a6..cf19174f6d9 100755 --- a/tests/history.py +++ b/tests/history.py @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -128,7 +128,7 @@ def write_str(child, s): def bc_banner(child): bc_banner1 = "bc [0-9]+\\.[0-9]+\\.[0-9]+\r\n" bc_banner2 = "Copyright \\(c\\) 2018-[2-9][0-9][0-9][0-9] Gavin D. Howard and contributors\r\n" - bc_banner3 = "Report bugs at: https://git.gavinhoward.com/gavin/bc\r\n\r\n" + bc_banner3 = "Report bugs at: https://github.com/gavinhoward/bc\r\n\r\n" bc_banner4 = "This is free software with ABSOLUTELY NO WARRANTY.\r\n\r\n" expect(child, bc_banner1) expect(child, bc_banner2) diff --git a/tests/history.sh b/tests/history.sh index d06d3c6af10..514ee176990 100755 --- a/tests/history.sh +++ b/tests/history.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/other.sh b/tests/other.sh deleted file mode 100755 index 1012fe919de..00000000000 --- a/tests/other.sh +++ /dev/null @@ -1,593 +0,0 @@ -#! /bin/sh -# -# SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -set -e - -script="$0" -testdir=$(dirname "$script") - -. "$testdir/../scripts/functions.sh" - -outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} - -# Just print the usage and exit with an error. This can receive a message to -# print. -# @param 1 A message to print. -usage() { - if [ $# -eq 1 ]; then - printf '%s\n\n' "$1" - fi - printf 'usage: %s dir extra_math [exec args...]\n' "$script" - exit 1 -} - -# Command-line processing. -if [ "$#" -ge 2 ]; then - - d="$1" - shift - check_d_arg "$d" - - extra_math="$1" - shift - check_bool_arg "$extra_math" - -else - usage "Not enough arguments; need 2" -fi - -if [ "$#" -lt 1 ]; then - exe="$testdir/../bin/$d" - check_exec_arg "$exe" -else - exe="$1" - shift - check_exec_arg "$exe" -fi - -if [ "$d" = "bc" ]; then - halt="quit" -else - halt="q" -fi - -mkdir -p "$outputdir" - -# For tests later. -num=100000000000000000000000000000000000000000000000000000000000000000000000000000 -num2="$num" -numres="$num" -num70="10000000000000000000000000000000000000000000000000000000000000000000\\ -0000000000" - -# Set stuff for the correct calculator. -if [ "$d" = "bc" ]; then - halt="halt" - opt="x" - lopt="extended-register" - line_var="BC_LINE_LENGTH" - lltest="line_length()" -else - halt="q" - opt="l" - lopt="mathlib" - line_var="DC_LINE_LENGTH" - num="$num pR" - lltest="glpR" -fi - -# I use these, so unset them to make the tests work. -unset BC_ENV_ARGS -unset BC_LINE_LENGTH -unset DC_ENV_ARGS -unset DC_LINE_LENGTH - -set +e - -printf '\nRunning %s quit test...' "$d" - -printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" > /dev/null 2>&1 - -checktest_retcode "$d" "$?" "quit" - -# bc has two halt or quit commands, so test the second as well. -if [ "$d" = bc ]; then - - printf '%s\n' "quit" 2> /dev/null | "$exe" "$@" > /dev/null 2>&1 - - checktest_retcode "$d" "$?" quit - - two=$("$exe" "$@" -e 1+1 -e quit) - - checktest_retcode "$d" "$?" quit - - if [ "$two" != "2" ]; then - err_exit "$d failed test quit" 1 - fi -fi - -printf 'pass\n' - -base=$(basename "$exe") - -printf 'Running %s environment var tests...' "$d" - -if [ "$d" = "bc" ]; then - - export BC_ENV_ARGS=" '-l' '' -q" - - printf 's(.02893)\n' 2> /dev/null | "$exe" "$@" > /dev/null - - checktest_retcode "$d" "$?" "environment var" - - printf 'halt\n' 2> /dev/null | "$exe" "$@" -e 4 > /dev/null - - err="$?" - checktest_retcode "$d" "$?" "environment var" - - printf 'pass\n' - - printf 'Running keyword redefinition test...' - - unset BC_ENV_ARGS - - redefine_res="$outputdir/bc_outputs/redefine.txt" - redefine_out="$outputdir/bc_outputs/redefine_results.txt" - - outdir=$(dirname "$redefine_out") - - if [ ! -d "$outdir" ]; then - mkdir -p "$outdir" - fi - - printf '5\n0\n' > "$redefine_res" - - printf 'halt\n' 2> /dev/null | "$exe" "$@" --redefine=print -e 'define print(x) { x }' -e 'print(5)' > "$redefine_out" - err="$?" - - checktest "$d" "$err" "keyword redefinition" "$redefine_res" "$redefine_out" - - printf 'halt\n' 2> /dev/null | "$exe" "$@" -r "abs" -r "else" -e 'abs = 5;else = 0' -e 'abs;else' > "$redefine_out" - err="$?" - - checktest "$d" "$err" "keyword redefinition" "$redefine_res" "$redefine_out" - - if [ "$extra_math" -ne 0 ]; then - - printf 'halt\n' 2> /dev/null | "$exe" "$@" -lr abs -e "perm(5, 1)" -e "0" > "$redefine_out" - err="$?" - - checktest "$d" "$err" "keyword not redefined in builtin library" "$redefine_res" "$redefine_out" - - fi - - "$exe" "$@" -r "break" -e 'define break(x) { x }' 2> "$redefine_out" - err="$?" - - checkerrtest "$d" "$err" "keyword redefinition error" "$redefine_out" "$d" - - "$exe" "$@" -e 'define read(x) { x }' 2> "$redefine_out" - err="$?" - - checkerrtest "$d" "$err" "Keyword redefinition error without BC_REDEFINE_KEYWORDS" "$redefine_out" "$d" - - printf 'pass\n' - printf 'Running multiline comment expression file test...' - - multiline_expr_res="" - multiline_expr_out="$outputdir/bc_outputs/multiline_expr_results.txt" - - # tests/bc/misc1.txt happens to have a multiline comment in it. - printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/misc1.txt" > "$multiline_expr_out" - err="$?" - - checktest "$d" "$err" "multiline comment in expression file" "$testdir/bc/misc1_results.txt" \ - "$multiline_expr_out" - - printf 'pass\n' - printf 'Running multiline comment expression file error test...' - - printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/errors/05.txt" 2> "$multiline_expr_out" - err="$?" - - checkerrtest "$d" "$err" "multiline comment in expression file error" \ - "$multiline_expr_out" "$d" - - printf 'pass\n' - printf 'Running multiline string expression file test...' - - # tests/bc/strings.txt happens to have a multiline string in it. - printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/strings.txt" > "$multiline_expr_out" - err="$?" - - checktest "$d" "$err" "multiline string in expression file" "$testdir/bc/strings_results.txt" \ - "$multiline_expr_out" - - printf 'pass\n' - printf 'Running multiline string expression file error test...' - - printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/errors/16.txt" 2> "$multiline_expr_out" - err="$?" - - checkerrtest "$d" "$err" "multiline string in expression file with backslash error" \ - "$multiline_expr_out" "$d" - - printf 'halt\n' 2> /dev/null | "$exe" "$@" -f "$testdir/bc/errors/04.txt" 2> "$multiline_expr_out" - err="$?" - - checkerrtest "$d" "$err" "multiline string in expression file error" \ - "$multiline_expr_out" "$d" - - printf 'pass\n' - -else - - export DC_ENV_ARGS="'-x'" - export DC_EXPR_EXIT="1" - - printf '4s stuff\n' 2> /dev/null | "$exe" "$@" > /dev/null - - checktest_retcode "$d" "$?" "environment var" - - "$exe" "$@" -e 4pR > /dev/null - - checktest_retcode "$d" "$?" "environment var" - - printf 'pass\n' - - set +e - - # dc has an extra test for a case that someone found running this easter.dc - # script. It went into an infinite loop, so we want to check that we did not - # regress. - printf 'three\n' 2> /dev/null | cut -c1-3 > /dev/null - err=$? - - if [ "$err" -eq 0 ]; then - - printf 'Running dc Easter script...' - - easter_out="$outputdir/dc_outputs/easter.txt" - easter_res="$outputdir/dc_outputs/easter_results.txt" - - outdir=$(dirname "$easter_out") - - if [ ! -d "$outdir" ]; then - mkdir -p "$outdir" - fi - - printf '4 April 2021\n' > "$easter_res" - - "$testdir/dc/scripts/easter.sh" "$exe" 2021 "$@" 2> /dev/null | cut -c1-12 > "$easter_out" - err="$?" - - checktest "$d" "$err" "Easter script" "$easter_out" "$easter_res" - - printf 'pass\n' - fi - - unset DC_ENV_ARGS - unset DC_EXPR_EXIT - - printf 'Running dc extended register command tests...' - - ext_reg_out="$outputdir/dc_outputs/ext_reg.txt" - ext_reg_res="$outputdir/dc_outputs/ext_reg_results.txt" - - outdir=$(dirname "$ext_reg_out") - - if [ ! -d "$outdir" ]; then - mkdir -p "$outdir" - fi - - printf '0\n' > "$ext_reg_res" - - printf '%s\n' "$halt" | "$exe" "$@" -e "gxpR" 2> /dev/null > "$ext_reg_out" - err="$?" - - checktest "$d" "$err" "Extended register command" "$ext_reg_out" "$ext_reg_res" - - printf '1\n' > "$ext_reg_res" - - printf '%s\n' "$halt" | "$exe" "$@" -x -e "gxpR" 2> /dev/null > "$ext_reg_out" - err="$?" - - checktest "$d" "$err" "Extended register command" "$ext_reg_out" "$ext_reg_res" - - printf 'pass\n' - -fi - -out1="$outputdir/${d}_outputs/${d}_other.txt" -out2="$outputdir/${d}_outputs/${d}_other_test.txt" - -printf 'Running %s line length tests...' "$d" - -printf '%s\n' "$numres" > "$out1" - -export "$line_var"=80 -printf '%s\n' "$num" 2> /dev/null | "$exe" "$@" > "$out2" - -checktest "$d" "$?" "line length" "$out1" "$out2" - -printf '%s\n' "$num70" > "$out1" - -export "$line_var"=2147483647 -printf '%s\n' "$num" 2> /dev/null | "$exe" "$@" > "$out2" - -checktest "$d" "$?" "line length 2" "$out1" "$out2" - -printf '%s\n' "$num2" > "$out1" - -export "$line_var"=62 -printf '%s\n' "$num" 2> /dev/null | "$exe" "$@" -L > "$out2" - -checktest "$d" "$?" "line length 3" "$out1" "$out2" - -printf '0\n' > "$out1" -printf '%s\n' "$lltest" 2> /dev/null | "$exe" "$@" -L > "$out2" - -checktest "$d" "$?" "line length 3" "$out1" "$out2" - -printf 'pass\n' - -printf '%s\n' "$numres" > "$out1" -export "$line_var"=2147483647 - -printf 'Running %s arg tests...' "$d" - -f="$testdir/$d/add.txt" -exprs=$(cat "$f") -results=$(cat "$testdir/$d/add_results.txt") - -printf '%s\n%s\n%s\n%s\n' "$results" "$results" "$results" "$results" > "$out1" - -"$exe" "$@" -e "$exprs" -f "$f" --expression "$exprs" --file "$f" -e "$halt" > "$out2" - -checktest "$d" "$?" "arg" "$out1" "$out2" - -printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -- "$f" "$f" "$f" "$f" > "$out2" - -checktest "$d" "$?" "arg" "$out1" "$out2" - -if [ "$d" = "bc" ]; then - printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -i > /dev/null 2>&1 -fi - -printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -h > /dev/null -checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -P > /dev/null -checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -R > /dev/null -checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -v > /dev/null -checktest_retcode "$d" "$?" "arg" -printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -V > /dev/null -checktest_retcode "$d" "$?" "arg" - -out=$(printf '0.1\n-0.1\n1.1\n-1.1\n0.1\n-0.1\n') -printf '%s\n' "$out" > "$out1" - -if [ "$d" = "bc" ]; then - data=$(printf '0.1\n-0.1\n1.1\n-1.1\n.1\n-.1\n') -else - data=$(printf '0.1pR\n_0.1pR\n1.1pR\n_1.1pR\n.1pR\n_.1pR\n') -fi - -printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" -z > "$out2" -checktest "$d" "$?" "leading zero" "$out1" "$out2" - -if [ "$d" = "bc" ] && [ "$extra_math" -ne 0 ]; then - - printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" -lz "$testdir/bc/leadingzero.txt" > "$out2" - - checktest "$d" "$?" "leading zero script" "$testdir/bc/leadingzero_results.txt" "$out2" - -fi - -"$exe" "$@" -f "saotehasotnehasthistohntnsahxstnhalcrgxgrlpyasxtsaosysxsatnhoy.txt" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "invalid file argument" "$out2" "$d" - -"$exe" "$@" "-$opt" -e "$exprs" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "invalid option argument" "$out2" "$d" - -"$exe" "$@" "--$lopt" -e "$exprs" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "invalid long option argument" "$out2" "$d" - -"$exe" "$@" "-u" -e "$exprs" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "unrecognized option argument" "$out2" "$d" - -"$exe" "$@" "--uniform" -e "$exprs" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "unrecognized long option argument" "$out2" "$d" - -"$exe" "$@" -f > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "missing required argument to short option" "$out2" "$d" - -"$exe" "$@" --file > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "missing required argument to long option" "$out2" "$d" - -"$exe" "$@" --version=5 > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "given argument to long option with no argument" "$out2" "$d" - -"$exe" "$@" -: > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "colon short option" "$out2" "$d" - -"$exe" "$@" --: > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "colon long option" "$out2" "$d" - -printf 'pass\n' - -printf 'Running %s builtin variable arg tests...' "$d" - -if [ "$extra_math" -ne 0 ]; then - - out=$(printf '14\n15\n16\n17.25\n') - printf '%s\n' "$out" > "$out1" - - if [ "$d" = "bc" ]; then - data=$(printf 's=scale;i=ibase;o=obase;t=seed@2;ibase=A;obase=A;s;i;o;t;') - else - data=$(printf 'J2@OIKAiAopRpRpRpR') - fi - - printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" -S14 -I15 -O16 -E17.25 > "$out2" - checktest "$d" "$?" "builtin variable args" "$out1" "$out2" - - printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" --scale=14 --ibase=15 --obase=16 --seed=17.25 > "$out2" - checktest "$d" "$?" "builtin variable long args" "$out1" "$out2" - -else - - out=$(printf '14\n15\n16\n') - printf '%s\n' "$out" > "$out1" - - if [ "$d" = "bc" ]; then - data=$(printf 's=scale;i=ibase;o=obase;ibase=A;obase=A;s;i;o;') - else - data=$(printf 'OIKAiAopRpRpR') - fi - - printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" -S14 -I15 -O16 > "$out2" - checktest "$d" "$?" "builtin variable args" "$out1" "$out2" - - printf '%s\n' "$data" 2> /dev/null | "$exe" "$@" --scale=14 --ibase=15 --obase=16 > "$out2" - checktest "$d" "$?" "builtin variable long args" "$out1" "$out2" - -fi - -if [ "$d" = "bc" ]; then - - out=$(printf '100\n') - printf '%s\n' "$out" > "$out1" - - printf 'scale\n' 2> /dev/null | "$exe" "$@" -S100 -l > "$out2" - checktest "$d" "$?" "builtin variable args with math lib" "$out1" "$out2" - - printf 'scale\n' 2> /dev/null | "$exe" "$@" --scale=100 --mathlib > "$out2" - checktest "$d" "$?" "builtin variable long args with math lib" "$out1" "$out2" - - export BC_ENV_ARGS="-l" - - printf 'scale\n' 2> /dev/null | "$exe" "$@" -S100 > "$out2" - checktest "$d" "$?" "builtin variable args with math lib env arg" "$out1" "$out2" - - printf 'scale\n' 2> /dev/null | "$exe" "$@" --scale=100 > "$out2" - checktest "$d" "$?" "builtin variable long args with math lib env arg" "$out1" "$out2" - - export BC_ENV_ARGS="-S100" - - printf 'scale\n' 2> /dev/null | "$exe" "$@" -l > "$out2" - checktest "$d" "$?" "builtin variable args with math lib arg" "$out1" "$out2" - - export BC_ENV_ARGS="--scale=100" - - printf 'scale\n' 2> /dev/null | "$exe" "$@" -l > "$out2" - checktest "$d" "$?" "builtin variable long args with math lib arg" "$out1" "$out2" - -fi - -printf 'scale\n' 2> /dev/null | "$exe" "$@" --scale=18923c.rlg > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "invalid command-line arg for builtin variable" "$out2" "$d" - -if [ "$extra_math" -ne 0 ]; then - - printf 'seed\n' 2> /dev/null | "$exe" "$@" --seed=18923c.rlg > /dev/null 2> "$out2" - err="$?" - - checkerrtest "$d" "$err" "invalid command-line arg for seed" "$out2" "$d" - -fi - -printf 'pass\n' - -printf 'Running %s directory test...' "$d" - -"$exe" "$@" "$testdir" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "directory" "$out2" "$d" - -printf 'pass\n' - -printf 'Running %s binary file test...' "$d" - -bin="/bin/sh" - -"$exe" "$@" "$bin" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "binary file" "$out2" "$d" - -printf 'pass\n' - -printf 'Running %s binary stdin test...' "$d" - -cat "$bin" 2> /dev/null | "$exe" "$@" > /dev/null 2> "$out2" -err="$?" - -checkerrtest "$d" "$err" "binary stdin" "$out2" "$d" - -printf 'pass\n' - -if [ "$d" = "bc" ]; then - - printf 'Running %s limits tests...' "$d" - printf 'limits\n' 2> /dev/null | "$exe" "$@" /dev/null > "$out2" 2>&1 - - checktest_retcode "$d" "$?" "limits" - - if [ ! -s "$out2" ]; then - err_exit "$d did not produce output on the limits test" 1 - fi - - exec printf 'pass\n' - -fi diff --git a/tests/read.sh b/tests/read.sh deleted file mode 100755 index fd4b9b6721a..00000000000 --- a/tests/read.sh +++ /dev/null @@ -1,166 +0,0 @@ -#! /bin/sh -# -# SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -set -e - -script="$0" -testdir=$(dirname "$script") - -. "$testdir/../scripts/functions.sh" - -outputdir=${BC_TEST_OUTPUT_DIR:-$testdir} - -# Just print the usage and exit with an error. This can receive a message to -# print. -# @param 1 A message to print. -usage() { - if [ $# -eq 1 ]; then - printf '%s\n\n' "$1" - fi - printf 'usage: %s dir [exe [args...]]\n' "$script" - printf 'valid dirs are:\n' - printf '\n' - cat "$testdir/all.txt" - printf '\n' - exit 1 -} - -# Command-line processing. -if [ "$#" -lt 1 ]; then - usage "Not enough arguments" -fi - -d="$1" -shift -check_d_arg "$d" - -if [ "$#" -gt 0 ]; then - exe="$1" - shift - check_exec_arg "$exe" -else - exe="$testdir/../bin/$d" - check_exec_arg "$exe" -fi - -name="$testdir/$d/read.txt" -results="$testdir/$d/read_results.txt" -errors="$testdir/$d/read_errors.txt" - -out="$outputdir/${d}_outputs/read_results.txt" -multiple_res="$outputdir/${d}_outputs/read_multiple_results.txt" -outdir=$(dirname "$out") - -# Make sure the directory exists. -if [ ! -d "$outdir" ]; then - mkdir -p "$outdir" -fi - -exebase=$(basename "$exe") - -# Set stuff for the correct calculator. -if [ "$d" = "bc" ]; then - options="-lq" - halt="halt" - read_call="read()" - read_expr="${read_call}\n5+5;" - read_multiple=$(printf '%s\n%s\n%s\n' "3" "2" "1") -else - options="-x" - halt="q" - read_call="?" - read_expr="${read_call}" - read_multiple=$(printf '%spR\n%spR\n%spR\n' "3" "2" "1") -fi - -# I use these, so unset them to make the tests work. -unset BC_ENV_ARGS -unset BC_LINE_LENGTH -unset DC_ENV_ARGS -unset DC_LINE_LENGTH - -printf 'Running %s read...' "$d" - -set +e - -# Run read() on every line. -while read line; do - - printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$@" "$options" > "$out" - checktest "$d" "$?" 'read' "$results" "$out" - -done < "$name" - -printf 'pass\n' - -printf 'Running %s read multiple...' "$d" - -printf '3\n2\n1\n' > "$multiple_res" - -# Run multiple read() calls. -printf '%s\n' "$read_multiple" | "$exe" "$@" "$options" -e "$read_call" -e "$read_call" -e "$read_call" > "$out" -checktest "$d" "$?" 'read multiple' "$multiple_res" "$out" - -printf 'pass\n' - -printf 'Running %s read errors...' "$d" - -# Run read on every line. -while read line; do - - printf '%s\n%s\n' "$read_call" "$line" | "$exe" "$@" "$options" 2> "$out" > /dev/null - err="$?" - - checkerrtest "$d" "$err" "$line" "$out" "$exebase" - -done < "$errors" - -printf 'pass\n' - -printf 'Running %s empty read...' "$d" - -read_test=$(printf '%s\n' "$read_call") - -printf '%s\n' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null -err="$?" - -checkerrtest "$d" "$err" "$read_test" "$out" "$exebase" - -printf 'pass\n' - -printf 'Running %s read EOF...' "$d" - -read_test=$(printf '%s' "$read_call") - -printf '%s' "$read_test" | "$exe" "$@" "$opts" 2> "$out" > /dev/null -err="$?" - -checkerrtest "$d" "$err" "$read_test" "$out" "$exebase" - -exec printf 'pass\n' diff --git a/tests/script.sh b/tests/script.sh index b1346ef0990..ce5cf19ee27 100755 --- a/tests/script.sh +++ b/tests/script.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -44,7 +44,7 @@ usage() { if [ $# -eq 1 ]; then printf '%s\n\n' "$1" fi - printf 'usage: %s dir script [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script" + printf 'usage: %s dir script [run_extra_tests] [run_stack_tests] [generate_tests] [exec args...]\n' "$script" exit 1 } @@ -90,15 +90,6 @@ else check_bool_arg "$generate" fi -if [ "$#" -gt 0 ]; then - time_tests="$1" - shift - check_bool_arg "$time_tests" -else - time_tests=0 - check_bool_arg "$generate" -fi - if [ "$#" -gt 0 ]; then exe="$1" shift @@ -209,16 +200,8 @@ set +e printf 'Running %s script %s...' "$d" "$f" -# Yes this is poor timing, but it works. -if [ "$time_tests" -ne 0 ]; then - printf '\n' - printf '%s\n' "$halt" 2> /dev/null | /usr/bin/time -p "$exe" "$@" $options "$s" > "$out" - err="$?" - printf '\n' -else - printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $options "$s" > "$out" - err="$?" -fi +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $options "$s" > "$out" +err="$?" checktest "$d" "$err" "script $f" "$res" "$out" diff --git a/tests/scripts.sh b/tests/scripts.sh index 2c8af6c06df..eb2963e4a9e 100755 --- a/tests/scripts.sh +++ b/tests/scripts.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -40,7 +40,7 @@ usage() { if [ $# -eq 1 ]; then printf '%s\n\n' "$1" fi - printf 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script" + printf 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [generate_tests] [exec args...]\n' "$script" exit 1 } @@ -95,15 +95,6 @@ else check_bool_arg "$generate" fi -if [ "$#" -gt 0 ]; then - time_tests="$1" - shift - check_bool_arg "$time_tests" -else - time_tests=0 - check_bool_arg "$time_tests" -fi - if [ "$#" -gt 0 ]; then exe="$1" shift @@ -124,11 +115,11 @@ for s in $scripts; do if [ "$pll" -ne 0 ]; then sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \ - "$generate" "$time_tests" "$exe" "$@" & + "$generate" "$exe" "$@" & pids="$pids $!" else sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \ - "$generate" "$time_tests" "$exe" "$@" + "$generate" "$exe" "$@" fi done diff --git a/tests/stdin.sh b/tests/stdin.sh index 7061e950367..ba56606b18c 100755 --- a/tests/stdin.sh +++ b/tests/stdin.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: diff --git a/tests/test.sh b/tests/test.sh index 7b5916f0299..3dd3e19963f 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: BSD-2-Clause # -# Copyright (c) 2018-2024 Gavin D. Howard and contributors. +# Copyright (c) 2018-2025 Gavin D. Howard and contributors. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: @@ -44,7 +44,7 @@ usage() { if [ $# -eq 1 ]; then printf '%s\n\n' "$1" fi - printf 'usage: %s dir test [generate_tests] [time_tests] [exe [args...]]\n' "$0" + printf 'usage: %s dir test [generate_tests] [exe [args...]]\n' "$0" printf 'valid dirs are:\n' printf '\n' cat "$testdir/all.txt" @@ -77,15 +77,6 @@ else check_bool_arg "$generate_tests" fi -if [ "$#" -gt 0 ]; then - time_tests="$1" - shift - check_bool_arg "$time_tests" -else - time_tests=0 - check_bool_arg "$time_tests" -fi - if [ "$#" -gt 0 ]; then exe="$1" shift @@ -155,15 +146,8 @@ set +e printf 'Running %s %s...' "$d" "$t" -if [ "$time_tests" -ne 0 ]; then - printf '\n' - printf '%s\n' "$halt" 2> /dev/null | /usr/bin/time -p "$exe" "$@" $options "$name" > "$out" - err="$?" - printf '\n' -else - printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $options "$name" > "$out" - err="$?" -fi +printf '%s\n' "$halt" 2> /dev/null | "$exe" "$@" $options "$name" > "$out" +err="$?" checktest "$d" "$err" "$t" "$results" "$out" diff --git a/vs/bc.vcxproj b/vs/bc.vcxproj index c98ebc6eee5..baffabbb2b4 100644 --- a/vs/bc.vcxproj +++ b/vs/bc.vcxproj @@ -204,7 +204,6 @@ - diff --git a/vs/bc.vcxproj.filters b/vs/bc.vcxproj.filters index f26387253f2..caa30d9c7fa 100644 --- a/vs/bc.vcxproj.filters +++ b/vs/bc.vcxproj.filters @@ -66,9 +66,6 @@ include - - include - include diff --git a/vs/bcl.vcxproj b/vs/bcl.vcxproj index f838cac7cbd..96bd3ba2a55 100644 --- a/vs/bcl.vcxproj +++ b/vs/bcl.vcxproj @@ -256,7 +256,6 @@ - diff --git a/vs/bcl.vcxproj.filters b/vs/bcl.vcxproj.filters index b62d1899e2b..ae3d24125dd 100644 --- a/vs/bcl.vcxproj.filters +++ b/vs/bcl.vcxproj.filters @@ -80,9 +80,6 @@ include - - include - include