xref: /freebsd/contrib/bc/README.md (revision 90b5fc95832da64a5f56295e687379732c33718f)
1# `bc`
2
3[![Coverity Scan Build Status][17]][18]
4
5***WARNING: This project has moved to [https://git.yzena.com/][20] for [these
6reasons][21], though GitHub will remain a mirror.***
7
8This is an implementation of the [POSIX `bc` calculator][12] that implements
9[GNU `bc`][1] extensions, as well as the period (`.`) extension for the BSD
10flavor of `bc`.
11
12For more information, see this `bc`'s full manual.
13
14This `bc` also includes an implementation of `dc` in the same binary, accessible
15via a symbolic link, which implements all FreeBSD and GNU extensions. (If a
16standalone `dc` binary is desired, `bc` can be copied and renamed to `dc`.) The
17`!` command is omitted; I believe this poses security concerns and that such
18functionality is unnecessary.
19
20For more information, see the `dc`'s full manual.
21
22This `bc` is Free and Open Source Software (FOSS). It is offered under the BSD
232-clause License. Full license text may be found in the [`LICENSE.md`][4] file.
24
25## Prerequisites
26
27This `bc` only requires a C99-compatible compiler and a (mostly) POSIX
282008-compatible system with the XSI (X/Open System Interfaces) option group.
29
30Since POSIX 2008 with XSI requires the existence of a C99 compiler as `c99`, any
31POSIX and XSI-compatible system will have everything needed.
32
33Systems that are known to work:
34
35* Linux
36* FreeBSD
37* OpenBSD
38* NetBSD
39* Mac OSX
40* Solaris* (as long as the Solaris version supports POSIX 2008)
41* AIX
42* HP-UX* (except for history)
43
44Please submit bug reports if this `bc` does not build out of the box on any
45system besides Windows. If Windows binaries are needed, they can be found at
46[xstatic][6].
47
48## Build
49
50This `bc` should build unmodified on any POSIX-compliant system.
51
52For more complex build requirements than the ones below, see the
53[build manual][5].
54
55### Pre-built Binaries
56
57It is possible to download pre-compiled binaries for a wide list of platforms,
58including Linux- and Windows-based systems, from [xstatic][6]. This link always
59points to the latest release of `bc`.
60
61### Default
62
63For the default build with optimization, use the following commands in the root
64directory:
65
66```
67./configure.sh -O3
68make
69```
70
71### One Calculator
72
73To only build `bc`, use the following commands:
74
75```
76./configure.sh --disable-dc
77make
78```
79
80To only build `dc`, use the following commands:
81
82```
83./configure.sh --disable-bc
84make
85```
86
87### Debug
88
89For debug builds, use the following commands in the root directory:
90
91```
92./configure.sh -g
93make
94```
95
96### Install
97
98To install, use the following command:
99
100```
101make install
102```
103
104By default, `bc` and `dc` will be installed in `/usr/local`. For installing in
105other locations, use the `PREFIX` environment variable when running
106`configure.sh` or pass the `--prefix=<prefix>` option to `configure.sh`. See the
107[build manual][5], or run `./configure.sh --help`, for more details.
108
109### Library
110
111This `bc` does provide a way to build a math library with C bindings. This is
112done by the `-a` or `--library` options to `configure.sh`:
113
114```
115./configure.sh -a
116```
117
118When building the library, the executables are not built. For more information,
119see the [build manual][5].
120
121The library API can be found in [`manuals/bcl.3.md`][26] or `man bcl` once the
122library is installed.
123
124The library is built as `bin/libbcl.a`.
125
126### Package and Distro Maintainers
127
128#### Recommended Compiler
129
130When I ran benchmarks with my `bc` compiled under `clang`, it performed much
131better than when compiled under `gcc`. I recommend compiling this `bc` with
132`clang`.
133
134I also recommend building this `bc` with C11 if you can because `bc` will detect
135a C11 compiler and add `_Noreturn` to any relevant function(s).
136
137#### Recommended Optimizations
138
139I wrote this `bc` with Separation of Concerns, which means that there are many
140small functions that could be inlined. However, they are often called across
141file boundaries, and the default optimizer can only look at the current file,
142which means that they are not inlined.
143
144Thus, because of the way this `bc` is built, it will automatically be slower
145than other `bc` implementations when running scripts with no math. (My `bc`'s
146math is *much* faster, so any non-trivial script should run faster in my `bc`.)
147
148Some, or all, of the difference can be made up with the right optimizations. The
149optimizations I recommend are:
150
1511.	`-O3`
1522.	`-flto` (link-time optimization)
153
154in that order.
155
156Link-time optimization, in particular, speeds up the `bc` a lot. This is because
157when link-time optimization is turned on, the optimizer can look across files
158and inline *much* more heavily.
159
160However, I recommend ***NOT*** using `-march=native`. Doing so will reduce this
161`bc`'s performance, at least when building with link-time optimization. See the
162[benchmarks][19] for more details.
163
164#### Stripping Binaries
165
166By default, non-debug binaries are stripped, but stripping can be disabled with
167the `-T` option to `configure.sh`.
168
169#### Using This `bc` as an Alternative
170
171If this `bc` is packaged as an alternative to an already existing `bc` package,
172it is possible to rename it in the build to prevent name collision. To prepend
173to the name, just run the following:
174
175```
176EXECPREFIX=<some_prefix> ./configure.sh
177```
178
179To append to the name, just run the following:
180
181```
182EXECSUFFIX=<some_suffix> ./configure.sh
183```
184
185If a package maintainer wishes to add both a prefix and a suffix, that is
186allowed.
187
188**Note**: The suggested name (and package name) when `bc` is not available is
189`bc-gh`.
190
191#### Karatsuba Number
192
193Package and distro maintainers have one tool at their disposal to build this
194`bc` in the optimal configuration: `karatsuba.py`.
195
196This script is not a compile-time or runtime prerequisite; it is for package and
197distro maintainers to run once when a package is being created. It finds the
198optimal Karatsuba number (see the [algorithms manual][7] for more information)
199for the machine that it is running on.
200
201The easiest way to run this script is with `make karatsuba`.
202
203If desired, maintainers can also skip running this script because there is a
204sane default for the Karatsuba number.
205
206## Status
207
208This `bc` is robust.
209
210It is well-tested, fuzzed, and fully standards-compliant (though not certified)
211with POSIX `bc`. The math has been tested with 40+ million random problems, so
212it is as correct as I can make it.
213
214This `bc` can be used as a drop-in replacement for any existing `bc`. This `bc`
215is also compatible with MinGW toolchains, though history is not supported on
216Windows.
217
218In addition, this `bc` is considered complete; i.e., there will be no more
219releases with additional features. However, it *is* actively maintained, so if
220any bugs are found, they will be fixed in new releases. Also, additional
221translations will also be added as they are provided.
222
223## Comparison to GNU `bc`
224
225This `bc` compares favorably to GNU `bc`.
226
227* It has more extensions, which make this `bc` more useful for scripting.
228* This `bc` is a bit more POSIX compliant.
229* It has a much less buggy parser. The GNU `bc` will give parse errors for what
230  is actually valid `bc` code, or should be. For example, putting an `else` on
231  a new line after a brace can cause GNU `bc` to give a parse error.
232* This `bc` has fewer crashes.
233* GNU `bc` calculates the wrong number of significant digits for `length(x)`.
234* GNU `bc` will sometimes print numbers incorrectly. For example, when running
235  it on the file `tests/bc/power.txt` in this repo, GNU `bc` gets all the right
236  answers, but it fails to wrap the numbers at the proper place when outputting
237  to a file.
238* This `bc` is faster. (See [Performance](#performance).)
239
240### Performance
241
242Because this `bc` packs more than `1` decimal digit per hardware integer, this
243`bc` is faster than GNU `bc` and can be *much* faster. Full benchmarks can be
244found at [manuals/benchmarks.md][19].
245
246There is one instance where this `bc` is slower: if scripts are light on math.
247This is because this `bc`'s intepreter is slightly slower than GNU `bc`, but
248that is because it is more robust. See the [benchmarks][19].
249
250## Algorithms
251
252To see what algorithms this `bc` uses, see the [algorithms manual][7].
253
254## Locales
255
256Currently, this `bc` only has support for English (and US English), French,
257German, Portuguese, Dutch, Polish, Russian, Japanese, and Chinese locales.
258Patches are welcome for translations; use the existing `*.msg` files in
259`locales/` as a starting point.
260
261In addition, patches for improvements are welcome; the last two messages in
262Portuguese were made with Google Translate, and the Dutch, Polish, Russian,
263Japanese, and Chinese locales were all generated with [DeepL][22].
264
265The message files provided assume that locales apply to all regions where a
266language is used, but this might not be true for, e.g., `fr_CA` and `fr_CH`.
267Any corrections or a confirmation that the current texts are acceptable for
268those regions would be appreciated, too.
269
270## Other Projects
271
272Other projects based on this bc are:
273
274* [busybox `bc`][8]. The busybox maintainers have made their own changes, so any
275  bugs in the busybox `bc` should be reported to them.
276
277* [toybox `bc`][9]. The maintainer has also made his own changes, so bugs in the
278  toybox `bc` should be reported there.
279
280* [FreeBSD `bc`][23]. While the `bc` in FreeBSD is kept up-to-date, it is better
281  to [report bugs there][24], as well as [submit patches][25], and the
282  maintainers of the package will contact me if necessary.
283
284## Language
285
286This `bc` is written in pure ISO C99, using POSIX 2008 APIs.
287
288## Commit Messages
289
290This `bc` uses the commit message guidelines laid out in [this blog post][10].
291
292## Semantic Versioning
293
294This `bc` uses [semantic versioning][11].
295
296## Contents
297
298Items labeled with `(maintainer use only)` are not included in release source
299tarballs.
300
301Files:
302
303	.gitignore           The git ignore file (maintainer use only).
304	configure            A symlink to configure.sh to make packaging easier.
305	configure.sh         The configure script.
306	functions.sh         A script with functions used by other scripts.
307	install.sh           Install script.
308	karatsuba.py         Script to find the optimal Karatsuba number.
309	LICENSE.md           A Markdown form of the BSD 2-clause License.
310	link.sh              A script to link dc to bc.
311	locale_install.sh    A script to install locales, if desired.
312	locale_uninstall.sh  A script to uninstall locales.
313	Makefile.in          The Makefile template.
314	manpage.sh           Script to generate man pages from markdown files.
315	NOTICE.md            List of contributors and copyright owners.
316	RELEASE.md           A checklist for making a release (maintainer use only).
317	release.sh           A script to test for release (maintainer use only).
318	safe-install.sh      Safe install script from musl libc.
319
320Folders:
321
322	gen      The bc math library, help texts, and code to generate C source.
323	include  All header files.
324	locales  Locale files, in .msg format. Patches welcome for translations.
325	manuals  Manuals for both programs.
326	src      All source code.
327	tests    All tests.
328
329[1]: https://www.gnu.org/software/bc/
330[4]: ./LICENSE.md
331[5]: ./manuals/build.md
332[6]: https://pkg.musl.cc/bc/
333[7]: ./manuals/algorithms.md
334[8]: https://git.busybox.net/busybox/tree/miscutils/bc.c
335[9]: https://github.com/landley/toybox/blob/master/toys/pending/bc.c
336[10]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
337[11]: http://semver.org/
338[12]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
339[17]: https://img.shields.io/coverity/scan/16609.svg
340[18]: https://scan.coverity.com/projects/gavinhoward-bc
341[19]: ./manuals/benchmarks.md
342[20]: https://git.yzena.com/gavin/bc
343[21]: https://gavinhoward.com/2020/04/i-am-moving-away-from-github/
344[22]: https://www.deepl.com/translator
345[23]: https://svnweb.freebsd.org/base/head/contrib/bc/
346[24]: https://bugs.freebsd.org/
347[25]: https://reviews.freebsd.org/
348[26]: ./manuals/bcl.3.md
349