.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