Add dc(1) sources

This commit is contained in:
Juhani Krekelä 2021-04-18 19:04:40 +03:00
commit 6fcea8b76c
7 changed files with 2580 additions and 0 deletions

30
LICENSE.bsd Normal file
View File

@ -0,0 +1,30 @@
Copyright (c) 1980, 1993
The Regents of the University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. 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.
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:
This product includes software developed by the University of
California, Berkeley and its contributors.
4. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.

19
LICENSE.gritter Normal file
View File

@ -0,0 +1,19 @@
Copyright (c) 2003 Gunnar Ritter
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute
it freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.

31
LICENSE.v7 Normal file
View File

@ -0,0 +1,31 @@
Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
Redistributions of source code and documentation 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.
All advertising materials mentioning features or use of this software
must display the following acknowledgement:
This product includes software developed or owned by Caldera
International, Inc.
Neither the name of Caldera International, Inc. nor the names of
other contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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.

5
dc/COPYING Normal file
View File

@ -0,0 +1,5 @@
dc.1 and dc.h are derived from Unix 7th edition. See LICENSE.v7
dc.c is derived from 4.4BSD. See LICENSE.bsd
Additionally, the files have been modified by Gunnar Ritter. See
LICENSE.gritter

231
dc/dc.1 Normal file
View File

@ -0,0 +1,231 @@
.\"
.\" Sccsid @(#)dc.1 1.5 (gritter) 1/11/03
.\" Derived from dc(1), Unix 7th edition:
.\" Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" Redistributions of source code and documentation 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.
.\" All advertising materials mentioning features or use of this software
.\" must display the following acknowledgement:
.\" This product includes software developed or owned by Caldera
.\" International, Inc.
.\" Neither the name of Caldera International, Inc. nor the names of
.\" other contributors may be used to endorse or promote products
.\" derived from this software without specific prior written permission.
.\"
.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
.\" INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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.
.TH DC 1 "1/11/03" "Heirloom Toolchest" "User Commands"
.SH NAME
dc \- desk calculator
.SH SYNOPSIS
\fBdc\fR [\fIfile\fR]
.SH DESCRIPTION
.I Dc
is an arbitrary precision arithmetic package.
Ordinarily it operates on decimal integers,
but one may specify an input base, output base,
and a number of fractional digits to be maintained.
The overall structure of
.I dc
is
a stacking (reverse Polish) calculator.
If an argument is given,
input is taken from that file until its end,
then from the standard input.
The following constructions are recognized:
.HP 6
number
.br
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.
Numbers may contain decimal points.
.HP 6
+ \- / * % ^
.br
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.
Any fractional part of an exponent is ignored.
.TP
.BI s x
The
top of the stack is popped and stored into
a register named
.I x,
where
.I x
may be any character.
If
the
.B s
is capitalized,
.I x
is treated as a stack and the value is pushed on it.
.TP
.BI l x
The
value in register
.I x
is pushed on the stack.
The register
.I x
is not altered.
All registers start with zero value.
If the
.B l
is capitalized,
register
.I x
is treated as a stack and its top value is popped onto the main stack.
.TP
.B d
The
top value on the stack is duplicated.
.TP
.B p
The top value on the stack is printed.
The top value remains unchanged.
.B P
interprets the top of the stack as an ascii string,
removes it, and prints it.
.TP
.B f
All values on the stack and in registers are printed.
.TP
.B q
exits the program.
If executing a string, the recursion level is
popped by two.
If
.B q
is capitalized,
the top value on the stack is popped and the string execution level is popped
by that value.
.TP
.B x
treats the top element of the stack as a character string
and executes it as a string of dc commands.
.TP
.B X
replaces the number on the top of the stack with its scale factor.
.TP
.B "[ ... ]"
puts the bracketed ascii string onto the top of the stack.
.HP 6
.I "<x >x =x"
.br
The
top two elements of the stack are popped and compared.
Register
.I x
is executed if they obey the stated
relation.
.TP
.B v
replaces the top element on the stack by its square root.
Any existing fractional part of the argument is taken
into account, but otherwise the scale factor is ignored.
.TP
.B !
interprets the rest of the line as a UNIX command.
.TP
.B c
All values on the stack are popped.
.TP
.B i
The top value on the stack is popped and used as the
number radix for further input.
.B I
pushes the input base on the top of the stack.
.TP
.B o
The top value on the stack is popped and used as the
number radix for further output.
.TP
.SM
.B O
pushes the output base on the top of the stack.
.TP
.B k
the top of the stack is popped, and that value is used as
a non-negative scale factor:
the appropriate number of places
are printed on output,
and maintained during multiplication, division, and exponentiation.
The interaction of scale factor,
input base, and output base will be reasonable if all are changed
together.
.TP
.B z
The stack level is pushed onto the stack.
.TP
.SM
.B Z
replaces the number on the top of the stack with its length.
.TP
.B ?
A line of input is taken from the input source (usually the terminal)
and executed.
.TP
.B "; :"
are used by
.I bc
for array operations.
.PP
An example which prints the first ten values of n! is
.nf
.PP
.in +3
[la1+dsa*pla10>y]sy
.br
0sa1
.br
lyx
.fi
.SH "SEE ALSO"
bc(1),
which is a preprocessor for
.I dc
providing infix notation and a C-like syntax
which implements functions and reasonable control
structures for programs.
.SH DIAGNOSTICS
`x is unimplemented' where x is an octal number.
.br
`stack empty' for not enough elements on the stack to do what was asked.
.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.

2061
dc/dc.c Normal file

File diff suppressed because it is too large Load Diff

203
dc/dc.h Normal file
View File

@ -0,0 +1,203 @@
/* from Unix 7th Edition /usr/src/cmd/dc/dc.h */
/*
* Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* Redistributions of source code and documentation 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.
* All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed or owned by Caldera
* International, Inc.
* Neither the name of Caldera International, Inc. nor the names of
* other contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
* INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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.
*/
/* Sccsid @(#)dc.h 1.9 (gritter) 2/4/05> */
#include <stdlib.h>
#include <signal.h>
#define FATAL 0
#define NFATAL 1
#define BLK sizeof(struct blk)
#define PTRSZ sizeof(int *)
#define HEADSZ 1024
#define STKSZ 100
#define RDSKSZ 100
#define TBLSZ 256
#define ARRAYST 0241
#define NL 1
#define NG 2
#define NE 3
#define length(p) ((p)->wt-(p)->beg)
#define rewind(p) (p)->rd=(p)->beg
#define create(p) (p)->rd = (p)->wt = (p)->beg
#define fsfile(p) (p)->rd = (p)->wt
#define truncate(p) (p)->wt = (p)->rd
#define sfeof(p) (((p)->rd>=(p)->wt)?1:0)
#define sfbeg(p) (((p)->rd==(p)->beg)?1:0)
#define sungetc(p,c) *(--(p)->rd)=c
#ifdef interdata
#define NEGBYTE 0200
#define MASK (-1 & ~0377)
#define sgetc(p) ( ((p)->rd==(p)->wt) ? EOF :( ((*(p)->rd & NEGBYTE) != 0) ? ( *(p)->rd++ | MASK): *(p)->rd++ ))
#define slookc(p) ( ((p)->rd==(p)->wt) ? EOF :( ((*(p)->rd & NEGBYTE) != 0) ? (*(p)->rd | MASK) : *(p)->rd ))
#define sbackc(p) ( ((p)->rd==(p)->beg) ? EOF :( ((*(--(p)->rd) & NEGBYTE) != 0) ? (*(p)->rd | MASK): *(p)->rd ))
#endif
#ifndef interdata
#define sgetc(p) (((p)->rd==(p)->wt)?EOF:*(p)->rd++)
#define slookc(p) (((p)->rd==(p)->wt)?EOF:*(p)->rd)
#define sbackc(p) (((p)->rd==(p)->beg)?EOF:*(--(p)->rd))
#endif
#define sputc(p,c) {if((p)->wt==(p)->last)more(p); *(p)->wt++ = c; }
#define salterc(p,c) {if((p)->rd==(p)->last)more(p); *(p)->rd++ = c; if((p)->rd>(p)->wt)(p)->wt=(p)->rd;}
#define sunputc(p) (*( (p)->rd = --(p)->wt))
#define zero(p) for(pp=(p)->beg;pp<(p)->last;)*pp++='\0'
#define OUTC(x) {int _c = (x); if (_c) {printf("%c",_c); if(--count == 0){printf("\\\n"); count=ll;} } }
#define TEST2(b) { OUTC(b[0] & 0377); OUTC(b[1] & 0377); }
#define EMPTY if(stkerr != 0){printf("stack empty\n"); continue; }
#define EMPTYR(x) if(stkerr!=0){pushp(x);printf("stack empty\n");continue;}
#define EMPTYS if(stkerr != 0){printf("stack empty\n"); return(1);}
#define EMPTYSR(x) if(stkerr !=0){printf("stack empty\n");pushp(x);return(1);}
#define error(p) {printf(p); continue; }
#define errorrt(p) {printf(p); return(1); }
struct blk {
char *rd;
char *wt;
char *beg;
char *last;
};
struct blk *hfree;
struct blk *arg1, *arg2;
int svargc;
char savk;
char **svargv;
int dbg;
int ifile;
FILE *curfile;
struct blk *scalptr, *basptr, *tenptr, *inbas;
struct blk *sqtemp, *chptr, *strptr, *divxyz;
struct blk *stack[STKSZ];
struct blk **stkptr,**stkbeg;
struct blk **stkend;
int stkerr;
int lastchar;
struct blk *readstk[RDSKSZ];
struct blk **readptr;
struct blk *rem;
int k;
struct blk *irem;
int skd,skr;
int neg;
struct sym {
struct sym *next;
struct blk *val;
} symlst[TBLSZ];
struct sym *stable[TBLSZ];
struct sym *sptr,*sfree;
struct wblk {
struct blk **rdw;
struct blk **wtw;
struct blk **begw;
struct blk **lastw;
};
FILE *fsave;
long rel;
long nbytes;
long all;
long headmor;
long obase;
int fw,fw1,ll;
int (*outdit)(struct blk *, int, int);
int logo;
int log_10;
int count;
char *pp;
char *dummy;
#define div(a, b) dcdiv(a, b)
#define sqrt(a) dcsqrt(a)
#define exp(a, b) dcexp(a, b)
#define getwd(a) dcgetwd(a)
extern void commnds(void);
extern struct blk *div(struct blk *, struct blk *);
extern int dscale(void);
extern struct blk *removr(struct blk *, int);
extern struct blk *sqrt(struct blk *);
extern struct blk *exp(struct blk *, struct blk *);
extern void init(int, char *[]);
extern void onintr(int);
extern void pushp(struct blk *);
extern struct blk *pop(void);
extern struct blk *readin(void);
extern struct blk *add0(struct blk *, int);
extern struct blk *mult(struct blk *, struct blk *);
extern void chsign(struct blk *);
extern int readc(void);
extern void unreadc(char);
extern void binop(char);
extern void print(struct blk *);
extern struct blk *getdec(struct blk *, int);
extern void tenot(struct blk *, int);
extern void oneot(struct blk *, int, char);
extern void hexot(struct blk *, int, int);
extern void bigot(struct blk *, int, int);
extern struct blk *add(struct blk *, struct blk *);
extern int eqk(void);
extern struct blk *removc(struct blk *, int);
extern struct blk *scalint(struct blk *);
extern struct blk *scale(struct blk *, int);
extern int subt(void);
extern int command(void);
extern int cond(char);
extern void load(void);
extern int log_2(long);
extern struct blk *salloc(int);
extern struct blk *morehd(void);
extern struct blk *copy(struct blk *, int);
extern void sdump(char *, struct blk *);
extern void seekc(struct blk *, int);
extern void salterwd(struct wblk *, struct blk *);
extern void more(struct blk *);
extern void ospace(char *);
extern void garbage(char *);
extern void redef(struct blk *);
extern void release(register struct blk *);
extern struct blk *getwd(struct blk *);
extern void putwd(struct blk *, struct blk *);
extern struct blk *lookwd(struct blk *);
extern char *nalloc(register char *, unsigned);
extern void *srealloc(void *, size_t);
#if defined (__GLIBC__) && defined (_IO_getc_unlocked)
#undef getc
#define getc(f) _IO_getc_unlocked(f)
#endif
#ifndef BC_BASE_MAX
#define BC_BASE_MAX 99
#endif
#ifndef BC_DIM_MAX
#define BC_DIM_MAX 2048
#endif