summaryrefslogtreecommitdiff
path: root/manuals/bc.1.ronn
diff options
context:
space:
mode:
Diffstat (limited to 'manuals/bc.1.ronn')
-rw-r--r--manuals/bc.1.ronn1556
1 files changed, 0 insertions, 1556 deletions
diff --git a/manuals/bc.1.ronn b/manuals/bc.1.ronn
deleted file mode 100644
index 3f62333e73e7..000000000000
--- a/manuals/bc.1.ronn
+++ /dev/null
@@ -1,1556 +0,0 @@
-bc(1) -- arbitrary-precision arithmetic language and calculator
-===============================================================
-
-SYNOPSIS
---------
-
-`bc` [`-ghilPqsvVw`] [`--global-stacks`] [`--help`] [`--interactive`]
-[`--mathlib`] [`--no-prompt`] [`--quiet`] [`--standard`] [`--warn`]
-[`--version`] [`-e` *expr*] [`--expression=`*expr*...] [`-f` *file*...]
-[`-file=`*file*...] [*file*...]
-
-DESCRIPTION
------------
-
-bc(1) is an interactive processor for a language first standardized in 1991 by
-POSIX. (The current standard is [here][1].) The language provides unlimited
-precision decimal arithmetic and is somewhat C-like, but there are differences.
-Such differences will be noted in this document.
-
-After parsing and handling options, this bc(1) reads any files given on the
-command line and executes them before reading from `stdin`.
-
-With all build options, except for extra math, enabled this bc(1) is a drop-in
-replacement for ***any*** bc(1), including (and especially) the GNU bc(1). It is
-also a drop-in replacement for any bc(1) if extra math is enabled, but it will
-have extra features not found in other bc(1) implementations.
-
-OPTIONS
--------
-
-The following are the options that bc(1) accepts.
-
- * `-g`, `--global-stacks`:
- Turns the globals `ibase`, `obase`, and `scale` into stacks. This includes
- `seed` if bc(1) was built with the extra math option.
-
- This has the effect that a copy of the current value of all three are pushed
- onto a stack for every function call, as well as popped when every function
- returns. This means that functions can assign to any and all of those
- globals without worrying that the change will affect other functions.
- Thus, `output(x,b)` (in the [extended library](#extended-library)) could
- have been written like this:
-
- `define void output(x, b) { obase=b; x }`
-
- instead of like this:
-
- `define void output(x, b) { auto c; c=obase; obase=b; x; obase=c }`
-
- This makes writing functions much easier.
-
- However, since using this flag means that functions cannot set `ibase`,
- `obase`, or `scale` globally, functions that are made to do so cannot work
- anymore. There are two possible use cases for that, and each has a solution.
-
- First, if a function is called on startup to turn bc(1) into a number
- converter, it is possible to replace that capability with various shell
- aliases. Examples:
-
- `alias d2o="bc -e ibase=A -e obase=8"; alias h2b="bc -e ibase=G -e obase=2"`
-
- Second, if the purpose of a function is to set `ibase`, `obase`, or `scale`
- globally for any other purpose, it could be split into one to three
- functions (based on how many globals it sets) and each of those functions
- could return the desired value for a global.
-
- For functions that set `seed`, the value assigned to `seed` is not
- propagated to parent functions. This means that the sequence of
- pseudo-random numbers that they see will not be the same sequence of
- pseudo-random numbers that any parent sees. This is only the case once
- `seed` has been set.
-
- If a function desires to not affect the sequence of pseudo-random numbers
- of its parents, but wants to use the same `seed`, it can use the following
- line:
-
- `seed = seed`
-
- If the behavior of this option is desired for every run of bc(1), then users
- could make sure to define `BC_ENV_ARGS` and include this option (see the
- ENVIRONMENT VARIABLES section for more details).
-
- If `-s`, `-w`, or any equivalents are used, this option is ignored.
-
- This is a **non-portable extension**.
-
- * `-h`, `--help`:
- Prints a usage message and quits.
-
- * `-i`, `--interactive`:
- Forces interactive mode. (See the INTERACTIVE MODE section.)
-
- This is a **non-portable extension**.
-
- * `-l`, `--mathlib`:
- Sets `scale` (see the Scale section) to `20` and loads the included math
- library before running any code, including any expressions or files
- specified on the command line.
-
- To learn what is in the library, see the LIBRARY section.
-
- * `-P`, `--no-prompt`:
- Disables the prompt in interactive mode. This is mostly for those users that
- do not want a prompt or are not used to having them in `bc`. Most of those
- users would want to put this option in `BC_ENV_ARGS`.
-
- If the prompt has been disabled while building bc(1), this option is a
- no-op.
-
- This is a **non-portable extension**.
-
- * `-q`, `--quiet`:
- Do not print copyright header. bc(1) will also suppress the header in
- non-interactive mode.
-
- This is mostly for compatibility with the [GNU bc(1)][2].
-
- This is a **non-portable extension**.
-
- * `-s`, `--standard`:
- Process exactly the language defined by the [standard][1] and error if any
- extensions are used.
-
- This is a **non-portable extension**.
-
- * `-v`, `-V`, `--version`:
- Print the version information (copyright header) and exit.
-
- This is a **non-portable extension**.
-
- * `-w`, `--warn`:
- Like `-s` and `--standard`, except that warnings (and not errors) are given
- for non-standard extensions.
-
- This is a **non-portable extension**.
-
- * `-e` *expr*, `--expression`=*expr*:
- Evaluates `expr`. If multiple expressions are given, they are evaluated in
- order. If files are given as well (see below), the expressions and files are
- evaluated in the order given. This means that if a file is given before an
- expression, the file is read in and evaluated first.
-
- In other bc(1) implementations, this option causes the program to execute
- the expressions and then exit. This bc(1) does not, unless the
- `BC_EXPR_EXIT` is defined (see the ENVIRONMENT VARIABLES section).
-
- This is a **non-portable extension**.
-
- * `-f` *file*, `--file`=*file*:
- Reads in `file` and evaluates it. If expressions are also given (see above),
- the expressions are evaluated in the order given.
-
- In other bc(1) implementations, this option causes the program to execute
- the files and then exit. This bc(1) does not, unless the
- `BC_EXPR_EXIT` is defined (see the ENVIRONMENT VARIABLES section).
-
- This is a **non-portable extension**.
-
-**Note**: long options are only accepted if bc(1) is built with them enabled.
-
-STDOUT
-------
-
-Any non-error output is written to `stdout`.
-
-**Note**: Unlike other bc(1) implementations, this bc(1) will issue a fatal
-error (see the EXIT STATUS section) if it cannot write to `stdout`, so if
-`stdout` is closed, as in `bc <file> >&-`, it will quit with an error. This is
-done so that bc(1) can report problems when `stdout` is redirected to a file.
-
-If there are scripts that depend on the behavior of other bc(1) implementations,
-it is recommended that those scripts be changed to redirect `stdout` to
-`/dev/null`.
-
-STDERR
-------
-
-Any error output is written to `stderr`.
-
-**Note**: Unlike other bc(1) implementations, this bc(1) will issue a fatal
-error (see the EXIT STATUS section) if it cannot write to `stderr`, so if
-`stderr` is closed, as in `bc <file> 2>&-`, it will quit with an error. This is
-done so that bc(1) can report problems when `stderr` is redirected to a file.
-
-If there are scripts that depend on the behavior of other bc(1) implementations,
-it is recommended that those scripts be changed to redirect `stderr` to
-`/dev/null`.
-
-SYNTAX
-------
-
-The syntax for bc(1) programs is mostly C-like, with some differences. This
-bc(1) follows the [POSIX standard][1], which is a much more thorough resource
-for the language this bc(1) accepts. This section is meant to be a summary and a
-listing of all the extensions to the [standard][1].
-
-In the sections below, `E` means expression, `S` means statement, and `I` means
-identifier.
-
-Identifiers (`I`) start with a lowercase letter and can be followed by any
-number (up to `BC_NAME_MAX-1`) of lowercase letters (`a-z`), digits (`0-9`), and
-underscores (`_`). The regex is `[a-z][a-z0-9_]*` Identifiers with more than one
-character (letter) are a **non-portable extension**.
-
-`ibase` is a global variable determining how to interpret constant numbers. It
-is the "input" base, or the number base used for interpreting input numbers.
-`ibase` is initially `10`. If the `-s` (`--standard`) and `-w` (`--warn`) flags
-were not given on the command line, the max allowable value for `ibase` is `36`.
-Otherwise, it is `16`. The min allowable value for `ibase` is `2`. The max
-allowable value for `ibase` can be queried in bc(1) programs with the
-`maxibase()` built in function.
-
-`obase` is a global variable determining how to output results. It is the
-"output" base, or the number base used for outputting numbers. `obase` is
-initially `10`. The max allowable value for `obase` is `BC_BASE_MAX`. The min
-allowable value for `obase` is `2`, unless bc(1) was built with the extra math
-option. If it was, then the min allowable value is `0`. In this case, if `obase`
-is `0`, values are output in scientific notation, and if `obase` is `1`, values
-are output in engineering notation. (Outputting in scientific or engineering
-notation are **non-portable extensions**.) The max allowable value for `obase`
-can be queried in bc(1) programs with the `maxobase()` built in function.
-
-The **scale** of an expression is the number of digits in the result of the
-expression right of the decimal point, and `scale` is a global variable that
-sets the precision of any operations, with exceptions. `scale` is initially `0`.
-`scale` cannot be negative. The max allowable value for `scale` can be queried
-in bc(1) programs with the `maxscale()` built in function.
-
-bc(1) has both **global** variables and **local** variables. All **local**
-variables are local to the function; they are parameters or are introduced in
-the `auto` list of a function (see FUNCTIONS). If a variable is accessed which
-is not a parameter or in the `auto` list, it is assumed to be **global**. If a
-parent function has a **local** variable version of a **global** variable that
-is accessed by a function that it calls, the value of that **global** variable
-in the child function is the value of the variable in the parent function, not
-the value of the actual **global** variable.
-
-All of the above applies to arrays as well.
-
-The value of a statement that is an expression (i.e., any of the
-[Named Expressions](#bc-named-expressions) or [Operands](#bc-operands)) is
-printed unless the lowest precedence operator is an
-[`assignment`](#bc-assignment) operator ***and*** the expression is not
-surrounded by parentheses.
-
-The value that is printed is also assigned to the special variable `last`. A
-single dot (`.`) may also be used as a synonym for `last`. These are
-**non-portable extensions**.
-
-Either semicolons or newlines may separate statements.
-
-### Comments
-
-There are two kinds of comments:
-
-1. Block comments are enclosed in `/*` and `*/`.
-2. Line comments go from `#` until, and not including, the next newline. This
- is a **non-portable extension**.
-
-<a name="bc-named-expressions"/>
-
-### Named Expressions
-
-The following are named expressions in bc(1):
-
-1. Variables: `I`
-2. Array Elements: `I[E]`
-3. `ibase`
-4. `obase`
-5. `scale`
-6. `last` or a single dot (`.`)
-
-Number 6 is a **non-portable extension**.
-
-If bc(1) was built with the extra math option, the following is also a named
-expression:
-
-1. `seed`
-
-The meaning of `seed` is dependent on the current pseudo-random number generator
-but is guaranteed to not change except for new major versions.
-
-The **scale** of the value may be significant.
-
-If a previously used `seed` value is assigned to `seed` and used again, the
-pseudo-random number generator is guaranteed to produce the same sequence of
-pseudo-random numbers as it did when the `seed` value was previously used.
-
-The exact value assigned to `seed` is not guaranteed to be returned if `seed` is
-queried again immediately. However, if `seed` *does* return a different value,
-both values, when assigned to `seed`, are guaranteed to produce the same
-sequence of pseudo-random numbers. This means that certain values assigned to
-`seed` will not produce unique sequences of pseudo-random numbers. The value of
-`seed` will change after any use of the `rand()` and `irand(E)` operands, except
-if the parameter passed to `irand(E)` is `0` or `1`.
-
-There is no limit to the length (number of significant decimal digits) or
-*scale* of the value that can be assigned to `seed`.
-
-This command is only available if bc(1) was built with the extra math option.
-
-This is a **non-portable extension**.
-
-Variables and arrays do not interfere; users can have arrays named the same as
-variables. This also applies to functions (see the FUNCTIONS section), so a user
-can have a variable, array, and function that all have the same name, and they
-will not shadow each other.
-
-Named expressions are required as the operand of
-[`increment`/`decrement` operators](#bc-increment-decrement) and as the left
-side of [`assignment` operators](#bc-assignment).
-
-<a name="bc-operands"/>
-
-### Operands
-
-The following are valid operands in bc(1):
-
-1. Numbers (see [Numbers](#bc-numbers) below).
-2. Array indices (`I[E]`).
-3. `(E)`: The value of `E` (used to change precedence).
-4. `sqrt(E)`: The square root of `E`. `E` must be non-negative.
-5. `length(E)`: The number of significant decimal digits in `E`.
-6. `length(I[])`: The number of elements in the array `I`. This is a
- **non-portable extension**.
-7. `scale(E)`: The **scale** of `E`.
-8. `abs(E)`: The absolute value of `E`. This is a **non-portable extension**.
-9. `I()`, `I(E)`, `I(E, E)`, and so on, where `I` is an identifier for a
- non-[void function](#void-functions). The `E` parameters may also be arrays,
- which will automatically be turned into [array
- references](#array-references) if the corresponding parameter is an array
- reference.
-10. `read()`: Reads a line from `stdin` and uses that as an expression. The
- result of that expression is the result of the `read()` operand. This is a
- **non-portable extension**.
-11. `maxibase()`: The max allowable `ibase`. This is a **non-portable
- extension**.
-12. `maxobase()`: The max allowable `obase`. This is a **non-portable
- extension**.
-13. `maxscale()`: The max allowable `scale`. This is a **non-portable
- extension**.
-
-If bc(1) was built with the extra math option, the following are also valid
-operands:
-
-1. `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**.
-2. `irand(E)`: A pseudo-random integer between `0` (inclusive) and the
- value of `E` (exclusive). If `E` is negative or is a non-integer (**scale**
- is not `0`), an error is raised, and bc(1) resets (see the RESET section).
- If `E` is larger than `BC_RAND_MAX`, the higher bound is honored by
- generating several pseudo-random integers, multiplying them by appropriate
- powers of `BC_RAND_MAX + 1`, and adding them together. Thus, the size of
- integer that can be generated with this operand is unbounded. Using this
- operand will change the value of `seed`. If `E` is `0` or `1`, then `0` is
- returned, and `seed` is not changed. This is a **non-portable extension**.
-3. `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
-unbiased as possible, subject to the limitations of the pseudo-random number
-generator.
-
-**Note**: The values returned by the pseudo-random number generator with
-`rand()` and `irand(E)` are guaranteed to **NOT** be cryptographically-secure.
-This is a consequence of using a seeded pseudo-random number generator. However,
-they **are** guaranteed to be reproducible with identical `seed` values.
-
-<a name="bc-numbers"/>
-
-### Numbers
-
-Numbers are strings made up of digits, uppercase letters, and at most `1` period
-for a radix. Numbers can have up to `BC_NUM_MAX` digits. Uppercase letters
-equal `9` + their position in the alphabet (i.e., `A` equals `10`, or `9 + 1`).
-If a digit or letter makes no sense with the current value of `ibase`, they are
-set to the value of the highest valid digit in `ibase`.
-
-Single-character numbers (i.e., `A`) take the value that they would have if they
-were valid digits, regardless of the value of `ibase`. This means that `A`
-always equals decimal `10` and `Z` always equals decimal `35`.
-
-In addition, if bc(1) was built with the extra math option, it accepts numbers
-in scientific notation. For bc(1), an example is `1.89237e9`, which is equal to
-`1892370000`. Negative exponents are also allowed, so `4.2890e-3` is equal to
-`0.0042890`.
-
-Using scientific notation is an error or warning if the `-s` or `-w`,
-respectively, command-line options (or equivalents) are given.
-
-**WARNING**: Both the number and the exponent in scientific notation are
-interpreted according to the current `ibase`, but the number is still multiplied
-by `10^exponent` regardless of the current `ibase`. For example, if `ibase` is
-`16` and bc(1) is given the number string `"FFeA"`, the resulting decimal number
-will be `2550000000000`, and if bc(1) is given the number string `"10e-4"`, the
-resulting decimal number will be `0.0016`.
-
-Accepting input as scientific notation is a **non-portable extension**.
-
-### Operators
-
-The following arithmetic and logical operators can be used. They are listed in
-order of decreasing precedence. Operators in the same group have the same
-precedence.
-
- * `++` `--`:
- Type: Prefix and Postfix
-
- Associativity: None
-
- Description: `increment`, `decrement`
-
- * `-` `!`:
- Type: Prefix
-
- Associativity: None
-
- Description: `negation`, `boolean not`
-
- * `$`:
- Type: Postfix
-
- Associativity: None
-
- Description: `truncation`
-
- * `@`:
- Type: Binary
-
- Associativity: Right
-
- Description: `set precision`
-
- * `^`:
- Type: Binary
-
- Associativity: Right
-
- Description: `power`
-
- * `*` `/` `%`:
- Type: Binary
-
- Associativity: Left
-
- Description: `multiply`, `divide`, `modulus`
-
- * `+` `-`:
- Type: Binary
-
- Associativity: Left
-
- Description: `add`, `subtract`
-
- * `<<` `>>`:
- Type: Binary
-
- Associativity: Left
-
- Description: `shift left`, `shift right`
-
- * `=` `<<=` `>>=` `+=` `-=` `*=` `/=` `%=` `^=` `@=`:
- Type: Binary
-
- Associativity: Right
-
- Description: `assignment`
-
- * `==` `<=` `>=` `!=` `<` `>`:
- Type: Binary
-
- Associativity: Left
-
- Description: `relational`
-
- * `&&`:
- Type: Binary
-
- Associativity: Left
-
- Description: `boolean and`
-
- * `||`:
- Type: Binary
-
- Associativity: Left
-
- Description: `boolean or`
-
-The operators will be described in more detail below.
-
-<a name="bc-increment-decrement"/>
-
- * `++` `--`:
- The prefix and postfix `increment` and `decrement` operators behave exactly
- like they would in C. They require a [named expression](#named-expressions)
- as an operand.
-
- The prefix versions of these operators are more efficient; use them where
- possible.
-
- * `-`:
- The `negation` operator returns `0` if a user attempts to negate any
- expression with the value `0`. Otherwise, a copy of the expression with its
- sign flipped is returned.
-
- * `!`:
- The `boolean not` operator returns `1` if the expression is `0`, or `0`
- otherwise.
-
- This is a **non-portable extension**.
-
- * `$`:
- The `truncation` operator returns a copy of the given expression with all of
- its **scale** removed.
-
- This is a **non-portable extension**.
-
- This is only available if bc(1) has been compiled with the extra math option
- enabled.
-
- * `@`:
- The `set precision` operator takes two expressions and returns a copy of the
- first with its **scale** equal to the value of the second expression. That
- could either mean that the number is returned without change (if the
- **scale** of the first expression matches the value of the second
- expression), extended (if it is less), or truncated (if it is more).
-
- The second expression must be an integer (no **scale**) and non-negative.
-
- This is a **non-portable extension**.
-
- This is only available if bc(1) has been compiled with the extra math option
- enabled.
-
- * `^`:
- The `power` operator (not the `exclusive or` operator, as it would be in C)
- takes two expressions and raises the first to the power of the value of the
- second.
-
- The second expression must be an integer (no **scale**), and if it is
- negative, the first value must be non-zero.
-
- * `*`:
- The `multiply` operator takes two expressions, multiplies them, and returns
- the product. If `a` is the **scale** of the first expression and `b` is the
- **scale** of the second expression, the scale of the result is equal to
- `min(a+b,max(scale,a,b))` where `min` and `max` return the obvious values.
-
- * `/`:
- The `divide` operator takes two expressions, divides them, and returns the
- quotient. The scale of the result shall be the value of `scale`.
-
- The second expression must be non-zero.
-
- * `%`:
- The `modulus` operator takes two expressions, `a` and `b`, and evaluates
- them by 1) Computing `a/b` to current `scale` and 2) Using the result of
- step 1 to calculate `a-(a/b)*b` to scale `max(scale+scale(b),scale(a))`.
-
- The second expression must be non-zero.
-
- * `+`:
- The `add` operator takes two expressions, `a` and `b`, and returns the sum,
- with a **scale** equal to the max of the **scale**s of `a` and `b`.
-
- * `-`:
- The `subtract` operator takes two expressions, `a` and `b`, and returns the
- difference, with a **scale** equal to the max of the **scale**s of `a` and
- `b`.
-
- * `<<`:
- The `left shift` operator takes two expressions, `a` and `b`, and returns a
- copy of the value of `a` with its decimal point moved `b` places to the
- right.
-
- The second expression must be an integer (no **scale**) and non-negative.
-
- This is a **non-portable extension**.
-
- This is only available if bc(1) has been compiled with the extra math option
- enabled.
-
- * `>>`:
- The `right shift` operator takes two expressions, `a` and `b`, and returns a
- copy of the value of `a` with its decimal point moved `b` places to the
- left.
-
- The second expression must be an integer (no **scale**) and non-negative.
-
- This is a **non-portable extension**.
-
- This is only available if bc(1) has been compiled with the extra math option
- enabled.
-
-<a name="bc-assignment"/>
-
- * `=` `<<=` `>>=` `+=` `-=` `*=` `/=` `%=` `^=` `@=`:
- The `assignment` operators take two expressions, `a` and `b` where `a` is a
- [named expression](#bc-named-expressions).
-
- For `=`, `b` is copied and the result is assigned to `a`. For all others,
- `a` and `b` are applied as operands to the corresponding arithmetic
- operator and the result is assigned to `a`.
-
- The `assignment` operators that correspond to operators that are extensions
- are themselves extensions.
-
- Also, those `assignment` operators that are extensions are only available if
- bc(1) has been compiled with the extra math option enabled.
-
- * `==` `<=` `>=` `!=` `<` `>`:
- The `relational` operators compare two expressions, `a` and `b`, and if the
- relation holds, according to C language semantics, the result is `1`.
- Otherwise, it is `0`.
-
- Note that unlike in C, these operators have a lower precedence than the
- `assignment` operators, which means that `a=b>c` is interpreted as
- `(a=b)>c`.
-
- Also, unlike the [standard][1] requires, these operators can appear anywhere
- any other expressions can be used. This allowance is a
- **non-portable extension**.
-
- * `&&`:
- The `boolean and` operator takes two expressions and returns `1` if both
- expressions are non-zero, `0` otherwise.
-
- This is ***not*** a short-circuit operator.
-
- This is a **non-portable extension**.
-
- * `||`:
- The `boolean or` operator takes two expressions and returns `1` if one of
- the expressions is non-zero, `0` otherwise.
-
- This is ***not*** a short-circuit operator.
-
- This is a **non-portable extension**.
-
-### Statements
-
-The following items are statements:
-
-1. `E`
-2. `{` `S` `;` ... `;` `S` `}`
-3. `if` `(` `E` `)` `S`
-4. `if` `(` `E` `)` `S` `else` `S`
-5. `while` `(` `E` `)` `S`
-6. `for` `(` `E` `;` `E` `;` `E` `)` `S`
-7. An empty statement
-8. `break`
-9. `continue`
-10. `quit`
-11. `halt`
-12. `limits`
-13. A string of characters, enclosed in double quotes
-14. `print` `E` `,` ... `,` `E`
-15. `I()`, `I(E)`, `I(E, E)`, and so on, where `I` is an identifier for a
- [void function](#void-functions). The `E` parameters may also be arrays,
- which will automatically be turned into [array
- references](#array-references) if the corresponding parameter is an array
- reference.
-
-Numbers 4, 9, 11, 12, 14, and 15 are **non-portable extensions**.
-
-Also, as a **non-portable extension**, any or all of the expressions in the
-header of a for loop may be omitted. If the condition (second expression) is
-omitted, it is assumed to be a constant `1`.
-
-The `break` statement causes a loop to stop iterating and resume execution
-immediately following a loop. This is only allowed in loops.
-
-The `continue` statement causes a loop iteration to stop early and returns to
-the start of the loop, including testing the loop condition. This is only
-allowed in loops.
-
-The `if` `else` statement does the same thing as in C.
-
-The `quit` statement causes bc(1) to quit, even if it is on a branch that will
-not be executed (it is a compile-time command).
-
-The `halt` statement causes bc(1) to quit, if it is executed. (Unlike `quit` if
-it is on a branch of an `if` statement that is not executed, bc(1) does not
-quit.)
-
-The `limits` statement prints the limits that this bc(1) is subject to. This is
-like the `quit` statement in that it is a compile-time command.
-
-An expression by itself is evaluated and printed, followed by a newline. If
-bc(1) has been built with the extra math option enabled, both scientific
-notation and engineering notation are available for printing the results of
-expressions. Scientific notation is activated by assigning `0` to `obase` (in
-any other context, an `obase` of `0` is invalid), and engineering notation is
-activated by assigning `1` to `obase` (which is also invalid in any other
-context). To deactivate them, just assign a different value to `obase`.
-
-Scientific notation and engineering notation are disabled if bc(1) is run with
-either the `-s` or `-w` command-line options (or equivalents).
-
-Printing numbers in scientific notation and/or engineering notation is a
-**non-portable extension**.
-
-### Print Statement
-
-The "expressions" in a `print` statement may also be strings. If they are, there
-are backslash escape sequences that are interpreted specially. What those
-sequences are, and what they cause to be printed, are shown below:
-
- * `\a`:
- `\a`
-
- * `\b`:
- `\b`
-
- * `\\`:
- `\`
-
- * `\e`:
- `\`
-
- * `\f`:
- `\f`
-
- * `\n`:
- `\n`
-
- * `\q`:
- `"`
-
- * `\r`:
- `\r`
-
- * `\t`:
- `\t`
-
-Any other character following a backslash causes the backslash and character to
-be printed as-is.
-
-Any non-string expression in a print statement shall be assigned to `last`, like
-any other expression that is printed.
-
-### Order of Evaluation
-
-All expressions in a statment are evaluated left to right, except as necessary
-to maintain order of operations. This means, for example, that in the expression
-`i = 0; a[i++] = i++`, the first (or 0th) element of `a` is set to `1`, and `i`
-is equal to `2` at the end of the expression.
-
-This includes function arguments. Thus, this means that in the expression
-`i = 0; x(i++, i++)`, the first argument passed to `x()` is `0`, and the second
-argument is `1`, while `i` is equal to `2` before the function starts executing.
-
-FUNCTIONS
----------
-
-Function definitions are as follows:
-
-```
-define I(I,...,I){
- auto I,...,I
- S;...;S
- return(E)
-}
-```
-
-Any `I` in the parameter list or `auto` list may be replaced with `I[]` to make
-a parameter or `auto` var an array, and any `I` in the parameter list may be
-replaced with `*I[]` to make a parameter an array reference. Callers of
-functions that take array references should not put an asterisk in the call;
-they must be called with just `I[]` like normal array parameters and will be
-automatically converted into references.
-
-As a **non-portable extension**, the opening brace of a `define` statement may
-appear on the next line.
-
-The return statement may also be in the following forms:
-
-1. `return`
-2. `return` `(` `)`
-3. `return` `E`
-
-The first two, or not specifying a `return` statement, is equivalent to
-`return (0)`, unless the function is a [void function](#void-functions).
-
-<a name="void-functions"/>
-
-### Void Functions
-
-Functions can also be void functions, defined as follows:
-
-```
-define void I(I,...,I){
- auto I,...,I
- S;...;S
- return
-}
-```
-
-They can only be used as standalone expressions, where such an expression would
-be printed alone, except in a print statement.
-
-Void functions can only use the first two `return` statements listed above. They
-can also omit the return statement entirely.
-
-The word `void` is not treated as a keyword; it is still possible to have
-variables, arrays, and functions named `void`. The word `void` is only treated
-specially right after the `define` keyword.
-
-This is a **non-portable extension**.
-
-<a name="array-references"/>
-
-### Array References
-
-For any array in the parameter list, if the array is declared in the form
-
-```
-*I[]
-```
-
-it is a **reference**. Any changes to the array in the function are reflected,
-when the function returns, to the array that was passed in.
-
-Other than this, all function arguments are passed by value.
-
-This is a **non-portable extension**.
-
-LIBRARY
--------
-
-All of the functions below, including the functions in the
-[extended library](#extended-library) if bc(1) has been compiled with the extra
-math option enabled, are available when the `-l` or `--mathlib` command-line
-flags are given.
-
-<a name="standard-library"/>
-
-### Standard Library
-
-The [standard][1] defines the following functions for the math library:
-
- * `s(x)`:
- Returns the sine of `x`, which is assumed to be in radians.
-
- This is a [transcendental function][5].
-
- * `c(x)`:
- Returns the cosine of `x`, which is assumed to be in radians.
-
- This is a [transcendental function][5].
-
- * `a(x)`:
- Returns the arctangent of `x`, in radians.
-
- This is a [transcendental function][5].
-
- * `l(x)`:
- Returns the natural logarithm of `x`.
-
- This is a [transcendental function][5].
-
- * `e(x)`:
- Returns the mathematical constant `e` raised to the power of `x`.
-
- This is a [transcendental function][5].
-
- * `j(x, n)`:
- Returns the bessel integer order `n` (truncated) of `x`.
-
- This is a [transcendental function][5].
-
-<a name="extended-library"/>
-
-### Extended Library
-
-In addition to the [standard library](#standard-library), if bc(1) has been
-built with the extra math option, the following functions are available when
-either the `-l` or `--mathlib` options are given.
-
-However, the extended library is ***not*** loaded when the `-s`/`--standard` or
-`-w`/`--warn` options are given since they are not part of the library defined
-by the [standard][1].
-
-The extended library is a **non-portable extension**.
-
- * `p(x, y)`:
- Calculates `x` to the power of `y`, even if `y` is not an integer, and
- returns the result to the current `scale`.
-
- This is a [transcendental function][5].
-
- * `r(x, p)`:
- Returns `x` rounded to `p` decimal places according to the rounding mode
- [round half away from `0`][3].
-
- * `ceil(x, p)`:
- Returns `x` rounded to `p` decimal places according to the rounding mode
- [round away from `0`][7].
-
- * `f(x)`:
- Returns the factorial of the truncated absolute value of `x`.
-
- * `perm(n, k)`:
- Returns the permutation of the truncated absolute value of `n` of the
- truncated absolute value of `k`, if `k <= n`. If not, it returns `0`.
-
- * `comb(n, k)`:
- Returns the combination of the truncated absolute value of `n` of the
- truncated absolute value of `k`, if `k <= n`. If not, it returns `0`.
-
- * `l2(x)`:
- Returns the logarithm base `2` of `x`.
-
- This is a [transcendental function][5].
-
- * `l10(x)`:
- Returns the logarithm base `10` of `x`.
-
- This is a [transcendental function][5].
-
- * `log(x, b)`:
- Returns the logarithm base `b` of `x`.
-
- This is a [transcendental function][5].
-
- * `cbrt(x)`:
- Returns the cube root of `x`.
-
- * `root(x, n)`:
- Calculates the truncated value of `n`, `r`, and returns the `r`th root of
- `x` to the current `scale`.
-
- If `r` is `0` or negative, this raises an error and causes bc(1) to reset
- (see the RESET section). It also raises an error and causes bc(1) to reset
- if `r` is even and `x` is negative.
-
- * `pi(p)`:
- Returns `pi` to `p` decimal places.
-
- This is a [transcendental function][5].
-
- * `t(x)`:
- Returns the tangent of `x`, which is assumed to be in radians.
-
- This is a [transcendental function][5].
-
- * `a2(y, x)`:
- Returns the arctangent of `y/x`, in radians. If both `y` and `x` are equal
- to `0`, it raises an error and causes bc(1) to reset (see the RESET
- section). Otherwise, if `x` is greater than `0`, it returns `a(y/x)`. If `x`
- is less than `0`, and `y` is greater than or equal to `0`, it returns
- `a(y/x) + pi`. If `x` is less than `0`, and `y` is less than `0`, it returns
- `a(y/x) - pi`. If `x` is equal to `0`, and `y` is greater than `0`, it
- returns `pi/2`. If `x` is equal to `0`, and `y` is less than `0`, it returns
- `-pi/2`.
-
- This function is the same as the `atan2()` function in many programming
- languages.
-
- This is a [transcendental function][5].
-
- * `sin(x)`:
- Returns the sine of `x`, which is assumed to be in radians.
-
- This is an alias of `s(x)`.
-
- This is a [transcendental function][5].
-
- * `cos(x)`:
- Returns the cosine of `x`, which is assumed to be in radians.
-
- This is an alias of `c(x)`.
-
- This is a [transcendental function][5].
-
- * `tan(x)`:
- Returns the tangent of `x`, which is assumed to be in radians.
-
- If `x` is equal to `1` or `-1`, this raises an error and causes bc(1) to
- reset (see the RESET section).
-
- This is an alias of `t(x)`.
-
- This is a [transcendental function][5].
-
- * `atan(x)`:
- Returns the arctangent of `x`, in radians.
-
- This is an alias of `a(x)`.
-
- This is a [transcendental function][5].
-
- * `atan2(y, x)`:
- Returns the arctangent of `y/x`, in radians. If both `y` and `x` are equal
- to `0`, it raises an error and causes bc(1) to reset (see the RESET
- section). Otherwise, if `x` is greater than `0`, it returns `a(y/x)`. If `x`
- is less than `0`, and `y` is greater than or equal to `0`, it returns
- `a(y/x) + pi`. If `x` is less than `0`, and `y` is less than `0`, it returns
- `a(y/x) - pi`. If `x` is equal to `0`, and `y` is greater than `0`, it
- returns `pi/2`. If `x` is equal to `0`, and `y` is less than `0`, it returns
- `-pi/2`.
-
- This function is the same as the `atan2()` function in many programming
- languages.
-
- This is an alias of `a2(y, x)`.
-
- This is a [transcendental function][5].
-
- * `r2d(x)`:
- Converts `x` from radians to degrees and returns the result.
-
- This is a [transcendental function][5].
-
- * `d2r(x)`:
- Converts `x` from degrees to radians and returns the result.
-
- This is a [transcendental function][5].
-
- * `frand(p)`:
- Generates a pseudo-random number between `0` (inclusive) and `1` (exclusive)
- with the number of decimal digits after the decimal point equal to the
- truncated absolute value of `p`. If `p` is not `0`, then calling this
- function will change the value of `seed`. If `p` is `0`, then `0` is
- returned, and `seed` is not changed.
-
- * `ifrand(i, p)`:
- Generates a pseudo-random number that is between `0` (inclusive) and the
- truncated absolute value of `i` (exclusive) with the number of decimal
- digits after the decimal point equal to the truncated absolute value of `p`.
- If the absolute value of `i` is greater than or equal to `2`, and `p` is not
- `0`, then calling this function will change the value of `seed`, otherwise,
- `0` is returned and `seed` is not changed.
-
- * `srand(x)`:
- Returns `x` with its sign flipped with probability `0.5`. In other words, it
- randomizes the sign of `x`.
-
- * `brand()`:
- Returns a random boolean value (either `0` or `1`).
-
- * `ubytes(x)`:
- Returns the numbers of unsigned integer bytes required to hold the truncated
- absolute value of `x`.
-
- * `sbytes(x)`:
- Returns the numbers of signed, two's-complement integer bytes required to
- hold the truncated value of `x`.
-
- * `hex(x)`:
- Outputs the hexadecimal (base `16`) representation of `x`.
-
- This is a [void function](#void-functions).
-
- * `binary(x)`:
- Outputs the binary (base `2`) representation of `x`.
-
- This is a [void function](#void-functions).
-
- * `output(x, b)`:
- Outputs the base `b` representation of `x`.
-
- This is a [void function](#void-functions).
-
- * `uint(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as an unsigned
- integer in as few power of two bytes as possible. Both outputs are split
- into bytes separated by spaces.
-
- If `x` is not an integer or is negative, an error message is printed
- instead, but bc(1) is not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `int(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as a signed,
- two's-complement integer in as few power of two bytes as possible. Both
- outputs are split into bytes separated by spaces.
-
- If `x` is not an integer, an error message is printed instead, but bc(1) is
- not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `uintn(x, n)`:
- Outputs the representation, in binary and hexadecimal, of `x` as an unsigned
- integer in `n` bytes. Both outputs are split into bytes separated by spaces.
-
- If `x` is not an integer, is negative, or cannot fit into `n` bytes, an
- error message is printed instead, but bc(1) is not reset (see the RESET
- section).
-
- This is a [void function](#void-functions).
-
- * `intn(x, n)`:
- Outputs the representation, in binary and hexadecimal, of `x` as a signed,
- two's-complement integer in `n` bytes. Both outputs are split into bytes
- separated by spaces.
-
- If `x` is not an integer or cannot fit into `n` bytes, an error message is
- printed instead, but bc(1) is not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `uint8(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as an unsigned
- integer in `1` byte. Both outputs are split into bytes separated by spaces.
-
- If `x` is not an integer, is negative, or cannot fit into `1` byte, an error
- message is printed instead, but bc(1) is not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `int8(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as a signed,
- two's-complement integer in `1` byte. Both outputs are split into bytes
- separated by spaces.
-
- If `x` is not an integer or cannot fit into `1` byte, an error message is
- printed instead, but bc(1) is not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `uint16(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as an unsigned
- integer in `2` bytes. Both outputs are split into bytes separated by spaces.
-
- If `x` is not an integer, is negative, or cannot fit into `2` bytes, an
- error message is printed instead, but bc(1) is not reset (see the RESET
- section).
-
- This is a [void function](#void-functions).
-
- * `int16(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as a signed,
- two's-complement integer in `2` bytes. Both outputs are split into bytes
- separated by spaces.
-
- If `x` is not an integer or cannot fit into `2` bytes, an error message is
- printed instead, but bc(1) is not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `uint32(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as an unsigned
- integer in `4` bytes. Both outputs are split into bytes separated by spaces.
-
- If `x` is not an integer, is negative, or cannot fit into `4` bytes, an
- error message is printed instead, but bc(1) is not reset (see the RESET
- section).
-
- This is a [void function](#void-functions).
-
- * `int32(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as a signed,
- two's-complement integer in `4` bytes. Both outputs are split into bytes
- separated by spaces.
-
- If `x` is not an integer or cannot fit into `4` bytes, an error message is
- printed instead, but bc(1) is not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `uint64(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as an unsigned
- integer in `8` bytes. Both outputs are split into bytes separated by spaces.
-
- If `x` is not an integer, is negative, or cannot fit into `8` bytes, an
- error message is printed instead, but bc(1) is not reset (see the RESET
- section).
-
- This is a [void function](#void-functions).
-
- * `int64(x)`:
- Outputs the representation, in binary and hexadecimal, of `x` as a signed,
- two's-complement integer in `8` bytes. Both outputs are split into bytes
- separated by spaces.
-
- If `x` is not an integer or cannot fit into `8` bytes, an error message is
- printed instead, but bc(1) is not reset (see the RESET section).
-
- This is a [void function](#void-functions).
-
- * `hex_uint(x, n)`:
- Outputs the representation of the truncated absolute value of `x` as an
- unsigned integer in hexadecimal using `n` bytes. Not all of the value will
- be output if `n` is too small.
-
- This is a [void function](#void-functions).
-
- * `binary_uint(x, n)`:
- Outputs the representation of the truncated absolute value of `x` as an
- unsigned integer in binary using `n` bytes. Not all of the value will be
- output if `n` is too small.
-
- This is a [void function](#void-functions).
-
- * `output_uint(x, n)`:
- Outputs the representation of the truncated absolute value of `x` as an
- unsigned integer in the current [`obase`](#obase) using `n` bytes. Not all
- of the value will be output if `n` is too small.
-
- This is a [void function](#void-functions).
-
- * `output_byte(x, i)`:
- Outputs byte `i` of the truncated absolute value of `x`, where `0` is the
- least significant byte and `number_of_bytes - 1` is the most significant
- byte.
-
- This is a [void function](#void-functions).
-
-<a name="transcendental-functions"/>
-
-### Transcendental Functions
-
-All transcendental functions can return slightly inaccurate results (up to 1
-[ULP][4]). This is unavoidable, and [this article][6] explains why it is
-impossible and unnecessary to calculate exact results for the transcendental
-functions.
-
-Because of the possible inaccuracy, I recommend that users call those functions
-with the precision (`scale`) set to at least 1 higher than is necessary. If
-exact results are *absolutely* required, users can double the precision
-(`scale`) and then truncate.
-
-The transcendental functions in the standard math library are:
-
-* `s(x)`
-* `c(x)`
-* `a(x)`
-* `l(x)`
-* `e(x)`
-* `j(x, n)`
-
-The transcendental functions in the extended math library are:
-
-* `l2(x)`
-* `l10(x)`
-* `log(x, b)`
-* `pi(p)`
-* `t(x)`
-* `a2(y, x)`
-* `sin(x)`
-* `cos(x)`
-* `tan(x)`
-* `atan(x)`
-* `atan2(y, x)`
-* `r2d(x)`
-* `d2r(x)`
-
-RESET
------
-
-When bc(1) encounters an error or a signal that it has a non-default handler
-for, it resets. This means that several things happen.
-
-First, any functions that are executing are stopped and popped off the stack.
-The behavior is not unlike that of exceptions in programming languages. Then
-the execution point is set so that any code waiting to execute (after all
-functions returned) is skipped.
-
-Thus, when bc(1) resets, it skips any remaining code waiting to be executed.
-Then, if it is interactive mode, and the error was not a fatal error (see the
-EXIT STATUS section), it asks for more input; otherwise, it exits with the
-appropriate return code.
-
-Note that this reset behavior is different from the GNU bc(1), which attempts to
-start executing the statement right after the one that caused an error.
-
-PERFORMANCE
------------
-
-Most bc(1) implementations use `char` types to calculate the value of `1`
-decimal digit at a time, but that can be slow. This bc(1) does something
-different.
-
-It uses large integers to calculate more than `1` decimal digit at a time. If
-built in a environment where `BC_LONG_BIT` (see the LIMITS section) is `64`,
-then each integer has `9` decimal digits. If built in an environment where
-`BC_LONG_BIT` is `32` then each integer has `4` decimal digits. This value (the
-number of decimal digits per large integer) is called `BC_BASE_DIGS`.
-
-In addition, this bc(1) uses an even larger integer for overflow checking. This
-integer type depends on the value of `BC_LONG_BIT`, but is always at least twice
-as large as the integer type used to store digits.
-
-LIMITS
-------
-
-The following are the limits on bc(1):
-
- * `BC_LONG_BIT`:
- The number of bits in the `long` type in the environment where bc(1) was
- built. This determines how many decimal digits can be stored in a single
- large integer (see the PERFORMANCE section).
-
- * `BC_BASE_DIGS`:
- The number of decimal digits per large integer (see the PERFORMANCE
- section). Depends on `BC_LONG_BIT`.
-
- * `BC_BASE_POW`:
- The max decimal number that each large integer can store (see
- `BC_BASE_DIGS`) plus `1`. Depends on `BC_BASE_DIGS`.
-
- * `BC_OVERFLOW_MAX`:
- The max number that the overflow type (see the PERFORMANCE section) can
- hold. Depends on `BC_LONG_BIT`.
-
- * `BC_BASE_MAX`:
- The maximum output base. Set at `BC_BASE_POW`.
-
- * `BC_DIM_MAX`:
- The maximum size of arrays. Set at `SIZE_MAX-1`.
-
- * `BC_SCALE_MAX`:
- The maximum `scale`. Set at `BC_OVERFLOW_MAX-1`.
-
- * `BC_STRING_MAX`:
- The maximum length of strings. Set at `BC_OVERFLOW_MAX-1`.
-
- * `BC_NAME_MAX`:
- The maximum length of identifiers. Set at `BC_OVERFLOW_MAX-1`.
-
- * `BC_NUM_MAX`:
- The maximum length of a number (in decimal digits), which includes digits
- after the decimal point. Set at `BC_OVERFLOW_MAX-1`.
-
- * `BC_RAND_MAX`:
- The maximum integer (inclusive) returned by the `rand()` operand, if bc(1)
- has been built with the extra math option. Set at `2^BC_LONG_BIT-1`.
-
- * Exponent:
- The maximum allowable exponent (positive or negative). Set at
- `BC_OVERFLOW_MAX`.
-
- * Number of vars:
- The maximum number of vars/arrays. Set at `SIZE_MAX-1`.
-
-Actual values can be queried with the `limits` statement.
-
-These limits are meant to be effectively non-existent; the limits are so large
-(at least on 64-bit machines) that there should not be any point at which they
-become a problem. In fact, memory should be exhausted before these limits should
-be hit.
-
-ENVIRONMENT VARIABLES
----------------------
-
-bc(1) recognizes the following environment variables:
-
- * `POSIXLY_CORRECT`:
- If this variable exists (no matter the contents), bc(1) behaves as if
- the `-s` option was given.
-
- * `BC_ENV_ARGS`:
- This is another way to give command-line arguments to bc(1). They should be
- in the same format as all other command-line arguments. These are always
- processed first, so any files given in `BC_ENV_ARGS` will be processed
- before arguments and files given on the command-line. This gives the user
- the ability to set up "standard" options and files to be used at every
- invocation. The most useful thing for such files to contain would be useful
- functions that the user might want every time bc(1) runs.
-
- The code that parses `BC_ENV_ARGS` will correctly handle quoted arguments,
- but it does not understand escape sequences. For example, the string
- `"/home/gavin/some bc file.bc"` will be correctly parsed, but the string
- `"/home/gavin/some \"bc\" file.bc"` will include the backslashes.
-
- The quote parsing will handle either kind of quotes, `'` or `"`. Thus, if
- you have a file with any number of single quotes in the name, you can use
- double quotes as the outside quotes, as in `"some 'bc' file.bc"`, and vice
- versa if you have a file with double quotes. However, handling a file with
- both kinds of quotes in `BC_ENV_ARGS` is not supported due to the complexity
- of the parsing, though such files are still supported on the command-line
- where the parsing is done by the shell.
-
- * `BC_LINE_LENGTH`:
- If this environment variable exists and contains an integer that is greater
- than `1` and is less than `UINT16_MAX` (`2^16-1`), bc(1) will output lines
- to that length, including the backslash (`\`). The default line length is
- `70`.
-
- * `BC_EXPR_EXIT`:
- If this variable exists (no matter the contents), bc(1) will exit
- immediately after executing expressions and files given by the `-e` and/or
- `-f` command-line options (and any equivalents).
-
-EXIT STATUS
------------
-
-bc(1) returns the following exit statuses:
-
- * `0`:
- No error.
-
- * `1`:
- A math error occurred. This follows standard practice of using `1` for
- expected errors, since math errors will happen in the process of normal
- execution.
-
- Math errors include divide by `0`, taking the square root of a negative
- number, using a negative number as a bound for the pseudo-random number
- generator, attempting to convert a negative number to a hardware integer,
- overflow when converting a number to a hardware integer, and attempting to
- use a non-integer where an integer is required.
-
- Converting to a hardware integer happens for the second operand of the power
- (`^`), places (`@`), left shift (`<<`), and right shift (`>>`) operators and
- their corresponding assignment operators.
-
- * `2`:
- A parse error occurred.
-
- Parse errors include unexpected `EOF`, using an invalid character, failing
- to find the end of a string or comment, using a token where it is invalid,
- giving an invalid expression, giving an invalid print statement, giving an
- invalid function definition, attempting to assign to an expression that is
- not a [named expression](#bc-named-expressions), giving an invalid `auto`
- list, having a duplicate `auto`/function parameter, failing to find the end
- of a code block, attempting to return a value from a `void` function,
- attempting to use a variable as a reference, and using any extensions when
- the option `-s` or any equivalents were given.
-
- * `3`:
- A runtime error occurred.
-
- Runtime errors include assigning an invalid number to `ibase`, `obase`, or
- `scale`; give a bad expression to a `read()` call, calling `read()` inside
- of a `read()` call, type errors, passing the wrong number of parameters to
- functions, attempting to call an undefined function, and attempting to use a
- `void` function call as a value in an expression.
-
- * `4`:
- A fatal error occurred.
-
- Fatal errors include memory allocation errors, I/O errors, failing to open
- files, attempting to use files that do not have only ASCII characters (bc(1)
- only accepts ASCII characters), attempting to open a directory as a file,
- and giving invalid command-line options.
-
-The exit status `4` is special; when a fatal error occurs, bc(1) always exits
-and returns `4`, no matter what mode bc(1) is in.
-
-The other statuses will only be returned when bc(1) is not in interactive mode
-(see the INTERACTIVE MODE section), since bc(1) resets its state (see the RESET
-section) and accepts more input when one of those errors occurs in interactive
-mode. This is also the case when interactive mode is forced by the `-i` flag or
-`--interactive` option.
-
-These exit statuses allow bc(1) to be used in shell scripting with error
-checking, and its normal behavior can be forced by using the `-i` flag or
-`--interactive` option.
-
-INTERACTIVE MODE
-----------------
-
-Per the [standard][1], bc(1) has an interactive mode and a non-interactive mode.
-Interactive mode is turned on automatically when both `stdin` and `stdout` are
-hooked to a terminal, but the `-i` flag and `--interactive` option can turn it
-on in other cases.
-
-In interactive mode, bc(1) attempts to recover from errors (see the RESET
-section), and in normal execution, flushes `stdout` as soon as execution is done
-for the current input.
-
-TTY MODE
---------
-
-If `stdin`, `stdout`, and `stderr` are all connected to a TTY, bc(1) turns on
-"TTY mode."
-
-TTY mode is required for history to be enabled (see the COMMAND LINE HISTORY
-section). It is also required to enable special handling for `SIGINT` signals.
-
-TTY mode is different from interactive mode because interactive mode is required
-in the [bc(1) specification][1], and interactive mode requires only `stdin` and
-`stdout` to be connected to a terminal.
-
-SIGNAL HANDLING
----------------
-
-Sending a `SIGINT` will cause bc(1) to stop execution of the current input. If
-bc(1) is in TTY mode (see the TTY MODE section), it will reset (see the RESET
-section). Otherwise, it will clean up and exit.
-
-Note that "current input" can mean one of two things. If bc(1) is processing
-input from `stdin` in TTY mode, it will ask for more input. If bc(1) is
-processing input from a file in TTY mode, it will stop processing the file and
-start processing the next file, if one exists, or ask for input from `stdin` if
-no other file exists.
-
-This means that if a `SIGINT` is sent to bc(1) as it is executing a file, it can
-seem as though bc(1) did not respond to the signal since it will immediately
-start executing the next file. This is by design; most files that users execute
-when interacting with bc(1) have function definitions, which are quick to parse.
-If a file takes a long time to execute, there may be a bug in that file. The
-rest of the files could still be executed without problem, allowing the user to
-continue.
-
-`SIGTERM` and `SIGQUIT` cause bc(1) to clean up and exit, and it uses the
-default handler for all other signals. The one exception is `SIGHUP`, if bc(1)
-was built with history support; in that case, when bc(1) is in TTY mode, a
-`SIGHUP` will cause bc(1) to clean up and exit.
-
-COMMAND LINE HISTORY
---------------------
-
-bc(1) supports interactive command-line editing, if compiled with the history
-option enabled. If bc(1) is in TTY mode (see the TTY MODE section), history is
-enabled. Previous lines can be recalled and edited with the arrow keys.
-
-**Note**: when bc(1) is built with history support, tabs are converted to 8
-spaces.
-
-LOCALES
--------
-
-This bc(1) ships with support for adding error messages for different locales.
-
-SEE ALSO
---------
-
-dc(1)
-
-STANDARDS
----------
-
-bc(1) is compliant with the [IEEE Std 1003.1-2017 (“POSIX.1-2017”)][1]
-specification. The flags `-efghiqsvVw`, all long options, and the extensions
-noted above are extensions to that specification.
-
-Note that the specification explicitly says that bc(1) only accepts numbers that
-use a period (`.`) as a radix point, regardless of the value of `LC_NUMERIC`.
-
-This bc(1) ships with support for adding error messages for different locales,
-so it supports `LC_MESSAGES`.
-
-AUTHOR
-------
-
-This bc(1) was made from scratch by Gavin D. Howard.
-
-BUGS
-----
-
-None are known. Report bugs at https://git.yzena.com/gavin/bc.
-
-[1]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/bc.html
-[2]: https://www.gnu.org/software/bc/
-[3]: https://en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero
-[4]: https://en.wikipedia.org/wiki/Unit_in_the_last_place
-[5]: #transcendental-functions
-[6]: https://people.eecs.berkeley.edu/~wkahan/LOG10HAF.TXT
-[7]: https://en.wikipedia.org/wiki/Rounding#Rounding_away_from_zero