[comp.sources.misc] v06i061: rpn - A reverse polish notation calculator

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (03/08/89)

Posting-number: Volume 6, Issue 61
Submitted-by: mtymp01@ux.acss.umn.edu
Archive-name: rpn

[Notes:  (1) copyrighted (and rejected by r$); (2) uses ANSI C (pcc users
beware!).  ++bsa]

[I know dc exists, I like this better, it has optional display of
		top of stack]

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  Makefile README rpn.1 rpn.c
# Wrapped by mtymp01@ux.acss.umn.edu on Fri Feb 24 16:47:38 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(159 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
XDESTMAN=/usr/man/man1
XDESTDIR=/usr/bin
X
Xrpn: rpn.o
X	cc -o rpn rpn.o
X
Xrpn.o: rpn.c
X	cc -c rpn.c
X
Xinstall: rpn
X	mv rpn ${DESTDIR}
X	rm rpn.o
X	mv rpn.1 ${DESTMAN}
END_OF_FILE
if test 159 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(195 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XJust edit the makefile and do 'make install' and have everything
Xhappen. any problems, please mail to mtymp01@ux.acss.umn.edu, or
X...!rutgers!umn-cs!ux.acss!mtymp01, or mtymp01@UMNACUX.BITNET.
X
X
END_OF_FILE
if test 195 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'rpn.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpn.1'\"
else
echo shar: Extracting \"'rpn.1'\" \(357 characters\)
sed "s/^X//" >'rpn.1' <<'END_OF_FILE'
X.TH RPN LOCAL "", ""
X.AT 3
X.SH NAME
X.PP
Xrpn - a reverse polish notation calculator
X.SH SYNOPSIS
Xrpn [-]
X.PP
X.SH DESCRIPTION
X.PP
X.I Rpn
Xtakes the standard input and is a RPN calculator. If you want verbose
Xoff, use 'rpn\ -'. For a more detailed description, type in 'help' from
Xwithin rpn.
X.SH BUGS
X.PP
X.SH MAN AUTHOR
XNils McCarthy (mtymp01@ux.acss.umn.edu)
END_OF_FILE
if test 357 -ne `wc -c <'rpn.1'`; then
    echo shar: \"'rpn.1'\" unpacked with wrong size!
fi
# end of 'rpn.1'
fi
if test -f 'rpn.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpn.c'\"
else
echo shar: Extracting \"'rpn.c'\" \(3850 characters\)
sed "s/^X//" >'rpn.c' <<'END_OF_FILE'
X/* rpn - a reverse polish notation calculator */
X/* By Nils McCarthy with special thanks to:
X	THE ZOO */
X/* COPYRIGHT 1898 NILS MCCARTHY */
X/* THIS CODE MAY BE DISTRIBUTED PROVIDED THIS HEADER IS KEPT WITH IT */
X/* THIS CODE, EXCLUDING THIS HEADER MAY BE MODIFIED */
X/* any questions about the copyright, mail to mtymp01@ux.acss.umn.edu */
X
X
X#include <stdio.h>
X
Xint stacklength,*stack;
X
Xint top(void)
X{
X	return stack[stacklength-1];
X}
X
Xpr(options)
Xchar *options;
X{
X	if(*options==' ') options++;
X	if(*options==NULL) {
X		printf("%d\n",top());
X		return;
X	}
X	if((stacklength-1-atoi(options))<0) fprintf(stderr,"ERROR: INVALID %s",
X				"STACK ADDRESSING\n");
X	printf("%d\n",stack[stacklength-1-atoi(options)]);
X}
X
Xpush(thing)
Xint thing;
X{
X	stacklength++;
X	stack[stacklength-1]=thing;
X	if(stacklength>=99) {
X		fprintf(stderr,"ERROR: STACK OVERFLOW\n");
X		/*exit(-1);*/
X	}
X}
X
Xint pop(void)
X{
X	int thing;
X	thing=stack[stacklength-1];
X	stacklength--;
X	if(stacklength<0) {
X          fprintf(stderr,"ERROR: STACK UNDERFLOW\n");	
X          /*exit(-1);*/
X	  }
X	return thing;
X}
X
Xvoid add(void)
X{
X	int thing;
X	thing=pop();
X	push(pop()+thing);
X}
X
Xvoid sub(void)
X{
X	int temp;
X	temp=pop();
X	push(pop()-temp);
X}
X
Xvoid mul(void)
X{
X	int temp;
X	temp=pop();
X	push(pop()*temp);
X}
X
Xvoid div(void)
X{
X	int temp;
X	temp=pop();
X	push(pop()/temp);
X}
X
Xvoid mod(void)
X{
X	int temp;
X	temp=pop();
X	push(pop()%temp);
X}
X
Xvoid not(void)
X{
X	push(~pop());
X}
X
Xvoid xor(void)
X{
X	int thing;
X	thing=pop();
X	push(pop()^thing);
X}
X
Xvoid and(void)
X{
X	int thing;
X	thing=pop();
X	push(pop()&thing);
X}
X
Xvoid or(void)
X{
X	int thing;
X	thing=pop();
X	push(pop()|thing);
X}
X
Xvoid help(void)
X{
X	printf("\n\nWELCOME TO RPN, a reverse polish notation calculator.\n");
X	printf("the functions are as follows:\n");
X	printf("add - add the top two numbers on the stack\n");
X	printf("sub - subtract the top two numbers on the stack\n");
X	printf("mul - multiply the top two numbers on the stack\n");
X	printf("div - divide the top two numbers on the stack\n");
X	printf("pop - discard the top element of the stack\n");
X	printf("mod - take the remainder of the division of the top two numbers on the stack\n");
X	printf("not - take the compliment of the top element on the stack\n");
X	printf("help - display this help\n");
X	printf("xor - exclusive or\n");
X	printf("or - not-exclusive or\n");
X	printf("and - bitwise and\n");
X	printf("pr [number] - print the number [number] deep in the stack. defaults to 0\n");
X	printf("sw - switch printing top of stack on/off\n");
X	printf("(not that you'll ever need this, but:)\n");
X	printf("end - terminate the progran\n\n");
X}
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	char showstack=(~0); /* closest i can get to boolean */
X	int stackspace[100];
X	char input[100];
X	stack=stackspace;
X/* argument stuff */
X	if(argc>1) showstack=0;
X/* end of argument stuff (short, eh?) */
X	printf("\nWELCOME TO RPN!!! (Rpn version 1) by Nils McCarthy\n\n");
X	while (scanf("%s",input)!=EOF) {
X		if(!strcmp(input,"add")) add();
X		else if(!strcmp(input,"sub")) sub();
X		else if(!strcmp(input,"mul")) mul();
X		else if(!strcmp(input,"div")) div();
X		else if(!strcmp(input,"pop")) pop();
X		else if(!strcmp(input,"?"))  help();
X		else if(!strcmp(input,"h")) help();
X		else if(!strcmp(input,"sw")) showstack=~showstack;
X		else if(!strncmp(input,"pr",2)) pr(input+2);
X		else if(!strcmp(input,"help")) help(); 
X		else if(!strcmp(input,"xor")) xor();
X		else if(!strcmp(input,"or")) or();
X		else if(!strcmp(input,"and")) and();
X		else if(!strcmp(input,"x")) break;
X		else if(!strcmp(input,"q")) break;
X		else if(!strcmp(input,"exit")) break;
X		else if(!strcmp(input,"quit")) break;
X		else if(!strcmp(input,"end")) break;
X		else push(atoi(input));
X		if(showstack) {
X			printf("\t\tstack top: %d\n",top());
X			printf("\t\t\tstacksize: %d\n",stacklength);
X		}
X	}
X	printf("Bye Bye, now! Please try rpn again!\n\n");
X}
END_OF_FILE
if test 3850 -ne `wc -c <'rpn.c'`; then
    echo shar: \"'rpn.c'\" unpacked with wrong size!
fi
# end of 'rpn.c'
fi
echo shar: End of shell archive.
exit 0

---Nils McCarthy---mtymp01@ux.acss.umn.edu---...!rutgers!umn-cs!ux.acss!mtymp01