xref: /freebsd/contrib/bc/NEWS.md (revision 10ff414c14eef433d8157f0c17904d740693933b)
1# News
2
3## 5.1.1
4
5This is a production release that completes a bug fix from `5.1.0`. The bug
6exists in all versions of `bc`.
7
8The bug was that `if` statements without `else` statements would not be handled
9correctly at the end of files or right before a function definition.
10
11## 5.1.0
12
13This is a production release with some fixes and new features.
14
15* Fixed a bug where an `if` statement without an `else` before defining a
16  function caused an error.
17* Fixed a bug with the `bc` banner and `-q`.
18* Fixed a bug on Windows where files were not read correctly.
19* Added a command-line flag (`-z`) to make `bc` and `dc` print leading zeroes on
20  numbers `-1 < x < 1`.
21* Added four functions to `lib2.bc` (`plz()`, `plznl()`, `pnlz()`, and
22  `pnlznl()`) to allow printing numbers with or without leading zeros, despite
23  the use of `-z` or not.
24* Added builtin functions to query global state like line length, global stacks,
25  and leading zeroes.
26* Added a command-line flag (`-L`) to disable wrapping when printing numbers.
27* Improved builds on Windows.
28
29## 5.0.2
30
31This is a production release with one fix for a flaky test. If you have not
32experienced problems with the test suite, you do ***NOT*** need to upgrade.
33
34The test was one that tested whether `bc` fails gracefully when it can't
35allocate memory. Unfortunately, there are cases when Linux and FreeBSD lie and
36pretend to allocate the memory.
37
38The reason they do this is because a lot of programs don't use all of the memory
39they allocate, so those OS's usually get away with it.
40
41However, this `bc` uses all of the memory it allocates (at least at page
42granularity), so when it tries to use the memory, FreeBSD and Linux kill it.
43
44This only happens sometimes, however. Other times (on my machine), they do, in
45fact, refuse the request.
46
47So I changed the test to not test for that because I think the graceful failure
48code won't really change much.
49
50## 5.0.1
51
52This is a production release with two fixes:
53
54* Fix for the build on Mac OSX.
55* Fix for the build on Android.
56
57Users that do not use those platforms do ***NOT*** need to update.
58
59## 5.0.0
60
61This is a major production release with several changes:
62
63* Added support for OpenBSD's `pledge()` and `unveil()`.
64* Fixed print bug where a backslash newline combo was printed even if only one
65  digit was left, something I blindly copied from GNU `bc`, like a fool.
66* Fixed bugs in the manuals.
67* Fixed a possible multiplication overflow in power.
68* Temporary numbers are garbage collected if allocation fails, and the
69  allocation is retried. This is to make `bc` and `dc` more resilient to running
70  out of memory.
71* Limited the number of temporary numbers and made the space for them static so
72  that allocating more space for them cannot fail.
73* Allowed integers with non-zero `scale` to be used with power, places, and
74  shift operators.
75* Added greatest common divisor and least common multiple to `lib2.bc`.
76* Added `SIGQUIT` handling to history.
77* Added a command to `dc` (`y`) to get the length of register stacks.
78* Fixed multi-digit bugs in `lib2.bc`.
79* Removed the no prompt build option.
80* Created settings that builders can set defaults for and users can set their
81  preferences for. This includes the `bc` banner, resetting on `SIGINT`, TTY
82  mode, and prompt.
83* Added history support to Windows.
84* Fixed bugs with the handling of register names in `dc`.
85* Fixed bugs with multi-line comments and strings in both calculators.
86* Added a new error type and message for `dc` when register stacks don't have
87  enough items.
88* Optimized string allocation.
89* Made `bc` and `dc` UTF-8 capable.
90* Fixed a bug with `void` functions.
91* Fixed a misspelled symbol in `bcl`. This is technically a breaking change,
92  which requires this to be `5.0.0`.
93* Added the ability for users to get the copyright banner back.
94* Added the ability for users to have `bc` and `dc` quit on `SIGINT`.
95* Added the ability for users to disable prompt and TTY mode by environment
96  variables.
97* Added the ability for users to redefine keywords. This is another reason this
98  is `5.0.0`.
99* Added `dc`'s modular exponentiation and divmod to `bc`.
100* Added the ability to assign strings to variables and array elements and pass
101  them to functions in `bc`.
102* Added `dc`'s asciify command and stream printing to `bc`.
103* Added a command to `dc` (`Y`) to get the length of an array.
104* Added a command to `dc` (`,`) to get the depth of the execution stack.
105* Added bitwise and, or, xor, left shift, right shift, reverse, left rotate,
106  right rotate, and mod functions to `lib2.bc`.
107* Added the functions `s2u(x)` and `s2un(x,n)`, to `lib2.bc`.
108
109## 4.0.2
110
111This is a production release that fixes two bugs:
112
1131.	If no files are used and the first statement on `stdin` is invalid, `scale`
114	would not be set to `20` even if `-l` was used.
1152.	When using history, `bc` failed to respond properly to `SIGSTOP` and
116	`SIGTSTP`.
117
118## 4.0.1
119
120This is a production release that only adds one thing: flushing output when it
121is printed with a print statement.
122
123## 4.0.0
124
125This is a production release with many fixes, a new command-line option, and a
126big surprise:
127
128* A bug was fixed in `dc`'s `P` command where the item on the stack was *not*
129  popped.
130* Various bugs in the manuals have been fixed.
131* A known bug was fixed where history did not interact well with prompts printed
132  by user code without newlines.
133* A new command-line option, `-R` and `--no-read-prompt` was added to disable
134  just the prompt when using `read()` (`bc`) or `?` (`dc`).
135* And finally, **official support for Windows was added**.
136
137The last item is why this is a major version bump.
138
139Currently, only one set of build options (extra math and prompt enabled, history
140and NLS/locale support disabled, both calculators enabled) is supported on
141Windows. However, both debug and release builds are supported.
142
143In addition, Windows builds are supported for the the library (`bcl`).
144
145For more details about how to build on Windows, see the [README][5] or the
146[build manual][13].
147
148## 3.3.4
149
150This is a production release that fixes a small bug.
151
152The bug was that output was not flushed before a `read()` call, so prompts
153without a newline on the end were not flushed before the `read()` call.
154
155This is such a tiny bug that users only need to upgrade if they are affected.
156
157## 3.3.3
158
159This is a production release with one tweak and fixes for manuals.
160
161The tweak is that `length(0)` returns `1` instead of `0`. In `3.3.1`, I changed
162it so `length(0.x)`, where `x` could be any number of digits, returned the
163`scale`, but `length(0)` still returned `0` because I believe that `0` has `0`
164significant digits.
165
166After request of FreeBSD and considering the arguments of a mathematician,
167compatibility with other `bc`'s, and the expectations of users, I decided to
168make the change.
169
170The fixes for manuals fixed a bug where `--` was rendered as `-`.
171
172## 3.3.2
173
174This is a production release that fixes a divide-by-zero bug in `root()` in the
175[extended math library][16]. All previous versions with `root()` have the bug.
176
177## 3.3.1
178
179This is a production release that fixes a bug.
180
181The bug was in the reporting of number length when the value was 0.
182
183## 3.3.0
184
185This is a production release that changes one behavior and fixes documentation
186bugs.
187
188The changed behavior is the treatment of `-e` and `-f` when given through
189`BC_ENV_ARGS` or `DC_ENV_ARGS`. Now `bc` and `dc` do not exit when those options
190(or their equivalents) are given through those environment variables. However,
191`bc` and `dc` still exit when they or their equivalents are given on the
192command-line.
193
194## 3.2.7
195
196This is a production release that removes a small non-portable shell operation
197in `configure.sh`. This problem was only noticed on OpenBSD, not FreeBSD or
198Linux.
199
200Non-OpenBSD users do ***NOT*** need to upgrade, although NetBSD users may also
201need to upgrade.
202
203## 3.2.6
204
205This is a production release that fixes the build on FreeBSD.
206
207There was a syntax error in `configure.sh` that the Linux shell did not catch,
208and FreeBSD depends on the existence of `tests/all.sh`.
209
210All users that already upgraded to `3.2.5` should update to this release, with
211my apologies for the poor release of `3.2.5`. Other users should skip `3.2.5` in
212favor of this version.
213
214## 3.2.5
215
216This is a production release that fixes several bugs and adds a couple small
217things.
218
219The two most important bugs were bugs that causes `dc` to access memory
220out-of-bounds (crash in debug builds). This was found by upgrading to `afl++`
221from `afl`. Both were caused by a failure to distinguish between the same two
222cases.
223
224Another bug was the failure to put all of the licenses in the `LICENSE.md` file.
225
226Third, some warnings by `scan-build` were found and eliminated. This needed one
227big change: `bc` and `dc` now bail out as fast as possible on fatal errors
228instead of unwinding the stack.
229
230Fourth, the pseudo-random number now attempts to seed itself with `/dev/random`
231if `/dev/urandom` fails.
232
233Finally, this release has a few quality-of-life changes to the build system. The
234usage should not change at all; the only thing that changed was making sure the
235`Makefile.in` was written to rebuild properly when headers changed and to not
236rebuild when not necessary.
237
238## 3.2.4
239
240This is a production release that fixes a warning on `gcc` 6 or older, which
241does not have an attribute that is used.
242
243Users do ***NOT*** need to upgrade if they don't use `gcc` 6 or older.
244
245## 3.2.3
246
247This is a production release that fixes a bug in `gen/strgen.sh`. I recently
248changed `gen/strgen.c`, but I did not change `gen/strgen.sh`.
249
250Users that do not use `gen/strgen.sh` do not need to upgrade.
251
252## 3.2.2
253
254This is a production release that fixes a portability bug in `configure.sh`. The
255bug was using the GNU `find` extension `-wholename`.
256
257## 3.2.1
258
259This is a production release that has one fix for `bcl(3)`. It is technically
260not a bug fix since the behavior is undefined, but the `BclNumber`s that
261`bcl_divmod()` returns will be set to `BCL_ERROR_INVALID_NUM` if there is an
262error. Previously, they were not set.
263
264## 3.2.0
265
266This is a production release that has one bug fix and a major addition.
267
268The bug fix was a missing `auto` variable in the bessel `j()` function in the
269math library.
270
271The major addition is a way to build a version of `bc`'s math code as a library.
272This is done with the `-a` option to `configure.sh`. The API for the library can
273be read in `./manuals/bcl.3.md` or `man bcl` once the library is installed with
274`make install`.
275
276This library was requested by developers before I even finished version 1.0, but
277I could not figure out how to do it until now.
278
279If the library has API breaking changes, the major version of `bc` will be
280incremented.
281
282## 3.1.6
283
284This is a production release that fixes a new warning from Clang 12 for FreeBSD
285and also removes some possible undefined behavior found by UBSan that compilers
286did not seem to take advantage of.
287
288Users do ***NOT*** need to upgrade, if they do not want to.
289
290## 3.1.5
291
292This is a production release that fixes the Chinese locales (which caused `bc`
293to crash) and a crash caused by `bc` executing code when it should not have been
294able to.
295
296***ALL USERS SHOULD UPGRADE.***
297
298## 3.1.4
299
300This is a production release that fixes one bug, changes two behaviors, and
301removes one environment variable.
302
303The bug is like the one in the last release except it applies if files are being
304executed. I also made the fix more general.
305
306The behavior that was changed is that `bc` now exits when given `-e`, `-f`,
307`--expression` or `--file`. However, if the last one of those is `-f-` (using
308`stdin` as the file), `bc` does not exit. If `-f-` exists and is not the last of
309the `-e` and `-f` options (and equivalents), `bc` gives a fatal error and exits.
310
311Next, I removed the `BC_EXPR_EXIT` and `DC_EXPR_EXIT` environment variables
312since their use is not needed with the behavior change.
313
314Finally, I made it so `bc` does not print the header, though the `-q` and
315`--quiet` options were kept for compatibility with GNU `bc`.
316
317## 3.1.3
318
319This is a production release that fixes one minor bug: if `bc` was invoked like
320the following, it would error:
321
322```
323echo "if (1 < 3) 1" | bc
324```
325
326Unless users run into this bug, they do not need to upgrade, but it is suggested
327that they do.
328
329## 3.1.2
330
331This is a production release that adds a way to install *all* locales. Users do
332***NOT*** need to upgrade.
333
334For package maintainers wishing to make use of the change, just pass `-l` to
335`configure.sh`.
336
337## 3.1.1
338
339This is a production release that adds two Spanish locales. Users do ***NOT***
340need to upgrade, unless they want those locales.
341
342## 3.1.0
343
344This is a production release that adjusts one behavior, fixes eight bugs, and
345improves manpages for FreeBSD. Because this release fixes bugs, **users and
346package maintainers should update to this version as soon as possible**.
347
348The behavior that was adjusted was how code from the `-e` and `-f` arguments
349(and equivalents) were executed. They used to be executed as one big chunk, but
350in this release, they are now executed line-by-line.
351
352The first bug fix in how output to `stdout` was handled in `SIGINT`. If a
353`SIGINT` came in, the `stdout` buffer was not correctly flushed. In fact, a
354clean-up function was not getting called. This release fixes that bug.
355
356The second bug is in how `dc` handled input from `stdin`. This affected `bc` as
357well since it was a mishandling of the `stdin` buffer.
358
359The third fixed bug was that `bc` and `dc` could `abort()` (in debug mode) when
360receiving a `SIGTERM`. This one was a race condition with pushing and popping
361items onto and out of vectors.
362
363The fourth bug fixed was that `bc` could leave extra items on the stack and
364thus, not properly clean up some memory. (The memory would still get
365`free()`'ed, but it would not be `free()`'ed when it could have been.)
366
367The next two bugs were bugs in `bc`'s parser that caused crashes when executing
368the resulting code.
369
370The last two bugs were crashes in `dc` that resulted from mishandling of
371strings.
372
373The manpage improvement was done by switching from [ronn][20] to [Pandoc][21] to
374generate manpages. Pandoc generates much cleaner manpages and doesn't leave
375blank lines where they shouldn't be.
376
377## 3.0.3
378
379This is a production release that adds one new feature: specific manpages.
380
381Before this release, `bc` and `dc` only used one manpage each that referred to
382various build options. This release changes it so there is one manpage set per
383relevant build type. Each manual only has information about its particular
384build, and `configure.sh` selects the correct set for install.
385
386## 3.0.2
387
388This is a production release that adds `utf8` locale symlinks and removes an
389unused `auto` variable from the `ceil()` function in the [extended math
390library][16].
391
392Users do ***NOT*** need to update unless they want the locales.
393
394## 3.0.1
395
396This is a production release with two small changes. Users do ***NOT*** need to
397upgrade to this release; however, if they haven't upgraded to `3.0.0` yet, it
398may be worthwhile to upgrade to this release.
399
400The first change is fixing a compiler warning on FreeBSD with strict warnings
401on.
402
403The second change is to make the new implementation of `ceil()` in `lib2.bc`
404much more efficient.
405
406## 3.0.0
407
408*Notes for package maintainers:*
409
410*First, the `2.7.0` release series saw a change in the option parsing. This made
411me change one error message and add a few others. The error message that was
412changed removed one format specifier. This means that `printf()` will seqfault
413on old locale files. Unfortunately, `bc` cannot use any locale files except the
414global ones that are already installed, so it will use the previous ones while
415running tests during install. **If `bc` segfaults while running arg tests when
416updating, it is because the global locale files have not been replaced. Make
417sure to either prevent the test suite from running on update or remove the old
418locale files before updating.** (Removing the locale files can be done with
419`make uninstall` or by running the [`locale_uninstall.sh`][22] script.) Once
420this is done, `bc` should install without problems.*
421
422*Second, **the option to build without signal support has been removed**. See
423below for the reasons why.*
424
425This is a production release with some small bug fixes, a few improvements,
426three major bug fixes, and a complete redesign of `bc`'s error and signal
427handling. **Users and package maintainers should update to this version as soon
428as possible.**
429
430The first major bug fix was in how `bc` executed files. Previously, a whole file
431was parsed before it was executed, but if a function is defined *after* code,
432especially if the function definition was actually a redefinition, and the code
433before the definition referred to the previous function, this `bc` would replace
434the function before executing any code. The fix was to make sure that all code
435that existed before a function definition was executed.
436
437The second major bug fix was in `bc`'s `lib2.bc`. The `ceil()` function had a
438bug where a `0` in the decimal place after the truncation position, caused it to
439output the wrong numbers if there was any non-zero digit after.
440
441The third major bug is that when passing parameters to functions, if an
442expression included an array (not an array element) as a parameter, it was
443accepted, when it should have been rejected. It is now correctly rejected.
444
445Beyond that, this `bc` got several improvements that both sped it up, improved
446the handling of signals, and improved the error handling.
447
448First, the requirements for `bc` were pushed back to POSIX 2008. `bc` uses one
449function, `strdup()`, which is not in POSIX 2001, and it is in the X/Open System
450Interfaces group 2001. It is, however, in POSIX 2008, and since POSIX 2008 is
451old enough to be supported anywhere that I care, that should be the requirement.
452
453Second, the BcVm global variable was put into `bss`. This actually slightly
454reduces the size of the executable from a massive code shrink, and it will stop
455`bc` from allocating a large set of memory when `bc` starts.
456
457Third, the default Karatsuba length was updated from 64 to 32 after making the
458optimization changes below, since 32 is going to be better than 64 after the
459changes.
460
461Fourth, Spanish translations were added.
462
463Fifth, the interpreter received a speedup to make performance on non-math-heavy
464scripts more competitive with GNU `bc`. While improvements did, in fact, get it
465much closer (see the [benchmarks][19]), it isn't quite there.
466
467There were several things done to speed up the interpreter:
468
469First, several small inefficiencies were removed. These inefficiencies included
470calling the function `bc_vec_pop(v)` twice instead of calling
471`bc_vec_npop(v, 2)`. They also included an extra function call for checking the
472size of the stack and checking the size of the stack more than once on several
473operations.
474
475Second, since the current `bc` function is the one that stores constants and
476strings, the program caches pointers to the current function's vectors of
477constants and strings to prevent needing to grab the current function in order
478to grab a constant or a string.
479
480Third, `bc` tries to reuse `BcNum`'s (the internal representation of
481arbitary-precision numbers). If a `BcNum` has the default capacity of
482`BC_NUM_DEF_SIZE` (32 on 64-bit and 16 on 32-bit) when it is freed, it is added
483to a list of available `BcNum`'s. And then, when a `BcNum` is allocated with a
484capacity of `BC_NUM_DEF_SIZE` and any `BcNum`'s exist on the list of reusable
485ones, one of those ones is grabbed instead.
486
487In order to support these changes, the `BC_NUM_DEF_SIZE` was changed. It used to
488be 16 bytes on all systems, but it was changed to more closely align with the
489minimum allocation size on Linux, which is either 32 bytes (64-bit musl), 24
490bytes (64-bit glibc), 16 bytes (32-bit musl), or 12 bytes (32-bit glibc). Since
491these are the minimum allocation sizes, these are the sizes that would be
492allocated anyway, making it worth it to just use the whole space, so the value
493of `BC_NUM_DEF_SIZE` on 64-bit systems was changed to 32 bytes.
494
495On top of that, at least on 64-bit, `BC_NUM_DEF_SIZE` supports numbers with
496either 72 integer digits or 45 integer digits and 27 fractional digits. This
497should be more than enough for most cases since `bc`'s default `scale` values
498are 0 or 20, meaning that, by default, it has at most 20 fractional digits. And
49945 integer digits are *a lot*; it's enough to calculate the amount of mass in
500the Milky Way galaxy in kilograms. Also, 72 digits is enough to calculate the
501diameter of the universe in Planck lengths.
502
503(For 32-bit, these numbers are either 32 integer digits or 12 integer digits and
50420 fractional digits. These are also quite big, and going much bigger on a
50532-bit system seems a little pointless since 12 digits is just under a trillion
506and 20 fractional digits is still enough for about any use since `10^-20` light
507years is just under a millimeter.)
508
509All of this together means that for ordinary uses, and even uses in scientific
510work, the default number size will be all that is needed, which means that
511nearly all, if not all, numbers will be reused, relieving pressure on the system
512allocator.
513
514I did several experiments to find the changes that had the most impact,
515especially with regard to reusing `BcNum`'s. One was putting `BcNum`'s into
516buckets according to their capacity in powers of 2 up to 512. That performed
517worse than `bc` did in `2.7.2`. Another was putting any `BcNum` on the reuse
518list that had a capacity of `BC_NUM_DEF_SIZE * 2` and reusing them for `BcNum`'s
519that requested `BC_NUM_DEF_SIZE`. This did reduce the amount of time spent, but
520it also spent a lot of time in the system allocator for an unknown reason. (When
521using `strace`, a bunch more `brk` calls showed up.) Just reusing `BcNum`'s that
522had exactly `BC_NUM_DEF_SIZE` capacity spent the smallest amount of time in both
523user and system time. This makes sense, especially with the changes to make
524`BC_NUM_DEF_SIZE` bigger on 64-bit systems, since the vast majority of numbers
525will only ever use numbers with a size less than or equal to `BC_NUM_DEF_SIZE`.
526
527Last of all, `bc`'s signal handling underwent a complete redesign. (This is the
528reason that this version is `3.0.0` and not `2.8.0`.) The change was to move
529from a polling approach to signal handling to an interrupt-based approach.
530
531Previously, every single loop condition had a check for signals. I suspect that
532this could be expensive when in tight loops.
533
534Now, the signal handler just uses `longjmp()` (actually `siglongjmp()`) to start
535an unwinding of the stack until it is stopped or the stack is unwound to
536`main()`, which just returns. If `bc` is currently executing code that cannot be
537safely interrupted (according to POSIX), then signals are "locked." The signal
538handler checks if the lock is taken, and if it is, it just sets the status to
539indicate that a signal arrived. Later, when the signal lock is released, the
540status is checked to see if a signal came in. If so, the stack unwinding starts.
541
542This design eliminates polling in favor of maintaining a stack of `jmp_buf`'s.
543This has its own performance implications, but it gives better interaction. And
544the cost of pushing and popping a `jmp_buf` in a function is paid at most twice.
545Most functions do not pay that price, and most of the rest only pay it once.
546(There are only some 3 functions in `bc` that push and pop a `jmp_buf` twice.)
547
548As a side effect of this change, I had to eliminate the use of `stdio.h` in `bc`
549because `stdio` does not play nice with signals and `longjmp()`. I implemented
550custom I/O buffer code that takes a fraction of the size. This means that static
551builds will be smaller, but non-static builds will be bigger, though they will
552have less linking time.
553
554This change is also good because my history implementation was already bypassing
555`stdio` for good reasons, and unifying the architecture was a win.
556
557Another reason for this change is that my `bc` should *always* behave correctly
558in the presence of signals like `SIGINT`, `SIGTERM`, and `SIGQUIT`. With the
559addition of my own I/O buffering, I needed to also make sure that the buffers
560were correctly flushed even when such signals happened.
561
562For this reason, I **removed the option to build without signal support**.
563
564As a nice side effect of this change, the error handling code could be changed
565to take advantage of the stack unwinding that signals used. This means that
566signals and error handling use the same code paths, which means that the stack
567unwinding is well-tested. (Errors are tested heavily in the test suite.)
568
569It also means that functions do not need to return a status code that
570***every*** caller needs to check. This eliminated over 100 branches that simply
571checked return codes and then passed that return code up the stack if necessary.
572The code bloat savings from this is at least 1700 bytes on `x86_64`, *before*
573taking into account the extra code from removing `stdio.h`.
574
575## 2.7.2
576
577This is a production release with one major bug fix.
578
579The `length()` built-in function can take either a number or an array. If it
580takes an array, it returns the length of the array. Arrays can be passed by
581reference. The bug is that the `length()` function would not properly
582dereference arrays that were references. This is a bug that affects all users.
583
584**ALL USERS SHOULD UPDATE `bc`**.
585
586## 2.7.1
587
588This is a production release with fixes for new locales and fixes for compiler
589warnings on FreeBSD.
590
591## 2.7.0
592
593This is a production release with a bug fix for Linux, new translations, and new
594features.
595
596Bug fixes:
597
598* Option parsing in `BC_ENV_ARGS` was broken on Linux in 2.6.1 because `glibc`'s
599  `getopt_long()` is broken. To get around that, and to support long options on
600  every platform, an adapted version of [`optparse`][17] was added. Now, `bc`
601  does not even use `getopt()`.
602* Parsing `BC_ENV_ARGS` with quotes now works. It isn't the smartest, but it
603  does the job if there are spaces in file names.
604
605The following new languages are supported:
606
607* Dutch
608* Polish
609* Russian
610* Japanes
611* Simplified Chinese
612
613All of these translations were generated using [DeepL][18], so improvements are
614welcome.
615
616There is only one new feature: **`bc` now has a built-in pseudo-random number
617generator** (PRNG).
618
619The PRNG is seeded, making it useful for applications where
620`/dev/urandom` does not work because output needs to be reproducible. However,
621it also uses `/dev/urandom` to seed itself by default, so it will start with a
622good seed by default.
623
624It also outputs 32 bits on 32-bit platforms and 64 bits on 64-bit platforms, far
625better than the 15 bits of C's `rand()` and `bash`'s `$RANDOM`.
626
627In addition, the PRNG can take a bound, and when it gets a bound, it
628automatically adjusts to remove bias. It can also generate numbers of arbitrary
629size. (As of the time of release, the largest pseudo-random number generated by
630this `bc` was generated with a bound of `2^(2^20)`.)
631
632***IMPORTANT: read the [`bc` manual][9] and the [`dc` manual][10] to find out
633exactly what guarantees the PRNG provides. The underlying implementation is not
634guaranteed to stay the same, but the guarantees that it provides are guaranteed
635to stay the same regardless of the implementation.***
636
637On top of that, four functions were added to `bc`'s [extended math library][16]
638to make using the PRNG easier:
639
640* `frand(p)`: Generates a number between `[0,1)` to `p` decimal places.
641* `ifrand(i, p)`: Generates an integer with bound `i` and adds it to `frand(p)`.
642* `srand(x)`: Randomizes the sign of `x`. In other words, it flips the sign of
643  `x` with probability `0.5`.
644* `brand()`: Returns a random boolean value (either `0` or `1`).
645
646## 2.6.1
647
648This is a production release with a bug fix for FreeBSD.
649
650The bug was that when `bc` was built without long options, it would give a fatal
651error on every run. This was caused by a mishandling of `optind`.
652
653## 2.6.0
654
655This release is a production release ***with no bugfixes***. If you do not want
656to upgrade, you don't have to.
657
658No source code changed; the only thing that changed was `lib2.bc`.
659
660This release adds one function to the [extended math library][16]: `p(x, y)`,
661which calculates `x` to the power of `y`, whether or not `y` is an integer. (The
662`^` operator can only accept integer powers.)
663
664This release also includes a couple of small tweaks to the [extended math
665library][16], mostly to fix returning numbers with too high of `scale`.
666
667## 2.5.3
668
669This release is a production release which addresses inconsistencies in the
670Portuguese locales. No `bc` code was changed.
671
672The issues were that the ISO files used different naming, and also that the
673files that should have been symlinks were not. I did not catch that because
674GitHub rendered them the exact same way.
675
676## 2.5.2
677
678This release is a production release.
679
680No code was changed, but the build system was changed to allow `CFLAGS` to be
681given to `CC`, like this:
682
683```
684CC="gcc -O3 -march=native" ./configure.sh
685```
686
687If this happens, the flags are automatically put into `CFLAGS`, and the compiler
688is set appropriately. In the example above this means that `CC` will be "gcc"
689and `CFLAGS` will be "-O3 -march=native".
690
691This behavior was added to conform to GNU autotools practices.
692
693## 2.5.1
694
695This is a production release which addresses portability concerns discovered
696in the `bc` build system. No `bc` code was changed.
697
698* Support for Solaris SPARC and AIX were added.
699* Minor documentations edits were performed.
700* An option for `configure.sh` was added to disable long options if
701  `getopt_long()` is missing.
702
703## 2.5.0
704
705This is a production release with new translations. No code changed.
706
707The translations were contributed by [bugcrazy][15], and they are for
708Portuguese, both Portugal and Brazil locales.
709
710## 2.4.0
711
712This is a production release primarily aimed at improving `dc`.
713
714* A couple of copy and paste errors in the [`dc` manual][10] were fixed.
715* `dc` startup was optimized by making sure it didn't have to set up `bc`-only
716  things.
717* The `bc` `&&` and `||` operators were made available to `dc` through the `M`
718  and `m` commands, respectively.
719* `dc` macros were changed to be tail call-optimized.
720
721The last item, tail call optimization, means that if the last thing in a macro
722is a call to another macro, then the old macro is popped before executing the
723new macro. This change was made to stop `dc` from consuming more and more memory
724as macros are executed in a loop.
725
726The `q` and `Q` commands still respect the "hidden" macros by way of recording
727how many macros were removed by tail call optimization.
728
729## 2.3.2
730
731This is a production release meant to fix warnings in the Gentoo `ebuild` by
732making it possible to disable binary stripping. Other users do *not* need to
733upgrade.
734
735## 2.3.1
736
737This is a production release. It fixes a bug that caused `-1000000000 < -1` to
738return `0`. This only happened with negative numbers and only if the value on
739the left was more negative by a certain amount. That said, this bug *is* a bad
740bug, and needs to be fixed.
741
742**ALL USERS SHOULD UPDATE `bc`**.
743
744## 2.3.0
745
746This is a production release with changes to the build system.
747
748## 2.2.0
749
750This release is a production release. It only has new features and performance
751improvements.
752
7531.	The performance of `sqrt(x)` was improved.
7542.	The new function `root(x, n)` was added to the extended math library to
755	calculate `n`th roots.
7563.	The new function `cbrt(x)` was added to the extended math library to
757	calculate cube roots.
758
759## 2.1.3
760
761This is a non-critical release; it just changes the build system, and in
762non-breaking ways:
763
7641.	Linked locale files were changed to link to their sources with a relative
765	link.
7662.	A bug in `configure.sh` that caused long option parsing to fail under `bash`
767	was fixed.
768
769## 2.1.2
770
771This release is not a critical release.
772
7731.	A few codes were added to history.
7742.	Multiplication was optimized a bit more.
7753.	Addition and subtraction were both optimized a bit more.
776
777## 2.1.1
778
779This release contains a fix for the test suite made for Linux from Scratch: now
780the test suite prints `pass` when a test is passed.
781
782Other than that, there is no change in this release, so distros and other users
783do not need to upgrade.
784
785## 2.1.0
786
787This release is a production release.
788
789The following bugs were fixed:
790
7911.	A `dc` bug that caused stack mishandling was fixed.
7922.	A warning on OpenBSD was fixed.
7933.	Bugs in `ctrl+arrow` operations in history were fixed.
7944.	The ability to paste multiple lines in history was added.
7955.	A `bc` bug, mishandling of array arguments to functions, was fixed.
7966.	A crash caused by freeing the wrong pointer was fixed.
7977.	A `dc` bug where strings, in a rare case, were mishandled in parsing was
798	fixed.
799
800In addition, the following changes were made:
801
8021.	Division was slightly optimized.
8032.	An option was added to the build to disable printing of prompts.
8043.	The special case of empty arguments is now handled. This is to prevent
805	errors in scripts that end up passing empty arguments.
8064.	A harmless bug was fixed. This bug was that, with the pop instructions
807	(mostly) removed (see below), `bc` would leave extra values on its stack for
808	`void` functions and in a few other cases. These extra items would not
809	affect anything put on the stack and would not cause any sort of crash or
810	even buggy behavior, but they would cause `bc` to take more memory than it
811	needed.
812
813On top of the above changes, the following optimizations were added:
814
8151.	The need for pop instructions in `bc` was removed.
8162.	Extra tests on every iteration of the interpreter loop were removed.
8173.	Updating function and code pointers on every iteration of the interpreter
818	loop was changed to only updating them when necessary.
8194.	Extra assignments to pointers were removed.
820
821Altogether, these changes sped up the interpreter by around 2x.
822
823***NOTE***: This is the last release with new features because this `bc` is now
824considered complete. From now on, only bug fixes and new translations will be
825added to this `bc`.
826
827## 2.0.3
828
829This is a production, bug-fix release.
830
831Two bugs were fixed in this release:
832
8331.	A rare and subtle signal handling bug was fixed.
8342.	A misbehavior on `0` to a negative power was fixed.
835
836The last bug bears some mentioning.
837
838When I originally wrote power, I did not thoroughly check its error cases;
839instead, I had it check if the first number was `0` and then if so, just return
840`0`. However, `0` to a negative power means that `1` will be divided by `0`,
841which is an error.
842
843I caught this, but only after I stopped being cocky. You see, sometime later, I
844had noticed that GNU `bc` returned an error, correctly, but I thought it was
845wrong simply because that's not what my `bc` did. I saw it again later and had a
846double take. I checked for real, finally, and found out that my `bc` was wrong
847all along.
848
849That was bad on me. But the bug was easy to fix, so it is fixed now.
850
851There are two other things in this release:
852
8531.	Subtraction was optimized by [Stefan Eßer][14].
8542.	Division was also optimized, also by Stefan Eßer.
855
856## 2.0.2
857
858This release contains a fix for a possible overflow in the signal handling. I
859would be surprised if any users ran into it because it would only happen after 2
860billion (`2^31-1`) `SIGINT`'s, but I saw it and had to fix it.
861
862## 2.0.1
863
864This release contains very few things that will apply to any users.
865
8661.	A slight bug in `dc`'s interactive mode was fixed.
8672.	A bug in the test suite that was only triggered on NetBSD was fixed.
8683.	**The `-P`/`--no-prompt` option** was added for users that do not want a
869	prompt.
8704.	A `make check` target was added as an alias for `make test`.
8715.	`dc` got its own read prompt: `?> `.
872
873## 2.0.0
874
875This release is a production release.
876
877This release is also a little different from previous releases. From here on
878out, I do not plan on adding any more features to this `bc`; I believe that it
879is complete. However, there may be bug fix releases in the future, if I or any
880others manage to find bugs.
881
882This release has only a few new features:
883
8841.	`atan2(y, x)` was added to the extended math library as both `a2(y, x)` and
885	`atan2(y, x)`.
8862.	Locales were fixed.
8873.	A **POSIX shell-compatible script was added as an alternative to compiling
888	`gen/strgen.c`** on a host machine. More details about making the choice
889	between the two can be found by running `./configure.sh --help` or reading
890	the [build manual][13].
8914.	Multiplication was optimized by using **diagonal multiplication**, rather
892	than straight brute force.
8935.	The `locale_install.sh` script was fixed.
8946.	`dc` was given the ability to **use the environment variable
895	`DC_ENV_ARGS`**.
8967.	`dc` was also given the ability to **use the `-i` or `--interactive`**
897	options.
8988.	Printing the prompt was fixed so that it did not print when it shouldn't.
8999.	Signal handling was fixed.
90010.	**Handling of `SIGTERM` and `SIGQUIT`** was fixed.
90111.	The **built-in functions `maxibase()`, `maxobase()`, and `maxscale()`** (the
902	commands `T`, `U`, `V` in `dc`, respectively) were added to allow scripts to
903	query for the max allowable values of those globals.
90412.	Some incompatibilities with POSIX were fixed.
905
906In addition, this release is `2.0.0` for a big reason: the internal format for
907numbers changed. They used to be a `char` array. Now, they are an array of
908larger integers, packing more decimal digits into each integer. This has
909delivered ***HUGE*** performance improvements, especially for multiplication,
910division, and power.
911
912This `bc` should now be the fastest `bc` available, but I may be wrong.
913
914## 1.2.8
915
916This release contains a fix for a harmless bug (it is harmless in that it still
917works, but it just copies extra data) in the [`locale_install.sh`][12] script.
918
919## 1.2.7
920
921This version contains fixes for the build on Arch Linux.
922
923## 1.2.6
924
925This release removes the use of `local` in shell scripts because it's not POSIX
926shell-compatible, and also updates a man page that should have been updated a
927long time ago but was missed.
928
929## 1.2.5
930
931This release contains some missing locale `*.msg` files.
932
933## 1.2.4
934
935This release contains a few bug fixes and new French translations.
936
937## 1.2.3
938
939This release contains a fix for a bug: use of uninitialized data. Such data was
940only used when outputting an error message, but I am striving for perfection. As
941Michelangelo said, "Trifles make perfection, and perfection is no trifle."
942
943## 1.2.2
944
945This release contains fixes for OpenBSD.
946
947## 1.2.1
948
949This release contains bug fixes for some rare bugs.
950
951## 1.2.0
952
953This is a production release.
954
955There have been several changes since `1.1.0`:
956
9571.	The build system had some changes.
9582.	Locale support has been added. (Patches welcome for translations.)
9593.	**The ability to turn `ibase`, `obase`, and `scale` into stacks** was added
960	with the `-g` command-line option. (See the [`bc` manual][9] for more
961	details.)
9624.	Support for compiling on Mac OSX out of the box was added.
9635.	The extended math library got `t(x)`, `ceil(x)`, and some aliases.
9646.	The extended math library also got `r2d(x)` (for converting from radians to
965	degrees) and `d2r(x)` (for converting from degrees to radians). This is to
966	allow using degrees with the standard library.
9677.	Both calculators now accept numbers in **scientific notation**. See the
968	[`bc` manual][9] and the [`dc` manual][10] for details.
9698.	Both calculators can **output in either scientific or engineering
970	notation**. See the [`bc` manual][9] and the [`dc` manual][10] for details.
9719.	Some inefficiencies were removed.
97210.	Some bugs were fixed.
97311.	Some bugs in the extended library were fixed.
97412.	Some defects from [Coverity Scan][11] were fixed.
975
976## 1.1.4
977
978This release contains a fix to the build system that allows it to build on older
979versions of `glibc`.
980
981## 1.1.3
982
983This release contains a fix for a bug in the test suite where `bc` tests and
984`dc` tests could not be run in parallel.
985
986## 1.1.2
987
988This release has a fix for a history bug; the down arrow did not work.
989
990## 1.1.1
991
992This release fixes a bug in the `1.1.0` build system. The source is exactly the
993same.
994
995The bug that was fixed was a failure to install if no `EXECSUFFIX` was used.
996
997## 1.1.0
998
999This is a production release. However, many new features were added since `1.0`.
1000
10011.	**The build system has been changed** to use a custom, POSIX
1002	shell-compatible configure script ([`configure.sh`][6]) to generate a POSIX
1003	make-compatible `Makefile`, which means that `bc` and `dc` now build out of
1004	the box on any POSIX-compatible system.
10052.	Out-of-memory and output errors now cause the `bc` to report the error,
1006	clean up, and die, rather than just reporting and trying to continue.
10073.	**Strings and constants are now garbage collected** when possible.
10084.	Signal handling and checking has been made more simple and more thorough.
10095.	`BcGlobals` was refactored into `BcVm` and `BcVm` was made global. Some
1010	procedure names were changed to reflect its difference to everything else.
10116.	Addition got a speed improvement.
10127.	Some common code for addition and multiplication was refactored into its own
1013	procedure.
10148.	A bug was removed where `dc` could have been selected, but the internal
1015	`#define` that returned `true` for a query about `dc` would not have
1016	returned `true`.
10179.	Useless calls to `bc_num_zero()` were removed.
101810.	**History support was added.** The history support is based off of a
1019	[UTF-8 aware fork][7] of [`linenoise`][8], which has been customized with
1020	`bc`'s own data structures and signal handling.
102111.	Generating C source from the math library now removes tabs from the library,
1022	shrinking the size of the executable.
102312.	The math library was shrunk.
102413.	Error handling and reporting was improved.
102514.	Reallocations were reduced by giving access to the request size for each
1026	operation.
102715.	**`abs()` (`b` command for `dc`) was added as a builtin.**
102816.	Both calculators were tested on FreeBSD.
102917.	Many obscure parse bugs were fixed.
103018.	Markdown and man page manuals were added, and the man pages are installed by
1031	`make install`.
103219.	Executable size was reduced, though the added features probably made the
1033	executable end up bigger.
103420.	**GNU-style array references were added as a supported feature.**
103521.	Allocations were reduced.
103622.	**New operators were added**: `$` (`$` for `dc`), `@` (`@` for `dc`), `@=`,
1037	`<<` (`H` for `dc`), `<<=`, `>>` (`h` for `dc`), and `>>=`. See the
1038	[`bc` manual][9] and the [`dc` manual][10] for more details.
103923.	**An extended math library was added.** This library contains code that
1040	makes it so I can replace my desktop calculator with this `bc`. See the
1041	[`bc` manual][3] for more details.
104224.	Support for all capital letters as numbers was added.
104325.	**Support for GNU-style void functions was added.**
104426.	A bug fix for improper handling of function parameters was added.
104527.	Precedence for the or (`||`) operator was changed to match GNU `bc`.
104628.	`dc` was given an explicit negation command.
104729.	`dc` was changed to be able to handle strings in arrays.
1048
1049## 1.1 Release Candidate 3
1050
1051This release is the eighth release candidate for 1.1, though it is the third
1052release candidate meant as a general release candidate. The new code has not
1053been tested as thoroughly as it should for release.
1054
1055## 1.1 Release Candidate 2
1056
1057This release is the seventh release candidate for 1.1, though it is the second
1058release candidate meant as a general release candidate. The new code has not
1059been tested as thoroughly as it should for release.
1060
1061## 1.1 FreeBSD Beta 5
1062
1063This release is the sixth release candidate for 1.1, though it is the fifth
1064release candidate meant specifically to test if `bc` works on FreeBSD. The new
1065code has not been tested as thoroughly as it should for release.
1066
1067## 1.1 FreeBSD Beta 4
1068
1069This release is the fifth release candidate for 1.1, though it is the fourth
1070release candidate meant specifically to test if `bc` works on FreeBSD. The new
1071code has not been tested as thoroughly as it should for release.
1072
1073## 1.1 FreeBSD Beta 3
1074
1075This release is the fourth release candidate for 1.1, though it is the third
1076release candidate meant specifically to test if `bc` works on FreeBSD. The new
1077code has not been tested as thoroughly as it should for release.
1078
1079## 1.1 FreeBSD Beta 2
1080
1081This release is the third release candidate for 1.1, though it is the second
1082release candidate meant specifically to test if `bc` works on FreeBSD. The new
1083code has not been tested as thoroughly as it should for release.
1084
1085## 1.1 FreeBSD Beta 1
1086
1087This release is the second release candidate for 1.1, though it is meant
1088specifically to test if `bc` works on FreeBSD. The new code has not been tested as
1089thoroughly as it should for release.
1090
1091## 1.1 Release Candidate 1
1092
1093This is the first release candidate for 1.1. The new code has not been tested as
1094thoroughly as it should for release.
1095
1096## 1.0
1097
1098This is the first non-beta release. `bc` is ready for production use.
1099
1100As such, a lot has changed since 0.5.
1101
11021.	`dc` has been added. It has been tested even more thoroughly than `bc` was
1103	for `0.5`. It does not have the `!` command, and for security reasons, it
1104	never will, so it is complete.
11052.	`bc` has been more thoroughly tested. An entire section of the test suite
1106	(for both programs) has been added to test for errors.
11073.	A prompt (`>>> `) has been added for interactive mode, making it easier to
1108	see inputs and outputs.
11094.	Interrupt handling has been improved, including elimination of race
1110	conditions (as much as possible).
11115.	MinGW and [Windows Subsystem for Linux][1] support has been added (see
1112	[xstatic][2] for binaries).
11136.	Memory leaks and errors have been eliminated (as far as ASan and Valgrind
1114	can tell).
11157.	Crashes have been eliminated (as far as [afl][3] can tell).
11168.	Karatsuba multiplication was added (and thoroughly) tested, speeding up
1117	multiplication and power by orders of magnitude.
11189.	Performance was further enhanced by using a "divmod" function to reduce
1119	redundant divisions and by removing superfluous `memset()` calls.
112010.	To switch between Karatsuba and `O(n^2)` multiplication, the config variable
1121	`BC_NUM_KARATSUBA_LEN` was added. It is set to a sane default, but the
1122	optimal number can be found with [`karatsuba.py`][4] (requires Python 3)
1123	and then configured through `make`.
112411.	The random math test generator script was changed to Python 3 and improved.
1125	`bc` and `dc` have together been run through 30+ million random tests.
112612.	All known math bugs have been fixed, including out of control memory
1127	allocations in `sine` and `cosine` (that was actually a parse bug), certain
1128	cases of infinite loop on square root, and slight inaccuracies (as much as
1129	possible; see the [README][5]) in transcendental functions.
113013.	Parsing has been fixed as much as possible.
113114.	Test coverage was improved to 94.8%. The only paths not covered are ones
1132	that happen when `malloc()` or `realloc()` fails.
113315.	An extension to get the length of an array was added.
113416.	The boolean not (`!`) had its precedence change to match negation.
113517.	Data input was hardened.
113618.	`bc` was made fully compliant with POSIX when the `-s` flag is used or
1137	`POSIXLY_CORRECT` is defined.
113819.	Error handling was improved.
113920.	`bc` now checks that files it is given are not directories.
1140
1141## 1.0 Release Candidate 7
1142
1143This is the seventh release candidate for 1.0. It fixes a few bugs in 1.0
1144Release Candidate 6.
1145
1146## 1.0 Release Candidate 6
1147
1148This is the sixth release candidate for 1.0. It fixes a few bugs in 1.0 Release
1149Candidate 5.
1150
1151## 1.0 Release Candidate 5
1152
1153This is the fifth release candidate for 1.0. It fixes a few bugs in 1.0 Release
1154Candidate 4.
1155
1156## 1.0 Release Candidate 4
1157
1158This is the fourth release candidate for 1.0. It fixes a few bugs in 1.0 Release
1159Candidate 3.
1160
1161## 1.0 Release Candidate 3
1162
1163This is the third release candidate for 1.0. It fixes a few bugs in 1.0 Release
1164Candidate 2.
1165
1166## 1.0 Release Candidate 2
1167
1168This is the second release candidate for 1.0. It fixes a few bugs in 1.0 Release
1169Candidate 1.
1170
1171## 1.0 Release Candidate 1
1172
1173This is the first Release Candidate for 1.0. `bc` is complete, with `dc`, but it
1174is not tested.
1175
1176## 0.5
1177
1178This beta release completes more features, but it is still not complete nor
1179tested as thoroughly as necessary.
1180
1181## 0.4.1
1182
1183This beta release fixes a few bugs in 0.4.
1184
1185## 0.4
1186
1187This is a beta release. It does not have the complete set of features, and it is
1188not thoroughly tested.
1189
1190[1]: https://docs.microsoft.com/en-us/windows/wsl/install-win10
1191[2]: https://pkg.musl.cc/bc/
1192[3]: http://lcamtuf.coredump.cx/afl/
1193[4]: ./scripts/karatsuba.py
1194[5]: ./README.md
1195[6]: ./configure.sh
1196[7]: https://github.com/rain-1/linenoise-mob
1197[8]: https://github.com/antirez/linenoise
1198[9]: ./manuals/bc/A.1.md
1199[10]: ./manuals/dc/A.1.md
1200[11]: https://scan.coverity.com/projects/gavinhoward-bc
1201[12]: ./scripts/locale_install.sh
1202[13]: ./manuals/build.md
1203[14]: https://github.com/stesser
1204[15]: https://github.com/bugcrazy
1205[16]: ./manuals/bc/A.1.md#extended-library
1206[17]: https://github.com/skeeto/optparse
1207[18]: https://www.deepl.com/translator
1208[19]: ./manuals/benchmarks.md
1209[20]: https://github.com/apjanke/ronn-ng
1210[21]: https://pandoc.org/
1211[22]: ./scripts/locale_uninstall.sh
1212