aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Eßer <se@FreeBSD.org>2021-10-04 19:22:35 +0000
committerStefan Eßer <se@FreeBSD.org>2021-10-04 19:22:35 +0000
commit5d58a51571721190681c50d4bd3a1f45e6282d72 (patch)
tree75a67b5732666b10aa1bac4ddece227faa5465af
parenta60ef1802a36f2f2a5611564191440ea1c1e2f17 (diff)
downloadsrc-vendor/bc/5.1.0.tar.gz
src-vendor/bc/5.1.0.zip
vendor/bc: update to version 5.1.0vendor/bc/5.1.0
This version adds options and functions that allow to print numbers in the open interval (-1 .. 1) with or without a leading 0 digit. Additionally, an option has been added to prevent line wrap and allows to print arbitrarily long results on a single line.
-rw-r--r--Makefile.in18
-rw-r--r--NEWS.md18
-rw-r--r--bc.vcxproj278
-rw-r--r--bc.vcxproj.filters182
-rw-r--r--bcl.sln31
-rw-r--r--bcl.vcxproj161
-rw-r--r--bcl.vcxproj.filters96
-rwxr-xr-xconfigure.sh102
-rw-r--r--gen/bc_help.txt10
-rw-r--r--gen/dc_help.txt10
-rw-r--r--gen/lib2.bc36
-rw-r--r--include/bc.h6
-rw-r--r--include/bcl.h5
-rw-r--r--include/history.h6
-rw-r--r--include/lang.h13
-rw-r--r--include/lex.h13
-rw-r--r--include/program.h16
-rw-r--r--include/version.h2
-rw-r--r--include/vm.h19
-rw-r--r--manuals/bc/A.189
-rw-r--r--manuals/bc/A.1.md68
-rw-r--r--manuals/bc/E.145
-rw-r--r--manuals/bc/E.1.md30
-rw-r--r--manuals/bc/EH.145
-rw-r--r--manuals/bc/EH.1.md30
-rw-r--r--manuals/bc/EHN.145
-rw-r--r--manuals/bc/EHN.1.md30
-rw-r--r--manuals/bc/EN.145
-rw-r--r--manuals/bc/EN.1.md30
-rw-r--r--manuals/bc/H.189
-rw-r--r--manuals/bc/H.1.md68
-rw-r--r--manuals/bc/HN.189
-rw-r--r--manuals/bc/HN.1.md68
-rw-r--r--manuals/bc/N.189
-rw-r--r--manuals/bc/N.1.md68
-rw-r--r--manuals/bcl.329
-rw-r--r--manuals/bcl.3.md26
-rw-r--r--manuals/build.md2
-rw-r--r--manuals/dc/A.145
-rw-r--r--manuals/dc/A.1.md40
-rw-r--r--manuals/dc/E.145
-rw-r--r--manuals/dc/E.1.md40
-rw-r--r--manuals/dc/EH.145
-rw-r--r--manuals/dc/EH.1.md40
-rw-r--r--manuals/dc/EHN.145
-rw-r--r--manuals/dc/EHN.1.md40
-rw-r--r--manuals/dc/EN.145
-rw-r--r--manuals/dc/EN.1.md40
-rw-r--r--manuals/dc/H.145
-rw-r--r--manuals/dc/H.1.md40
-rw-r--r--manuals/dc/HN.145
-rw-r--r--manuals/dc/HN.1.md40
-rw-r--r--manuals/dc/N.145
-rw-r--r--manuals/dc/N.1.md40
-rwxr-xr-xscripts/functions.sh8
-rw-r--r--src/args.c14
-rw-r--r--src/bc_parse.c16
-rw-r--r--src/data.c18
-rw-r--r--src/dc_lex.c13
-rw-r--r--src/history.c53
-rw-r--r--src/library.c8
-rw-r--r--src/num.c18
-rw-r--r--src/program.c40
-rw-r--r--src/read.c20
-rw-r--r--src/vm.c14
-rwxr-xr-xtests/all.sh101
-rw-r--r--tests/bc/all.txt1
-rw-r--r--tests/bc/leadingzero.txt12
-rw-r--r--tests/bc/leadingzero_results.txt12
-rw-r--r--tests/bc/scripts/globals.bc4
-rw-r--r--tests/bcl.c98
-rw-r--r--tests/dc/errors.txt3
-rwxr-xr-xtests/error.sh99
-rwxr-xr-xtests/errors.sh25
-rw-r--r--tests/extra_required.txt1
-rwxr-xr-xtests/history.py405
-rwxr-xr-xtests/history.sh30
-rwxr-xr-xtests/other.sh42
-rwxr-xr-xtests/scripts.sh51
-rw-r--r--vs/bc.sln (renamed from bc.sln)22
-rw-r--r--vs/bc.vcxproj297
-rw-r--r--vs/bc.vcxproj.filters173
-rw-r--r--vs/bcl.sln37
-rw-r--r--vs/bcl.vcxproj259
-rw-r--r--vs/bcl.vcxproj.filters90
-rw-r--r--vs/bin/some.txt0
-rw-r--r--vs/tests/some.txt0
-rw-r--r--vs/tests/tests_bc.bat104
-rw-r--r--vs/tests/tests_dc.bat61
89 files changed, 3751 insertions, 1085 deletions
diff --git a/Makefile.in b/Makefile.in
index c3a41854fe9e..3d6780d6ac95 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -280,17 +280,25 @@ help:
@printf ' valgrind_dc runs the dc test suite, if dc has been built,\n'
@printf ' through valgrind\n'
-run_all_tests: bc_all_tests timeconst_all_tests dc_all_tests history_all_tests
+run_all_tests: bc_all_tests timeconst_all_tests dc_all_tests
+
+run_all_tests_np: bc_all_tests_np timeconst_all_tests dc_all_tests_np
bc_all_tests:
%%BC_ALL_TESTS%%
+bc_all_tests_np:
+ %%BC_ALL_TESTS_NP%%
+
timeconst_all_tests:
%%TIMECONST_ALL_TESTS%%
dc_all_tests:
%%DC_ALL_TESTS%%
+dc_all_tests_np:
+ %%DC_ALL_TESTS_NP%%
+
history_all_tests:
%%HISTORY_TESTS%%
@@ -311,7 +319,9 @@ test_bc_stdin:
test_bc_read:
@sh tests/read.sh bc %%BC_TEST_EXEC%%
-test_bc_errors:
+test_bc_errors: test_bc_error_lines%%BC_ERROR_TESTS%%
+
+test_bc_error_lines:
@sh tests/errors.sh bc %%BC_TEST_EXEC%%
test_bc_other:
@@ -333,7 +343,9 @@ test_dc_stdin:
test_dc_read:
@sh tests/read.sh dc %%DC_TEST_EXEC%%
-test_dc_errors:
+test_dc_errors: test_dc_error_lines%%DC_ERROR_TESTS%%
+
+test_dc_error_lines:
@sh tests/errors.sh dc %%DC_TEST_EXEC%%
test_dc_other:
diff --git a/NEWS.md b/NEWS.md
index f35d593b807a..98b52024b2e8 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,5 +1,23 @@
# News
+## 5.1.0
+
+This is a production release with some fixes and new features.
+
+* Fixed a bug where an `if` statement without an `else` before defining a
+ function caused an error.
+* Fixed a bug with the `bc` banner and `-q`.
+* Fixed a bug on Windows where files were not read correctly.
+* Added a command-line flag (`-z`) to make `bc` and `dc` print leading zeroes on
+ numbers `-1 < x < 1`.
+* Added four functions to `lib2.bc` (`plz()`, `plznl()`, `pnlz()`, and
+ `pnlznl()`) to allow printing numbers with or without leading zeros, despite
+ the use of `-z` or not.
+* Added builtin functions to query global state like line length, global stacks,
+ and leading zeroes.
+* Added a command-line flag (`-L`) to disable wrapping when printing numbers.
+* Improved builds on Windows.
+
## 5.0.2
This is a production release with one fix for a flaky test. If you have not
diff --git a/bc.vcxproj b/bc.vcxproj
deleted file mode 100644
index 8d4f34a2a0e6..000000000000
--- a/bc.vcxproj
+++ /dev/null
@@ -1,278 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <VCProjectVersion>16.0</VCProjectVersion>
- <ProjectGuid>{D5086CFE-052C-4742-B005-E05DB983BBA2}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>Application</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Label="Shared">
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ItemGroup>
- <CustomBuild Include="gen\strgen.c">
- <Message>Building strgen</Message>
- <Command>CL /Fo:$(Configuration)\$(Platform)\$(ProjectName)\ /Fe:$(Configuration)\$(Platform)\$(ProjectName)\strgen.exe gen\strgen.c</Command>
- <Inputs>gen\strgen.c</Inputs>
- <Outputs>$(Configuration)\$(Platform)\$(ProjectName)\strgen.exe</Outputs>
- </CustomBuild>
- <CustomBuild Include="gen\lib.bc">
- <Message>Generating $(Configuration)\$(Platform)\$(ProjectName)/lib.c</Message>
- <Command>START $(Configuration)\$(Platform)\$(ProjectName)/strgen gen\lib.bc $(Configuration)\$(Platform)\$(ProjectName)/lib.c bc_lib bc_lib_name BC_ENABLED 1</Command>
- <Inputs>$(Configuration)\$(Platform)\$(ProjectName)\strgen.exe;gen\lib.bc</Inputs>
- <Outputs>$(Configuration)\$(Platform)\$(ProjectName)\lib.c</Outputs>
- </CustomBuild>
- <CustomBuild Include="gen\lib2.bc">
- <Message>Generating $(Configuration)\$(Platform)\$(ProjectName)/lib2.c</Message>
- <Command>START $(Configuration)\$(Platform)\$(ProjectName)/strgen gen\lib2.bc $(Configuration)\$(Platform)\$(ProjectName)/lib2.c bc_lib2 bc_lib2_name BC_ENABLED 1</Command>
- <Inputs>$(Configuration)\$(Platform)\$(ProjectName)\strgen.exe;gen\lib2.bc</Inputs>
- <Outputs>$(Configuration)\$(Platform)\$(ProjectName)\lib2.c</Outputs>
- </CustomBuild>
- <CustomBuild Include="gen\bc_help.txt">
- <Message>Generating $(Configuration)\$(Platform)\$(ProjectName)/bc_help.c</Message>
- <Command>START $(Configuration)\$(Platform)\$(ProjectName)/strgen gen\bc_help.txt $(Configuration)\$(Platform)\$(ProjectName)\bc_help.c bc_help "" BC_ENABLED</Command>
- <Inputs>$(Configuration)\$(Platform)\$(ProjectName)\strgen.exe;gen\bc_help.txt</Inputs>
- <Outputs>$(Configuration)\$(Platform)\$(ProjectName)\bc_help.c</Outputs>
- </CustomBuild>
- <CustomBuild Include="gen\dc_help.txt">
- <Message>Generating $(Configuration)\$(Platform)\$(ProjectName)/dc_help.c</Message>
- <Command>START $(Configuration)\$(Platform)\$(ProjectName)/strgen gen\dc_help.txt $(Configuration)\$(Platform)\$(ProjectName)\dc_help.c dc_help "" DC_ENABLED</Command>
- <Inputs>$(Configuration)\$(Platform)\$(ProjectName)\strgen.exe;gen\dc_help.txt</Inputs>
- <Outputs>$(Configuration)\$(Platform)\$(ProjectName)\dc_help.c</Outputs>
- </CustomBuild>
- </ItemGroup>
- <PropertyGroup>
- <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets>
- </PropertyGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <LinkIncremental>false</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;EXECSUFFIX=.exe;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <Optimization>Disabled</Optimization>
- <ExceptionHandling>false</ExceptionHandling>
- <AdditionalOptions>/W3 %(AdditionalOptions)</AdditionalOptions>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX86</TargetMachine>
- <GenerateDebugInformation>DebugFastLink</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;bcrypt.lib;ucrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <PostBuildEvent>
- <Command>copy /b "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\bc.exe" "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\dc.exe"</Command>
- </PostBuildEvent>
- <PostBuildEvent>
- <Message>Copying bc to dc...</Message>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;EXECSUFFIX=.exe;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <Optimization>MaxSpeed</Optimization>
- <ExceptionHandling>false</ExceptionHandling>
- <AdditionalOptions>/W3 %(AdditionalOptions)</AdditionalOptions>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX86</TargetMachine>
- <GenerateDebugInformation>false</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;bcrypt.lib;ucrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- </Link>
- <PostBuildEvent>
- <Command>copy /b "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\bc.exe" "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\dc.exe"</Command>
- </PostBuildEvent>
- <PostBuildEvent>
- <Message>Copying bc to dc...</Message>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;EXECSUFFIX=.exe;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <Optimization>Disabled</Optimization>
- <ExceptionHandling>false</ExceptionHandling>
- <AdditionalOptions>/W3 %(AdditionalOptions)</AdditionalOptions>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX64</TargetMachine>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;bcrypt.lib;ucrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <PostBuildEvent>
- <Command>copy /b "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\bc.exe" "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\dc.exe"</Command>
- </PostBuildEvent>
- <PostBuildEvent>
- <Message>Copying bc to dc...</Message>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=1;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;EXECSUFFIX=.exe;BUILD_TYPE=N;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <Optimization>MaxSpeed</Optimization>
- <ExceptionHandling>false</ExceptionHandling>
- <AdditionalOptions>/W3 %(AdditionalOptions)</AdditionalOptions>
- <BasicRuntimeChecks>Default</BasicRuntimeChecks>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX64</TargetMachine>
- <GenerateDebugInformation>DebugFastLink</GenerateDebugInformation>
- <SubSystem>Console</SubSystem>
- <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;bcrypt.lib;ucrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
- </Link>
- <PostBuildEvent>
- <Command>copy /b "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\bc.exe" "$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\dc.exe"</Command>
- </PostBuildEvent>
- <PostBuildEvent>
- <Message>Copying bc to dc...</Message>
- </PostBuildEvent>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="$(Configuration)\$(Platform)\$(ProjectName)\lib.c" />
- <ClCompile Include="$(Configuration)\$(Platform)\$(ProjectName)\lib2.c" />
- <ClCompile Include="$(Configuration)\$(Platform)\$(ProjectName)\bc_help.c" />
- <ClCompile Include="$(Configuration)\$(Platform)\$(ProjectName)\dc_help.c" />
- <ClCompile Include="src\args.c" />
- <ClCompile Include="src\bc.c" />
- <ClCompile Include="src\bc_lex.c" />
- <ClCompile Include="src\bc_parse.c" />
- <ClCompile Include="src\data.c" />
- <ClCompile Include="src\dc.c" />
- <ClCompile Include="src\dc_lex.c" />
- <ClCompile Include="src\dc_parse.c" />
- <ClCompile Include="src\file.c" />
- <ClCompile Include="src\history.c" />
- <ClCompile Include="src\lang.c" />
- <ClCompile Include="src\lex.c" />
- <ClCompile Include="src\main.c" />
- <ClCompile Include="src\num.c" />
- <ClCompile Include="src\opt.c" />
- <ClCompile Include="src\parse.c" />
- <ClCompile Include="src\program.c" />
- <ClCompile Include="src\rand.c" />
- <ClCompile Include="src\read.c" />
- <ClCompile Include="src\vector.c" />
- <ClCompile Include="src\vm.c" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="include\args.h" />
- <ClInclude Include="include\bc.h" />
- <ClInclude Include="include\bcl.h" />
- <ClInclude Include="include\dc.h" />
- <ClInclude Include="include\file.h" />
- <ClInclude Include="include\history.h" />
- <ClInclude Include="include\lang.h" />
- <ClInclude Include="include\lex.h" />
- <ClInclude Include="include\library.h" />
- <ClInclude Include="include\num.h" />
- <ClInclude Include="include\opt.h" />
- <ClInclude Include="include\parse.h" />
- <ClInclude Include="include\program.h" />
- <ClInclude Include="include\rand.h" />
- <ClInclude Include="include\read.h" />
- <ClInclude Include="include\status.h" />
- <ClInclude Include="include\vector.h" />
- <ClInclude Include="include\version.h" />
- <ClInclude Include="include\vm.h" />
- </ItemGroup>
- <ItemGroup>
- <Text Include="gen\bc_help.txt" />
- <Text Include="gen\dc_help.txt" />
- </ItemGroup>
- <ItemGroup>
- <None Include="gen\lib.bc" />
- <None Include="gen\lib2.bc" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/bc.vcxproj.filters b/bc.vcxproj.filters
deleted file mode 100644
index 141ecb808d08..000000000000
--- a/bc.vcxproj.filters
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Resource Files">
- <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="src\args.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\bc.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\bc_lex.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\bc_parse.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\data.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\dc.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\dc_lex.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\dc_parse.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\file.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\history.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\lang.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\lex.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\main.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\num.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\opt.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\parse.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\program.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\rand.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\read.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\vector.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\vm.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="gen\lib.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="gen\lib2.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="gen\bc_help.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="gen\dc_help.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="include\args.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\bc.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\bcl.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\dc.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\file.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\history.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\lang.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\lex.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\library.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\num.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\opt.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\parse.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\program.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\rand.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\read.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\status.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\vector.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\version.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\vm.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
- <ItemGroup>
- <CustomBuild Include="gen\strgen.c">
- <Filter>Source Files</Filter>
- </CustomBuild>
- <CustomBuild Include="gen\lib.bc" />
- <CustomBuild Include="gen\lib2.bc" />
- <CustomBuild Include="gen\bc_help.txt" />
- <CustomBuild Include="gen\dc_help.txt" />
- <CustomBuild Include="gen\lib.bc" />
- <CustomBuild Include="gen\lib2.bc" />
- <CustomBuild Include="gen\bc_help.txt" />
- <CustomBuild Include="gen\dc_help.txt" />
- </ItemGroup>
- <ItemGroup>
- <Text Include="gen\bc_help.txt">
- <Filter>Resource Files</Filter>
- </Text>
- <Text Include="gen\dc_help.txt">
- <Filter>Resource Files</Filter>
- </Text>
- </ItemGroup>
- <ItemGroup>
- <None Include="gen\lib.bc">
- <Filter>Resource Files</Filter>
- </None>
- <None Include="gen\lib2.bc">
- <Filter>Resource Files</Filter>
- </None>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/bcl.sln b/bcl.sln
deleted file mode 100644
index 77009a439db3..000000000000
--- a/bcl.sln
+++ /dev/null
@@ -1,31 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31129.286
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bcl", "bcl.vcxproj", "{D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Debug|x64.ActiveCfg = Debug|x64
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Debug|x64.Build.0 = Debug|x64
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Debug|x86.ActiveCfg = Debug|Win32
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Debug|x86.Build.0 = Debug|Win32
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Release|x64.ActiveCfg = Release|x64
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Release|x64.Build.0 = Release|x64
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Release|x86.ActiveCfg = Release|Win32
- {D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}.Release|x86.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {591735E0-C314-4BFF-A595-E9999B49CB25}
- EndGlobalSection
-EndGlobal
diff --git a/bcl.vcxproj b/bcl.vcxproj
deleted file mode 100644
index c1031045e34a..000000000000
--- a/bcl.vcxproj
+++ /dev/null
@@ -1,161 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
- <PropertyGroup Label="Globals">
- <VCProjectVersion>16.0</VCProjectVersion>
- <ProjectGuid>{D2CC3DCF-7919-4DEF-839D-E9B897EC3E8E}</ProjectGuid>
- <Keyword>Win32Proj</Keyword>
- <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>true</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- <ConfigurationType>StaticLibrary</ConfigurationType>
- <UseDebugLibraries>false</UseDebugLibraries>
- <PlatformToolset>v142</PlatformToolset>
- </PropertyGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <ImportGroup Label="ExtensionSettings">
- </ImportGroup>
- <ImportGroup Label="Shared">
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- </ImportGroup>
- <PropertyGroup Label="UserMacros" />
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <LinkIncremental>true</LinkIncremental>
- <OutDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</OutDir>
- <IntDir>$(SolutionDir)\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
- </PropertyGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <Optimization>Disabled</Optimization>
- <AdditionalIncludeDirectories>$(SolutionDir)\include</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX86</TargetMachine>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Windows</SubSystem>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1</PreprocessorDefinitions>
- <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
- <WarningLevel>Level3</WarningLevel>
- <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
- <AdditionalIncludeDirectories>$(SolutionDir)\include</AdditionalIncludeDirectories>
- </ClCompile>
- <Link>
- <TargetMachine>MachineX86</TargetMachine>
- <GenerateDebugInformation>true</GenerateDebugInformation>
- <SubSystem>Windows</SubSystem>
- <EnableCOMDATFolding>true</EnableCOMDATFolding>
- <OptimizeReferences>true</OptimizeReferences>
- </Link>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)\include</AdditionalIncludeDirectories>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- <ClCompile>
- <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions);BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1</PreprocessorDefinitions>
- <AdditionalIncludeDirectories>$(SolutionDir)\include</AdditionalIncludeDirectories>
- </ClCompile>
- </ItemDefinitionGroup>
- <ItemGroup>
- <ClCompile Include="src\data.c" />
- <ClCompile Include="src\library.c" />
- <ClCompile Include="src\num.c" />
- <ClCompile Include="src\rand.c" />
- <ClCompile Include="src\vector.c" />
- <ClCompile Include="src\vm.c" />
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="include\args.h" />
- <ClInclude Include="include\bc.h" />
- <ClInclude Include="include\bcl.h" />
- <ClInclude Include="include\dc.h" />
- <ClInclude Include="include\file.h" />
- <ClInclude Include="include\history.h" />
- <ClInclude Include="include\lang.h" />
- <ClInclude Include="include\lex.h" />
- <ClInclude Include="include\library.h" />
- <ClInclude Include="include\num.h" />
- <ClInclude Include="include\opt.h" />
- <ClInclude Include="include\parse.h" />
- <ClInclude Include="include\program.h" />
- <ClInclude Include="include\rand.h" />
- <ClInclude Include="include\read.h" />
- <ClInclude Include="include\status.h" />
- <ClInclude Include="include\vector.h" />
- <ClInclude Include="include\version.h" />
- <ClInclude Include="include\vm.h" />
- </ItemGroup>
- <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- <ImportGroup Label="ExtensionTargets">
- </ImportGroup>
-</Project> \ No newline at end of file
diff --git a/bcl.vcxproj.filters b/bcl.vcxproj.filters
deleted file mode 100644
index f75e0331cc88..000000000000
--- a/bcl.vcxproj.filters
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <ItemGroup>
- <Filter Include="Source Files">
- <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- </Filter>
- <Filter Include="Header Files">
- <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
- </Filter>
- <Filter Include="Resource Files">
- <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
- </Filter>
- </ItemGroup>
- <ItemGroup>
- <ClCompile Include="src\data.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\library.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\num.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\rand.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\vector.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- <ClCompile Include="src\vm.c">
- <Filter>Source Files</Filter>
- </ClCompile>
- </ItemGroup>
- <ItemGroup>
- <ClInclude Include="include\args.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\bc.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\bcl.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\dc.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\file.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\history.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\lang.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\lex.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\library.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\num.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\opt.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\parse.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\program.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\rand.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\read.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\status.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\vector.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\version.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- <ClInclude Include="include\vm.h">
- <Filter>Header Files</Filter>
- </ClInclude>
- </ItemGroup>
-</Project> \ No newline at end of file
diff --git a/configure.sh b/configure.sh
index bcc8688e0ec1..de1339780073 100755
--- a/configure.sh
+++ b/configure.sh
@@ -446,35 +446,35 @@ gen_file_list() {
# @param extra_math An integer that, if non-zero, activates extra math tests.
# @param time_tests An integer that, if non-zero, tells the test suite to time
# the execution of each test.
-gen_tests() {
+gen_std_tests() {
- _gen_tests_name="$1"
+ _gen_std_tests_name="$1"
shift
- _gen_tests_extra_math="$1"
+ _gen_std_tests_extra_math="$1"
shift
- _gen_tests_time_tests="$1"
+ _gen_std_tests_time_tests="$1"
shift
- _gen_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt")
+ _gen_std_tests_extra_required=$(cat "$scriptdir/tests/extra_required.txt")
- for _gen_tests_t in $(cat "$scriptdir/tests/$_gen_tests_name/all.txt"); do
+ for _gen_std_tests_t in $(cat "$scriptdir/tests/$_gen_std_tests_name/all.txt"); do
- if [ "$_gen_tests_extra_math" -eq 0 ]; then
+ if [ "$_gen_std_tests_extra_math" -eq 0 ]; then
- if [ -z "${_gen_tests_extra_required##*$_gen_tests_t*}" ]; then
+ if [ -z "${_gen_std_tests_extra_required##*$_gen_std_tests_t*}" ]; then
printf 'test_%s_%s:\n\t@printf "Skipping %s %s\\n"\n\n' \
- "$_gen_tests_name" "$_gen_tests_t" "$_gen_tests_name" \
- "$_gen_tests_t" >> "$scriptdir/Makefile"
+ "$_gen_std_tests_name" "$_gen_std_tests_t" "$_gen_std_tests_name" \
+ "$_gen_std_tests_t" >> "$scriptdir/Makefile"
continue
fi
fi
printf 'test_%s_%s:\n\t@sh tests/test.sh %s %s %s %s %s\n\n' \
- "$_gen_tests_name" "$_gen_tests_t" "$_gen_tests_name" \
- "$_gen_tests_t" "$generate_tests" "$time_tests" \
+ "$_gen_std_tests_name" "$_gen_std_tests_t" "$_gen_std_tests_name" \
+ "$_gen_std_tests_t" "$generate_tests" "$time_tests" \
"$*" >> "$scriptdir/Makefile"
done
@@ -484,15 +484,55 @@ gen_tests() {
# targets.
#
# @param name The name of the calculator to generate test targets for.
-gen_test_targets() {
+gen_std_test_targets() {
- _gen_test_targets_name="$1"
+ _gen_std_test_targets_name="$1"
shift
- _gen_test_targets_tests=$(cat "$scriptdir/tests/${_gen_test_targets_name}/all.txt")
+ _gen_std_test_targets_tests=$(cat "$scriptdir/tests/${_gen_std_test_targets_name}/all.txt")
- for _gen_test_targets_t in $_gen_test_targets_tests; do
- printf ' test_%s_%s' "$_gen_test_targets_name" "$_gen_test_targets_t"
+ for _gen_std_test_targets_t in $_gen_std_test_targets_tests; do
+ printf ' test_%s_%s' "$_gen_std_test_targets_name" "$_gen_std_test_targets_t"
+ done
+
+ printf '\n'
+}
+
+# Generates the proper test targets for each error test to have its own target.
+# This allows `make test_bc_errors` and `make test_dc_errors` to run in
+# parallel.
+#
+# @param name Which calculator to generate tests for.
+gen_err_tests() {
+
+ _gen_err_tests_name="$1"
+ shift
+
+ _gen_err_tests_fs=$(ls "$scriptdir/tests/$_gen_err_tests_name/errors/")
+
+ for _gen_err_tests_t in $_gen_err_tests_fs; do
+
+ printf 'test_%s_error_%s:\n\t@sh tests/error.sh %s %s %s\n\n' \
+ "$_gen_err_tests_name" "$_gen_err_tests_t" "$_gen_err_tests_name" \
+ "$_gen_err_tests_t" "$*" >> "$scriptdir/Makefile"
+
+ done
+
+}
+
+# Generates a list of error test targets that will be used as prerequisites for
+# other targets.
+#
+# @param name The name of the calculator to generate test targets for.
+gen_err_test_targets() {
+
+ _gen_err_test_targets_name="$1"
+ shift
+
+ _gen_err_test_targets_tests=$(ls "$scriptdir/tests/$_gen_err_test_targets_name/errors/")
+
+ for _gen_err_test_targets_t in $_gen_err_test_targets_tests; do
+ printf ' test_%s_error_%s' "$_gen_err_test_targets_name" "$_gen_err_test_targets_t"
done
printf '\n'
@@ -904,10 +944,12 @@ link="@printf 'No link necessary\\\\n'"
main_exec="BC"
executable="BC_EXEC"
-tests="test_bc timeconst test_dc test_history"
+tests="test_bc timeconst test_dc"
bc_test="@tests/all.sh bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
+bc_test_np="@tests/all.sh -n bc $extra_math 1 $generate_tests $time_tests \$(BC_EXEC)"
dc_test="@tests/all.sh dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
+dc_test_np="@tests/all.sh -n dc $extra_math 1 $generate_tests $time_tests \$(DC_EXEC)"
timeconst="@tests/bc/timeconst.sh tests/bc/scripts/timeconst.bc \$(BC_EXEC)"
@@ -967,6 +1009,7 @@ elif [ "$bc_only" -eq 1 ]; then
executables="bc"
dc_test="@printf 'No dc tests to run\\\\n'"
+ dc_test_np="@printf 'No dc tests to run\\\\n'"
test_dc_history_prereqs=" test_dc_history_skip"
install_prereqs=" install_execs"
@@ -976,7 +1019,7 @@ elif [ "$bc_only" -eq 1 ]; then
default_target="\$(BC_EXEC)"
second_target="\$(DC_EXEC)"
- tests="test_bc timeconst test_history"
+ tests="test_bc timeconst"
elif [ "$dc_only" -eq 1 ]; then
@@ -992,6 +1035,7 @@ elif [ "$dc_only" -eq 1 ]; then
executable="DC_EXEC"
bc_test="@printf 'No bc tests to run\\\\n'"
+ bc_test_np="@printf 'No bc tests to run\\\\n'"
test_bc_history_prereqs=" test_bc_history_skip"
timeconst="@printf 'timeconst cannot be run because bc is not built\\\\n'"
@@ -1001,7 +1045,7 @@ elif [ "$dc_only" -eq 1 ]; then
uninstall_prereqs=" uninstall_dc"
uninstall_man_prereqs=" uninstall_dc_manpage"
- tests="test_dc test_history"
+ tests="test_dc"
else
@@ -1392,10 +1436,12 @@ if [ "$dc_default_prompt" = "" ]; then
fi
# Generate the test targets and prerequisites.
-bc_tests=$(gen_test_targets bc)
+bc_tests=$(gen_std_test_targets bc)
bc_script_tests=$(gen_script_test_targets bc)
-dc_tests=$(gen_test_targets dc)
+bc_err_tests=$(gen_err_test_targets bc)
+dc_tests=$(gen_std_test_targets dc)
dc_script_tests=$(gen_script_test_targets dc)
+dc_err_tests=$(gen_err_test_targets dc)
# Print out the values; this is for debugging.
if [ "$bc" -ne 0 ]; then
@@ -1483,14 +1529,18 @@ contents=$(replace "$contents" "BC_ENABLED" "$bc")
contents=$(replace "$contents" "DC_ENABLED" "$dc")
contents=$(replace "$contents" "BC_ALL_TESTS" "$bc_test")
+contents=$(replace "$contents" "BC_ALL_TESTS_NP" "$bc_test_np")
contents=$(replace "$contents" "BC_TESTS" "$bc_tests")
contents=$(replace "$contents" "BC_SCRIPT_TESTS" "$bc_script_tests")
+contents=$(replace "$contents" "BC_ERROR_TESTS" "$bc_err_tests")
contents=$(replace "$contents" "BC_TEST_EXEC" "$bc_test_exec")
contents=$(replace "$contents" "TIMECONST_ALL_TESTS" "$timeconst")
contents=$(replace "$contents" "DC_ALL_TESTS" "$dc_test")
+contents=$(replace "$contents" "DC_ALL_TESTS_NP" "$dc_test_np")
contents=$(replace "$contents" "DC_TESTS" "$dc_tests")
contents=$(replace "$contents" "DC_SCRIPT_TESTS" "$dc_script_tests")
+contents=$(replace "$contents" "DC_ERROR_TESTS" "$dc_err_tests")
contents=$(replace "$contents" "DC_TEST_EXEC" "$dc_test_exec")
contents=$(replace "$contents" "BUILD_TYPE" "$manpage_args")
@@ -1551,9 +1601,7 @@ contents=$(replace "$contents" "MAIN_EXEC" "$main_exec")
contents=$(replace "$contents" "EXEC" "$executable")
contents=$(replace "$contents" "TESTS" "$tests")
-contents=$(replace "$contents" "BC_TEST" "$bc_test")
contents=$(replace "$contents" "BC_HISTORY_TEST_PREREQS" "$test_bc_history_prereqs")
-contents=$(replace "$contents" "DC_TEST" "$dc_test")
contents=$(replace "$contents" "DC_HISTORY_TEST_PREREQS" "$test_dc_history_prereqs")
contents=$(replace "$contents" "HISTORY_TESTS" "$history_tests")
@@ -1588,13 +1636,15 @@ printf '%s\n%s\n\n' "$contents" "$SRC_TARGETS" > "$scriptdir/Makefile"
# Generate the individual test targets.
if [ "$bc" -ne 0 ]; then
- gen_tests bc "$extra_math" "$time_tests" $bc_test_exec
+ gen_std_tests bc "$extra_math" "$time_tests" $bc_test_exec
gen_script_tests bc "$extra_math" "$generate_tests" "$time_tests" $bc_test_exec
+ gen_err_tests bc $bc_test_exec
fi
if [ "$dc" -ne 0 ]; then
- gen_tests dc "$extra_math" "$time_tests" $dc_test_exec
+ gen_std_tests dc "$extra_math" "$time_tests" $dc_test_exec
gen_script_tests dc "$extra_math" "$generate_tests" "$time_tests" $dc_test_exec
+ gen_err_tests dc $dc_test_exec
fi
cd "$scriptdir"
diff --git a/gen/bc_help.txt b/gen/bc_help.txt
index 50c38ab61314..9ba34c606481 100644
--- a/gen/bc_help.txt
+++ b/gen/bc_help.txt
@@ -86,6 +86,10 @@ Options:
Force interactive mode.
+ -L --no-line-length
+
+ Disable line length checking.
+
-l --mathlib
Use predefined math routines:
@@ -135,6 +139,10 @@ Options:
Print version information and copyright and exit.
+ -z --leading-zeroes
+
+ Enable leading zeroes on numbers greater than -1 and less than 1.
+
Environment variables:
POSIXLY_CORRECT
@@ -148,7 +156,7 @@ Environment variables:
BC_LINE_LENGTH
If an integer, the number of characters to print on a line before
- wrapping.
+ wrapping. Using 0 will disable line length checking.
BC_BANNER
diff --git a/gen/dc_help.txt b/gen/dc_help.txt
index c0bf34daeb46..4cf10826cd7f 100644
--- a/gen/dc_help.txt
+++ b/gen/dc_help.txt
@@ -89,6 +89,10 @@ Options:
Put dc into interactive mode. See the man page for more details.
+ -L --no-line-length
+
+ Disable line length checking.
+
-P --no-prompt
Disable the prompts in interactive mode.
@@ -105,6 +109,10 @@ Options:
Enable extended register mode.
+ -z --leading-zeroes
+
+ Enable leading zeroes on numbers greater than -1 and less than 1.
+
Environment variables:
DC_ENV_ARGS
@@ -114,7 +122,7 @@ Environment variables:
DC_LINE_LENGTH
If an integer, the number of characters to print on a line before
- wrapping.
+ wrapping. Using 0 will disable line length checking.
DC_SIGINT_RESET
diff --git a/gen/lib2.bc b/gen/lib2.bc
index 93df1889eb63..23cbec104d02 100644
--- a/gen/lib2.bc
+++ b/gen/lib2.bc
@@ -274,6 +274,42 @@ define s2un(x,n){
return x
}
define s2u(x){return s2un(x,sbytes(x))}
+define void plz(x){
+ if(leading_zero())print x
+ else{
+ if(x>-1&&x<1&&x!=0){
+ if(x<0)print"-"
+ print 0,abs(x)
+ }
+ else print x
+ }
+}
+define void plznl(x){
+ plz(x)
+ print"\n"
+}
+define void pnlz(x){
+ auto s,i
+ if(leading_zero()){
+ if(x>-1&&x<1&&x!=0){
+ s=scale(x)
+ if(x<0)print"-"
+ print"."
+ x=abs(x)
+ for(i=0;i<s;++i){
+ x<<=1
+ print x$
+ x-=x$
+ }
+ return
+ }
+ }
+ print x
+}
+define void pnlznl(x){
+ pnlz(x)
+ print"\n"
+}
define void output_byte(x,i){
auto j,p,y,b
j=ibase
diff --git a/include/bc.h b/include/bc.h
index 2b47ea7b7473..3d4a11592875 100644
--- a/include/bc.h
+++ b/include/bc.h
@@ -73,7 +73,7 @@ typedef struct BcLexKeyword {
uchar data;
/// The keyword text.
- const char name[9];
+ const char name[14];
} BcLexKeyword;
/// Sets the most significant bit. Used for setting the POSIX bit in
@@ -94,13 +94,13 @@ typedef struct BcLexKeyword {
/// A macro for the number of keywords bc has. This has to be updated if any are
/// added. This is for the redefined_kws field of the BcVm struct.
-#define BC_LEX_NKWS (32)
+#define BC_LEX_NKWS (35)
#else // BC_ENABLE_EXTRA_MATH
/// A macro for the number of keywords bc has. This has to be updated if any are
/// added. This is for the redefined_kws field of the BcVm struct.
-#define BC_LEX_NKWS (28)
+#define BC_LEX_NKWS (31)
#endif // BC_ENABLE_EXTRA_MATH
diff --git a/include/bcl.h b/include/bcl.h
index 833592c4bff0..9c0e5e59cfd0 100644
--- a/include/bcl.h
+++ b/include/bcl.h
@@ -63,7 +63,8 @@
#define write(f, b, s) _write((f), (b), (unsigned int) (s))
#define read(f, b, s) _read((f), (b), (unsigned int) (s))
#define close _close
-#define open(f, n, m) _sopen_s(f, n, m, _SH_DENYNO, _S_IREAD | _S_IWRITE)
+#define open(f, n, m) \
+ _sopen_s((f), (n), (m) | _O_BINARY, _SH_DENYNO, _S_IREAD | _S_IWRITE)
#define sigjmp_buf jmp_buf
#define sigsetjmp(j, s) setjmp(j)
#define siglongjmp longjmp
@@ -168,6 +169,8 @@ void bcl_free(void);
bool bcl_abortOnFatalError(void);
void bcl_setAbortOnFatalError(bool abrt);
+bool bcl_leadingZeroes(void);
+void bcl_setLeadingZeroes(bool leadingZeroes);
void bcl_gc(void);
diff --git a/include/history.h b/include/history.h
index 3a2cf82b7943..8d9c3417d897 100644
--- a/include/history.h
+++ b/include/history.h
@@ -244,7 +244,11 @@ typedef struct BcHistory {
/// The original terminal state.
struct termios orig_termios;
#else // _WIN32
- DWORD orig_console_mode;
+ /// The original input console mode.
+ DWORD orig_in;
+
+ /// The original output console mode.
+ DWORD orig_out;
#endif // _WIN32
/// These next two are here because pahole found a 4 byte hole here.
diff --git a/include/lang.h b/include/lang.h
index 5a678ed34a25..705aca35df1c 100644
--- a/include/lang.h
+++ b/include/lang.h
@@ -200,6 +200,19 @@ typedef enum BcInst {
BC_INST_MAXRAND,
#endif // BC_ENABLE_EXTRA_MATH
+ /// bc line_length() builtin function.
+ BC_INST_LINE_LENGTH,
+
+#if BC_ENABLED
+
+ /// bc global_stacks() builtin function.
+ BC_INST_GLOBAL_STACKS,
+
+#endif // BC_ENABLED
+
+ /// bc leading_zero() builtin function.
+ BC_INST_LEADING_ZERO,
+
/// This is slightly misnamed versus BC_INST_PRINT_POP. Well, it is in bc.
/// dc uses this instruction to print, but not pop. That's valid in dc.
/// However, in bc, it is *never* valid to print without popping. In bc,
diff --git a/include/lex.h b/include/lex.h
index 0b556894cec7..0e7af1742001 100644
--- a/include/lex.h
+++ b/include/lex.h
@@ -357,6 +357,19 @@ typedef enum BcLexType {
BC_LEX_KW_MAXRAND,
#endif // BC_ENABLE_EXTRA_MATH
+ /// bc line_length keyword.
+ BC_LEX_KW_LINE_LENGTH,
+
+#if BC_ENABLED
+
+ /// bc global_stacks keyword.
+ BC_LEX_KW_GLOBAL_STACKS,
+
+#endif // BC_ENABLED
+
+ /// bc leading_zero keyword.
+ BC_LEX_KW_LEADING_ZERO,
+
/// bc stream keyword.
BC_LEX_KW_STREAM,
diff --git a/include/program.h b/include/program.h
index 83c0c754b8f4..3f90f2b9f552 100644
--- a/include/program.h
+++ b/include/program.h
@@ -513,6 +513,9 @@ extern const char bc_program_esc_seqs[];
&&lbl_BC_INST_MAXOBASE, \
&&lbl_BC_INST_MAXSCALE, \
&&lbl_BC_INST_MAXRAND, \
+ &&lbl_BC_INST_LINE_LENGTH, \
+ &&lbl_BC_INST_GLOBAL_STACKS, \
+ &&lbl_BC_INST_LEADING_ZERO, \
&&lbl_BC_INST_PRINT, \
&&lbl_BC_INST_PRINT_POP, \
&&lbl_BC_INST_STR, \
@@ -600,6 +603,9 @@ extern const char bc_program_esc_seqs[];
&&lbl_BC_INST_MAXIBASE, \
&&lbl_BC_INST_MAXOBASE, \
&&lbl_BC_INST_MAXSCALE, \
+ &&lbl_BC_INST_LINE_LENGTH, \
+ &&lbl_BC_INST_GLOBAL_STACKS, \
+ &&lbl_BC_INST_LEADING_ZERO, \
&&lbl_BC_INST_PRINT, \
&&lbl_BC_INST_PRINT_POP, \
&&lbl_BC_INST_STR, \
@@ -705,6 +711,9 @@ extern const char bc_program_esc_seqs[];
&&lbl_BC_INST_MAXOBASE, \
&&lbl_BC_INST_MAXSCALE, \
&&lbl_BC_INST_MAXRAND, \
+ &&lbl_BC_INST_LINE_LENGTH, \
+ &&lbl_BC_INST_GLOBAL_STACKS, \
+ &&lbl_BC_INST_LEADING_ZERO, \
&&lbl_BC_INST_PRINT, \
&&lbl_BC_INST_PRINT_POP, \
&&lbl_BC_INST_STR, \
@@ -778,6 +787,9 @@ extern const char bc_program_esc_seqs[];
&&lbl_BC_INST_MAXIBASE, \
&&lbl_BC_INST_MAXOBASE, \
&&lbl_BC_INST_MAXSCALE, \
+ &&lbl_BC_INST_LINE_LENGTH, \
+ &&lbl_BC_INST_GLOBAL_STACKS, \
+ &&lbl_BC_INST_LEADING_ZERO, \
&&lbl_BC_INST_PRINT, \
&&lbl_BC_INST_PRINT_POP, \
&&lbl_BC_INST_STR, \
@@ -849,6 +861,8 @@ extern const char bc_program_esc_seqs[];
&&lbl_BC_INST_MAXOBASE, \
&&lbl_BC_INST_MAXSCALE, \
&&lbl_BC_INST_MAXRAND, \
+ &&lbl_BC_INST_LINE_LENGTH, \
+ &&lbl_BC_INST_LEADING_ZERO, \
&&lbl_BC_INST_PRINT, \
&&lbl_BC_INST_PRINT_POP, \
&&lbl_BC_INST_STR, \
@@ -912,6 +926,8 @@ extern const char bc_program_esc_seqs[];
&&lbl_BC_INST_MAXIBASE, \
&&lbl_BC_INST_MAXOBASE, \
&&lbl_BC_INST_MAXSCALE, \
+ &&lbl_BC_INST_LINE_LENGTH, \
+ &&lbl_BC_INST_LEADING_ZERO, \
&&lbl_BC_INST_PRINT, \
&&lbl_BC_INST_PRINT_POP, \
&&lbl_BC_INST_STR, \
diff --git a/include/version.h b/include/version.h
index 071b123cccf1..3be823189b8f 100644
--- a/include/version.h
+++ b/include/version.h
@@ -37,6 +37,6 @@
#define BC_VERSION_H
/// The current version.
-#define VERSION 5.0.2
+#define VERSION 5.1.0
#endif // BC_VERSION_H
diff --git a/include/vm.h b/include/vm.h
index 7db5f7e3c0e9..bbc5e57e2ac8 100644
--- a/include/vm.h
+++ b/include/vm.h
@@ -164,14 +164,17 @@
/// The flag for read prompt. This is also reversed; the option clears the flag.
#define BC_FLAG_R (UINTMAX_C(1)<<8)
+/// The flag for a leading zero.
+#define BC_FLAG_Z (UINTMAX_C(1)<<9)
+
/// The flag for stdin being a TTY.
-#define BC_FLAG_TTYIN (UINTMAX_C(1)<<9)
+#define BC_FLAG_TTYIN (UINTMAX_C(1)<<10)
/// The flag for TTY mode.
-#define BC_FLAG_TTY (UINTMAX_C(1)<<10)
+#define BC_FLAG_TTY (UINTMAX_C(1)<<11)
/// The flag for reset on SIGINT.
-#define BC_FLAG_SIGINT (UINTMAX_C(1)<<11)
+#define BC_FLAG_SIGINT (UINTMAX_C(1)<<12)
/// A convenience macro for getting the TTYIN flag.
#define BC_TTYIN (vm.flags & BC_FLAG_TTYIN)
@@ -214,6 +217,9 @@
/// A convenience macro for getting the read prompt flag.
#define BC_R (vm.flags & BC_FLAG_R)
+/// A convenience macro for getting the leading zero flag.
+#define BC_Z (vm.flags & BC_FLAG_Z)
+
#if BC_ENABLED
/// A convenience macro for checking if bc is in POSIX mode.
@@ -253,6 +259,10 @@
/// A convenience macro for checking if the prompt is enabled.
#define BC_PROMPT (BC_P)
+#else // !BC_ENABLE_LIBRARY
+
+#define BC_Z (vm.leading_zeroes)
+
#endif // !BC_ENABLE_LIBRARY
/**
@@ -406,6 +416,9 @@ typedef struct BcVm {
/// Whether or not bcl should abort on fatal errors.
bool abrt;
+ /// Whether or not to print leading zeros.
+ bool leading_zeroes;
+
/// The number of "references," or times that the library was initialized.
unsigned int refs;
diff --git a/manuals/bc/A.1 b/manuals/bc/A.1
index ff9973e3cc8d..bf6c9108456b 100644
--- a/manuals/bc/A.1
+++ b/manuals/bc/A.1
@@ -176,6 +176,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library and the extended math library before
@@ -318,6 +328,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -636,11 +658,28 @@ This is a \f[B]non-portable extension\f[R].
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "20." 4
\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive).
Using this operand will change the value of \f[B]seed\f[R].
This is a \f[B]non-portable extension\f[R].
-.IP "18." 4
+.IP "21." 4
\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and the value of \f[B]E\f[R] (exclusive).
If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s
@@ -658,7 +697,7 @@ value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R].
In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is
\f[I]not\f[R] changed.
This is a \f[B]non-portable extension\f[R].
-.IP "19." 4
+.IP "22." 4
\f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R].
This is a \f[B]non-portable extension\f[R].
.PP
@@ -1937,6 +1976,46 @@ This function is used to implement other bitwise functions; it is not
meant to be used by users, but it can be.
.RE
.TP
+\f[B]plz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]plznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
+\f[B]pnlz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]pnlznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
\f[B]ubytes(x)\f[R]
Returns the numbers of unsigned integer bytes required to hold the
truncated absolute value of \f[B]x\f[R].
@@ -2407,6 +2486,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/A.1.md b/manuals/bc/A.1.md
index 9ab4665e9ebd..e773d967284c 100644
--- a/manuals/bc/A.1.md
+++ b/manuals/bc/A.1.md
@@ -141,6 +141,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -248,6 +256,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -488,10 +507,18 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
-17. **rand()**: A pseudo-random integer between **0** (inclusive) and
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+20. **rand()**: A pseudo-random integer between **0** (inclusive) and
**BC_RAND_MAX** (inclusive). Using this operand will change the value of
**seed**. This is a **non-portable extension**.
-18. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
+21. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
value of **E** (exclusive). If **E** is negative or is a non-integer
(**E**'s *scale* is not **0**), an error is raised, and bc(1) resets (see
the **RESET** section) while **seed** remains unchanged. If **E** is larger
@@ -502,7 +529,7 @@ The following are valid operands in bc(1):
change the value of **seed**, unless the value of **E** is **0** or **1**.
In that case, **0** is returned, and **seed** is *not* changed. This is a
**non-portable extension**.
-19. **maxrand()**: The max integer returned by **rand()**. This is a
+22. **maxrand()**: The max integer returned by **rand()**. This is a
**non-portable extension**.
The integers generated by **rand()** and **irand(E)** are guaranteed to be as
@@ -1597,6 +1624,38 @@ The extended library is a **non-portable extension**.
This function is used to implement other bitwise functions; it is not meant
to be used by users, but it can be.
+**plz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**plznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
+**pnlz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**pnlznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
**ubytes(x)**
: Returns the numbers of unsigned integer bytes required to hold the truncated
@@ -2012,6 +2071,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bc/E.1 b/manuals/bc/E.1
index f157f6668a48..bb563f5c96fc 100644
--- a/manuals/bc/E.1
+++ b/manuals/bc/E.1
@@ -154,6 +154,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library before running any code, including
@@ -287,6 +297,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -570,6 +592,23 @@ This is a \f[B]non-portable extension\f[R].
.IP "16." 4
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
+.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
.SS Numbers
.PP
Numbers are strings made up of digits, uppercase letters, and at most
@@ -1295,6 +1334,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/E.1.md b/manuals/bc/E.1.md
index 5c9d83b97c4c..63367e436cc8 100644
--- a/manuals/bc/E.1.md
+++ b/manuals/bc/E.1.md
@@ -125,6 +125,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -228,6 +236,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -442,6 +461,14 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
## Numbers
@@ -1064,6 +1091,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bc/EH.1 b/manuals/bc/EH.1
index aca8e3b65f34..0bdfaa9fe14b 100644
--- a/manuals/bc/EH.1
+++ b/manuals/bc/EH.1
@@ -154,6 +154,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library before running any code, including
@@ -287,6 +297,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -570,6 +592,23 @@ This is a \f[B]non-portable extension\f[R].
.IP "16." 4
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
+.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
.SS Numbers
.PP
Numbers are strings made up of digits, uppercase letters, and at most
@@ -1295,6 +1334,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/EH.1.md b/manuals/bc/EH.1.md
index 89fc2b54f27f..044330b7fe0a 100644
--- a/manuals/bc/EH.1.md
+++ b/manuals/bc/EH.1.md
@@ -125,6 +125,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -228,6 +236,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -442,6 +461,14 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
## Numbers
@@ -1064,6 +1091,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bc/EHN.1 b/manuals/bc/EHN.1
index 5aff4d53a344..f0519898ad7e 100644
--- a/manuals/bc/EHN.1
+++ b/manuals/bc/EHN.1
@@ -154,6 +154,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library before running any code, including
@@ -287,6 +297,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -570,6 +592,23 @@ This is a \f[B]non-portable extension\f[R].
.IP "16." 4
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
+.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
.SS Numbers
.PP
Numbers are strings made up of digits, uppercase letters, and at most
@@ -1295,6 +1334,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/EHN.1.md b/manuals/bc/EHN.1.md
index 618a09286de1..25543500eea7 100644
--- a/manuals/bc/EHN.1.md
+++ b/manuals/bc/EHN.1.md
@@ -125,6 +125,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -228,6 +236,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -442,6 +461,14 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
## Numbers
@@ -1064,6 +1091,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bc/EN.1 b/manuals/bc/EN.1
index e67cbf332c88..192dccfea2fc 100644
--- a/manuals/bc/EN.1
+++ b/manuals/bc/EN.1
@@ -154,6 +154,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library before running any code, including
@@ -287,6 +297,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -570,6 +592,23 @@ This is a \f[B]non-portable extension\f[R].
.IP "16." 4
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
+.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
.SS Numbers
.PP
Numbers are strings made up of digits, uppercase letters, and at most
@@ -1295,6 +1334,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/EN.1.md b/manuals/bc/EN.1.md
index c99a9a28a405..e77d64cd7a56 100644
--- a/manuals/bc/EN.1.md
+++ b/manuals/bc/EN.1.md
@@ -125,6 +125,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -228,6 +236,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -442,6 +461,14 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
## Numbers
@@ -1064,6 +1091,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bc/H.1 b/manuals/bc/H.1
index 2fab932ce05c..5f290f12ae32 100644
--- a/manuals/bc/H.1
+++ b/manuals/bc/H.1
@@ -176,6 +176,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library and the extended math library before
@@ -318,6 +328,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -636,11 +658,28 @@ This is a \f[B]non-portable extension\f[R].
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "20." 4
\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive).
Using this operand will change the value of \f[B]seed\f[R].
This is a \f[B]non-portable extension\f[R].
-.IP "18." 4
+.IP "21." 4
\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and the value of \f[B]E\f[R] (exclusive).
If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s
@@ -658,7 +697,7 @@ value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R].
In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is
\f[I]not\f[R] changed.
This is a \f[B]non-portable extension\f[R].
-.IP "19." 4
+.IP "22." 4
\f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R].
This is a \f[B]non-portable extension\f[R].
.PP
@@ -1937,6 +1976,46 @@ This function is used to implement other bitwise functions; it is not
meant to be used by users, but it can be.
.RE
.TP
+\f[B]plz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]plznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
+\f[B]pnlz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]pnlznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
\f[B]ubytes(x)\f[R]
Returns the numbers of unsigned integer bytes required to hold the
truncated absolute value of \f[B]x\f[R].
@@ -2407,6 +2486,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/H.1.md b/manuals/bc/H.1.md
index 9a1cbbf5d518..99c88db93230 100644
--- a/manuals/bc/H.1.md
+++ b/manuals/bc/H.1.md
@@ -141,6 +141,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -248,6 +256,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -488,10 +507,18 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
-17. **rand()**: A pseudo-random integer between **0** (inclusive) and
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+20. **rand()**: A pseudo-random integer between **0** (inclusive) and
**BC_RAND_MAX** (inclusive). Using this operand will change the value of
**seed**. This is a **non-portable extension**.
-18. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
+21. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
value of **E** (exclusive). If **E** is negative or is a non-integer
(**E**'s *scale* is not **0**), an error is raised, and bc(1) resets (see
the **RESET** section) while **seed** remains unchanged. If **E** is larger
@@ -502,7 +529,7 @@ The following are valid operands in bc(1):
change the value of **seed**, unless the value of **E** is **0** or **1**.
In that case, **0** is returned, and **seed** is *not* changed. This is a
**non-portable extension**.
-19. **maxrand()**: The max integer returned by **rand()**. This is a
+22. **maxrand()**: The max integer returned by **rand()**. This is a
**non-portable extension**.
The integers generated by **rand()** and **irand(E)** are guaranteed to be as
@@ -1597,6 +1624,38 @@ The extended library is a **non-portable extension**.
This function is used to implement other bitwise functions; it is not meant
to be used by users, but it can be.
+**plz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**plznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
+**pnlz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**pnlznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
**ubytes(x)**
: Returns the numbers of unsigned integer bytes required to hold the truncated
@@ -2012,6 +2071,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bc/HN.1 b/manuals/bc/HN.1
index 1ca11d9b4579..4773ff77efea 100644
--- a/manuals/bc/HN.1
+++ b/manuals/bc/HN.1
@@ -176,6 +176,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library and the extended math library before
@@ -318,6 +328,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -636,11 +658,28 @@ This is a \f[B]non-portable extension\f[R].
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "20." 4
\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive).
Using this operand will change the value of \f[B]seed\f[R].
This is a \f[B]non-portable extension\f[R].
-.IP "18." 4
+.IP "21." 4
\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and the value of \f[B]E\f[R] (exclusive).
If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s
@@ -658,7 +697,7 @@ value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R].
In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is
\f[I]not\f[R] changed.
This is a \f[B]non-portable extension\f[R].
-.IP "19." 4
+.IP "22." 4
\f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R].
This is a \f[B]non-portable extension\f[R].
.PP
@@ -1937,6 +1976,46 @@ This function is used to implement other bitwise functions; it is not
meant to be used by users, but it can be.
.RE
.TP
+\f[B]plz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]plznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
+\f[B]pnlz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]pnlznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
\f[B]ubytes(x)\f[R]
Returns the numbers of unsigned integer bytes required to hold the
truncated absolute value of \f[B]x\f[R].
@@ -2407,6 +2486,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/HN.1.md b/manuals/bc/HN.1.md
index d61d15122bd8..d5b3324514ad 100644
--- a/manuals/bc/HN.1.md
+++ b/manuals/bc/HN.1.md
@@ -141,6 +141,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -248,6 +256,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -488,10 +507,18 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
-17. **rand()**: A pseudo-random integer between **0** (inclusive) and
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+20. **rand()**: A pseudo-random integer between **0** (inclusive) and
**BC_RAND_MAX** (inclusive). Using this operand will change the value of
**seed**. This is a **non-portable extension**.
-18. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
+21. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
value of **E** (exclusive). If **E** is negative or is a non-integer
(**E**'s *scale* is not **0**), an error is raised, and bc(1) resets (see
the **RESET** section) while **seed** remains unchanged. If **E** is larger
@@ -502,7 +529,7 @@ The following are valid operands in bc(1):
change the value of **seed**, unless the value of **E** is **0** or **1**.
In that case, **0** is returned, and **seed** is *not* changed. This is a
**non-portable extension**.
-19. **maxrand()**: The max integer returned by **rand()**. This is a
+22. **maxrand()**: The max integer returned by **rand()**. This is a
**non-portable extension**.
The integers generated by **rand()** and **irand(E)** are guaranteed to be as
@@ -1597,6 +1624,38 @@ The extended library is a **non-portable extension**.
This function is used to implement other bitwise functions; it is not meant
to be used by users, but it can be.
+**plz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**plznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
+**pnlz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**pnlznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
**ubytes(x)**
: Returns the numbers of unsigned integer bytes required to hold the truncated
@@ -2012,6 +2071,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bc/N.1 b/manuals/bc/N.1
index f5dc39a246c4..56fca3d02b4d 100644
--- a/manuals/bc/N.1
+++ b/manuals/bc/N.1
@@ -176,6 +176,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-l\f[R], \f[B]--mathlib\f[R]
Sets \f[B]scale\f[R] (see the \f[B]SYNTAX\f[R] section) to \f[B]20\f[R]
and loads the included math library and the extended math library before
@@ -318,6 +328,18 @@ continues normally.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -636,11 +658,28 @@ This is a \f[B]non-portable extension\f[R].
\f[B]maxscale()\f[R]: The max allowable \f[B]scale\f[R].
This is a \f[B]non-portable extension\f[R].
.IP "17." 4
+\f[B]line_length()\f[R]: The line length set with
+\f[B]BC_LINE_LENGTH\f[R] (see the \f[B]ENVIRONMENT VARIABLES\f[R]
+section).
+This is a \f[B]non-portable extension\f[R].
+.IP "18." 4
+\f[B]global_stacks()\f[R]: \f[B]0\f[R] if global stacks are not enabled
+with the \f[B]-g\f[R] or \f[B]--global-stacks\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "19." 4
+\f[B]leading_zero()\f[R]: \f[B]0\f[R] if leading zeroes are not enabled
+with the \f[B]-z\f[R] or \f[B]\[en]leading-zeroes\f[R] options, non-zero
+otherwise.
+See the \f[B]OPTIONS\f[R] section.
+This is a \f[B]non-portable extension\f[R].
+.IP "20." 4
\f[B]rand()\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and \f[B]BC_RAND_MAX\f[R] (inclusive).
Using this operand will change the value of \f[B]seed\f[R].
This is a \f[B]non-portable extension\f[R].
-.IP "18." 4
+.IP "21." 4
\f[B]irand(E)\f[R]: A pseudo-random integer between \f[B]0\f[R]
(inclusive) and the value of \f[B]E\f[R] (exclusive).
If \f[B]E\f[R] is negative or is a non-integer (\f[B]E\f[R]\[cq]s
@@ -658,7 +697,7 @@ value of \f[B]E\f[R] is \f[B]0\f[R] or \f[B]1\f[R].
In that case, \f[B]0\f[R] is returned, and \f[B]seed\f[R] is
\f[I]not\f[R] changed.
This is a \f[B]non-portable extension\f[R].
-.IP "19." 4
+.IP "22." 4
\f[B]maxrand()\f[R]: The max integer returned by \f[B]rand()\f[R].
This is a \f[B]non-portable extension\f[R].
.PP
@@ -1937,6 +1976,46 @@ This function is used to implement other bitwise functions; it is not
meant to be used by users, but it can be.
.RE
.TP
+\f[B]plz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]plznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed with a leading zero, regardless
+of the use of the \f[B]-z\f[R] option (see the \f[B]OPTIONS\f[R]
+section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
+\f[B]pnlz(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and without a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, without a trailing newline.
+.RE
+.TP
+\f[B]pnlznl(x)\f[R]
+If \f[B]x\f[R] is not equal to \f[B]0\f[R] and greater that \f[B]-1\f[R]
+and less than \f[B]1\f[R], it is printed without a leading zero,
+regardless of the use of the \f[B]-z\f[R] option (see the
+\f[B]OPTIONS\f[R] section) and with a trailing newline.
+.RS
+.PP
+Otherwise, \f[B]x\f[R] is printed normally, with a trailing newline.
+.RE
+.TP
\f[B]ubytes(x)\f[R]
Returns the numbers of unsigned integer bytes required to hold the
truncated absolute value of \f[B]x\f[R].
@@ -2407,6 +2486,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), bc(1) will output lines to that length,
including the backslash (\f[B]\[rs]\f[R]).
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]BC_BANNER\f[R]
If this environment variable exists and contains an integer, then a
diff --git a/manuals/bc/N.1.md b/manuals/bc/N.1.md
index 6867a05d2184..51dad376b56d 100644
--- a/manuals/bc/N.1.md
+++ b/manuals/bc/N.1.md
@@ -141,6 +141,14 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-l**, **-\-mathlib**
: Sets **scale** (see the **SYNTAX** section) to **20** and loads the included
@@ -248,6 +256,17 @@ The following are the options that bc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -488,10 +507,18 @@ The following are valid operands in bc(1):
extension**.
16. **maxscale()**: The max allowable **scale**. This is a **non-portable
extension**.
-17. **rand()**: A pseudo-random integer between **0** (inclusive) and
+17. **line_length()**: The line length set with **BC_LINE_LENGTH** (see the
+ **ENVIRONMENT VARIABLES** section). This is a **non-portable extension**.
+18. **global_stacks()**: **0** if global stacks are not enabled with the **-g**
+ or **-\-global-stacks** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+19. **leading_zero()**: **0** if leading zeroes are not enabled with the **-z**
+ or **--leading-zeroes** options, non-zero otherwise. See the **OPTIONS**
+ section. This is a **non-portable extension**.
+20. **rand()**: A pseudo-random integer between **0** (inclusive) and
**BC_RAND_MAX** (inclusive). Using this operand will change the value of
**seed**. This is a **non-portable extension**.
-18. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
+21. **irand(E)**: A pseudo-random integer between **0** (inclusive) and the
value of **E** (exclusive). If **E** is negative or is a non-integer
(**E**'s *scale* is not **0**), an error is raised, and bc(1) resets (see
the **RESET** section) while **seed** remains unchanged. If **E** is larger
@@ -502,7 +529,7 @@ The following are valid operands in bc(1):
change the value of **seed**, unless the value of **E** is **0** or **1**.
In that case, **0** is returned, and **seed** is *not* changed. This is a
**non-portable extension**.
-19. **maxrand()**: The max integer returned by **rand()**. This is a
+22. **maxrand()**: The max integer returned by **rand()**. This is a
**non-portable extension**.
The integers generated by **rand()** and **irand(E)** are guaranteed to be as
@@ -1597,6 +1624,38 @@ The extended library is a **non-portable extension**.
This function is used to implement other bitwise functions; it is not meant
to be used by users, but it can be.
+**plz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**plznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed with a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
+**pnlz(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and without a trailing newline.
+
+ Otherwise, **x** is printed normally, without a trailing newline.
+
+**pnlznl(x)**
+
+: If **x** is not equal to **0** and greater that **-1** and less than **1**,
+ it is printed without a leading zero, regardless of the use of the **-z**
+ option (see the **OPTIONS** section) and with a trailing newline.
+
+ Otherwise, **x** is printed normally, with a trailing newline.
+
**ubytes(x)**
: Returns the numbers of unsigned integer bytes required to hold the truncated
@@ -2012,6 +2071,9 @@ bc(1) recognizes the following environment variables:
lines to that length, including the backslash (**\\**). The default line
length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**BC_BANNER**
: If this environment variable exists and contains an integer, then a non-zero
diff --git a/manuals/bcl.3 b/manuals/bcl.3
index c079a20c40ba..9370417dcfef 100644
--- a/manuals/bcl.3
+++ b/manuals/bcl.3
@@ -55,6 +55,11 @@ These items allow clients to set up bcl(3).
.PP
\f[B]void bcl_setAbortOnFatalError(bool\f[R] \f[I]abrt\f[R]\f[B]);\f[R]
.PP
+\f[B]bool bcl_leadingZeroes(\f[R]\f[I]void\f[R]\f[B]);\f[R]
+.PP
+\f[B]void bcl_setLeadingZeroes(bool\f[R]
+\f[I]leadingZeroes\f[R]\f[B]);\f[R]
+.PP
\f[B]void bcl_gc(\f[R]\f[I]void\f[R]\f[B]);\f[R]
.SS Contexts
.PP
@@ -231,8 +236,9 @@ bcl(3) is async-signal-safe if
\f[B]bcl_handleSignal(\f[R]\f[I]void\f[R]\f[B])\f[R] is used properly.
(See the \f[B]SIGNAL HANDLING\f[R] section.)
.PP
-bcl(3) assumes that it is allowed to use the \f[B]bcl_\f[R] and
-\f[B]bc_\f[R] prefixes for symbol names without collision.
+bcl(3) assumes that it is allowed to use the \f[B]bcl\f[R],
+\f[B]Bcl\f[R], \f[B]bc\f[R], and \f[B]Bc\f[R] prefixes for symbol names
+without collision.
.PP
All of the items in its interface are described below.
See the documentation for each function for what each function can
@@ -304,6 +310,8 @@ a fatal error occurs.
.RS
.PP
If activated, clients do not need to check for fatal errors.
+.PP
+The default is \f[B]false\f[R].
.RE
.TP
\f[B]void bcl_setAbortOnFatalError(bool\f[R] \f[I]abrt\f[R]\f[B])\f[R]
@@ -317,6 +325,23 @@ If \f[I]abrt\f[R] is \f[B]true\f[R], bcl(3) will cause a
If activated, clients do not need to check for fatal errors.
.RE
.TP
+\f[B]bool bcl_leadingZeroes(\f[R]\f[I]void\f[R]\f[B])\f[R]
+Queries and returns the state of whether leading zeroes are added to
+strings returned by \f[B]bcl_string()\f[R] when numbers are greater than
+\f[B]-1\f[R], less than \f[B]1\f[R], and not equal to \f[B]0\f[R].
+If \f[B]true\f[R] is returned, then leading zeroes will be added.
+.RS
+.PP
+The default is \f[B]false\f[R].
+.RE
+.TP
+\f[B]void bcl_setLeadingZeroes(bool\f[R] \f[I]leadingZeroes\f[R]\f[B])\f[R]
+Sets the state of whether leading zeroes are added to strings returned
+by \f[B]bcl_string()\f[R] when numbers are greater than \f[B]-1\f[R],
+less than \f[B]1\f[R], and not equal to \f[B]0\f[R].
+If \f[I]leadingZeroes\f[R] is \f[B]true\f[R], leading zeroes will be
+added to strings returned by \f[B]bcl_string()\f[R].
+.TP
\f[B]void bcl_gc(\f[R]\f[I]void\f[R]\f[B])\f[R]
Garbage collects cached instances of arbitrary-precision numbers.
This only frees the memory of numbers that are \f[I]not\f[R] in use, so
diff --git a/manuals/bcl.3.md b/manuals/bcl.3.md
index daf5f461cc94..fa630fc79f1a 100644
--- a/manuals/bcl.3.md
+++ b/manuals/bcl.3.md
@@ -61,6 +61,10 @@ These items allow clients to set up bcl(3).
**void bcl_setAbortOnFatalError(bool** _abrt_**);**
+**bool bcl_leadingZeroes(**_void_**);**
+
+**void bcl_setLeadingZeroes(bool** _leadingZeroes_**);**
+
**void bcl_gc(**_void_**);**
## Contexts
@@ -216,8 +220,8 @@ bcl(3) is a library that implements arbitrary-precision decimal math, as
bcl(3) is async-signal-safe if **bcl_handleSignal(**_void_**)** is used
properly. (See the **SIGNAL HANDLING** section.)
-bcl(3) assumes that it is allowed to use the **bcl_** and **bc_** prefixes for
-symbol names without collision.
+bcl(3) assumes that it is allowed to use the **bcl**, **Bcl**, **bc**, and
+**Bc** prefixes for symbol names without collision.
All of the items in its interface are described below. See the documentation for
each function for what each function can return.
@@ -280,6 +284,8 @@ each function for what each function can return.
If activated, clients do not need to check for fatal errors.
+ The default is **false**.
+
**void bcl_setAbortOnFatalError(bool** _abrt_**)**
: Sets the state of calling **abort()** on fatal errors. If *abrt* is
@@ -289,6 +295,22 @@ each function for what each function can return.
If activated, clients do not need to check for fatal errors.
+**bool bcl_leadingZeroes(**_void_**)**
+
+: Queries and returns the state of whether leading zeroes are added to strings
+ returned by **bcl_string()** when numbers are greater than **-1**, less than
+ **1**, and not equal to **0**. If **true** is returned, then leading zeroes
+ will be added.
+
+ The default is **false**.
+
+**void bcl_setLeadingZeroes(bool** _leadingZeroes_**)**
+
+: Sets the state of whether leading zeroes are added to strings returned by
+ **bcl_string()** when numbers are greater than **-1**, less than **1**, and
+ not equal to **0**. If *leadingZeroes* is **true**, leading zeroes will be
+ added to strings returned by **bcl_string()**.
+
**void bcl_gc(**_void_**)**
: Garbage collects cached instances of arbitrary-precision numbers. This only
diff --git a/manuals/build.md b/manuals/build.md
index f8fc786329eb..13e969e8e673 100644
--- a/manuals/build.md
+++ b/manuals/build.md
@@ -46,7 +46,7 @@ However, if you wish to build it yourself, this `bc` can be built using Visual
Studio or MSBuild.
Unfortunately, only one build configuration (besides Debug or Release) is
-supported: extra math, and history enabled, NLS (locale support) disabled, with
+supported: extra math enabled, history and NLS (locale support) disabled, with
both calculators built. The default [settings][11] are `BC_BANNER=1`,
`{BC,DC}_SIGINT_RESET=0`, `{BC,DC}_TTY_MODE=1`, `{BC,DC}_PROMPT=1`.
diff --git a/manuals/dc/A.1 b/manuals/dc/A.1
index f1151a812509..a7ff2e3a6963 100644
--- a/manuals/dc/A.1
+++ b/manuals/dc/A.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -1072,6 +1094,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1249,6 +1288,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/A.1.md b/manuals/dc/A.1.md
index 3a09d4375395..0007cc76760a 100644
--- a/manuals/dc/A.1.md
+++ b/manuals/dc/A.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -942,6 +961,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -1108,6 +1145,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/manuals/dc/E.1 b/manuals/dc/E.1
index 9f8859b8f6b0..8760477a03ff 100644
--- a/manuals/dc/E.1
+++ b/manuals/dc/E.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -872,6 +894,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1044,6 +1083,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/E.1.md b/manuals/dc/E.1.md
index 9e14d20f76b2..6a2c465e5642 100644
--- a/manuals/dc/E.1.md
+++ b/manuals/dc/E.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -782,6 +801,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -943,6 +980,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/manuals/dc/EH.1 b/manuals/dc/EH.1
index 050074bca762..4506001dfe55 100644
--- a/manuals/dc/EH.1
+++ b/manuals/dc/EH.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -872,6 +894,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1044,6 +1083,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/EH.1.md b/manuals/dc/EH.1.md
index 1175c57ee85d..06ec59d4b3f7 100644
--- a/manuals/dc/EH.1.md
+++ b/manuals/dc/EH.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -782,6 +801,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -943,6 +980,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/manuals/dc/EHN.1 b/manuals/dc/EHN.1
index b552b611c3d7..1124d907bdd9 100644
--- a/manuals/dc/EHN.1
+++ b/manuals/dc/EHN.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -872,6 +894,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1044,6 +1083,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/EHN.1.md b/manuals/dc/EHN.1.md
index b6aedde3e0d8..50cb37ef2586 100644
--- a/manuals/dc/EHN.1.md
+++ b/manuals/dc/EHN.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -782,6 +801,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -943,6 +980,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/manuals/dc/EN.1 b/manuals/dc/EN.1
index d1de8e208f32..beae0e46a9b6 100644
--- a/manuals/dc/EN.1
+++ b/manuals/dc/EN.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -872,6 +894,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1044,6 +1083,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/EN.1.md b/manuals/dc/EN.1.md
index 22983732721b..db6f27f34576 100644
--- a/manuals/dc/EN.1.md
+++ b/manuals/dc/EN.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -782,6 +801,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -943,6 +980,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/manuals/dc/H.1 b/manuals/dc/H.1
index ba30beb54d95..b4ab9f511080 100644
--- a/manuals/dc/H.1
+++ b/manuals/dc/H.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -1072,6 +1094,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1249,6 +1288,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/H.1.md b/manuals/dc/H.1.md
index 0fee947ec5c3..647d486adc38 100644
--- a/manuals/dc/H.1.md
+++ b/manuals/dc/H.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -942,6 +961,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -1108,6 +1145,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/manuals/dc/HN.1 b/manuals/dc/HN.1
index e7a76f01dc4a..eb35cb23ff7b 100644
--- a/manuals/dc/HN.1
+++ b/manuals/dc/HN.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -1072,6 +1094,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1249,6 +1288,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/HN.1.md b/manuals/dc/HN.1.md
index caffefacce7d..70c962624833 100644
--- a/manuals/dc/HN.1.md
+++ b/manuals/dc/HN.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -942,6 +961,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -1108,6 +1145,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/manuals/dc/N.1 b/manuals/dc/N.1
index 30cfcadc7a07..c5cc36ac9b10 100644
--- a/manuals/dc/N.1
+++ b/manuals/dc/N.1
@@ -73,6 +73,16 @@ Forces interactive mode.
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-L\f[R], \f[B]--no-line-length\f[R]
+Disables line length checking and prints numbers without backslashes and
+newlines.
+In other words, this option sets \f[B]BC_LINE_LENGTH\f[R] to \f[B]0\f[R]
+(see the \f[B]ENVIRONMENT VARIABLES\f[R] section).
+.RS
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-P\f[R], \f[B]--no-prompt\f[R]
Disables the prompt in TTY mode.
(The prompt is only enabled in TTY mode.
@@ -118,6 +128,18 @@ See the \f[I]Extended Register Mode\f[R] subsection of the
This is a \f[B]non-portable extension\f[R].
.RE
.TP
+\f[B]-z\f[R], \f[B]--leading-zeroes\f[R]
+Makes bc(1) print all numbers greater than \f[B]-1\f[R] and less than
+\f[B]1\f[R], and not equal to \f[B]0\f[R], with a leading zero.
+.RS
+.PP
+This can be set for individual numbers with the \f[B]plz(x)\f[R],
+plznl(x)**, \f[B]pnlz(x)\f[R], and \f[B]pnlznl(x)\f[R] functions in the
+extended math library (see the \f[B]LIBRARY\f[R] section).
+.PP
+This is a \f[B]non-portable extension\f[R].
+.RE
+.TP
\f[B]-e\f[R] \f[I]expr\f[R], \f[B]--expression\f[R]=\f[I]expr\f[R]
Evaluates \f[I]expr\f[R].
If multiple expressions are given, they are evaluated in order.
@@ -1072,6 +1094,23 @@ Pushes the length of the array \f[I]r\f[R] onto the stack.
.PP
This is a \f[B]non-portable extension\f[R].
.RE
+.SS Global Settings
+.PP
+These commands retrieve global settings.
+These are the only commands that require multiple specific characters,
+and all of them begin with the letter \f[B]g\f[R].
+Only the characters below are allowed after the character \f[B]g\f[R];
+any other character produces a parse error (see the \f[B]ERRORS\f[R]
+section).
+.TP
+\f[B]gl\f[R]
+Pushes the line length set by \f[B]DC_LINE_LENGTH\f[R] (see the
+\f[B]ENVIRONMENT VARIABLES\f[R] section) onto the stack.
+.TP
+\f[B]gz\f[R]
+Pushes \f[B]0\f[R] onto the stack if the leading zero setting has not
+been enabled with the \f[B]-z\f[R] or \f[B]--leading-zeroes\f[R] options
+(see the \f[B]OPTIONS\f[R] section), non-zero otherwise.
.SH REGISTERS
.PP
Registers are names that can store strings, numbers, and arrays.
@@ -1249,6 +1288,12 @@ greater than \f[B]1\f[R] and is less than \f[B]UINT16_MAX\f[R]
(\f[B]2\[ha]16-1\f[R]), dc(1) will output lines to that length,
including the backslash newline combo.
The default line length is \f[B]70\f[R].
+.RS
+.PP
+The special value of \f[B]0\f[R] will disable line length checking and
+print numbers without regard to line length and without backslashes and
+newlines.
+.RE
.TP
\f[B]DC_SIGINT_RESET\f[R]
If dc(1) is not in interactive mode (see the \f[B]INTERACTIVE MODE\f[R]
diff --git a/manuals/dc/N.1.md b/manuals/dc/N.1.md
index 078554a4fc58..fea23028e483 100644
--- a/manuals/dc/N.1.md
+++ b/manuals/dc/N.1.md
@@ -69,6 +69,14 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-L**, **-\-no-line-length**
+
+: Disables line length checking and prints numbers without backslashes and
+ newlines. In other words, this option sets **BC_LINE_LENGTH** to **0** (see
+ the **ENVIRONMENT VARIABLES** section).
+
+ This is a **non-portable extension**.
+
**-P**, **-\-no-prompt**
: Disables the prompt in TTY mode. (The prompt is only enabled in TTY mode.
@@ -106,6 +114,17 @@ The following are the options that dc(1) accepts.
This is a **non-portable extension**.
+**-z**, **-\-leading-zeroes**
+
+: Makes bc(1) print all numbers greater than **-1** and less than **1**, and
+ not equal to **0**, with a leading zero.
+
+ This can be set for individual numbers with the **plz(x)**, plznl(x)**,
+ **pnlz(x)**, and **pnlznl(x)** functions in the extended math library (see
+ the **LIBRARY** section).
+
+ This is a **non-portable extension**.
+
**-e** *expr*, **-\-expression**=*expr*
: Evaluates *expr*. If multiple expressions are given, they are evaluated in
@@ -942,6 +961,24 @@ These commands manipulate arrays.
This is a **non-portable extension**.
+## Global Settings
+
+These commands retrieve global settings. These are the only commands that
+require multiple specific characters, and all of them begin with the letter
+**g**. Only the characters below are allowed after the character **g**; any
+other character produces a parse error (see the **ERRORS** section).
+
+**gl**
+
+: Pushes the line length set by **DC_LINE_LENGTH** (see the **ENVIRONMENT
+ VARIABLES** section) onto the stack.
+
+**gz**
+
+: Pushes **0** onto the stack if the leading zero setting has not been enabled
+ with the **-z** or **-\-leading-zeroes** options (see the **OPTIONS**
+ section), non-zero otherwise.
+
# REGISTERS
Registers are names that can store strings, numbers, and arrays. (Number/string
@@ -1108,6 +1145,9 @@ dc(1) recognizes the following environment variables:
lines to that length, including the backslash newline combo. The default
line length is **70**.
+ The special value of **0** will disable line length checking and print
+ numbers without regard to line length and without backslashes and newlines.
+
**DC_SIGINT_RESET**
: If dc(1) is not in interactive mode (see the **INTERACTIVE MODE** section),
diff --git a/scripts/functions.sh b/scripts/functions.sh
index e794d96fc707..65ec0a1167fe 100755
--- a/scripts/functions.sh
+++ b/scripts/functions.sh
@@ -223,11 +223,9 @@ checkerrtest()
die "$_checkerrtest_d" "produced no error message" "$_checkerrtest_name" "$_checkerrtest_error"
fi
- # Display the error messages if not directly running exe.
- # This allows the script to print valgrind output.
- if [ "$_checkerrtest_exebase" != "bc" ] && [ "$_checkerrtest_exebase" != "dc" ]; then
- cat "$_checkerrtest_out"
- fi
+ # To display error messages, uncomment this line. This is useful when
+ # debugging.
+ #cat "$_checkerrtest_out"
}
# Replace a substring in a string with another. This function is the *real*
diff --git a/src/args.c b/src/args.c
index ea1d0043a357..6601cfb2eeb6 100644
--- a/src/args.c
+++ b/src/args.c
@@ -171,6 +171,18 @@ void bc_args(int argc, char *argv[], bool exit_exprs) {
break;
}
+ case 'z':
+ {
+ vm.flags |= BC_FLAG_Z;
+ break;
+ }
+
+ case 'L':
+ {
+ vm.line_len = 0;
+ break;
+ }
+
case 'P':
{
vm.flags &= ~(BC_FLAG_P);
@@ -201,7 +213,7 @@ void bc_args(int argc, char *argv[], bool exit_exprs) {
case 'q':
{
assert(BC_IS_BC);
- // Do nothing.
+ vm.flags &= ~(BC_FLAG_Q);
break;
}
diff --git a/src/bc_parse.c b/src/bc_parse.c
index d0635a3b56d0..c64121ec5da8 100644
--- a/src/bc_parse.c
+++ b/src/bc_parse.c
@@ -1589,6 +1589,9 @@ static void bc_parse_stmt(BcParse *p) {
#if BC_ENABLE_EXTRA_MATH
case BC_LEX_KW_MAXRAND:
#endif // BC_ENABLE_EXTRA_MATH
+ case BC_LEX_KW_LINE_LENGTH:
+ case BC_LEX_KW_GLOBAL_STACKS:
+ case BC_LEX_KW_LEADING_ZERO:
{
bc_parse_expr_status(p, BC_PARSE_PRINT, bc_parse_next_expr);
break;
@@ -1726,8 +1729,14 @@ void bc_parse_parse(BcParse *p) {
// Functions need special parsing.
else if (p->l.t == BC_LEX_KW_DEFINE) {
- if (BC_ERR(BC_PARSE_NO_EXEC(p)))
- bc_parse_err(p, BC_ERR_PARSE_TOKEN);
+ if (BC_ERR(BC_PARSE_NO_EXEC(p))) {
+ if (p->flags.len == 1 &&
+ BC_PARSE_TOP_FLAG(p) == BC_PARSE_FLAG_IF_END)
+ {
+ bc_parse_noElse(p);
+ }
+ else bc_parse_err(p, BC_ERR_PARSE_TOKEN);
+ }
bc_parse_func(p);
}
@@ -2078,6 +2087,9 @@ static BcParseStatus bc_parse_expr_err(BcParse *p, uint8_t flags,
#if BC_ENABLE_EXTRA_MATH
case BC_LEX_KW_MAXRAND:
#endif // BC_ENABLE_EXTRA_MATH
+ case BC_LEX_KW_LINE_LENGTH:
+ case BC_LEX_KW_GLOBAL_STACKS:
+ case BC_LEX_KW_LEADING_ZERO:
{
// All of these are leaves and cannot come right after a leaf.
if (BC_ERR(BC_PARSE_LEAF(prev, bin_last, rprn)))
diff --git a/src/data.c b/src/data.c
index 0eaf7d699f7d..82475299ed78 100644
--- a/src/data.c
+++ b/src/data.c
@@ -141,6 +141,8 @@ const BcOptLong bc_args_lopt[] = {
{ "file", BC_OPT_REQUIRED, 'f' },
{ "help", BC_OPT_NONE, 'h' },
{ "interactive", BC_OPT_NONE, 'i' },
+ { "leading-zeroes", BC_OPT_NONE, 'z' },
+ { "no-line-length", BC_OPT_NONE, 'L' },
{ "no-prompt", BC_OPT_NONE, 'P' },
{ "no-read-prompt", BC_OPT_NONE, 'R' },
#if BC_ENABLED
@@ -873,6 +875,9 @@ const BcLexKeyword bc_lex_kws[] = {
#if BC_ENABLE_EXTRA_MATH
BC_LEX_KW_ENTRY("maxrand", 7, false),
#endif // BC_ENABLE_EXTRA_MATH
+ BC_LEX_KW_ENTRY("line_length", 11, false),
+ BC_LEX_KW_ENTRY("global_stacks", 13, false),
+ BC_LEX_KW_ENTRY("leading_zero", 12, false),
BC_LEX_KW_ENTRY("stream", 6, false),
BC_LEX_KW_ENTRY("else", 4, false),
};
@@ -928,7 +933,10 @@ const uint8_t bc_parse_exprs[] = {
BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, false, true),
// Starts with BC_LEX_KW_MAXIBASE.
- BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, false, 0)
+ BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
+
+ // Starts with BC_LEX_KW_STREAM.
+ BC_PARSE_EXPR_ENTRY(false, false, 0, 0, 0, 0, 0, 0)
#else // BC_ENABLE_EXTRA_MATH
@@ -948,7 +956,7 @@ const uint8_t bc_parse_exprs[] = {
BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, true, true),
// Starts with BC_LEX_KW_MAXSCALE,
- BC_PARSE_EXPR_ENTRY(true, true, false, false, 0, 0, 0, 0)
+ BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, false, 0)
#endif // BC_ENABLE_EXTRA_MATH
};
@@ -1170,7 +1178,11 @@ const uchar dc_parse_insts[] = {
#if BC_ENABLE_EXTRA_MATH
BC_INST_MAXRAND,
#endif // BC_ENABLE_EXTRA_MATH
- BC_INST_PRINT_STREAM, BC_INST_INVALID,
+ BC_INST_LINE_LENGTH,
+#if BC_ENABLED
+ BC_INST_INVALID,
+#endif // BC_ENABLED
+ BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM, BC_INST_INVALID,
BC_INST_REL_EQ, BC_INST_INVALID,
BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK,
BC_INST_INVALID, BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP,
diff --git a/src/dc_lex.c b/src/dc_lex.c
index d0e93c28a431..5c6950ba9698 100644
--- a/src/dc_lex.c
+++ b/src/dc_lex.c
@@ -248,6 +248,19 @@ void dc_lex_token(BcLex *l) {
break;
}
+ case 'g':
+ {
+ c2 = l->buf[l->i];
+
+ if (c2 == 'l') l->t = BC_LEX_KW_LINE_LENGTH;
+ else if (c2 == 'z') l->t = BC_LEX_KW_LEADING_ZERO;
+ else bc_lex_invalidChar(l, c2);
+
+ l->i += 1;
+
+ break;
+ }
+
case '[':
{
dc_lex_string(l);
diff --git a/src/history.c b/src/history.c
index 44fe48acc1ad..b5ba0758075c 100644
--- a/src/history.c
+++ b/src/history.c
@@ -1648,8 +1648,45 @@ void bc_history_string_free(void *str) {
void bc_history_init(BcHistory *h) {
+#ifdef _WIN32
+ HANDLE out, in;
+#endif // _WIN32
+
BC_SIG_ASSERT_LOCKED;
+ h->rawMode = false;
+ h->badTerm = bc_history_isBadTerm();
+
+#ifdef _WIN32
+
+ h->orig_in = 0;
+ h->orig_out = 0;
+
+ in = GetStdHandle(STD_INPUT_HANDLE);
+ out = GetStdHandle(STD_OUTPUT_HANDLE);
+
+ if (!h->badTerm) {
+ SetConsoleCP(CP_UTF8);
+ SetConsoleOutputCP(CP_UTF8);
+ if (!GetConsoleMode(in, &h->orig_in) ||
+ !GetConsoleMode(out, &h->orig_out))
+ {
+ h->badTerm = true;
+ return;
+ }
+ else {
+ DWORD reqOut = ENABLE_VIRTUAL_TERMINAL_PROCESSING |
+ DISABLE_NEWLINE_AUTO_RETURN;
+ DWORD reqIn = ENABLE_VIRTUAL_TERMINAL_INPUT;
+ if (!SetConsoleMode(in, h->orig_in | reqIn) ||
+ !SetConsoleMode(out, h->orig_out | reqOut))
+ {
+ h->badTerm = true;
+ }
+ }
+ }
+#endif // _WIN32
+
bc_vec_init(&h->buf, sizeof(char), BC_DTOR_NONE);
bc_vec_init(&h->history, sizeof(char*), BC_DTOR_HISTORY_STRING);
bc_vec_init(&h->extras, sizeof(char), BC_DTOR_NONE);
@@ -1663,19 +1700,6 @@ void bc_history_init(BcHistory *h) {
sigemptyset(&h->sigmask);
sigaddset(&h->sigmask, SIGINT);
#endif // _WIN32
-
- h->rawMode = false;
- h->badTerm = bc_history_isBadTerm();
-
-#ifdef _WIN32
- if (!h->badTerm) {
- SetConsoleCP(CP_UTF8);
- SetConsoleOutputCP(CP_UTF8);
- GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &h->orig_console_mode);
- SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE),
- ENABLE_VIRTUAL_TERMINAL_INPUT);
- }
-#endif // _WIN32
}
void bc_history_free(BcHistory *h) {
@@ -1683,7 +1707,8 @@ void bc_history_free(BcHistory *h) {
#ifndef _WIN32
bc_history_disableRaw(h);
#else // _WIN32
- SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), h->orig_console_mode);
+ SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), h->orig_in);
+ SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), h->orig_out);
#endif // _WIN32
#ifndef NDEBUG
bc_vec_free(&h->buf);
diff --git a/src/library.c b/src/library.c
index dbc8355a6b8e..e0bd3ee98b85 100644
--- a/src/library.c
+++ b/src/library.c
@@ -185,6 +185,14 @@ void bcl_setAbortOnFatalError(bool abrt) {
vm.abrt = abrt;
}
+bool bcl_leadingZeroes(void) {
+ return vm.leading_zeroes;
+}
+
+void bcl_setLeadingZeroes(bool leadingZeroes) {
+ vm.leading_zeroes = leadingZeroes;
+}
+
BclContext bcl_ctxt_create(void) {
BclContext ctxt = NULL;
diff --git a/src/num.c b/src/num.c
index 604328dca80d..dc3f63ab076e 100644
--- a/src/num.c
+++ b/src/num.c
@@ -2366,7 +2366,7 @@ int_err:
*/
static inline void bc_num_printNewline(void) {
#if !BC_ENABLE_LIBRARY
- if (vm.nchars >= vm.line_len - 1) {
+ if (vm.nchars >= vm.line_len - 1 && vm.line_len) {
bc_vm_putchar('\\', bc_flush_none);
bc_vm_putchar('\n', bc_flush_err);
}
@@ -2475,9 +2475,6 @@ static void bc_num_printDecimal(const BcNum *restrict n, bool newline) {
bool zero = true;
size_t buffer[BC_BASE_DIGS];
- // Print the sign.
- if (BC_NUM_NEG(n)) bc_num_putchar('-', true);
-
// Print loop.
for (i = n->len - 1; i < n->len; --i) {
@@ -2975,9 +2972,6 @@ static void bc_num_printBase(BcNum *restrict n, BcBigDig base, bool newline) {
BcNumDigitOp print;
bool neg = BC_NUM_NEG(n);
- // Just take care of the sign right here.
- if (neg) bc_num_putchar('-', true);
-
// Clear the sign because it makes the actual printing easier when we have
// to do math.
BC_NUM_NEG_CLR(n);
@@ -3145,6 +3139,16 @@ void bc_num_print(BcNum *restrict n, BcBigDig base, bool newline) {
// We may need a newline, just to start.
bc_num_printNewline();
+ if (BC_NUM_NONZERO(n)) {
+
+ // Print the sign.
+ if (BC_NUM_NEG(n)) bc_num_putchar('-', true);
+
+ // Print the leading zero if necessary.
+ if (BC_Z && BC_NUM_RDX_VAL(n) == n->len)
+ bc_num_printHex(0, 1, false, !newline);
+ }
+
// Short-circuit 0.
if (BC_NUM_ZERO(n)) bc_num_printHex(0, 1, false, !newline);
else if (base == BC_BASE) bc_num_printDecimal(n, newline);
diff --git a/src/program.c b/src/program.c
index 1ba012e57a5e..1ff9c24f323b 100644
--- a/src/program.c
+++ b/src/program.c
@@ -287,6 +287,14 @@ static BcNum* bc_program_num(BcProgram *p, BcResult *r) {
BcNum *n;
+#ifdef _WIN32
+ // Windows made it an error to not initialize this, so shut it up.
+ // I don't want to do this on other platforms because this procedure
+ // is one of the most heavily-used, and eliminating the initialization
+ // is a performance win.
+ n = NULL;
+#endif // _WIN32
+
switch (r->t) {
case BC_RESULT_STR:
@@ -2389,6 +2397,28 @@ static void bc_program_pushGlobal(BcProgram *p, uchar inst) {
bc_program_pushBigdig(p, p->globals[inst - BC_INST_IBASE], t);
}
+/**
+ * Pushes the value of a global setting onto the stack.
+ * @param p The program.
+ * @param inst Which global setting to push, as an instruction.
+ */
+static void bc_program_globalSetting(BcProgram *p, uchar inst) {
+
+ BcBigDig val;
+
+ // Make sure the instruction is valid.
+ assert(inst >= BC_INST_LINE_LENGTH && inst <= BC_INST_LEADING_ZERO);
+
+ if (inst == BC_INST_LINE_LENGTH) val = (BcBigDig) vm.line_len;
+#if BC_ENABLED
+ else if (inst == BC_INST_GLOBAL_STACKS) val = (BC_G != 0);
+#endif // BC_ENABLED
+ else val = (BC_Z != 0);
+
+ // Push the global.
+ bc_program_pushBigdig(p, val, BC_RESULT_TEMP);
+}
+
#if BC_ENABLE_EXTRA_MATH
/**
@@ -2822,6 +2852,16 @@ void bc_program_exec(BcProgram *p) {
BC_PROG_JUMP(inst, code, ip);
}
+ BC_PROG_LBL(BC_INST_LINE_LENGTH):
+#if BC_ENABLED
+ BC_PROG_LBL(BC_INST_GLOBAL_STACKS):
+#endif // BC_ENABLED
+ BC_PROG_LBL(BC_INST_LEADING_ZERO):
+ {
+ bc_program_globalSetting(p, inst);
+ BC_PROG_JUMP(inst, code, ip);
+ }
+
BC_PROG_LBL(BC_INST_VAR):
{
bc_program_pushVar(p, code, &ip->idx, false, false);
diff --git a/src/read.c b/src/read.c
index aa906c7e5dd5..84621ad3acac 100644
--- a/src/read.c
+++ b/src/read.c
@@ -232,10 +232,11 @@ BcStatus bc_read_line(BcVec *vec, const char *prompt) {
char* bc_read_file(const char *path) {
BcErr e = BC_ERR_FATAL_IO_ERR;
- size_t size, r;
+ size_t size, to_read;
struct stat pstat;
int fd;
char* buf;
+ char* buf2;
BC_SIG_ASSERT_LOCKED;
@@ -264,11 +265,18 @@ char* bc_read_file(const char *path) {
// Get the size of the file and allocate that much.
size = (size_t) pstat.st_size;
buf = bc_vm_malloc(size + 1);
-
- // Read the file. We just bail if a signal interrupts. This is so that users
- // can interrupt the reading of big files if they want.
- r = (size_t) read(fd, buf, size);
- if (BC_ERR(r != size)) goto read_err;
+ buf2 = buf;
+ to_read = size;
+
+ do {
+
+ // Read the file. We just bail if a signal interrupts. This is so that
+ // users can interrupt the reading of big files if they want.
+ ssize_t r = read(fd, buf2, to_read);
+ if (BC_ERR(r < 0)) goto read_err;
+ to_read -= (size_t) r;
+ buf2 += (size_t) r;
+ } while (to_read);
// Got to have a nul byte.
buf[size] = '\0';
diff --git a/src/vm.c b/src/vm.c
index dc15d7dae3c0..8f222f8ccf69 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -495,7 +495,7 @@ static size_t bc_vm_envLen(const char *var) {
// Parse it and clamp it if needed.
len = (size_t) atoi(lenv) - 1;
- if (len < 2 || len >= UINT16_MAX) len = BC_NUM_PRINT_WIDTH;
+ if (len == 1 || len >= UINT16_MAX) len = BC_NUM_PRINT_WIDTH;
}
// Set the default.
else len = BC_NUM_PRINT_WIDTH;
@@ -1336,6 +1336,13 @@ void bc_vm_boot(int argc, char *argv[]) {
vm.flags |= BC_TTY ? BC_FLAG_P | BC_FLAG_R : 0;
vm.flags |= BC_I ? BC_FLAG_Q : 0;
+#if BC_ENABLED
+ if (BC_IS_BC && BC_I) {
+ // Set whether we print the banner or not.
+ bc_vm_setenvFlag("BC_BANNER", BC_DEFAULT_BANNER, BC_FLAG_Q);
+ }
+#endif // BC_ENABLED
+
// Are we in TTY mode?
if (BC_TTY) {
@@ -1368,11 +1375,6 @@ void bc_vm_boot(int argc, char *argv[]) {
// Set whether we reset on SIGINT or not.
bc_vm_setenvFlag(env_sigint, env_sigint_def, BC_FLAG_SIGINT);
-#if BC_ENABLED
- // Set whether we print the banner or not.
- if (BC_IS_BC)
- bc_vm_setenvFlag("BC_BANNER", BC_DEFAULT_BANNER, BC_FLAG_Q);
-#endif // BC_ENABLED
}
#if BC_ENABLED
diff --git a/tests/all.sh b/tests/all.sh
index a4a9c8bc8936..d3e79ef80ece 100755
--- a/tests/all.sh
+++ b/tests/all.sh
@@ -27,19 +27,29 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-set -e
-
script="$0"
testdir=$(dirname "$script")
. "$testdir/../scripts/functions.sh"
+# We need to figure out if we should run stuff in parallel.
+pll=1
+
+while getopts "n" opt; do
+
+ case "$opt" in
+ n) pll=0 ; shift ; set -e ;;
+ ?) usage "Invalid option: $opt" ;;
+ esac
+
+done
+
# Command-line processing.
if [ "$#" -ge 1 ]; then
d="$1"
shift
else
- err_exit "usage: $script dir [run_extra_tests] [run_stack_tests] [gen_tests] [time_tests] [exec args...]" 1
+ err_exit "usage: $script [-n] dir [run_extra_tests] [run_stack_tests] [gen_tests] [time_tests] [exec args...]" 1
fi
if [ "$#" -lt 1 ]; then
@@ -96,6 +106,8 @@ unset DC_LINE_LENGTH
# Get the list of tests that require extra math.
extra_required=$(cat "$testdir/extra_required.txt")
+pids=""
+
printf '\nRunning %s tests...\n\n' "$d"
# Run the tests one at a time.
@@ -109,28 +121,93 @@ while read t; do
fi
fi
- sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@"
+ if [ "$pll" -ne 0 ]; then
+ sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@" &
+ pids="$pids $!"
+ else
+ sh "$testdir/test.sh" "$d" "$t" "$generate_tests" "$time_tests" "$exe" "$@"
+ fi
done < "$testdir/$d/all.txt"
# stdin tests.
-sh "$testdir/stdin.sh" "$d" "$exe" "$@"
+if [ "$pll" -ne 0 ]; then
+ sh "$testdir/stdin.sh" "$d" "$exe" "$@" &
+ pids="$pids $!"
+else
+ sh "$testdir/stdin.sh" "$d" "$exe" "$@"
+fi
# Script tests.
-sh "$testdir/scripts.sh" "$d" "$extra" "$run_stack_tests" "$generate_tests" \
- "$time_tests" "$exe" "$@"
+if [ "$pll" -ne 0 ]; then
+ sh "$testdir/scripts.sh" "$d" "$extra" "$run_stack_tests" "$generate_tests" \
+ "$time_tests" "$exe" "$@" &
+ pids="$pids $!"
+else
+ sh "$testdir/scripts.sh" -n "$d" "$extra" "$run_stack_tests" "$generate_tests" \
+ "$time_tests" "$exe" "$@"
+fi
# Read tests.
-sh "$testdir/read.sh" "$d" "$exe" "$@"
+if [ "$pll" -ne 0 ]; then
+ sh "$testdir/read.sh" "$d" "$exe" "$@" &
+ pids="$pids $!"
+else
+ sh "$testdir/read.sh" "$d" "$exe" "$@"
+fi
# Error tests.
-sh "$testdir/errors.sh" "$d" "$exe" "$@"
+if [ "$pll" -ne 0 ]; then
+ sh "$testdir/errors.sh" "$d" "$exe" "$@" &
+ pids="$pids $!"
+else
+ sh "$testdir/errors.sh" "$d" "$exe" "$@"
+fi
+
+# Test all the files in the errors directory. While the other error test (in
+# tests/errors.sh) does a test for every line, this does one test per file, but
+# it runs the file through stdin and as a file on the command-line.
+for testfile in $testdir/$d/errors/*.txt; do
+
+ b=$(basename "$testfile")
+
+ if [ "$pll" -ne 0 ]; then
+ sh "$testdir/error.sh" "$d" "$b" "$@" &
+ pids="$pids $!"
+ else
+ sh "$testdir/error.sh" "$d" "$b" "$@"
+ fi
+
+done
# Other tests.
-sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@"
+if [ "$pll" -ne 0 ]; then
+ sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@" &
+ pids="$pids $!"
+else
+ sh "$testdir/other.sh" "$d" "$extra" "$exe" "$@"
+fi
+
+if [ "$pll" -ne 0 ]; then
+
+ exit_err=0
-# History tests.
-sh "$testdir/history.sh" "$d" -a
+ for p in $pids; do
+
+ wait "$p"
+ err="$?"
+
+ if [ "$err" -ne 0 ]; then
+ printf 'A test failed!\n'
+ exit_err=1
+ fi
+ done
+
+ if [ "$exit_err" -ne 0 ]; then
+ exit 1
+ fi
+
+fi
printf '\nAll %s tests passed.\n' "$d"
diff --git a/tests/bc/all.txt b/tests/bc/all.txt
index 6f3b41a37ac1..23244773b933 100644
--- a/tests/bc/all.txt
+++ b/tests/bc/all.txt
@@ -49,3 +49,4 @@ recursive_arrays
divmod
modexp
bitfuncs
+leadingzero
diff --git a/tests/bc/leadingzero.txt b/tests/bc/leadingzero.txt
new file mode 100644
index 000000000000..77c7dcd08ef9
--- /dev/null
+++ b/tests/bc/leadingzero.txt
@@ -0,0 +1,12 @@
+plznl(0.01)
+plznl(-0.01)
+plznl(.01)
+plznl(-.01)
+plznl(1.01)
+plznl(-1.01)
+pnlznl(0.01)
+pnlznl(-0.01)
+pnlznl(.01)
+pnlznl(-.01)
+pnlznl(1.01)
+pnlznl(-1.01)
diff --git a/tests/bc/leadingzero_results.txt b/tests/bc/leadingzero_results.txt
new file mode 100644
index 000000000000..4b542860a773
--- /dev/null
+++ b/tests/bc/leadingzero_results.txt
@@ -0,0 +1,12 @@
+0.01
+-0.01
+0.01
+-0.01
+1.01
+-1.01
+.01
+-.01
+.01
+-.01
+1.01
+-1.01
diff --git a/tests/bc/scripts/globals.bc b/tests/bc/scripts/globals.bc
index e9a0c6dbacd3..30ff9074387e 100644
--- a/tests/bc/scripts/globals.bc
+++ b/tests/bc/scripts/globals.bc
@@ -1,5 +1,9 @@
#! /usr/bin/bc -gq
+if (!global_stacks()) {
+ sqrt(-1)
+}
+
define i(x) {
ibase=x
return ibase
diff --git a/tests/bcl.c b/tests/bcl.c
index 89ee185145a5..e1d527ad8721 100644
--- a/tests/bcl.c
+++ b/tests/bcl.c
@@ -234,6 +234,104 @@ int main(void) {
// Clean up.
bcl_num_free(n);
+ // Test leading zeroes.
+ if (bcl_leadingZeroes())
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ n = bcl_parse("0.01");
+ err(bcl_err(n));
+
+ n2 = bcl_parse("-0.01");
+ err(bcl_err(n2));
+
+ n3 = bcl_parse("1.01");
+ err(bcl_err(n3));
+
+ n4 = bcl_parse("-1.01");
+ err(bcl_err(n4));
+
+ res = bcl_string(bcl_dup(n));
+ if (strcmp(res, ".01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(bcl_dup(n2));
+ if (strcmp(res, "-.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(bcl_dup(n3));
+ if (strcmp(res, "1.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(bcl_dup(n4));
+ if (strcmp(res, "-1.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ bcl_setLeadingZeroes(true);
+
+ if (!bcl_leadingZeroes())
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ res = bcl_string(bcl_dup(n));
+ if (strcmp(res, "0.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(bcl_dup(n2));
+ if (strcmp(res, "-0.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(bcl_dup(n3));
+ if (strcmp(res, "1.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(bcl_dup(n4));
+ if (strcmp(res, "-1.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ bcl_setLeadingZeroes(false);
+
+ if (bcl_leadingZeroes())
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ res = bcl_string(n);
+ if (strcmp(res, ".01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(n2);
+ if (strcmp(res, "-.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(n3);
+ if (strcmp(res, "1.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
+ res = bcl_string(n4);
+ if (strcmp(res, "-1.01"))
+ err(BCL_ERROR_FATAL_UNKNOWN_ERR);
+
+ free(res);
+
bcl_ctxt_freeNums(ctxt);
bcl_gc();
diff --git a/tests/dc/errors.txt b/tests/dc/errors.txt
index 37513e972647..95fff37d915f 100644
--- a/tests/dc/errors.txt
+++ b/tests/dc/errors.txt
@@ -24,6 +24,9 @@ zp198202389.289374pzp[He World!]xSzpzXfrfxzpfR
3 0~
0 _251^pR
.
+ga
+gb
+gd
@
0 0< $
0 0> s e %
diff --git a/tests/error.sh b/tests/error.sh
new file mode 100755
index 000000000000..c76dcdf113dd
--- /dev/null
+++ b/tests/error.sh
@@ -0,0 +1,99 @@
+#! /bin/sh
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2018-2021 Gavin D. Howard and contributors.
+#
+# 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.
+#
+
+script="$0"
+testdir=$(dirname "$script")
+
+. "$testdir/../scripts/functions.sh"
+
+outputdir=${BC_TEST_OUTPUT_DIR:-$testdir}
+
+# Command-line processing.
+if [ "$#" -lt 2 ]; then
+ printf 'usage: %s dir test [exec args...]\n' "$script"
+ exit 1
+else
+ d="$1"
+ shift
+
+ t="$1"
+ shift
+fi
+
+if [ "$#" -lt 1 ]; then
+ exe="$testdir/../bin/$d"
+else
+ exe="$1"
+ shift
+fi
+
+# I use these, so unset them to make the tests work.
+unset BC_ENV_ARGS
+unset BC_LINE_LENGTH
+unset DC_ENV_ARGS
+unset DC_LINE_LENGTH
+
+out="$outputdir/${d}_outputs/error_results_${t}"
+outdir=$(dirname "$out")
+
+# Make sure the directory exists.
+if [ ! -d "$outdir" ]; then
+ mkdir -p "$outdir"
+fi
+
+# Set stuff for the correct calculator.
+if [ "$d" = "bc" ]; then
+ opts="-l"
+ halt="halt"
+ read_call="read()"
+ read_expr="${read_call}\n5+5;"
+else
+ opts="-x"
+ halt="q"
+fi
+
+testfile="$testdir/$d/errors/$t"
+
+printf 'Running %s error file %s...' "$d" "$t"
+
+printf '%s\n' "$halt" | "$exe" "$@" $opts "$testfile" 2> "$out" > /dev/null
+err="$?"
+
+checkerrtest "$d" "$err" "$testfile" "$out" "$exebase" > /dev/null
+
+printf 'pass\n'
+
+printf 'Running %s error file %s through cat...' "$d" "$t"
+
+cat "$testfile" | "$exe" "$@" $opts 2> "$out" > /dev/null
+err="$?"
+
+checkcrash "$d" "$err" "$testfile"
+
+printf 'pass\n'
diff --git a/tests/errors.sh b/tests/errors.sh
index c8c82cfe356f..4acc978b9e5a 100755
--- a/tests/errors.sh
+++ b/tests/errors.sh
@@ -147,28 +147,3 @@ for testfile in $testdir/$d/*errors.txt; do
printf 'pass\n'
done
-
-# Test all the files in the errors directory. While the loop above does one test
-# for every line, this does one test per file, but it runs the file through
-# stdin and as a file on the command-line.
-for testfile in $testdir/$d/errors/*.txt; do
-
- printf 'Running %s error file %s...' "$d" "$testfile"
-
- printf '%s\n' "$halt" | "$exe" "$@" $opts "$testfile" 2> "$out" > /dev/null
- err="$?"
-
- checkerrtest "$d" "$err" "$testfile" "$out" "$exebase"
-
- printf 'pass\n'
-
- printf 'Running %s error file %s through cat...' "$d" "$testfile"
-
- cat "$testfile" | "$exe" "$@" $opts 2> "$out" > /dev/null
- err="$?"
-
- checkcrash "$d" "$err" "$testfile"
-
- printf 'pass\n'
-
-done
diff --git a/tests/extra_required.txt b/tests/extra_required.txt
index bcce9ee83b03..e36d95a1305b 100644
--- a/tests/extra_required.txt
+++ b/tests/extra_required.txt
@@ -6,3 +6,4 @@ scientific
shift
trunc
bitfuncs
+leadingzero
diff --git a/tests/history.py b/tests/history.py
index fff531652b1b..17006c93ef2d 100755
--- a/tests/history.py
+++ b/tests/history.py
@@ -30,6 +30,7 @@
import os, sys
import time
import signal
+import traceback
try:
import pexpect
@@ -72,23 +73,54 @@ utf8_stress_strs = [
]
+def expect(child, data):
+ child.expect(data)
+
+
+# Eats all of the child's data.
+# @param child The child whose data should be eaten.
+def eat(child):
+ while child.buffer is not None and len(child.buffer) > 0:
+ expect(child, ".+")
+
+
+# Send data to a child. This makes sure the buffers are empty first.
+# @param child The child to send data to.
+# @param data The data to send.
+def send(child, data):
+ eat(child)
+ child.send(data)
+
+
+def wait(child):
+ if child.isalive():
+ child.sendeof()
+ time.sleep(1)
+ if child.isalive():
+ child.kill(signal.SIGTERM)
+ time.sleep(1)
+ if child.isalive():
+ child.kill(signal.SIGKILL)
+ child.wait()
+
+
# Check that the child output the expected line. If history is false, then
# the output should change.
def check_line(child, expected, prompt=">>> ", history=True):
- child.send("\n")
+ send(child, "\n")
prefix = "\r\n" if history else ""
- child.expect(prefix + expected + "\r\n" + prompt)
+ expect(child, prefix + expected + "\r\n" + prompt)
# Write a string to output, checking all of the characters are output,
# one-by-one.
def write_str(child, s):
for c in s:
- child.send(c)
+ send(child, c)
if c in escapes:
- child.expect("\\{}".format(c))
+ expect(child, "\\{}".format(c))
else:
- child.expect(c)
+ expect(child, c)
# Check the bc banner.
@@ -98,11 +130,11 @@ def bc_banner(child):
bc_banner2 = "Copyright \(c\) 2018-[2-9][0-9][0-9][0-9] Gavin D. Howard and contributors\r\n"
bc_banner3 = "Report bugs at: https://git.yzena.com/gavin/bc\r\n\r\n"
bc_banner4 = "This is free software with ABSOLUTELY NO WARRANTY.\r\n\r\n"
- child.expect(bc_banner1)
- child.expect(bc_banner2)
- child.expect(bc_banner3)
- child.expect(bc_banner4)
- child.expect(prompt)
+ expect(child, bc_banner1)
+ expect(child, bc_banner2)
+ expect(child, bc_banner3)
+ expect(child, bc_banner4)
+ expect(child, prompt)
# Common UTF-8 testing function. The index is the index into utf8_stress_strs
@@ -121,20 +153,20 @@ def test_utf8(exe, args, env, idx, bc=True):
try:
# Write the stress string.
- child.send(utf8_stress_strs[idx])
- child.send("\n")
- child.expect("Parse error: bad character")
+ send(child, utf8_stress_strs[idx])
+ send(child, "\n")
if bc:
- child.send("quit")
+ send(child, "quit")
else:
- child.send("q")
+ send(child, "q")
- child.send("\n")
+ send(child, "\n")
- child.wait()
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -162,21 +194,21 @@ def test_utf8_0(exe, args, env, bc=True):
# Just random UTF-8 I generated somewhow, plus ensuring that insert works.
write_str(child, "ﴪáá̵̗🈐ã")
- child.send("\x1b[D\x1b[D\x1b[D\x1b\x1b[Aℐ")
- child.send("\n")
-
- child.expect("Parse error: bad character")
+ send(child, "\x1b[D\x1b[D\x1b[D\x1b\x1b[Aℐ")
+ send(child, "\n")
if bc:
- child.send("quit")
+ send(child, "quit")
else:
- child.send("q")
+ send(child, "q")
- child.send("\n")
+ send(child, "\n")
+ eat(child)
- child.wait()
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -212,15 +244,19 @@ def test_utf8_4(exe, args, env, bc=True):
# @param env The environment.
def test_sigint_sigquit(exe, args, env):
+ # Because both bc and dc use this, make sure the banner doesn't pop.
+ env["BC_BANNER"] = "0"
+
child = pexpect.spawn(exe, args=args, env=env)
try:
- child.send("\t")
- child.expect(" ")
- child.send("\x03")
- child.send("\x1c")
- child.wait()
+ send(child, "\t")
+ expect(child, " ")
+ send(child, "\x03")
+ send(child, "\x1c")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -240,14 +276,18 @@ def test_sigint_sigquit(exe, args, env):
# @param env The environment.
def test_eof(exe, args, env):
+ # Because both bc and dc use this, make sure the banner doesn't pop.
+ env["BC_BANNER"] = "0"
+
child = pexpect.spawn(exe, args=args, env=env)
try:
- child.send("\t")
- child.expect(" ")
- child.send("\x04")
- child.wait()
+ send(child, "\t")
+ expect(child, " ")
+ send(child, "\x04")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -267,17 +307,21 @@ def test_eof(exe, args, env):
# @param env The environment.
def test_sigint(exe, args, env):
+ # Because both bc and dc use this, make sure the banner doesn't pop.
+ env["BC_BANNER"] = "0"
+
env["BC_SIGINT_RESET"] = "0"
env["DC_SIGINT_RESET"] = "0"
child = pexpect.spawn(exe, args=args, env=env)
try:
- child.send("\t")
- child.expect(" ")
- child.send("\x03")
- child.wait()
+ send(child, "\t")
+ expect(child, " ")
+ send(child, "\x03")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -297,12 +341,19 @@ def test_sigint(exe, args, env):
# @param env The environment.
def test_sigtstp(exe, args, env):
+ # This test does not work on FreeBSD, so skip.
+ if sys.platform.startswith("freebsd"):
+ sys.exit(0)
+
+ # Because both bc and dc use this, make sure the banner doesn't pop.
+ env["BC_BANNER"] = "0"
+
child = pexpect.spawn(exe, args=args, env=env)
try:
- child.send("\t")
- child.expect(" ")
- child.send("\x13")
+ send(child, "\t")
+ expect(child, " ")
+ send(child, "\x13")
time.sleep(1)
if not child.isalive():
print("child exited early")
@@ -310,10 +361,11 @@ def test_sigtstp(exe, args, env):
print(str(child.buffer))
sys.exit(1)
child.kill(signal.SIGCONT)
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -333,19 +385,22 @@ def test_sigtstp(exe, args, env):
# @param env The environment.
def test_sigstop(exe, args, env):
+ # Because both bc and dc use this, make sure the banner doesn't pop.
+ env["BC_BANNER"] = "0"
+
child = pexpect.spawn(exe, args=args, env=env)
try:
- child.send("\t")
- child.expect(" ")
- child.send("\x14")
+ send(child, "\t")
+ expect(child, " ")
+ send(child, "\x14")
time.sleep(1)
if not child.isalive():
print("child exited early")
print(str(child))
print(str(child.buffer))
sys.exit(1)
- child.send("\x13")
+ send(child, "\x13")
time.sleep(1)
if not child.isalive():
print("child exited early")
@@ -353,10 +408,11 @@ def test_sigstop(exe, args, env):
print(str(child.buffer))
sys.exit(1)
child.kill(signal.SIGCONT)
- child.send("quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -404,10 +460,11 @@ def test_bc1(exe, args, env):
check_line(child, "1")
write_str(child, "1")
check_line(child, "1")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -438,8 +495,9 @@ def test_bc2(exe, args, env):
time.sleep(1)
child.sendintr()
child.sendline("quit")
- child.wait()
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -463,22 +521,23 @@ def test_bc3(exe, args, env):
try:
bc_banner(child)
- child.send("\x1b[D\x1b[D\x1b[C\x1b[C")
- child.send("\n")
- child.expect(prompt)
- child.send("12\x1b[D3\x1b[C4\x1bOD5\x1bOC6")
- child.send("\n")
+ send(child, "\x1b[D\x1b[D\x1b[C\x1b[C")
+ send(child, "\n")
+ expect(child, prompt)
+ send(child, "12\x1b[D3\x1b[C4\x1bOD5\x1bOC6")
+ send(child, "\n")
check_line(child, "132546")
- child.send("12\x023\x064")
- child.send("\n")
+ send(child, "12\x023\x064")
+ send(child, "\n")
check_line(child, "1324")
- child.send("12\x1b[H3\x1bOH\x01\x1b[H45\x1bOF6\x05\x1b[F7\x1bOH8")
- child.send("\n")
+ send(child, "12\x1b[H3\x1bOH\x01\x1b[H45\x1bOF6\x05\x1b[F7\x1bOH8")
+ send(child, "\n")
check_line(child, "84531267")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -502,25 +561,26 @@ def test_bc4(exe, args, env):
try:
bc_banner(child)
- child.send("\x1b[A\x1bOA\x1b[B\x1bOB")
- child.send("\n")
- child.expect(prompt)
+ send(child, "\x1b[A\x1bOA\x1b[B\x1bOB")
+ send(child, "\n")
+ expect(child, prompt)
write_str(child, "15")
check_line(child, "15")
write_str(child, "2^16")
check_line(child, "65536")
- child.send("\x1b[A\x1bOA")
- child.send("\n")
+ send(child, "\x1b[A\x1bOA")
+ send(child, "\n")
check_line(child, "15")
- child.send("\x1b[A\x1bOA\x1b[A\x1b[B")
+ send(child, "\x1b[A\x1bOA\x1b[A\x1b[B")
check_line(child, "65536")
- child.send("\x1b[A\x1bOA\x0e\x1b[A\x1b[A\x1b[A\x1b[B\x10\x1b[B\x1b[B\x1bOB\x1b[B\x1bOA")
- child.send("\n")
+ send(child, "\x1b[A\x1bOA\x0e\x1b[A\x1b[A\x1b[A\x1b[B\x10\x1b[B\x1b[B\x1bOB\x1b[B\x1bOA")
+ send(child, "\n")
check_line(child, "65536")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -544,11 +604,12 @@ def test_bc5(exe, args, env):
try:
bc_banner(child)
- child.send("\x0c")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "\x0c")
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -572,15 +633,16 @@ def test_bc6(exe, args, env):
try:
bc_banner(child)
- child.send("print \"Enter number: \"")
- child.send("\n")
- child.expect("Enter number: ")
- child.send("4\x1b[A\x1b[A")
- child.send("\n")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "print \"Enter number: \"")
+ send(child, "\n")
+ expect(child, "Enter number: ")
+ send(child, "4\x1b[A\x1b[A")
+ send(child, "\n")
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -604,34 +666,35 @@ def test_bc7(exe, args, env):
try:
bc_banner(child)
- child.send("\x1bb\x1bb\x1bf\x1bf")
- child.send("\n")
- child.expect(prompt)
- child.send("\x1b[0~\x1b[3a")
- child.send("\n")
- child.expect(prompt)
- child.send("\x1b[0;4\x1b[0A")
- child.send("\n")
- child.expect(prompt)
- child.send(" ")
- child.send("\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb")
- child.send("\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf")
- child.send("\n")
- child.expect(prompt)
+ send(child, "\x1bb\x1bb\x1bf\x1bf")
+ send(child, "\n")
+ expect(child, prompt)
+ send(child, "\x1b[0~\x1b[3a")
+ send(child, "\n")
+ expect(child, prompt)
+ send(child, "\x1b[0;4\x1b[0A")
+ send(child, "\n")
+ expect(child, prompt)
+ send(child, " ")
+ send(child, "\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb")
+ send(child, "\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf")
+ send(child, "\n")
+ expect(child, prompt)
write_str(child, "12 + 34 + 56 + 78 + 90")
check_line(child, "270")
- child.send("\x1b[A")
- child.send("\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb")
- child.send("\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf")
+ send(child, "\x1b[A")
+ send(child, "\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb\x1bb")
+ send(child, "\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf\x1bf")
check_line(child, "270")
- child.send("\x1b[A")
- child.send("\x1bh\x1bh\x1bf + 14 ")
- child.send("\n")
+ send(child, "\x1b[A")
+ send(child, "\x1bh\x1bh\x1bf + 14 ")
+ send(child, "\n")
check_line(child, "284")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -655,13 +718,14 @@ def test_bc8(exe, args, env):
try:
bc_banner(child)
- child.send("12\x1b[D3\x1b[C4\x08\x7f")
- child.send("\n")
+ send(child, "12\x1b[D3\x1b[C4\x08\x7f")
+ send(child, "\n")
check_line(child, "13")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -685,26 +749,27 @@ def test_bc9(exe, args, env):
try:
bc_banner(child)
- child.send("\x1b[0;5D\x1b[0;5D\x1b[0;5D\x1b[0;5C\x1b[0;5D\x1bd\x1b[3~\x1b[d\x1b[d\x1b[d\x1b[d\x7f\x7f\x7f")
- child.send("\n")
- child.expect(prompt)
+ send(child, "\x1b[0;5D\x1b[0;5D\x1b[0;5D\x1b[0;5C\x1b[0;5D\x1bd\x1b[3~\x1b[d\x1b[d\x1b[d\x1b[d\x7f\x7f\x7f")
+ send(child, "\n")
+ expect(child, prompt)
write_str(child, "12 + 34 + 56 + 78 + 90")
check_line(child, "270")
- child.send("\x1b[A")
- child.send("\x1b[0;5D\x1b[0;5D\x1b[0;5D\x1b[0;5C\x1b[0;5D\x1bd\x1b[3~\x1b[d\x1b[d\x1b[d\x1b[d\x7f\x7f\x7f")
- child.send("\n")
+ send(child, "\x1b[A")
+ send(child, "\x1b[0;5D\x1b[0;5D\x1b[0;5D\x1b[0;5C\x1b[0;5D\x1bd\x1b[3~\x1b[d\x1b[d\x1b[d\x1b[d\x7f\x7f\x7f")
+ send(child, "\n")
check_line(child, "102")
- child.send("\x1b[A")
- child.send("\x17\x17")
- child.send("\n")
+ send(child, "\x1b[A")
+ send(child, "\x17\x17")
+ send(child, "\n")
check_line(child, "46")
- child.send("\x17\x17")
- child.send("\n")
- child.expect(prompt)
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "\x17\x17")
+ send(child, "\n")
+ expect(child, prompt)
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -728,26 +793,27 @@ def test_bc10(exe, args, env):
try:
bc_banner(child)
- child.send("\x1b[3~\x1b[3~")
- child.send("\n")
- child.expect(prompt)
- child.send(" \x1b[3~\x1b[3~")
- child.send("\n")
- child.expect(prompt)
+ send(child, "\x1b[3~\x1b[3~")
+ send(child, "\n")
+ expect(child, prompt)
+ send(child, " \x1b[3~\x1b[3~")
+ send(child, "\n")
+ expect(child, prompt)
write_str(child, "12 + 34 + 56 + 78 + 90")
check_line(child, "270")
- child.send("\x1b[A\x1b[A\x1b[A\x1b[B\x1b[B\x1b[B\x1b[A")
- child.send("\n")
+ send(child, "\x1b[A\x1b[A\x1b[A\x1b[B\x1b[B\x1b[B\x1b[A")
+ send(child, "\n")
check_line(child, "270")
- child.send("\x1b[A\x1b[0;5D\x1b[0;5D\x0b")
- child.send("\n")
+ send(child, "\x1b[A\x1b[0;5D\x1b[0;5D\x0b")
+ send(child, "\n")
check_line(child, "180")
- child.send("\x1b[A\x1521")
+ send(child, "\x1b[A\x1521")
check_line(child, "21")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -771,17 +837,18 @@ def test_bc11(exe, args, env):
try:
bc_banner(child)
- child.send("\x1b[A\x02\x14")
- child.send("\n")
- child.expect(prompt)
+ send(child, "\x1b[A\x02\x14")
+ send(child, "\n")
+ expect(child, prompt)
write_str(child, "12 + 34 + 56 + 78")
check_line(child, "180")
- child.send("\x1b[A\x02\x14")
+ send(child, "\x1b[A\x02\x14")
check_line(child, "189")
- write_str(child, "quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -805,18 +872,19 @@ def test_bc12(exe, args, env):
try:
bc_banner(child)
- child.send("12 +")
- child.send("\n")
+ send(child, "12 +")
+ send(child, "\n")
time.sleep(1)
if not child.isalive():
print("child exited early")
print(str(child))
print(str(child.buffer))
sys.exit(1)
- child.send("quit")
- child.send("\n")
- child.wait()
+ send(child, "quit")
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -864,9 +932,10 @@ def test_dc1(exe, args, env):
write_str(child, "1pR")
check_line(child, "1")
write_str(child, "q")
- child.send("\n")
- child.wait()
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -896,8 +965,9 @@ def test_dc2(exe, args, env):
time.sleep(1)
child.sendintr()
child.sendline("q")
- child.wait()
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -925,9 +995,10 @@ def test_dc3(exe, args, env):
write_str(child, "1pR")
check_line(child, "1")
write_str(child, "q")
- child.send("\n")
- child.wait()
+ send(child, "\n")
+ wait(child)
except pexpect.TIMEOUT:
+ traceback.print_tb(sys.exc_info()[2])
print("timed out")
print(str(child))
sys.exit(2)
@@ -988,7 +1059,7 @@ def usage():
print(" The valid values for dir are: 'bc' and 'dc'.")
print(" The max test_idx for bc is {}.".format(len(bc_tests) - 1))
print(" The max test_idx for dc is {}.".format(len(dc_tests) - 1))
- print(" If -a is given, the number of test for dir is printed.")
+ print(" If -a is given, the number of tests for dir is printed.")
print(" No tests are run.")
sys.exit(1)
@@ -1038,7 +1109,7 @@ exebase = os.path.basename(exe)
# Use the correct options.
if exebase == "bc":
halt = "halt\n"
- options = "-lq"
+ options = "-l"
test_array = bc_tests
else:
halt = "q\n"
@@ -1076,7 +1147,7 @@ child.close()
exit = child.exitstatus
-if exit != 0:
+if exit is not None and exit != 0:
print("child failed; expected exit code 0, got {}".format(exit))
print(str(child))
sys.exit(1)
diff --git a/tests/history.sh b/tests/history.sh
index bf25b2ffea92..92db985a4f86 100755
--- a/tests/history.sh
+++ b/tests/history.sh
@@ -33,7 +33,7 @@ testdir=$(dirname "$script")
. "$testdir/../scripts/functions.sh"
-# usage: history.sh dir -a|idx
+# usage: history.sh dir -a|idx [exe args...]
# If Python does not exist, then just skip.
py=$(command -v python3)
@@ -60,6 +60,24 @@ shift
idx="$1"
shift
+if [ "$#" -gt 0 ]; then
+
+ # exe is the executable to run.
+ exe="$1"
+ shift
+
+else
+ exe="$testdir/../bin/$d"
+fi
+
+if [ "$d" = "bc" ]; then
+ flip="! %s"
+ addone="%s + 1"
+else
+ flip="%s Np"
+ addone="%s 1+p"
+fi
+
# Set the test range correctly for all tests or one test. st is the start index.
if [ "$idx" = "-a" ]; then
idx=$("$py" "$testdir/history.py" "$d" -a)
@@ -72,12 +90,12 @@ fi
# Run all of the tests.
for i in $(seq "$st" "$idx"); do
- for j in $(seq 1 3); do
+ printf 'Running %s history test %d...' "$d" "$i"
- printf 'Running %s history test %d...' "$d" "$i"
+ for j in $(seq 1 3); do
- "$py" "$testdir/history.py" "$d" "$i" "$@"
- err=$?
+ "$py" "$testdir/history.py" "$d" "$i" "$exe" "$@"
+ err="$?"
if [ "$err" -eq 0 ]; then
break
@@ -85,7 +103,7 @@ for i in $(seq "$st" "$idx"); do
done
- checktest_retcode "$d" "$err" "$d history tests $i"
+ checktest_retcode "$d" "$err" "$d history test $i"
printf 'pass\n'
diff --git a/tests/other.sh b/tests/other.sh
index 4a26582457e3..bd0014641846 100755
--- a/tests/other.sh
+++ b/tests/other.sh
@@ -64,6 +64,7 @@ fi
# For tests later.
num=100000000000000000000000000000000000000000000000000000000000000000000000000000
+num2="$num"
numres="$num"
num70="10000000000000000000000000000000000000000000000000000000000000000000\\
0000000000"
@@ -74,12 +75,14 @@ if [ "$d" = "bc" ]; then
opt="x"
lopt="extended-register"
line_var="BC_LINE_LENGTH"
+ lltest="line_length()"
else
halt="q"
opt="l"
lopt="mathlib"
line_var="DC_LINE_LENGTH"
num="$num pR"
+ lltest="glpR"
fi
# I use these, so unset them to make the tests work.
@@ -234,17 +237,32 @@ printf '%s\n' "$numres" > "$out1"
export "$line_var"=80
printf '%s\n' "$num" | "$exe" "$@" > "$out2"
-checktest "$d" "$?" "environment var" "$out1" "$out2"
+checktest "$d" "$?" "line length" "$out1" "$out2"
printf '%s\n' "$num70" > "$out1"
export "$line_var"=2147483647
printf '%s\n' "$num" | "$exe" "$@" > "$out2"
-checktest "$d" "$?" "environment var" "$out1" "$out2"
+checktest "$d" "$?" "line length 2" "$out1" "$out2"
+
+printf '%s\n' "$num2" > "$out1"
+
+export "$line_var"=62
+printf '%s\n' "$num" | "$exe" "$@" -L > "$out2"
+
+checktest "$d" "$?" "line length 3" "$out1" "$out2"
+
+printf '0\n' > "$out1"
+printf '%s\n' "$lltest" | "$exe" "$@" -L > "$out2"
+
+checktest "$d" "$?" "line length 3" "$out1" "$out2"
printf 'pass\n'
+printf '%s\n' "$numres" > "$out1"
+export "$line_var"=2147483647
+
printf 'Running %s arg tests...' "$d"
f="$testdir/$d/add.txt"
@@ -276,6 +294,26 @@ checktest_retcode "$d" "$?" "arg"
printf '%s\n' "$halt" | "$exe" "$@" -V > /dev/null
checktest_retcode "$d" "$?" "arg"
+out=$(printf '0.1\n-0.1\n1.1\n-1.1\n0.1\n-0.1\n')
+printf '%s\n' "$out" > "$out1"
+
+if [ "$d" = "bc" ]; then
+ data=$(printf '0.1\n-0.1\n1.1\n-1.1\n.1\n-.1\n')
+else
+ data=$(printf '0.1pR\n_0.1pR\n1.1pR\n_1.1pR\n.1pR\n_.1pR\n')
+fi
+
+printf '%s\n' "$data" | "$exe" "$@" -z > "$out2"
+checktest "$d" "$?" "leading zero" "$out1" "$out2"
+
+if [ "$d" = "bc" ] && [ "$extra_math" -ne 0 ]; then
+
+ printf '%s\n' "$halt" | "$exe" "$@" -lz "$testdir/bc/leadingzero.txt" > "$out2"
+
+ checktest "$d" "$?" "leading zero script" "$testdir/bc/leadingzero_results.txt" "$out2"
+
+fi
+
"$exe" "$@" -f "saotehasotnehasthistohntnsahxstnhalcrgxgrlpyasxtsaosysxsatnhoy.txt" > /dev/null 2> "$out2"
err="$?"
diff --git a/tests/scripts.sh b/tests/scripts.sh
index 30fb42f1e873..46aa7e761170 100755
--- a/tests/scripts.sh
+++ b/tests/scripts.sh
@@ -27,15 +27,27 @@
# POSSIBILITY OF SUCH DAMAGE.
#
-set -e
-
script="$0"
testdir=$(dirname "${script}")
+pids=""
+
+# We need to figure out if we should run stuff in parallel.
+pll=1
+
+while getopts "n" opt; do
+
+ case "$opt" in
+ n) pll=0 ; shift ; set -e ;;
+ ?) usage "Invalid option: $opt" ;;
+ esac
+
+done
+
# Command-line processing.
if [ "$#" -eq 0 ]; then
- printf 'usage: %s dir [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script"
+ printf 'usage: %s [-n] dir [run_extra_tests] [run_stack_tests] [generate_tests] [time_tests] [exec args...]\n' "$script"
exit 1
else
d="$1"
@@ -85,7 +97,36 @@ scripts=$(cat "$scriptdir/all.txt")
for s in $scripts; do
f=$(basename "$s")
- sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \
- "$generate" "$time_tests" "$exe" "$@"
+
+ if [ "$pll" -ne 0 ]; then
+ sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \
+ "$generate" "$time_tests" "$exe" "$@" &
+ pids="$pids $!"
+ else
+ sh "$testdir/script.sh" "$d" "$f" "$run_extra_tests" "$run_stack_tests" \
+ "$generate" "$time_tests" "$exe" "$@"
+ fi
done
+
+if [ "$pll" -ne 0 ]; then
+
+ exit_err=0
+
+ for p in $pids; do
+
+ wait "$p"
+ err="$?"
+
+ if [ "$err" -ne 0 ]; then
+ printf 'A script failed!\n'
+ exit_err=1
+ fi
+
+ done
+
+ if [ "$exit_err" -ne 0 ]; then
+ exit 1
+ fi
+
+fi
diff --git a/bc.sln b/vs/bc.sln
index 584b28d13bf6..daf1a4a12bd8 100644
--- a/bc.sln
+++ b/vs/bc.sln
@@ -1,9 +1,9 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
-VisualStudioVersion = 16.0.31129.286
+VisualStudioVersion = 16.0.31515.178
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bc", "bc.vcxproj", "{D5086CFE-052C-4742-B005-E05DB983BBA2}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bc", "bc.vcxproj", "{4450D61F-2535-4085-B1B1-F96ACD23CC9F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -13,19 +13,19 @@ Global
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Debug|x64.ActiveCfg = Debug|x64
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Debug|x64.Build.0 = Debug|x64
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Debug|x86.ActiveCfg = Debug|Win32
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Debug|x86.Build.0 = Debug|Win32
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Release|x64.ActiveCfg = Release|x64
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Release|x64.Build.0 = Release|x64
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Release|x86.ActiveCfg = Release|Win32
- {D5086CFE-052C-4742-B005-E05DB983BBA2}.Release|x86.Build.0 = Release|Win32
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Debug|x64.ActiveCfg = Debug|x64
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Debug|x64.Build.0 = Debug|x64
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Debug|x86.ActiveCfg = Debug|Win32
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Debug|x86.Build.0 = Debug|Win32
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Release|x64.ActiveCfg = Release|x64
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Release|x64.Build.0 = Release|x64
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Release|x86.ActiveCfg = Release|Win32
+ {4450D61F-2535-4085-B1B1-F96ACD23CC9F}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {7869B1FB-A7C4-4FCF-8B99-F696DB2765EC}
+ SolutionGuid = {99364EF5-C65F-4658-A3FA-19EAC64BE8B9}
EndGlobalSection
EndGlobal
diff --git a/vs/bc.vcxproj b/vs/bc.vcxproj
new file mode 100644
index 000000000000..19b53d66a405
--- /dev/null
+++ b/vs/bc.vcxproj
@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <VCProjectVersion>16.0</VCProjectVersion>
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{4450d61f-2535-4085-b1b1-f96acd23cc9f}</ProjectGuid>
+ <RootNamespace>bc</RootNamespace>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="Shared">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets>
+ <GenerateManifest>false</GenerateManifest>
+ <OutDir>bin\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>bin\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets>
+ <GenerateManifest>false</GenerateManifest>
+ <OutDir>bin\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>bin\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets>
+ <GenerateManifest>false</GenerateManifest>
+ <OutDir>bin\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>bin\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets>
+ <GenerateManifest>false</GenerateManifest>
+ <OutDir>bin\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>bin\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BUILD_TYPE=HN;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <PostBuildEvent>
+ <Command>copy /b /y $(OutDir)bc.exe $(OutDir)dc.exe</Command>
+ </PostBuildEvent>
+ <PreBuildEvent />
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BUILD_TYPE=HN;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <AdditionalDependencies>bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <PostBuildEvent>
+ <Command>copy /b /y $(OutDir)bc.exe $(OutDir)dc.exe</Command>
+ </PostBuildEvent>
+ <PreBuildEvent />
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BUILD_TYPE=HN;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <AdditionalDependencies>bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <PostBuildEvent>
+ <Command>copy /b /y $(OutDir)bc.exe $(OutDir)dc.exe</Command>
+ </PostBuildEvent>
+ <PreBuildEvent />
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=0;BUILD_TYPE=HN;BC_DEFAULT_BANNER=1;BC_DEFAULT_SIGINT_RESET=0;DC_DEFAULT_SIGINT_RESET=0;BC_DEFAULT_TTY_MODE=1;DC_DEFAULT_TTY_MODE=1;BC_DEFAULT_PROMPT=1;DC_DEFAULT_PROMPT=1;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <ConformanceMode>true</ConformanceMode>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>false</GenerateDebugInformation>
+ <AdditionalDependencies>bcrypt.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ <PostBuildEvent>
+ <Command>copy /b /y $(OutDir)bc.exe $(OutDir)dc.exe</Command>
+ </PostBuildEvent>
+ <PreBuildEvent />
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClInclude Include="..\include\args.h" />
+ <ClInclude Include="..\include\bc.h" />
+ <ClInclude Include="..\include\bcl.h" />
+ <ClInclude Include="..\include\dc.h" />
+ <ClInclude Include="..\include\file.h" />
+ <ClInclude Include="..\include\history.h" />
+ <ClInclude Include="..\include\lang.h" />
+ <ClInclude Include="..\include\lex.h" />
+ <ClInclude Include="..\include\library.h" />
+ <ClInclude Include="..\include\num.h" />
+ <ClInclude Include="..\include\opt.h" />
+ <ClInclude Include="..\include\parse.h" />
+ <ClInclude Include="..\include\program.h" />
+ <ClInclude Include="..\include\rand.h" />
+ <ClInclude Include="..\include\read.h" />
+ <ClInclude Include="..\include\status.h" />
+ <ClInclude Include="..\include\vector.h" />
+ <ClInclude Include="..\include\version.h" />
+ <ClInclude Include="..\include\vm.h" />
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\gen\strgen.c">
+ <FileType>CppCode</FileType>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">cl.exe /Fo:$(OutDir)strgen.obj /Fe:$(OutDir)strgen.exe %(Identity)</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)strgen.exe</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">cl.exe /Fo:$(OutDir)strgen.obj /Fe:$(OutDir)strgen.exe %(Identity)</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)strgen.exe</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cl.exe /Fo:$(OutDir)strgen.obj /Fe:$(OutDir)strgen.exe %(Identity)</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)strgen.exe</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">cl.exe /Fo:$(OutDir)strgen.obj /Fe:$(OutDir)strgen.exe %(Identity)</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)strgen.exe</Outputs>
+ </CustomBuild>
+ <ClCompile Include="src2\bc_help.c" />
+ <ClCompile Include="src2\dc_help.c" />
+ <ClCompile Include="src2\lib.c" />
+ <ClCompile Include="src2\lib2.c" />
+ <ClCompile Include="..\src\args.c" />
+ <ClCompile Include="..\src\bc.c" />
+ <ClCompile Include="..\src\bc_lex.c" />
+ <ClCompile Include="..\src\bc_parse.c" />
+ <ClCompile Include="..\src\data.c" />
+ <ClCompile Include="..\src\dc.c" />
+ <ClCompile Include="..\src\dc_lex.c" />
+ <ClCompile Include="..\src\dc_parse.c" />
+ <ClCompile Include="..\src\file.c" />
+ <ClCompile Include="..\src\lang.c" />
+ <ClCompile Include="..\src\lex.c" />
+ <ClCompile Include="..\src\library.c" />
+ <ClCompile Include="..\src\main.c" />
+ <ClCompile Include="..\src\num.c" />
+ <ClCompile Include="..\src\opt.c" />
+ <ClCompile Include="..\src\parse.c" />
+ <ClCompile Include="..\src\program.c" />
+ <ClCompile Include="..\src\rand.c" />
+ <ClCompile Include="..\src\read.c" />
+ <ClCompile Include="..\src\vector.c" />
+ <ClCompile Include="..\src\vm.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\gen\lib.bc">
+ <FileType>Document</FileType>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)strgen.exe %(Identity) src2\lib.c bc_lib bc_lib_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">src2\lib.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)strgen.exe %(Identity) src2\lib.c bc_lib bc_lib_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">src2\lib.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)strgen.exe %(Identity) src2\lib.c bc_lib bc_lib_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">src2\lib.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)strgen.exe %(Identity) src2\lib.c bc_lib bc_lib_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">src2\lib.c</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\gen\lib2.bc">
+ <FileType>Document</FileType>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)strgen.exe %(Identity) src2\lib2.c bc_lib2 bc_lib2_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">src2\lib2.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)strgen.exe %(Identity) src2\lib2.c bc_lib2 bc_lib2_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">src2\lib2.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)strgen.exe %(Identity) src2\lib2.c bc_lib2 bc_lib2_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">src2\lib2.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)strgen.exe %(Identity) src2\lib2.c bc_lib2 bc_lib2_name BC_ENABLED 1</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">src2\lib2.c</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\gen\dc_help.txt">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)strgen.exe %(Identity) src2\dc_help.c dc_help "" DC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">src2\dc_help.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)strgen.exe %(Identity) src2\dc_help.c dc_help "" DC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">src2\dc_help.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)strgen.exe %(Identity) src2\dc_help.c dc_help "" DC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">src2\dc_help.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)strgen.exe %(Identity) src2\dc_help.c dc_help "" DC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">src2\dc_help.c</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\gen\bc_help.txt">
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)strgen.exe %(Identity) src2\bc_help.c bc_help "" BC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">src2\bc_help.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)strgen.exe %(Identity) src2\bc_help.c bc_help "" BC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">src2\bc_help.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)strgen.exe %(Identity) src2\bc_help.c bc_help "" BC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">src2\bc_help.c</Outputs>
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)strgen.exe %(Identity) src2\bc_help.c bc_help "" BC_ENABLED</Command>
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">src2\bc_help.c</Outputs>
+ </CustomBuild>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/vs/bc.vcxproj.filters b/vs/bc.vcxproj.filters
new file mode 100644
index 000000000000..f26387253f27
--- /dev/null
+++ b/vs/bc.vcxproj.filters
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="src">
+ <UniqueIdentifier>{ef855c5b-fc2c-4736-bb38-346aae9184f7}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="include">
+ <UniqueIdentifier>{df4ea0e1-2549-4c13-bf11-79ba8ba4cad9}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="gen">
+ <UniqueIdentifier>{1bbcb2e0-c1a0-417e-88bf-8eda8a53714e}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src2">
+ <UniqueIdentifier>{c384b486-4ea2-473a-8b04-86f2f5f7bb69}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\include\args.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\bc.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\bcl.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\dc.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\file.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\history.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\lang.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\lex.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\library.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\num.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\opt.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\parse.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\program.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\rand.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\read.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\status.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\vector.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\version.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\vm.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\src\args.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\bc.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\bc_lex.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\bc_parse.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\data.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\dc.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\dc_lex.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\dc_parse.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\file.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\history.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\lang.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\lex.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\library.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\main.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\num.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\opt.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\parse.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\program.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\rand.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\read.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\vector.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\vm.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="src2\bc_help.c">
+ <Filter>src2</Filter>
+ </ClCompile>
+ <ClCompile Include="src2\dc_help.c">
+ <Filter>src2</Filter>
+ </ClCompile>
+ <ClCompile Include="src2\lib.c">
+ <Filter>src2</Filter>
+ </ClCompile>
+ <ClCompile Include="src2\lib2.c">
+ <Filter>src2</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <CustomBuild Include="..\gen\lib.bc">
+ <Filter>gen</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\gen\lib2.bc">
+ <Filter>gen</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\gen\dc_help.txt">
+ <Filter>gen</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\gen\bc_help.txt">
+ <Filter>gen</Filter>
+ </CustomBuild>
+ <CustomBuild Include="..\gen\strgen.c">
+ <Filter>gen</Filter>
+ </CustomBuild>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/vs/bcl.sln b/vs/bcl.sln
new file mode 100644
index 000000000000..bc6d37a72360
--- /dev/null
+++ b/vs/bcl.sln
@@ -0,0 +1,37 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31515.178
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bcl", "bcl.vcxproj", "{76B451C9-72BF-45B2-B78D-B3515410F99F}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ ReleaseMD|x64 = ReleaseMD|x64
+ ReleaseMD|x86 = ReleaseMD|x86
+ ReleaseMT|x64 = ReleaseMT|x64
+ ReleaseMT|x86 = ReleaseMT|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.Debug|x64.ActiveCfg = Debug|x64
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.Debug|x64.Build.0 = Debug|x64
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.Debug|x86.ActiveCfg = Debug|Win32
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.Debug|x86.Build.0 = Debug|Win32
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMD|x64.ActiveCfg = ReleaseMD|x64
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMD|x64.Build.0 = ReleaseMD|x64
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMD|x86.ActiveCfg = ReleaseMD|Win32
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMD|x86.Build.0 = ReleaseMD|Win32
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMT|x64.ActiveCfg = ReleaseMT|x64
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMT|x64.Build.0 = ReleaseMT|x64
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMT|x86.ActiveCfg = ReleaseMT|Win32
+ {76B451C9-72BF-45B2-B78D-B3515410F99F}.ReleaseMT|x86.Build.0 = ReleaseMT|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {C943D6A7-81EA-47C8-90D6-7DB528C262E7}
+ EndGlobalSection
+EndGlobal
diff --git a/vs/bcl.vcxproj b/vs/bcl.vcxproj
new file mode 100644
index 000000000000..a8de10e9f10b
--- /dev/null
+++ b/vs/bcl.vcxproj
@@ -0,0 +1,259 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseMD|Win32">
+ <Configuration>ReleaseMD</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseMD|x64">
+ <Configuration>ReleaseMD</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseMT|Win32">
+ <Configuration>ReleaseMT</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseMT|x64">
+ <Configuration>ReleaseMT</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <VCProjectVersion>16.0</VCProjectVersion>
+ <Keyword>Win32Proj</Keyword>
+ <ProjectGuid>{76b451c9-72bf-45b2-b78d-b3515410f99f}</ProjectGuid>
+ <RootNamespace>bcl</RootNamespace>
+ <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <PlatformToolset>v142</PlatformToolset>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="Shared">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|x64'">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <LinkIncremental>true</LinkIncremental>
+ <OutDir>lib\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>lib\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>lib\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>lib\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|Win32'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>lib\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>lib\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <LinkIncremental>true</LinkIncremental>
+ <OutDir>lib\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>lib\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>lib\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>lib\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|x64'">
+ <LinkIncremental>false</LinkIncremental>
+ <OutDir>lib\$(Platform)\$(Configuration)\</OutDir>
+ <IntDir>lib\$(Platform)\$(Configuration)\</IntDir>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|Win32'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMD|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseMT|x64'">
+ <ClCompile>
+ <WarningLevel>Level3</WarningLevel>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <PreprocessorDefinitions>BC_ENABLED=1;DC_ENABLED=1;BC_ENABLE_EXTRA_MATH=1;BC_ENABLE_HISTORY=0;BC_ENABLE_NLS=0;BC_DEBUG_CODE=0;BC_ENABLE_LIBRARY=1;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ConformanceMode>true</ConformanceMode>
+ <AdditionalIncludeDirectories>..\include</AdditionalIncludeDirectories>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\src\data.c" />
+ <ClCompile Include="..\src\library.c" />
+ <ClCompile Include="..\src\num.c" />
+ <ClCompile Include="..\src\rand.c" />
+ <ClCompile Include="..\src\vector.c" />
+ <ClCompile Include="..\src\vm.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\include\args.h" />
+ <ClInclude Include="..\include\bc.h" />
+ <ClInclude Include="..\include\bcl.h" />
+ <ClInclude Include="..\include\dc.h" />
+ <ClInclude Include="..\include\file.h" />
+ <ClInclude Include="..\include\history.h" />
+ <ClInclude Include="..\include\lang.h" />
+ <ClInclude Include="..\include\lex.h" />
+ <ClInclude Include="..\include\library.h" />
+ <ClInclude Include="..\include\num.h" />
+ <ClInclude Include="..\include\opt.h" />
+ <ClInclude Include="..\include\parse.h" />
+ <ClInclude Include="..\include\program.h" />
+ <ClInclude Include="..\include\rand.h" />
+ <ClInclude Include="..\include\read.h" />
+ <ClInclude Include="..\include\status.h" />
+ <ClInclude Include="..\include\vector.h" />
+ <ClInclude Include="..\include\version.h" />
+ <ClInclude Include="..\include\vm.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/vs/bcl.vcxproj.filters b/vs/bcl.vcxproj.filters
new file mode 100644
index 000000000000..b62d1899e2bf
--- /dev/null
+++ b/vs/bcl.vcxproj.filters
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="src">
+ <UniqueIdentifier>{4eccf85f-77c4-4ebd-b89c-3920075c5b2d}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="include">
+ <UniqueIdentifier>{48fc3219-18c1-42d7-b9f4-da5f65ab1ccc}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\src\data.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\library.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\num.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\rand.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\vector.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ <ClCompile Include="..\src\vm.c">
+ <Filter>src</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\include\args.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\bc.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\bcl.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\dc.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\file.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\history.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\lang.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\lex.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\library.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\num.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\opt.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\parse.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\program.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\rand.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\read.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\status.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\vector.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\version.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ <ClInclude Include="..\include\vm.h">
+ <Filter>include</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/vs/bin/some.txt b/vs/bin/some.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/vs/bin/some.txt
diff --git a/vs/tests/some.txt b/vs/tests/some.txt
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/vs/tests/some.txt
diff --git a/vs/tests/tests_bc.bat b/vs/tests/tests_bc.bat
new file mode 100644
index 000000000000..5fbd4e35fc3a
--- /dev/null
+++ b/vs/tests/tests_bc.bat
@@ -0,0 +1,104 @@
+@echo off
+
+set scripts=..\..\tests\bc
+set bc=%~dp0\bc.exe
+set args=-ql
+
+del /f /q *.txt > NUL
+
+
+rem excluded: all, errors, read_errors, posix_errors, misc6, misc7, recursive_arrays
+
+for %%i in (
+abs
+add
+arctangent
+arrays
+assignments
+bitfuncs
+boolean
+comp
+cosine
+decimal
+divide
+divmod
+engineering
+exponent
+functions
+globals
+length
+letters
+lib2
+log
+misc
+misc1
+misc2
+misc3
+misc4
+misc5
+modexp
+modulus
+multiply
+pi
+places
+power
+print2
+rand
+read
+scale
+scientific
+shift
+sine
+sqrt
+stdin
+stdin1
+stdin2
+strings
+subtract
+trunc
+vars
+void
+leadingzero
+) do (
+if exist "%scripts%\%%i.txt" (
+ "%bc%" "%args%" < "%scripts%\%%i.txt" > "%%i_results.txt"
+
+ if errorlevel 1 (
+ echo FAIL_RUNTIME: %%i
+ goto :eof
+ )
+
+ fc.exe "%scripts%\%%i_results.txt" "%%i_results.txt" > NUL
+
+ if errorlevel 1 (
+ echo FAIL_RESULTS: %%i
+ goto :eof
+ )
+
+ echo PASS: %%i
+) else (
+ echo FAIL_NOT_EXIST: %%i
+ goto :eof
+)
+)
+
+if exist "%scripts%\leadingzero.txt" (
+ "%bc%" "%args%" -z < "%scripts%\leadingzero.txt" > "leadingzero_z_results.txt"
+
+ if errorlevel 1 (
+ echo FAIL_RUNTIME: leadingzero_z
+ goto :eof
+ )
+
+ fc.exe "%scripts%\leadingzero_results.txt" "leadingzero_z_results.txt" > NUL
+
+ if errorlevel 1 (
+ echo FAIL_RESULTS: leadingzero_z
+ goto :eof
+ )
+
+ echo PASS: leadingzero_z
+) else (
+ echo FAIL_NOT_EXIST: leadingzero_z
+ goto :eof
+) \ No newline at end of file
diff --git a/vs/tests/tests_dc.bat b/vs/tests/tests_dc.bat
new file mode 100644
index 000000000000..36c97daa4e11
--- /dev/null
+++ b/vs/tests/tests_dc.bat
@@ -0,0 +1,61 @@
+@echo off
+
+set scripts=..\..\tests\dc
+set dc=%~dp0\dc.exe
+set args=-x
+
+del /f /q *.txt > NUL
+
+
+rem excluded: all, errors, read_errors
+
+for %%i in (
+abs
+add
+boolean
+decimal
+divide
+divmod
+engineering
+exec_stack_len
+length
+misc
+modexp
+modulus
+multiply
+negate
+places
+power
+rand
+read
+scientific
+shift
+sqrt
+stack_len
+stdin
+strings
+subtract
+trunc
+vars
+) do (
+if exist "%scripts%\%%i.txt" (
+ "%dc%" "%args%" < "%scripts%\%%i.txt" > "%%i_results.txt"
+
+ if errorlevel 1 (
+ echo FAIL_RUNTIME: %%i
+ goto :eof
+ )
+
+ fc.exe "%scripts%\%%i_results.txt" "%%i_results.txt" > NUL
+
+ if errorlevel 1 (
+ echo FAIL_RESULTS: %%i
+ goto :eof
+ )
+
+ echo PASS: %%i
+) else (
+ echo FAIL_NOT_EXIST: %%i
+ goto :eof
+)
+) \ No newline at end of file