Author: se
Date: Sat Jun 27 12:02:01 2020
New Revision: 362681
URL: https://svnweb.freebsd.org/changeset/base/362681

Log:
  Import new 2-clause BSD licenced implementation of the bc and dc commands
  
  These implementations of the bc and dc programs offer a number of advantages
  compared to the current implementations in the FreeBSD base system:
  
  - They do not depend on external large number functions (i.e. no dependency
    on OpenSSL or any other large number library)
  
  - They implements all features found in GNU bc/dc (with the exception of
    the forking of sub-processes, which the author of this version considers
    as a security issue).
  
  - They are significantly faster than the current code in base (more than
    2 orders of magnitude in some of my tests, e.g. for 12345^100000).
  
  - They should be fully compatible with all features and the behavior of the
    current implementations in FreeBSD (not formally verified).
  
  - They support POSIX message catalogs and come with localized messages in
    Chinese, Dutch, English, French, German, Japanese, Polish, Portugueze,
    and Russian.
  
  - They offer very detailed man-pages that provide far more information than
    the current ones.
  
  The upstream sources contain a large number of tests, which are not
  imported with this commit. They could be integrated into our test
  framework at a latter time.
  
  Installation of this version is controlled by the option "MK_GH_BC=yes".
  This option will be set to yes by default in 13-CURRENT, but will be off
  by default in 12-STABLE.
  
  Approved by:  imp
  Obtained from:        https://git.yzena.com/gavin/bc
  MFC after:    4 weeks
  Relnotes:     yes
  Differential Revision:        https://reviews.freebsd.org/D19982

Added:
  head/contrib/bc/LICENSE.md
  head/contrib/bc/Makefile.in   (contents, props changed)
  head/contrib/bc/NEWS.md
  head/contrib/bc/NOTICE.md
  head/contrib/bc/README.md
  head/contrib/bc/RELEASE.md
  head/contrib/bc/gen/bc_help.txt   (contents, props changed)
  head/contrib/bc/gen/dc_help.txt   (contents, props changed)
  head/contrib/bc/gen/lib.bc
  head/contrib/bc/gen/lib2.bc
  head/contrib/bc/gen/strgen.sh   (contents, props changed)
  head/contrib/bc/include/args.h   (contents, props changed)
  head/contrib/bc/include/bc.h   (contents, props changed)
  head/contrib/bc/include/dc.h   (contents, props changed)
  head/contrib/bc/include/file.h   (contents, props changed)
  head/contrib/bc/include/history.h   (contents, props changed)
  head/contrib/bc/include/lang.h   (contents, props changed)
  head/contrib/bc/include/lex.h   (contents, props changed)
  head/contrib/bc/include/num.h   (contents, props changed)
  head/contrib/bc/include/opt.h   (contents, props changed)
  head/contrib/bc/include/parse.h   (contents, props changed)
  head/contrib/bc/include/program.h   (contents, props changed)
  head/contrib/bc/include/rand.h   (contents, props changed)
  head/contrib/bc/include/read.h   (contents, props changed)
  head/contrib/bc/include/status.h   (contents, props changed)
  head/contrib/bc/include/vector.h   (contents, props changed)
  head/contrib/bc/include/vm.h   (contents, props changed)
  head/contrib/bc/locales/
  head/contrib/bc/locales/de_DE.ISO8859-1.msg
  head/contrib/bc/locales/de_DE.UTF-8.msg
  head/contrib/bc/locales/en_US.UTF-8.msg   (contents, props changed)
  head/contrib/bc/locales/en_US.msg
  head/contrib/bc/locales/es_ES.UTF-8.msg
  head/contrib/bc/locales/fr_FR.ISO8859-1.msg
  head/contrib/bc/locales/fr_FR.UTF-8.msg
  head/contrib/bc/locales/ja_JP.UTF-8.msg   (contents, props changed)
  head/contrib/bc/locales/ja_JP.eucJP.msg   (contents, props changed)
  head/contrib/bc/locales/nl_NL.ISO8859-1.msg
  head/contrib/bc/locales/nl_NL.UTF-8.msg
  head/contrib/bc/locales/pl_PL.ISO8859-2.msg
  head/contrib/bc/locales/pl_PL.UTF-8.msg
  head/contrib/bc/locales/pt_PT.ISO8859-1.msg
  head/contrib/bc/locales/pt_PT.UTF-8.msg
  head/contrib/bc/locales/ru_RU.CP1251.msg   (contents, props changed)
  head/contrib/bc/locales/ru_RU.CP866.msg   (contents, props changed)
  head/contrib/bc/locales/ru_RU.ISO8859-5.msg   (contents, props changed)
  head/contrib/bc/locales/ru_RU.KOI8-R.msg   (contents, props changed)
  head/contrib/bc/locales/ru_RU.UTF-8.msg   (contents, props changed)
  head/contrib/bc/locales/zh_CN.GB18030.msg   (contents, props changed)
  head/contrib/bc/locales/zh_CN.GB2312.msg   (contents, props changed)
  head/contrib/bc/locales/zh_CN.GBK.msg   (contents, props changed)
  head/contrib/bc/locales/zh_CN.UTF-8.msg   (contents, props changed)
  head/contrib/bc/locales/zh_CN.eucCN.msg   (contents, props changed)
  head/contrib/bc/manuals/algorithms.md
  head/contrib/bc/manuals/bc.1   (contents, props changed)
  head/contrib/bc/manuals/bc.1.ronn
  head/contrib/bc/manuals/bc.md   (contents, props changed)
  head/contrib/bc/manuals/benchmarks.md
  head/contrib/bc/manuals/build.md
  head/contrib/bc/manuals/dc.1   (contents, props changed)
  head/contrib/bc/manuals/dc.1.ronn
  head/contrib/bc/manuals/dc.md   (contents, props changed)
  head/contrib/bc/src/args.c   (contents, props changed)
  head/contrib/bc/src/bc/bc.c   (contents, props changed)
  head/contrib/bc/src/bc/lex.c   (contents, props changed)
  head/contrib/bc/src/bc/parse.c   (contents, props changed)
  head/contrib/bc/src/data.c   (contents, props changed)
  head/contrib/bc/src/dc/dc.c   (contents, props changed)
  head/contrib/bc/src/dc/lex.c   (contents, props changed)
  head/contrib/bc/src/dc/parse.c   (contents, props changed)
  head/contrib/bc/src/file.c   (contents, props changed)
  head/contrib/bc/src/history/history.c   (contents, props changed)
  head/contrib/bc/src/lang.c   (contents, props changed)
  head/contrib/bc/src/lex.c   (contents, props changed)
  head/contrib/bc/src/main.c   (contents, props changed)
  head/contrib/bc/src/num.c   (contents, props changed)
  head/contrib/bc/src/opt.c   (contents, props changed)
  head/contrib/bc/src/parse.c   (contents, props changed)
  head/contrib/bc/src/program.c   (contents, props changed)
  head/contrib/bc/src/rand/
  head/contrib/bc/src/rand/rand.c   (contents, props changed)
  head/contrib/bc/src/read.c   (contents, props changed)
  head/contrib/bc/src/vector.c   (contents, props changed)
  head/contrib/bc/src/vm.c   (contents, props changed)
  head/usr.bin/gh-bc/
  head/usr.bin/gh-bc/Makefile   (contents, props changed)
Directory Properties:
  head/contrib/bc/   (props changed)
  head/contrib/bc/gen/   (props changed)
  head/contrib/bc/include/   (props changed)
  head/contrib/bc/manuals/   (props changed)
  head/contrib/bc/src/   (props changed)
  head/contrib/bc/src/bc/   (props changed)
  head/contrib/bc/src/dc/   (props changed)
  head/contrib/bc/src/history/   (props changed)
Modified:
  head/share/mk/src.opts.mk
  head/usr.bin/Makefile

Added: head/contrib/bc/LICENSE.md
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/contrib/bc/LICENSE.md  Sat Jun 27 12:02:01 2020        (r362681)
@@ -0,0 +1,59 @@
+# License
+
+Copyright (c) 2018-2020 Gavin D. Howard <yzena.t...@gmail.com>
+
+All rights reserved.
+
+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.
+
+## History
+
+The files `src/history.c` and `include/history.h` are under the following
+copyrights and license:
+
+Copyright (c) 2010-2014, Salvatore Sanfilippo <antirez at gmail dot com><br>
+Copyright (c) 2010-2013, Pieter Noordhuis <pcnoordhuis at gmail dot com><br>
+Copyright (c) 2018 rain-1 <ra...@openmailbox.org><br>
+Copyright (c) 2018-2020, Gavin D. Howard <yzena.t...@gmail.com>
+
+All rights reserved.
+
+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.

Added: head/contrib/bc/Makefile.in
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/contrib/bc/Makefile.in Sat Jun 27 12:02:01 2020        (r362681)
@@ -0,0 +1,362 @@
+#
+# Copyright (c) 2018-2020 Gavin D. Howard and contributors.
+#
+# All rights reserved.
+#
+# 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.
+#
+# %%WARNING%%
+#
+.POSIX:
+
+VERSION = 3.0.2
+
+SRC = %%SRC%%
+OBJ = %%OBJ%%
+GCDA = %%GCDA%%
+GCNO = %%GCNO%%
+
+BC_SRC = %%BC_SRC%%
+BC_OBJ = %%BC_OBJ%%
+BC_GCDA = %%BC_GCDA%%
+BC_GCNO = %%BC_GCNO%%
+
+DC_SRC = %%DC_SRC%%
+DC_OBJ = %%DC_OBJ%%
+DC_GCDA = %%DC_GCDA%%
+DC_GCNO = %%DC_GCNO%%
+
+HISTORY_SRC = %%HISTORY_SRC%%
+HISTORY_OBJ = %%HISTORY_OBJ%%
+HISTORY_GCDA = %%HISTORY_GCDA%%
+HISTORY_GCNO = %%HISTORY_GCNO%%
+
+RAND_SRC = %%RAND_SRC%%
+RAND_OBJ = %%RAND_OBJ%%
+RAND_GCDA = %%RAND_GCDA%%
+RAND_GCNO = %%RAND_GCNO%%
+
+BC_ENABLED_NAME = BC_ENABLED
+BC_ENABLED = %%BC_ENABLED%%
+DC_ENABLED_NAME = DC_ENABLED
+DC_ENABLED = %%DC_ENABLED%%
+
+GEN_DIR = gen
+GEN = %%GEN%%
+GEN_EXEC = $(GEN_DIR)/$(GEN)
+GEN_C = $(GEN_DIR)/$(GEN).c
+
+GEN_EMU = %%GEN_EMU%%
+
+BC_LIB = $(GEN_DIR)/lib.bc
+BC_LIB_C = $(GEN_DIR)/lib.c
+BC_LIB_O = %%BC_LIB_O%%
+BC_LIB_GCDA = $(GEN_DIR)/lib.gcda
+BC_LIB_GCNO = $(GEN_DIR)/lib.gcno
+
+BC_LIB2 = $(GEN_DIR)/lib2.bc
+BC_LIB2_C = $(GEN_DIR)/lib2.c
+BC_LIB2_O = %%BC_LIB2_O%%
+BC_LIB2_GCDA = $(GEN_DIR)/lib2.gcda
+BC_LIB2_GCNO = $(GEN_DIR)/lib2.gcno
+
+BC_HELP = $(GEN_DIR)/bc_help.txt
+BC_HELP_C = $(GEN_DIR)/bc_help.c
+BC_HELP_O = %%BC_HELP_O%%
+BC_HELP_GCDA = $(GEN_DIR)/bc_help.gcda
+BC_HELP_GCNO = $(GEN_DIR)/bc_help.gcno
+
+DC_HELP = $(GEN_DIR)/dc_help.txt
+DC_HELP_C = $(GEN_DIR)/dc_help.c
+DC_HELP_O = %%DC_HELP_O%%
+DC_HELP_GCDA = $(GEN_DIR)/dc_help.gcda
+DC_HELP_GCNO = $(GEN_DIR)/dc_help.gcno
+
+BIN = bin
+LOCALES = locales
+EXEC_SUFFIX = %%EXECSUFFIX%%
+EXEC_PREFIX = %%EXECPREFIX%%
+
+BC = bc
+DC = dc
+BC_EXEC = $(BIN)/$(EXEC_PREFIX)$(BC)
+DC_EXEC = $(BIN)/$(EXEC_PREFIX)$(DC)
+
+MANUALS = manuals
+BC_MANPAGE_NAME = $(EXEC_PREFIX)$(BC)$(EXEC_SUFFIX).1
+BC_MANPAGE = $(MANUALS)/$(BC).1
+BC_RONN = $(BC_MANPAGE).ronn
+DC_MANPAGE_NAME = $(EXEC_PREFIX)$(DC)$(EXEC_SUFFIX).1
+DC_MANPAGE = $(MANUALS)/$(DC).1
+DC_RONN = $(DC_MANPAGE).ronn
+
+MANPAGE_INSTALL_ARGS = -Dm644
+
+%%DESTDIR%%
+BINDIR = %%BINDIR%%
+MAN1DIR = %%MAN1DIR%%
+MAIN_EXEC = $(EXEC_PREFIX)$(%%MAIN_EXEC%%)$(EXEC_SUFFIX)
+EXEC = $(%%EXEC%%)
+NLSPATH = %%NLSPATH%%
+
+BC_ENABLE_HISTORY = %%HISTORY%%
+BC_ENABLE_EXTRA_MATH_NAME = BC_ENABLE_EXTRA_MATH
+BC_ENABLE_EXTRA_MATH = %%EXTRA_MATH%%
+BC_ENABLE_NLS = %%NLS%%
+BC_ENABLE_PROMPT = %%PROMPT%%
+BC_LONG_BIT = %%LONG_BIT%%
+
+RM = rm
+MKDIR = mkdir
+
+INSTALL = ./install.sh
+SAFE_INSTALL = ./safe-install.sh
+LINK = ./link.sh
+MANPAGE = ./manpage.sh
+KARATSUBA = ./karatsuba.py
+LOCALE_INSTALL = ./locale_install.sh
+LOCALE_UNINSTALL = ./locale_uninstall.sh
+
+VALGRIND_ARGS = --error-exitcode=100 --leak-check=full --show-leak-kinds=all 
--errors-for-leak-kinds=all
+
+BC_NUM_KARATSUBA_LEN = %%KARATSUBA_LEN%%
+
+CPPFLAGS1 = -D$(BC_ENABLED_NAME)=$(BC_ENABLED) 
-D$(DC_ENABLED_NAME)=$(DC_ENABLED)
+CPPFLAGS2 = $(CPPFLAGS1) -I./include/ -DVERSION=$(VERSION) %%LONG_BIT_DEFINE%%
+CPPFLAGS3 = $(CPPFLAGS2) -DEXECPREFIX=$(EXEC_PREFIX) -DMAINEXEC=$(MAIN_EXEC)
+CPPFLAGS4 = $(CPPFLAGS3) -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700
+CPPFLAGS5 = $(CPPFLAGS4) -DBC_NUM_KARATSUBA_LEN=$(BC_NUM_KARATSUBA_LEN)
+CPPFLAGS6 = $(CPPFLAGS5) -DBC_ENABLE_NLS=$(BC_ENABLE_NLS) 
-DBC_ENABLE_PROMPT=$(BC_ENABLE_PROMPT)
+CPPFLAGS7 = $(CPPFLAGS6) -D$(BC_ENABLE_EXTRA_MATH_NAME)=$(BC_ENABLE_EXTRA_MATH)
+CPPFLAGS = $(CPPFLAGS7) -DBC_ENABLE_HISTORY=$(BC_ENABLE_HISTORY)
+CFLAGS = $(CPPFLAGS) %%CPPFLAGS%% %%CFLAGS%%
+LDFLAGS = %%LDFLAGS%%
+
+HOSTCFLAGS = %%HOSTCFLAGS%%
+
+CC = %%CC%%
+HOSTCC = %%HOSTCC%%
+
+BC_LIB_C_ARGS = bc_lib bc.h bc_lib_name $(BC_ENABLED_NAME) 1
+BC_LIB2_C_ARGS = bc_lib2 bc.h bc_lib2_name "$(BC_ENABLED_NAME) && 
$(BC_ENABLE_EXTRA_MATH_NAME)" 1
+
+OBJS1 = $(OBJ) $(DC_OBJ) $(BC_OBJ) $(HISTORY_OBJ) $(RAND_OBJ) $(BC_HELP_O) 
$(DC_HELP_O)
+OBJS = $(OBJS1) $(BC_LIB_O) $(BC_LIB2_O) $(BC_LIB3_O)
+OBJ_TARGETS1 = $(DC_HELP_O) $(BC_HELP_O) $(BC_LIB_O) $(BC_LIB2_O) $(BC_LIB3_O)
+OBJ_TARGETS = $(OBJ_TARGETS1) $(BC_OBJ) $(DC_OBJ) $(HISTORY_OBJ) $(RAND_OBJ) 
$(OBJ)
+
+.c.o:
+       $(CC) $(CFLAGS) -o $@ -c $<
+
+all: make_bin $(OBJ_TARGETS)
+       $(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $(EXEC)
+       %%LINK%%
+
+$(GEN_EXEC):
+       %%GEN_EXEC_TARGET%%
+
+$(BC_LIB_C): $(GEN_EXEC) $(BC_LIB)
+       $(GEN_EMU) $(GEN_EXEC) $(BC_LIB) $(BC_LIB_C) $(BC_LIB_C_ARGS)
+
+$(BC_LIB2_C): $(GEN_EXEC) $(BC_LIB2)
+       $(GEN_EMU) $(GEN_EXEC) $(BC_LIB2) $(BC_LIB2_C) $(BC_LIB2_C_ARGS)
+
+$(BC_HELP_C): $(GEN_EXEC) $(BC_HELP)
+       $(GEN_EMU) $(GEN_EXEC) $(BC_HELP) $(BC_HELP_C) bc_help bc.h "" 
$(BC_ENABLED_NAME)
+
+$(DC_HELP_C): $(GEN_EXEC) $(DC_HELP)
+       $(GEN_EMU) $(GEN_EXEC) $(DC_HELP) $(DC_HELP_C) dc_help dc.h "" 
$(DC_ENABLED_NAME)
+
+make_bin:
+       $(MKDIR) -p $(BIN)
+
+help:
+       @printf 'available targets:\n'
+       @printf '\n'
+       @printf '    all (default)   builds %%EXECUTABLES%%\n'
+       @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'
+       @printf '    valgrind        runs the test suite through valgrind\n'
+       @printf '    valgrind_bc     runs the bc test suite, if bc has been 
built,\n'
+       @printf '                    through valgrind\n'
+       @printf '    valgrind_dc     runs the dc test suite, if dc has been 
built,\n'
+       @printf '                    through valgrind\n'
+
+check: test
+
+test: test_bc timeconst test_dc
+
+test_bc:
+       %%BC_TEST%%
+
+test_dc:
+       %%DC_TEST%%
+
+time_test: time_test_bc timeconst time_test_dc
+
+time_test_bc:
+       %%BC_TIME_TEST%%
+
+time_test_dc:
+       %%DC_TIME_TEST%%
+
+timeconst:
+       %%TIMECONST%%
+
+valgrind: valgrind_bc valgrind_dc
+
+valgrind_bc:
+       %%VG_BC_TEST%%
+
+valgrind_dc:
+       %%VG_DC_TEST%%
+
+karatsuba:
+       %%KARATSUBA%%
+
+karatsuba_test:
+       %%KARATSUBA_TEST%%
+
+coverage_output:
+       %%COVERAGE_OUTPUT%%
+
+coverage:%%COVERAGE_PREREQS%%
+
+version:
+       @printf '%s' "$(VERSION)"
+
+libcname:
+       @printf '%s' "$(BC_LIB_C)"
+
+extra_math:
+       @printf '%s' "$(BC_ENABLE_EXTRA_MATH)"
+
+manpages:
+       $(MANPAGE) $(BC_RONN) $(BC_MANPAGE)
+       $(MANPAGE) $(DC_RONN) $(DC_MANPAGE)
+
+clean_gen:
+       @$(RM) -f $(GEN_EXEC)
+
+clean:%%CLEAN_PREREQS%%
+       @printf 'Cleaning files...\n'
+       @$(RM) -f $(OBJ)
+       @$(RM) -f $(BC_OBJ)
+       @$(RM) -f $(DC_OBJ)
+       @$(RM) -f $(HISTORY_OBJ)
+       @$(RM) -f $(RAND_OBJ)
+       @$(RM) -f $(BC_EXEC)
+       @$(RM) -f $(DC_EXEC)
+       @$(RM) -fr $(BIN)
+       @$(RM) -f $(LOCALES)/*.cat
+       @$(RM) -f $(BC_LIB_C) $(BC_LIB_O)
+       @$(RM) -f $(BC_LIB2_C) $(BC_LIB2_O)
+       @$(RM) -f $(BC_HELP_C) $(BC_HELP_O)
+       @$(RM) -f $(DC_HELP_C) $(DC_HELP_O)
+
+clean_config: clean
+       @printf 'Cleaning config...\n'
+       @$(RM) -f Makefile
+
+clean_coverage:
+       @printf 'Cleaning coverage files...\n'
+       @$(RM) -f *.gcov
+       @$(RM) -f *.html
+       @$(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)
+
+clean_tests: clean clean_config clean_coverage
+       @printf 'Cleaning test files...\n'
+       @$(RM) -f tests/bc/parse.txt tests/bc/parse_results.txt
+       @$(RM) -f tests/bc/print.txt tests/bc/print_results.txt
+       @$(RM) -f tests/bc/bessel.txt tests/bc/bessel_results.txt
+       @$(RM) -f tests/bc/scripts/bessel.txt
+       @$(RM) -f tests/bc/scripts/parse.txt
+       @$(RM) -f tests/bc/scripts/print.txt
+       @$(RM) -f tests/bc/scripts/add.txt
+       @$(RM) -f tests/bc/scripts/divide.txt
+       @$(RM) -f tests/bc/scripts/multiply.txt
+       @$(RM) -f tests/bc/scripts/subtract.txt
+       @$(RM) -f tests/dc/scripts/prime.txt tests/dc/scripts/stream.txt
+       @$(RM) -f .log_*.txt
+       @$(RM) -f .math.txt .results.txt .ops.txt
+       @$(RM) -f .test.txt
+       @$(RM) -f tags .gdbbreakpoints .gdb_history .gdbsetup
+       @$(RM) -f cscope.*
+       @$(RM) -f bc.old
+
+install_locales:
+       $(LOCALE_INSTALL) $(NLSPATH) $(MAIN_EXEC) $(DESTDIR)
+
+install_bc_manpage:
+       $(SAFE_INSTALL) $(MANPAGE_INSTALL_ARGS) $(BC_MANPAGE) 
$(DESTDIR)$(MAN1DIR)/$(BC_MANPAGE_NAME)
+
+install_dc_manpage:
+       $(SAFE_INSTALL) $(MANPAGE_INSTALL_ARGS) $(DC_MANPAGE) 
$(DESTDIR)$(MAN1DIR)/$(DC_MANPAGE_NAME)
+
+install:%%INSTALL_LOCALES_PREREQS%%%%INSTALL_PREREQS%%
+       $(INSTALL) $(DESTDIR)$(BINDIR) "$(EXEC_SUFFIX)"
+
+uninstall_locales:
+       $(LOCALE_UNINSTALL) $(NLSPATH) $(MAIN_EXEC) $(DESTDIR)
+
+uninstall_bc_manpage:
+       $(RM) -f $(DESTDIR)$(MAN1DIR)/$(BC_MANPAGE_NAME)
+
+uninstall_bc:
+       $(RM) -f $(DESTDIR)$(BINDIR)/$(EXEC_PREFIX)$(BC)$(EXEC_SUFFIX)
+
+uninstall_dc_manpage:
+       $(RM) -f $(DESTDIR)$(MAN1DIR)/$(DC_MANPAGE_NAME)
+
+uninstall_dc:
+       $(RM) -f $(DESTDIR)$(BINDIR)/$(EXEC_PREFIX)$(DC)$(EXEC_SUFFIX)
+
+uninstall:%%UNINSTALL_LOCALES_PREREQS%%%%UNINSTALL_MAN_PREREQS%%%%UNINSTALL_PREREQS%%

Added: head/contrib/bc/NEWS.md
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/contrib/bc/NEWS.md     Sat Jun 27 12:02:01 2020        (r362681)
@@ -0,0 +1,824 @@
+# News
+
+## 3.0.2
+
+This is a production release that adds `utf8` locale symlinks and removes an
+unused `auto` variable from the `ceil()` function in the [extended math
+library][16].
+
+Users do ***NOT*** need to update unless they want the locales.
+
+## 3.0.1
+
+This is a production release with two small changes. Users do ***NOT*** need to
+upgrade to this release; however, if they haven't upgraded to `3.0.0` yet, it
+may be worthwhile to upgrade to this release.
+
+The first change is fixing a compiler warning on FreeBSD with strict warnings
+on.
+
+The second change is to make the new implementation of `ceil()` in `lib2.bc`
+much more efficient.
+
+## 3.0.0
+
+*Notes for package maintainers:*
+
+*First, the `2.7.0` release series saw a change in the option parsing. This 
made
+me change one error message and add a few others. The error message that was
+changed removed one format specifier. This means that `printf()` will seqfault
+on old locale files. Unfortunately, `bc` cannot use any locale files except the
+global ones that are already installed, so it will use the previous ones while
+running tests during install. **If `bc` segfaults while running arg tests when
+updating, it is because the global locale files have not been replaced. Make
+sure to either prevent the test suite from running on update or remove the old
+locale files before updating.** Once this is done, `bc` should install without
+problems.*
+
+*Second, **the option to build without signal support has been removed**. See
+below for the reasons why.*
+
+This is a production release with some small bug fixes, a few improvements,
+three major bug fixes, and a complete redesign of `bc`'s error and signal
+handling. **Users and package maintainers should update to this version as soon
+as possible.**
+
+The first major bug fix was in how `bc` executed files. Previously, a whole 
file
+was parsed before it was executed, but if a function is defined *after* code,
+especially if the function definition was actually a redefinition, and the code
+before the definition referred to the previous function, this `bc` would 
replace
+the function before executing any code. The fix was to make sure that all code
+that existed before a function definition was executed.
+
+The second major bug fix was in `bc`'s `lib2.bc`. The `ceil()` function had a
+bug where a `0` in the decimal place after the truncation position, caused it 
to
+output the wrong numbers if there was any non-zero digit after.
+
+The third major bug is that when passing parameters to functions, if an
+expression included an array (not an array element) as a parameter, it was
+accepted, when it should have been rejected. It is now correctly rejected.
+
+Beyond that, this `bc` got several improvements that both sped it up, improved
+the handling of signals, and improved the error handling.
+
+First, the requirements for `bc` were pushed back to POSIX 2008. `bc` uses one
+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
+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.
+
+Third, the default Karatsuba length was updated from 64 to 32 after making the
+optimization changes below, since 32 is going to be better than 64 after the
+changes.
+
+Fourth, Spanish translations were added.
+
+Fifth, the interpreter received a speedup to make performance on non-math-heavy
+scripts more competitive with GNU `bc`. While improvements did, in fact, get it
+much closer (see the [benchmarks][19]), it isn't quite there.
+
+There were several things done to speed up the interpreter:
+
+First, several small inefficiencies were removed. These inefficiencies included
+calling the function `bc_vec_pop(v)` twice instead of calling
+`bc_vec_npop(v, 2)`. They also included an extra function call for checking the
+size of the stack and checking the size of the stack more than once on several
+operations.
+
+Second, since the current `bc` function is the one that stores constants and
+strings, the program caches pointers to the current function's vectors of
+constants and strings to prevent needing to grab the current function in order
+to grab a constant or a string.
+
+Third, `bc` tries to reuse `BcNum`'s (the internal representation of
+arbitary-precision numbers). If a `BcNum` has the default capacity of
+`BC_NUM_DEF_SIZE` (32 on 64-bit and 16 on 32-bit) when it is freed, it is added
+to a list of available `BcNum`'s. And then, when a `BcNum` is allocated with a
+capacity of `BC_NUM_DEF_SIZE` and any `BcNum`'s exist on the list of reusable
+ones, one of those ones is grabbed instead.
+
+In order to support these changes, the `BC_NUM_DEF_SIZE` was changed. It used 
to
+be 16 bytes on all systems, but it was changed to more closely align with the
+minimum allocation size on Linux, which is either 32 bytes (64-bit musl), 24
+bytes (64-bit glibc), 16 bytes (32-bit musl), or 12 bytes (32-bit glibc). Since
+these are the minimum allocation sizes, these are the sizes that would be
+allocated anyway, making it worth it to just use the whole space, so the value
+of `BC_NUM_DEF_SIZE` on 64-bit systems was changed to 32 bytes.
+
+On top of that, at least on 64-bit, `BC_NUM_DEF_SIZE` supports numbers with
+either 72 integer digits or 45 integer digits and 27 fractional digits. This
+should be more than enough for most cases since `bc`'s default `scale` values
+are 0 or 20, meaning that, by default, it has at most 20 fractional digits. And
+45 integer digits are *a lot*; it's enough to calculate the amount of mass in
+the Milky Way galaxy in kilograms. Also, 72 digits is enough to calculate the
+diameter of the universe in Planck lengths.
+
+(For 32-bit, these numbers are either 32 integer digits or 12 integer digits 
and
+20 fractional digits. These are also quite big, and going much bigger on a
+32-bit system seems a little pointless since 12 digits in just under a trillion
+and 20 fractional digits is still enough for about any use since `10^-20` light
+years is just under a millimeter.)
+
+All of this together means that for ordinary uses, and even uses in scientific
+work, the default number size will be all that is needed, which means that
+nearly all, if not all, numbers will be reused, relieving pressure on the 
system
+allocator.
+
+I did several experiments to find the changes that had the most impact,
+especially with regard to reusing `BcNum`'s. One was putting `BcNum`'s into
+buckets according to their capacity in powers of 2 up to 512. That performed
+worse than `bc` did in `2.7.2`. Another was putting any `BcNum` on the reuse
+list that had a capacity of `BC_NUM_DEF_SIZE * 2` and reusing them for 
`BcNum`'s
+that requested `BC_NUM_DEF_SIZE`. This did reduce the amount of time spent, but
+it also spent a lot of time in the system allocator for an unknown reason. 
(When
+using `strace`, a bunch more `brk` calls showed up.) Just reusing `BcNum`'s 
that
+had exactly `BC_NUM_DEF_SIZE` capacity spent the smallest amount of time in 
both
+user and system time. This makes sense, especially with the changes to make
+`BC_NUM_DEF_SIZE` bigger on 64-bit systems, since the vast majority of numbers
+will only ever use numbers with a size less than or equal to `BC_NUM_DEF_SIZE`.
+
+Last of all, `bc`'s signal handling underwent a complete redesign. (This is the
+reason that this version is `3.0.0` and not `2.8.0`.) The change was to move
+from a polling approach to signal handling to an interrupt-based approach.
+
+Previously, every single loop condition had a check for signals. I suspect that
+this could be expensive when in tight loops.
+
+Now, the signal handler just uses `longjmp()` (actually `siglongjmp()`) to 
start
+an unwinding of the stack until it is stopped or the stack is unwound to
+`main()`, which just returns. If `bc` is currently executing code that cannot 
be
+safely interrupted (according to POSIX), then signals are "locked." The signal
+handler checks if the lock is taken, and if it is, it just sets the status to
+indicate that a signal arrived. Later, when the signal lock is released, the
+status is checked to see if a signal came in. If so, the stack unwinding 
starts.
+
+This design eliminates polling in favor of maintaining a stack of `jmp_buf`'s.
+This has its own performance implications, but it gives better interaction. And
+the cost of pushing and popping a `jmp_buf` in a function is paid at most 
twice.
+Most functions do not pay that price, and most of the rest only pay it once.
+(There are only some 3 functions in `bc` that push and pop a `jmp_buf` twice.)
+
+As a side effect of this change, I had to eliminate the use of `stdio.h` in 
`bc`
+because `stdio` does not play nice with signals and `longjmp()`. I implemented
+custom I/O buffer code that takes a fraction of the size. This means that 
static
+builds will be smaller, but non-static builds will be bigger, though they will
+have less linking time.
+
+This change is also good because my history implementation was already 
bypassing
+`stdio` for good reasons, and unifying the architecture was a win.
+
+Another reason for this change is that my `bc` should *always* behave correctly
+in the presence of signals like `SIGINT`, `SIGTERM`, and `SIGQUIT`. With the
+addition of my own I/O buffering, I needed to also make sure that the buffers
+were correctly flushed even when such signals happened.
+
+For this reason, I **removed the option to build without signal support**.
+
+As a nice side effect of this change, the error handling code could be changed
+to take advantage of the stack unwinding that signals used. This means that
+signals and error handling use the same code paths, which means that the stack
+unwinding is well-tested. (Errors are tested heavily in the test suite.)
+
+It also means that functions do not need to return a status code that
+***every*** caller needs to check. This eliminated over 100 branches that 
simply
+checked return codes and then passed that return code up the stack if 
necessary.
+The code bloat savings from this is at least 1700 bytes on `x86_64`, *before*
+taking into account the extra code from removing `stdio.h`.
+
+## 2.7.2
+
+This is a production release with one major bug fix.
+
+The `length()` built-in function can take either a number or an array. If it
+takes an array, it returns the length of the array. Arrays can be passed by
+reference. The bug is that the `length()` function would not properly
+dereference arrays that were references. This is a bug that affects all users.
+
+**ALL USERS SHOULD UPDATE `bc`**.
+
+## 2.7.1
+
+This is a production release with fixes for new locales and fixes for compiler
+warnings on FreeBSD.
+
+## 2.7.0
+
+This is a production release with a bug fix for Linux, new translations, and 
new
+features.
+
+Bug fixes:
+
+* Option parsing in `BC_ENV_ARGS` was broken on Linux in 2.6.1 because 
`glibc`'s
+  `getopt_long()` is broken. To get around that, and to support long options on
+  every platform, an adapted version of [`optparse`][17] was added. Now, `bc`
+  does not even use `getopt()`.
+* Parsing `BC_ENV_ARGS` with quotes now works. It isn't the smartest, but it
+  does the job if there are spaces in file names.
+
+The following new languages are supported:
+
+* Dutch
+* Polish
+* Russian
+* Japanes
+* Simplified Chinese
+
+All of these translations were generated using [DeepL][18], so improvements are
+welcome.
+
+There is only one new feature: **`bc` now has a built-in pseudo-random number
+generator** (PRNG).
+
+The PRNG is seeded, making it useful for applications where
+`/dev/urandom` does not work because output needs to be reproducible. However,
+it also uses `/dev/urandom` to seed itself by default, so it will start with a
+good seed by default.
+
+It also outputs 32 bits on 32-bit platforms and 64 bits on 64-bit platforms, 
far
+better than the 15 bits of C's `rand()` and `bash`'s `$RANDOM`.
+
+In addition, the PRNG can take a bound, and when it gets a bound, it
+automatically adjusts to remove bias. It can also generate numbers of arbitrary
+size. (As of the time of release, the largest pseudo-random number generated by
+this `bc` was generated with a bound of `2^(2^20)`.)
+
+***IMPORTANT: read the [`bc` manual][9] and the [`dc` manual][10] to find out
+exactly what guarantees the PRNG provides. The underlying implementation is not
+guaranteed to stay the same, but the guarantees that it provides are guaranteed
+to stay the same regardless of the implementation.***
+
+On top of that, four functions were added to `bc`'s [extended math library][16]
+to make using the PRNG easier:
+
+* `frand(p)`: Generates a number between `[0,1)` to `p` decimal places.
+* `ifrand(i, p)`: Generates an integer with bound `i` and adds it to 
`frand(p)`.
+* `srand(x)`: Randomizes the sign of `x`. In other words, it flips the sign of
+  `x` with probability `0.5`.
+* `brand()`: Returns a random boolean value (either `0` or `1`).
+
+## 2.6.1
+
+This is a production release with a bug fix for FreeBSD.
+
+The bug was that when `bc` was built without long options, it would give a 
fatal
+error on every run. This was caused by a mishandling of `optind`.
+
+## 2.6.0
+
+This release is a production release ***with no bugfixes***. If you do not want
+to upgrade, you don't have to.
+
+No source code changed; the only thing that changed was `lib2.bc`.
+
+This release adds one function to the [extended math library][16]: `p(x, y)`,
+which calculates `x` to the power of `y`, whether or not `y` is an integer. 
(The
+`^` operator can only accept integer powers.)
+
+This release also includes a couple of small tweaks to the [extended math
+library][16], mostly to fix returning numbers with too high of `scale`.
+
+## 2.5.3
+
+This release is a production release which addresses inconsistencies in the
+Portuguese locales. No `bc` code was changed.
+
+The issues were that the ISO files used different naming, and also that the
+files that should have been symlinks were not. I did not catch that because
+GitHub rendered them the exact same way.
+
+## 2.5.2
+
+This release is a production release.
+
+No code was changed, but the build system was changed to allow `CFLAGS` to be
+given to `CC`, like this:
+
+```
+CC="gcc -O3 -march=native" ./configure.sh
+```
+
+If this happens, the flags are automatically put into `CFLAGS`, and the 
compiler
+is set appropriately. In the example above this means that `CC` will be "gcc"
+and `CFLAGS` will be "-O3 -march=native".
+
+This behavior was added to conform to GNU autotools practices.
+
+## 2.5.1
+
+This is a production release which addresses portability concerns discovered
+in the `bc` build system. No `bc` code was changed.
+
+* Support for Solaris SPARC and AIX were added.
+* Minor documentations edits were performed.
+* An option for `configure.sh` was added to disable long options if
+  `getopt_long()` is missing.
+
+## 2.5.0
+
+This is a production release with new translations. No code changed.
+
+The translations were contributed by [bugcrazy][15], and they are for
+Portuguese, both Portugal and Brazil locales.
+
+## 2.4.0
+
+This is a production release primarily aimed at improving `dc`.
+
+* A couple of copy and paste errors in the [`dc` manual][10] were fixed.
+* `dc` startup was optimized by making sure it didn't have to set up `bc`-only
+  things.
+* The `bc` `&&` and `||` operators were made available to `dc` through the `M`
+  and `m` commands, respectively.
+* `dc` macros were changed to be tail call-optimized.
+
+The last item, tail call optimization, means that if the last thing in a macro
+is a call to another macro, then the old macro is popped before executing the
+new macro. This change was made to stop `dc` from consuming more and more 
memory
+as macros are executed in a loop.
+
+The `q` and `Q` commands still respect the "hidden" macros by way of recording
+how many macros were removed by tail call optimization.
+
+## 2.3.2
+
+This is a production release meant to fix warnings in the Gentoo `ebuild` by
+making it possible to disable binary stripping. Other users do *not* need to
+upgrade.
+
+## 2.3.1
+
+This is a production release. It fixes a bug that caused `-1000000000 < -1` to
+return `0`. This only happened with negative numbers and only if the value on
+the left was more negative by a certain amount. That said, this bug *is* a bad
+bug, and needs to be fixed.
+
+**ALL USERS SHOULD UPDATE `bc`**.
+
+## 2.3.0
+
+This is a production release with changes to the build system.
+
+## 2.2.0
+
+This release is a production release. It only has new features and performance
+improvements.
+
+1.     The performance of `sqrt(x)` was improved.
+2.     The new function `root(x, n)` was added to the extended math library to
+       calculate `n`th roots.
+3.     The new function `cbrt(x)` was added to the extended math library to
+       calculate cube roots.
+
+## 2.1.3
+
+This is a non-critical release; it just changes the build system, and in
+non-breaking ways:
+
+1.     Linked locale files were changed to link to their sources with a 
relative
+       link.
+2.     A bug in `configure.sh` that caused long option parsing to fail under 
`bash`
+       was fixed.
+
+## 2.1.2
+
+This release is not a critical release.
+
+1.     A few codes were added to history.
+2.     Multiplication was optimized a bit more.
+3.     Addition and subtraction were both optimized a bit more.
+
+## 2.1.1
+
+This release contains a fix for the test suite made for Linux from Scratch: now
+the test suite prints `pass` when a test is passed.
+
+Other than that, there is no change in this release, so distros and other users
+do not need to upgrade.
+
+## 2.1.0
+
+This release is a production release.
+
+The following bugs were fixed:
+
+1.     A `dc` bug that caused stack mishandling was fixed.
+2.     A warning on OpenBSD was fixed.
+3.     Bugs in `ctrl+arrow` operations in history were fixed.
+4.     The ability to paste multiple lines in history was added.
+5.     A `bc` bug, mishandling of array arguments to functions, was fixed.
+6.     A crash caused by freeing the wrong pointer was fixed.
+7.     A `dc` bug where strings, in a rare case, were mishandled in parsing was
+       fixed.
+
+In addition, the following changes were made:
+
+1.     Division was slightly optimized.
+2.     An option was added to the build to disable printing of prompts.
+3.     The special case of empty arguments is now handled. This is to prevent
+       errors in scripts that end up passing empty arguments.
+4.     A harmless bug was fixed. This bug was that, with the pop instructions
+       (mostly) removed (see below), `bc` would leave extra values on its 
stack for
+       `void` functions and in a few other cases. These extra items would not
+       affect anything put on the stack and would not cause any sort of crash 
or
+       even buggy behavior, but they would cause `bc` to take more memory than 
it
+       needed.
+
+On top of the above changes, the following optimizations were added:
+
+1.     The need for pop instructions in `bc` was removed.
+2.     Extra tests on every iteration of the interpreter loop were removed.
+3.     Updating function and code pointers on every iteration of the 
interpreter
+       loop was changed to only updating them when necessary.
+4.     Extra assignments to pointers were removed.
+
+Altogether, these changes sped up the interpreter by around 2x.
+
+***NOTE***: This is the last release with new features because this `bc` is now
+considered complete. From now on, only bug fixes and new translations will be
+added to this `bc`.
+
+## 2.0.3
+
+This is a production, bug-fix release.
+
+Two bugs were fixed in this release:
+
+1.     A rare and subtle signal handling bug was fixed.
+2.     A misbehavior on `0` to a negative power was fixed.
+
+The last bug bears some mentioning.
+
+When I originally wrote power, I did not thoroughly check its error cases;
+instead, I had it check if the first number was `0` and then if so, just return
+`0`. However, `0` to a negative power means that `1` will be divided by `0`,
+which is an error.
+
+I caught this, but only after I stopped being cocky. You see, sometime later, I
+had noticed that GNU `bc` returned an error, correctly, but I thought it was
+wrong simply because that's not what my `bc` did. I saw it again later and had 
a
+double take. I checked for real, finally, and found out that my `bc` was wrong
+all along.
+
+That was bad on me. But the bug was easy to fix, so it is fixed now.
+
+There are two other things in this release:
+
+1.     Subtraction was optimized by [Stefan Eßer][14].
+2.     Division was also optimized, also by Stefan Eßer.
+
+## 2.0.2
+
+This release contains a fix for a possible overflow in the signal handling. I
+would be surprised if any users ran into it because it would only happen after 
2
+billion (`2^31-1`) `SIGINT`'s, but I saw it and had to fix it.
+
+## 2.0.1
+
+This release contains very few things that will apply to any users.
+
+1.     A slight bug in `dc`'s interactive mode was fixed.
+2.     A bug in the test suite that was only triggered on NetBSD was fixed.
+3.     **The `-P`/`--no-prompt` option** was added for users that do not want a
+       prompt.
+4.     A `make check` target was added as an alias for `make test`.
+5.     `dc` got its own read prompt: `?> `.
+
+## 2.0.0
+
+This release is a production release.
+
+This release is also a little different from previous releases. From here on
+out, I do not plan on adding any more features to this `bc`; I believe that it
+is complete. However, there may be bug fix releases in the future, if I or any
+others manage to find bugs.
+
+This release has only a few new features:
+
+1.     `atan2(y, x)` was added to the extended math library as both `a2(y, x)` 
and
+       `atan2(y, x)`.
+2.     Locales were fixed.
+3.     A **POSIX shell-compatible script was added as an alternative to 
compiling
+       `gen/strgen.c`** on a host machine. More details about making the choice
+       between the two can be found by running `./configure.sh --help` or 
reading
+       the [build manual][13].
+4.     Multiplication was optimized by using **diagonal multiplication**, 
rather
+       than straight brute force.
+5.     The `locale_install.sh` script was fixed.
+6.     `dc` was given the ability to **use the environment variable
+       `DC_ENV_ARGS`**.
+7.     `dc` was also given the ability to **use the `-i` or `--interactive`**
+       options.
+8.     Printing the prompt was fixed so that it did not print when it 
shouldn't.
+9.     Signal handling was fixed.
+10.    **Handling of `SIGTERM` and `SIGQUIT`** was fixed.
+11.    The **built-in functions `maxibase()`, `maxobase()`, and `maxscale()`** 
(the
+       commands `T`, `U`, `V` in `dc`, respectively) were added to allow 
scripts to
+       query for the max allowable values of those globals.
+12.    Some incompatibilities with POSIX were fixed.
+
+In addition, this release is `2.0.0` for a big reason: the internal format for
+numbers changed. They used to be a `char` array. Now, they are an array of
+larger integers, packing more decimal digits into each integer. This has
+delivered ***HUGE*** performance improvements, especially for multiplication,
+division, and power.
+
+This `bc` should now be the fastest `bc` available, but I may be wrong.
+
+## 1.2.8
+
+This release contains a fix for a harmless bug (it is harmless in that it still
+works, but it just copies extra data) in the [`locale_install.sh`][12] script.
+
+## 1.2.7
+
+This version contains fixes for the build on Arch Linux.
+
+## 1.2.6
+
+This release removes the use of `local` in shell scripts because it's not POSIX
+shell-compatible, and also updates a man page that should have been updated a
+long time ago but was missed.
+
+## 1.2.5
+
+This release contains some missing locale `*.msg` files.
+
+## 1.2.4
+
+This release contains a few bug fixes and new French translations.
+
+## 1.2.3
+
+This release contains a fix for a bug: use of uninitialized data. Such data was
+only used when outputting an error message, but I am striving for perfection. 
As
+Michelangelo said, "Trifles make perfection, and perfection is no trifle."
+
+## 1.2.2
+
+This release contains fixes for OpenBSD.
+
+## 1.2.1
+
+This release contains bug fixes for some rare bugs.
+
+## 1.2.0
+
+This is a production release.
+

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to