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"