Date: Tue, 30 Nov 2021 17:45:30 GMT From: =?utf-8?Q?Stefan E=C3=9Fer?= <se@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: 10041e99a0c2 - main - contrib/bc: merge version 5.2.1 from vendor branch Message-ID: <202111301745.1AUHjULo048271@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by se: URL: https://cgit.FreeBSD.org/src/commit/?id=10041e99a0c29c9f99c4148fc173bb12dd26aa8d commit 10041e99a0c29c9f99c4148fc173bb12dd26aa8d Merge: 439da7f06dce e63540eed295 Author: Stefan Eßer <se@FreeBSD.org> AuthorDate: 2021-11-30 17:40:32 +0000 Commit: Stefan Eßer <se@FreeBSD.org> CommitDate: 2021-11-30 17:40:32 +0000 contrib/bc: merge version 5.2.1 from vendor branch Merge commit 'e63540eed295749528548c2e3a90f5a6e57275c8' contrib/bc/Makefile.in | 204 +++++++++++++++++++-------------- contrib/bc/NEWS.md | 20 ++++ contrib/bc/README.md | 60 +++++++--- contrib/bc/bcl.pc.in | 8 ++ contrib/bc/configure.sh | 200 ++++++++++++++++++++++++-------- contrib/bc/gen/bc_help.txt | 7 ++ contrib/bc/gen/dc_help.txt | 7 ++ contrib/bc/include/status.h | 12 ++ contrib/bc/include/version.h | 2 +- contrib/bc/include/vm.h | 6 + contrib/bc/locales/de_DE.ISO8859-1.msg | 10 +- contrib/bc/locales/de_DE.UTF-8.msg | 10 +- contrib/bc/locales/en_US.msg | 10 +- contrib/bc/locales/es_ES.ISO8859-1.msg | 10 +- contrib/bc/locales/es_ES.UTF-8.msg | 10 +- contrib/bc/locales/fr_FR.ISO8859-1.msg | 10 +- contrib/bc/locales/fr_FR.UTF-8.msg | 10 +- contrib/bc/locales/ja_JP.UTF-8.msg | 10 +- contrib/bc/locales/ja_JP.eucJP.msg | 10 +- contrib/bc/locales/nl_NL.ISO8859-1.msg | 10 +- contrib/bc/locales/nl_NL.UTF-8.msg | 10 +- contrib/bc/locales/pl_PL.ISO8859-2.msg | 10 +- contrib/bc/locales/pl_PL.UTF-8.msg | 10 +- contrib/bc/locales/pt_PT.ISO8859-1.msg | 10 +- contrib/bc/locales/pt_PT.UTF-8.msg | 10 +- contrib/bc/locales/ru_RU.CP1251.msg | 10 +- contrib/bc/locales/ru_RU.CP866.msg | 10 +- contrib/bc/locales/ru_RU.ISO8859-5.msg | 10 +- contrib/bc/locales/ru_RU.KOI8-R.msg | 10 +- contrib/bc/locales/ru_RU.UTF-8.msg | 10 +- contrib/bc/locales/zh_CN.GB18030.msg | 10 +- contrib/bc/locales/zh_CN.GB2312.msg | 10 +- contrib/bc/locales/zh_CN.GBK.msg | 10 +- contrib/bc/locales/zh_CN.UTF-8.msg | 10 +- contrib/bc/locales/zh_CN.eucCN.msg | 10 +- contrib/bc/manuals/bc/A.1 | 13 +++ contrib/bc/manuals/bc/A.1.md | 11 ++ contrib/bc/manuals/bc/E.1 | 13 +++ contrib/bc/manuals/bc/E.1.md | 11 ++ contrib/bc/manuals/bc/EH.1 | 13 +++ contrib/bc/manuals/bc/EH.1.md | 11 ++ contrib/bc/manuals/bc/EHN.1 | 13 +++ contrib/bc/manuals/bc/EHN.1.md | 11 ++ contrib/bc/manuals/bc/EN.1 | 13 +++ contrib/bc/manuals/bc/EN.1.md | 11 ++ contrib/bc/manuals/bc/H.1 | 13 +++ contrib/bc/manuals/bc/H.1.md | 11 ++ contrib/bc/manuals/bc/HN.1 | 13 +++ contrib/bc/manuals/bc/HN.1.md | 11 ++ contrib/bc/manuals/bc/N.1 | 13 +++ contrib/bc/manuals/bc/N.1.md | 11 ++ contrib/bc/manuals/build.md | 17 +++ contrib/bc/manuals/dc/A.1 | 13 +++ contrib/bc/manuals/dc/A.1.md | 11 ++ contrib/bc/manuals/dc/E.1 | 13 +++ contrib/bc/manuals/dc/E.1.md | 11 ++ contrib/bc/manuals/dc/EH.1 | 13 +++ contrib/bc/manuals/dc/EH.1.md | 11 ++ contrib/bc/manuals/dc/EHN.1 | 13 +++ contrib/bc/manuals/dc/EHN.1.md | 11 ++ contrib/bc/manuals/dc/EN.1 | 13 +++ contrib/bc/manuals/dc/EN.1.md | 11 ++ contrib/bc/manuals/dc/H.1 | 13 +++ contrib/bc/manuals/dc/H.1.md | 11 ++ contrib/bc/manuals/dc/HN.1 | 13 +++ contrib/bc/manuals/dc/HN.1.md | 11 ++ contrib/bc/manuals/dc/N.1 | 13 +++ contrib/bc/manuals/dc/N.1.md | 11 ++ contrib/bc/scripts/exec-install.sh | 9 +- contrib/bc/scripts/karatsuba.py | 7 +- contrib/bc/src/args.c | 2 + contrib/bc/src/bc_lex.c | 2 + contrib/bc/src/bc_parse.c | 49 +++++--- contrib/bc/src/data.c | 3 +- contrib/bc/src/dc_lex.c | 2 + contrib/bc/src/dc_parse.c | 5 +- contrib/bc/src/file.c | 37 +++++- contrib/bc/src/history.c | 95 +++++++++++---- contrib/bc/src/lex.c | 17 ++- contrib/bc/src/library.c | 18 ++- contrib/bc/src/opt.c | 2 +- contrib/bc/src/parse.c | 14 +-- contrib/bc/src/program.c | 53 ++++++++- contrib/bc/src/rand.c | 11 +- contrib/bc/src/read.c | 4 + contrib/bc/src/vm.c | 68 +++++++---- contrib/bc/tests/bc/all.txt | 1 + contrib/bc/tests/bc/misc8.txt | 8 ++ contrib/bc/tests/bc/misc8_results.txt | 3 + contrib/bc/tests/bc/posix_errors.txt | 1 + contrib/bc/tests/bc/timeconst.sh | 1 - contrib/bc/tests/history.py | 3 +- contrib/bc/tests/history.sh | 2 +- contrib/bc/vs/bc.vcxproj | 8 +- 94 files changed, 1241 insertions(+), 361 deletions(-) diff --cc contrib/bc/README.md index c46d66b7e3ea,000000000000..259ab923bfc4 mode 100644,000000..100644 --- a/contrib/bc/README.md +++ b/contrib/bc/README.md @@@ -1,419 -1,0 +1,441 @@@ +# `bc` + +***WARNING: This project has moved to [https://git.yzena.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 +flavor of `bc`. + +For more information, see this `bc`'s full manual. + +This `bc` also includes an implementation of `dc` in the same binary, accessible +via a symbolic link, which implements all FreeBSD and GNU extensions. (If a +standalone `dc` binary is desired, `bc` can be copied and renamed to `dc`.) The +`!` command is omitted; I believe this poses security concerns and that such +functionality is unnecessary. + +For more information, see the `dc`'s full manual. + +This `bc` also provides `bc`'s math as a library with C bindings, called `bcl`. + +For more information, see the full manual for `bcl`. + +## License + +This `bc` is Free and Open Source Software (FOSS). It is offered under the BSD +2-clause License. Full license text may be found in the [`LICENSE.md`][4] file. + +## Prerequisites + +This `bc` only requires either: + +1. Windows 10 or later, or +2. A C99-compatible compiler and a (mostly) POSIX 2008-compatible system with + the XSI (X/Open System Interfaces) option group. + +Since POSIX 2008 with XSI requires the existence of a C99 compiler as `c99`, any +POSIX and XSI-compatible system will have everything needed. + +POSIX-compatible systems that are known to work: + +* Linux +* FreeBSD +* OpenBSD +* NetBSD +* Mac OSX +* Solaris* (as long as the Solaris version supports POSIX 2008) +* AIX +* HP-UX* (except for history) + +In addition, there is compatibility code to make this `bc` work on Windows. + +Please submit bug reports if this `bc` does not build out of the box on any +system. + +## Build + +This `bc` should build unmodified on any POSIX-compliant system or on Windows +starting with Windows 10 (though earlier versions may work). + - For more complex build requirements than the ones below, see the - [build manual][5]. ++For more complex build requirements than the ones below, see the [build ++manual][5]. + +### Windows + +There is no guarantee that this `bc` will work on any version of Windows earlier +than Windows 10 (I cannot test on earlier versions), but it is guaranteed to +work on Windows 10 at least. + +Also, if building with MSBuild, the MSBuild bundled with Visual Studio is +required. + +**Note**: Unlike the POSIX-compatible platforms, only one build configuration is +supported on Windows: extra math and prompt enabled, history and NLS (locale +support) disabled, with both calculators built. + +#### `bc` + - To build `bc`, you can open the `bc.sln` file in Visual Studio, select the ++To build `bc`, you can open the `vs/bc.sln` file in Visual Studio, select the +configuration, and build. + +You can also build using MSBuild with the following from the root directory: + +``` - msbuild -property:Configuration=<config> bc.sln ++msbuild -property:Configuration=<config> vs/bc.sln +``` + +where `<config>` is either one of `Debug` or `Release`. + ++On Windows, the calculators are built as `vs/bin/<platform>/<config>/bc.exe` and ++`vs/bin/<Platform>/<Config>/dc.exe`, where `<platform>` can be either `Win32` or ++`x64`, and `<config>` can be `Debug` or `Release`. ++ ++**Note**: On Windows, `dc.exe` is just copied from `bc.exe`; it is not linked. ++Patches are welcome for a way to do that. ++ +#### `bcl` (Library) + - To build the library, you can open the `bcl.sln` file in Visual Studio, select - the configuration, and build. ++To build the library, you can open the `vs/bcl.sln` file in Visual Studio, ++select the configuration, and build. + +You can also build using MSBuild with the following from the root directory: + +``` - msbuild -property:Configuration=<config> bcl.sln ++msbuild -property:Configuration=<config> vs/bcl.sln +``` + - where `<config>` is either one of `Debug` or `Release`. ++where `<config>` is either one of `Debug`, `ReleaseMD`, or `ReleaseMT`. ++ ++On Windows, the library is built as `vs/lib/<platform>/<config>/bcl.lib`, where ++`<platform>` can be either `Win32` or `x64`, and `<config>` can be `Debug`, ++`ReleaseMD`, or `ReleaseMT`. + +### POSIX-Compatible Systems + +On POSIX-compatible systems, `bc` is built as `bin/bc` and `dc` is built as - `bin/dc` by default. On Windows, they are built as `Release/bc/bc.exe` and - `Release/bc/dc.exe`. - - **Note**: On Windows, `dc.exe` is just copied from `bc.exe`; it is not linked. - Patches are welcome for a way to do that. ++`bin/dc` by default. + +#### Default + +For the default build with optimization, use the following commands in the root +directory: + +``` +./configure.sh -O3 +make +``` + +#### One Calculator + +To only build `bc`, use the following commands: + +``` +./configure.sh --disable-dc +make +``` + +To only build `dc`, use the following commands: + +``` +./configure.sh --disable-bc +make +``` + +#### Debug + +For debug builds, use the following commands in the root directory: + +``` +./configure.sh -g +make +``` + +#### Install + +To install, use the following command: + +``` +make install +``` + +By default, `bc` and `dc` will be installed in `/usr/local`. For installing in +other locations, use the `PREFIX` environment variable when running +`configure.sh` or pass the `--prefix=<prefix>` option to `configure.sh`. See the +[build manual][5], or run `./configure.sh --help`, for more details. + +#### Library + +This `bc` does provide a way to build a math library with C bindings. This is +done by the `-a` or `--library` options to `configure.sh`: + +``` +./configure.sh -a +``` + +When building the library, the executables are not built. For more information, +see the [build manual][5]. + +The library API can be found in [`manuals/bcl.3.md`][26] or `man bcl` once the +library is installed. + +The library is built as `bin/libbcl.a` on POSIX-compatible systems or as +`Release/bcl/bcl.lib` on Windows. + +#### Package and Distro Maintainers + ++This section is for package and distro maintainers. ++ ++##### Out-of-Source Builds ++ ++Out-of-source builds are supported; just call `configure.sh` from the directory ++where the actual build will happen. ++ ++For example, if the source is in `bc`, the build should happen in `build`, then ++call `configure.sh` and `make` like so: ++ ++``` ++../bc/configure.sh ++make ++``` ++ ++***WARNING***: The path to `configure.sh` from the build directory must not have ++spaces because `make` does not support target names with spaces. ++ +##### Recommended Compiler + +When I ran benchmarks with my `bc` compiled under `clang`, it performed much +better than when compiled under `gcc`. I recommend compiling this `bc` with +`clang`. + +I also recommend building this `bc` with C11 if you can because `bc` will detect +a C11 compiler and add `_Noreturn` to any relevant function(s). + +##### Recommended Optimizations + +I wrote this `bc` with Separation of Concerns, which means that there are many +small functions that could be inlined. However, they are often called across +file boundaries, and the default optimizer can only look at the current file, +which means that they are not inlined. + +Thus, because of the way this `bc` is built, it will automatically be slower +than other `bc` implementations when running scripts with no math. (My `bc`'s +math is *much* faster, so any non-trivial script should run faster in my `bc`.) + +Some, or all, of the difference can be made up with the right optimizations. The +optimizations I recommend are: + +1. `-O3` +2. `-flto` (link-time optimization) + +in that order. + +Link-time optimization, in particular, speeds up the `bc` a lot. This is because +when link-time optimization is turned on, the optimizer can look across files +and inline *much* more heavily. + +However, I recommend ***NOT*** using `-march=native`. Doing so will reduce this +`bc`'s performance, at least when building with link-time optimization. See the +[benchmarks][19] for more details. + +##### Stripping Binaries + +By default, non-debug binaries are stripped, but stripping can be disabled with +the `-T` option to `configure.sh`. + +##### Using This `bc` as an Alternative + +If this `bc` is packaged as an alternative to an already existing `bc` package, +it is possible to rename it in the build to prevent name collision. To prepend +to the name, just run the following: + +``` +EXECPREFIX=<some_prefix> ./configure.sh +``` + +To append to the name, just run the following: + +``` +EXECSUFFIX=<some_suffix> ./configure.sh +``` + +If a package maintainer wishes to add both a prefix and a suffix, that is +allowed. + +**Note**: The suggested name (and package name) when `bc` is not available is +`bc-gh`. + +##### Karatsuba Number + +Package and distro maintainers have one tool at their disposal to build this +`bc` in the optimal configuration: `scripts/karatsuba.py`. + +This script is not a compile-time or runtime prerequisite; it is for package and +distro maintainers to run once when a package is being created. It finds the +optimal Karatsuba number (see the [algorithms manual][7] for more information) +for the machine that it is running on. + +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. + +## Status + +This `bc` is robust. + +It is well-tested, fuzzed, and fully standards-compliant (though not certified) +with POSIX `bc`. The math has been tested with 40+ million random problems, so +it is as correct as I can make it. + +This `bc` can be used as a drop-in replacement for any existing `bc`. This `bc` +is also compatible with MinGW toolchains, though history is not supported on +Windows. + +In addition, this `bc` is considered complete; i.e., there will be no more +releases with additional features. However, it *is* actively maintained, so if +any bugs are found, they will be fixed in new releases. Also, additional +translations will also be added as they are provided. + +### Development + +If I (Gavin D. Howard) get [hit by a bus][27] and future programmers need to +handle work themselves, the best place to start is the [Development manual][28]. + +## Vim Syntax + +I have developed (using other people's code to start) [`vim` syntax files][17] +for this `bc` and `dc`, including the extensions. + +## `bc` Libs + +I have gathered some excellent [`bc` and `dc` libraries][18]. These libraries +may prove useful to any serious users. + +## Comparison to GNU `bc` + +This `bc` compares favorably to GNU `bc`. + +* This `bc` builds natively on Windows. +* It has more extensions, which make this `bc` more useful for scripting. +* This `bc` is a bit more POSIX compliant. +* It has a much less buggy parser. The GNU `bc` will give parse errors for what + is actually valid `bc` code, or should be. For example, putting an `else` on + a new line after a brace can cause GNU `bc` to give a parse error. +* This `bc` has fewer crashes. +* GNU `bc` calculates the wrong number of significant digits for `length(x)`. +* GNU `bc` will sometimes print numbers incorrectly. For example, when running + it on the file `tests/bc/power.txt` in this repo, GNU `bc` gets all the right + answers, but it fails to wrap the numbers at the proper place when outputting + to a file. +* This `bc` is faster. (See [Performance](#performance).) + +### Performance + +Because this `bc` packs more than `1` decimal digit per hardware integer, this +`bc` is faster than GNU `bc` and can be *much* faster. Full benchmarks can be +found at [manuals/benchmarks.md][19]. + +There is one instance where this `bc` is slower: if scripts are light on math. +This is because this `bc`'s intepreter is slightly slower than GNU `bc`, but +that is because it is more robust. See the [benchmarks][19]. + +## Algorithms + +To see what algorithms this `bc` uses, see the [algorithms manual][7]. + +## Locales + +Currently, there is no locale support on Windows. + +Additionally, this `bc` only has support for English (and US English), French, +German, Portuguese, Dutch, Polish, Russian, Japanese, and Chinese locales. +Patches are welcome for translations; use the existing `*.msg` files in +`locales/` as a starting point. + +In addition, patches for improvements are welcome; the last two messages in +Portuguese were made with Google Translate, and the Dutch, Polish, Russian, +Japanese, and Chinese locales were all generated with [DeepL][22]. + +The message files provided assume that locales apply to all regions where a +language is used, but this might not be true for, e.g., `fr_CA` and `fr_CH`. +Any corrections or a confirmation that the current texts are acceptable for +those regions would be appreciated, too. + +## Other Projects + +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. + +## Language + +This `bc` is written in pure ISO C99, using POSIX 2008 APIs with custom Windows +compatibility code. + +## Commit Messages + +This `bc` uses the commit message guidelines laid out in [this blog post][10]. + +## Semantic Versioning + +This `bc` uses [semantic versioning][11]. + +## Contents + +Items labeled with `(maintainer use only)` are not included in release source +tarballs. + +Files: + + .gitignore The git ignore file (maintainer use only). + .gitattributes The git attributes file (maintainer use only). - bc.sln The Visual Studio solution file for bc. - bc.vcxproj The Visual Studio project file for bc. - bc.vcxproj.filters The Visual Studio filters file for bc. - bcl.sln The Visual Studio solution file for bcl. - bcl.vcxproj The Visual Studio project file for bcl. - bcl.vcxproj.filters The Visual Studio filters file for bcl. ++ bcl.pc.in A template pkg-config file for bcl. + 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. + RELEASE.md A checklist for making a release (maintainer use only). + +Folders: + + gen The bc math library, help texts, and code to generate C source. + include All header files. + locales Locale files, in .msg format. Patches welcome for translations. + manuals Manuals for both programs. + src All source code. + scripts A bunch of shell scripts to help with development and building. + tests All tests. ++ vs Files needed for the build on Windows. + +[1]: https://www.gnu.org/software/bc/ +[4]: ./LICENSE.md +[5]: ./manuals/build.md +[7]: ./manuals/algorithms.md +[8]: https://git.busybox.net/busybox/tree/miscutils/bc.c +[9]: https://github.com/landley/toybox/blob/master/toys/pending/bc.c +[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 +[19]: ./manuals/benchmarks.md +[20]: https://git.yzena.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 +[24]: https://bugs.freebsd.org/ +[25]: https://reviews.freebsd.org/ +[26]: ./manuals/bcl.3.md +[27]: https://en.wikipedia.org/wiki/Bus_factor +[28]: ./manuals/development.md diff --cc contrib/bc/bcl.pc.in index 000000000000,f440eeca950f..f440eeca950f mode 000000,100644..100644 --- a/contrib/bc/bcl.pc.in +++ b/contrib/bc/bcl.pc.in diff --cc contrib/bc/tests/bc/misc8.txt index 000000000000,8bef63316ef8..8bef63316ef8 mode 000000,100644..100644 --- a/contrib/bc/tests/bc/misc8.txt +++ b/contrib/bc/tests/bc/misc8.txt diff --cc contrib/bc/tests/bc/misc8_results.txt index 000000000000,daee0f1b2fbf..daee0f1b2fbf mode 000000,100644..100644 --- a/contrib/bc/tests/bc/misc8_results.txt +++ b/contrib/bc/tests/bc/misc8_results.txt
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202111301745.1AUHjULo048271>