.th DC I 1/15/73
.sh NAME
dc \*- desk calculator
.sh SYNOPSIS
.bd dc
[ file ]
.sh DESCRIPTION
.it Dc
is an arbitrary precision integer arithmetic package.
The overall structure of
.it dc
is
a stacking (reverse Polish) calculator.
The following constructions are recognized
by the calculator:
.s3
.lp +10 10
number	The value of the number is pushed on the stack.
A number is an unbroken string of the digits 0-9.
It may be preceded by an underscore \*_ to input a
negative number.
.s3
.lp +10 10
+|\*-|*|/|%|^	The top two values on the stack are added
(+),
subtracted
(\*-),
multiplied (*),
divided (/),
remaindered (%),
or exponentiated (^).
The two entries are popped off the stack;
the result is pushed on the stack in their place.
.s3
.lp +10 10
\fBs\fIx\fR	The
top of the stack is popped and stored into
a register named
.it x,
where
.it x
may be any character.
.s3
.lp +10 10
\fBl\fIx\fR	The
value in register
.it x
is pushed on the stack.
The register
.it x
is not altered.
All registers start with zero value.
.s3
.lp +10 10
\fBd\fR	The top value on the stack is pushed on the stack.
Thus the top value is duplicated.
.s3
.lp +10 10
\fBp\fR	The top value on the stack is printed.
The top value remains unchanged.
.s3
.lp +10 10
\fBf\fR	All values on the stack and in registers are printed.
.s3
.lp +10 10
\fBq\fR	exits the program. If executing a string, the nesting level is
popped by two.
.s3
.lp +10 10
\fBx\fR	treats the top element of the stack as a character string
and executes it as a string of dc commands.
.s3
.lp +10 10
\fB[|...|]\fR	puts the bracketed ascii string onto the top of the stack.
.s3
.lp +10 10
\fI<x||=x||>x\fR	The
top two elements of the stack are popped and compared.
Register
.it x
is executed if they obey the stated
relation.
.s3
.lp +10 10
\fBv\fR	replaces the top element on the stack by its square root.
.s3
.lp +10 10
\fB!\fR	interprets the rest of the line as a UNIX command.
.s3
.lp +10 10
\fBc\fR	All values on the stack are popped.
.s3
.lp +10 10
\fBi\fR	The top value on the stack is popped and used as the
number radix for further input.
.s3
.lp +10 10
\fBo\fR	The top value on the stack is popped and used as the
number radix for further output.
.s3
.lp +10 10
\fBz\fR	The stack level is pushed onto the stack.
.s3
.lp +10 10
\fB?\fR	A line of input is taken from the input source (usually the console)
and executed.
.s3
.lp +10 10
new-line	ignored
except as the name of a register or to end the
response to a
.bd ?.
.s3
.lp +10 10
space	ignored
except as the name of a register or to terminate a number.
.s3
.i0
If a file name is given, input is taken from that file until
end-of-file, then input is taken from the console.
An example which prints the first ten values of n! is
.nf
.s3
.in +3
.bd "[la1+dsa*pla10>x]sx"
.bd "0sa1"
.bd lxx
.s3
.fi
.in -3
.sh FILES
/etc/msh	to implement `!'
.sh DIAGNOSTICS
(x) ? for unrecognized character x.
.br
(x) ? for not enough elements on the stack to do what was asked
by command x.
.br
`Out of space' when the free list is exhausted (too many digits).
.br
`Out of headers' for too many numbers being kept around.
.br
`Out of pushdown' for too many items on the stack.
.br
`Nesting Depth' for too many levels of nested execution.
.sh BUGS
