[comp.sources.misc] v11i022: RPL Part 2 of 3

hp@relay.EU.net@vmars.UUCP (03/11/90)

Posting-number: Volume 11, Issue 22
Submitted-by: hp@relay.EU.net@vmars.UUCP
Archive-name: rpl/part02

#! /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 arithcmd.h benchmar bincmd.c bincmd.h branchcm.h
#   cmplxcmd.c cmplxcmd.h debug.c debug.h errors.c errors.h filecmd.c
#   filecmd.h globvar.c globvar.h intcmd.h logcmd.c logcmd.h matherr.c
#   mem.h misccmd.c misccmd.h parser.h porting.tips problems realcmd.h
#   relcmd.c relcmd.h rpl.c rpl.h rpl.prj stackcmd.c stackcmd.h
#   storecmd.c storecmd.h trigcmd.h
# Wrapped by hp@gipsy on Thu Mar  8 17:56:17 1990
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'\" \(2842 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X#	rpl Makefile
X#
X#	This Makefile works with ULTRIX v2.1 and GCC v.1.36.
X#	You may have to make changes for other systems or
X#	compilers.
X
X#	@(#)	1.0	90-03-07	hjp
X
X
X#	port contains headerfiles I wrote as replacements
X#	for some of Turbo-C's headerfiles during porting 
X#	the program to ULTRIX.
X
X#	define -DTRACE	for some tracing messages.
X#	I added them because gcc and dbx won't work together.
X
X#	define -DSTDARGBUG if stdarg.h doesn't work right
X#	with your compiler, too.
X
CFLAGS = -Iport -DSTDARGBUG
CC =	gcc
X
X#	object files for rpl.
X
OBJS = 	arithcmd.o	\
X	bincmd.o	\
X	branchcm.o	\
X	cmplxcmd.o	\
X	errors.o	\
X	filecmd.o	\
X	globvar.o	\
X	rpl.o		\
X	intcmd.o	\
X	logcmd.o	\
X	matherr.o	\
X	misccmd.o	\
X	parser.o	\
X	realcmd.o	\
X	relcmd.o	\
X	stackcmd.o	\
X	storecmd.o	\
X	trigcmd.o
X
X#	additional object files needed with gcc.
X#	They may be in your C library or you may miss others ...
X
POBJS = cabs.o		\
X	itoa.o		\
X	strerror.o	\
X	strtoul.o
X
X#	Libraries:
X#		m is the math library
X#		malloc contains faster memory allocation routines.
X
LIBS = -lm -lmalloc
X
rpl:	$(OBJS) $(POBJS)
X	gcc -o rpl $(OBJS) $(POBJS) $(LIBS)
X
arithcmd.o:	arithcmd.c	arithcmd.h	debug.h errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h
bincmd.o:	bincmd.c	branchcm.h	debug.h errors.h	rpl.h	intcmd.h	misccmd.h	stackcmd.h
branchcm.o:	branchcm.c	branchcm.h	debug.h errors.h	rpl.h	intcmd.h	misccmd.h	stackcmd.h
cmplxcmd.o:	cmplxcmd.c	cmplxcmd.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h
debug.o:	debug.c 	debug.h	rpl.h	errors.h
errors.o:	errors.c	errors.h	debug.h
filecmd.o:	filecmd.c	errors.h	filecmd.h	globvar.h	rpl.h	intcmd.h
globvar.o:	globvar.c	arithcmd.h	branchcm.h	cmplxcmd.h	debug.h filecmd.h	globvar.h	rpl.h	logcmd.h	misccmd.h	relcmd.h	stackcmd.h	storecmd.h	trigcmd.h
rpl.o:	rpl.c		debug.h	globvar.h	rpl.h	intcmd.h	parser.h
intcmd.o:	intcmd.c	debug.h	errors.h	rpl.h	globvar.h	intcmd.h	misccmd.h
logcmd.o:	logcmd.c	errors.h	globvar.h	rpl.h	intcmd.h	logcmd.h	stackcmd.h
matherr.o:	matherr.c
misccmd.o:	misccmd.c	debug.h	errors.h	globvar.h	rpl.h	intcmd.h	misccmd.h	stackcmd.h
parser.o:	parser.c	debug.h	errors.h	globvar.h	rpl.h	misccmd.h	parser.h
realcmd.o:	realcmd.c	arithcmd.h	errors.h	globvar.h	intcmd.h	realcmd.h	rpl.h	stackcmd.h
relcmd.o:	relcmd.c	relcmd.h	debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h
stackcmd.o:	stackcmd.c	debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h
storecmd.o:	storecmd.c	debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h	storecmd.h
trigcmd.o:	trigcmd.c	debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h	trigcmd.h
X
cabs.o:	port/cabs.c
X	gcc -c -o cabs.o port/cabs.c
X
itoa.o:	port/itoa.c
X	gcc -c -o itoa.o port/itoa.c
X
strerror.o:	port/strerror.c
X	gcc -c -o strerror.o port/strerror.c
X
strtoul.o:	port/strtoul.c
X	gcc -c -o strtoul.o port/strtoul.c
X
X#
X#	clean: remove all files created during making
X#
X
clean:
X	rm $(OBJS) $(POBJS) rpl
X
END_OF_FILE
if test 2842 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'arithcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'arithcmd.h'\"
else
echo shar: Extracting \"'arithcmd.h'\" \(812 characters\)
sed "s/^X//" >'arithcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Functions used for implementing user arithmetic commands
X
X0.0	hjp	89-06-27
X
X	initial version
X
X0.1	hjp	89-10-01
X
X	EXP and LN added.
X
X0.2	hjp	89-11-08
X
X	PI, e and i added.
X	SIN, ASIN, COS, ACOS, TAN, ATAN added.
X
X0.3	hjp	89-11-15
X
X	C->R, R->C, RE, IM added.
X
X0.4	hjp	89-12-02
X
X	LN and EXP moved to LogCmd
X	SIN, TAN, COS, ASIN, ATAN, ACOS moved to TrigCmd
X	R->C, C->R, RE, IM moved to CmplxCmd.
X
X****************************************************************/
X
X#ifndef I_arithcmd
X
X	#define I_arithcmd
X
X	void	c_add	(void);
X	void	c_div	(void);
X	void	c_e	(void);
X	void	c_i	(void);
X	void	c_inv	(void);
X	void	c_mul	(void);
X	void	c_neg	(void);
X	void	c_pi	(void);
X	void	c_pow	(void);
X	void	c_sq	(void);
X	void	c_sqrt	(void);
X	void	c_sub	(void);
X
X#endif
END_OF_FILE
if test 812 -ne `wc -c <'arithcmd.h'`; then
    echo shar: \"'arithcmd.h'\" unpacked with wrong size!
fi
chmod +x 'arithcmd.h'
# end of 'arithcmd.h'
fi
if test -f 'benchmar' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'benchmar'\"
else
echo shar: Extracting \"'benchmar'\" \(1944 characters\)
sed "s/^X//" >'benchmar' <<'END_OF_FILE'
X                         BENCHMARKS
X                         ----------
X
X
X
X------------------------------------------------------------
X1. Empty Loop 1 .. 10000
X
RPL (Amstrad PC 1512):          12.25 sec.
RPL (DECstation 3100):           0.08 sec.
X
X<< TIME
X   1 10000 FOR i NEXT
X   TIME - NEG
X>>
X
X
X
HP28C:                          81.95 sec.
X
X<< # 123E SYSEVAL
X   1 10000 START NEXT
X   # 123E SYSEVAL
X   SWAP - B->R 8192 /
X>>
X
X
X
GWBASIC (Amstrad PC 1512):       5.35 sec.
X
X10 PRINT TIME$
X20 FOR i = 1 TO 10000
X30 NEXT i
X40 PRINT TIME$
X
X
X------------------------------------------------------------
X2. Fibonacci - Number
X
RPL (Amstrad PC 1512):          15.71 sec.
RPL (DECstation 3100):           0.40 sec.
X
X<<
X    IF DUP 2 >
X    THEN
X        DUP 1 - FIB SW
X    ELSE
X        DROP 1
X    ENDIF
X>> 'FIB' STO
X
X<< TIME
X   15 FIB DROP
X   TIME - NEG
X>>
X
X
X
HP28C:                          43.376 sec.
X
X<<
X    IF DUP 2 >
X    THEN
X        DUP 1 - FIB SWAP 2 - FIB +
X    ELSE
X        DROP 1
X    ENDIF
X>> 'FIB' STO
X
X << # 123E SYSEVAL
X    15 FIB DROP
X    # 123E SYSEVAL
X    SWAP - B->R 8192 /
X >>
X
X
X
GWBasic (Amstrad PC1512):       23.15 sec.
X
X10      PRINT TIME$
X20      DIM STACK (30)
X30      SP = 0
X40      STACK (SP) = 15: SP = SP + 1
X50      GOSUB 1000
X55      PRINT STACK (SP - 1)
X60      PRINT TIME$
X900     END
X1000    '       PRINT "fib("; STACK (SP - 1); ")", "[sp = "; SP; "]"
X1005    IF STACK (SP - 1) > 2 THEN 1010 ELSE 1060
X1010            STACK (SP) = STACK (SP - 1): SP = SP + 1
X1020            STACK (SP - 1) = STACK (SP - 1) - 1: GOSUB 1000
X1030            H = STACK (SP - 1): STACK (SP - 1) = STACK (SP - 2): STACK (SP - 2) = H
X1040            STACK (SP - 1) = STACK (SP - 1) - 2: GOSUB 1000
X1045            STACK (SP - 2) = STACK (SP - 2) + STACK (SP - 1): SP = SP - 1
X1050            GOTO  1080
X1060    'else
X1070            STACK (SP - 1) = 1
X1080    'endif
X1085    '       PRINT "="; STACK (SP - 1), "[sp = "; SP; "]"
X1090    RETURN
END_OF_FILE
if test 1944 -ne `wc -c <'benchmar'`; then
    echo shar: \"'benchmar'\" unpacked with wrong size!
fi
chmod +x 'benchmar'
# end of 'benchmar'
fi
if test -f 'bincmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'bincmd.c'\"
else
echo shar: Extracting \"'bincmd.c'\" \(1126 characters\)
sed "s/^X//" >'bincmd.c' <<'END_OF_FILE'
X/****************************************************************
X
X	BinCmd	--	Commands for manipulating binary objects.
X			(The BINARY menu on HP28)
X
X0.0	hjp	90-03-03
X
X	initial version
X
X****************************************************************/
X
X#include "bincmd.h"
X#include "errors.h"
X#include "globvar.h"
X#include "intcmd.h"
X#include "rpl.h"
X#include "stackcmd.h"
X
X/*
X	B->R	convert binary to real
X
X	BINARY ->	REAL
X*/
X
void	c_b_r (void)
X{
X	realobj 	* a;
X	binaryobj	* c;
X
X	if (! stack) {
X		error ("B->R", ERR_2FEWARG);
X		return;
X	}
X
X	if ((c = stack->obj)->id == BINARY) {
X
X		if (!(a = mallocobj (REAL)))
X		{
X			error ("B->R", ERR_NOMEM);
X			return;
X		}
X		a->val = c->val;
X		c_drop ();
X		push (a);
X	} else {
X		error ("B->R", ERR_WRTYPE);
X	}
X}
X
X
X/*
X	R->B	convert real ro binary
X
X	REAL	->	BINARY
X*/
X
void	c_r_b (void)
X{
X	realobj 	* c;
X	binaryobj	* a;
X
X	if (! stack) {
X		error ("R->B", ERR_2FEWARG);
X		return;
X	}
X
X	if ((c = stack->obj)->id == REAL) {
X
X		if (!(a = mallocobj (BINARY)))
X		{
X			error ("R->B", ERR_NOMEM);
X			return;
X		}
X		a->val = c->val;
X		c_drop ();
X		push (a);
X	} else {
X		error ("R->B", ERR_WRTYPE);
X	}
X}
END_OF_FILE
if test 1126 -ne `wc -c <'bincmd.c'`; then
    echo shar: \"'bincmd.c'\" unpacked with wrong size!
fi
chmod +x 'bincmd.c'
# end of 'bincmd.c'
fi
if test -f 'bincmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'bincmd.h'\"
else
echo shar: Extracting \"'bincmd.h'\" \(294 characters\)
sed "s/^X//" >'bincmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Commands related to binary objects.
X
X0.0	hjp	90-03-03
X
X	initial version.
X
X****************************************************************/
X
X#ifndef I_bincmd
X
X	#define I_bincmd
X
X	void	c_b_r	(void);
X	void	c_r_b	(void);
X
X#endif
END_OF_FILE
if test 294 -ne `wc -c <'bincmd.h'`; then
    echo shar: \"'bincmd.h'\" unpacked with wrong size!
fi
chmod +x 'bincmd.h'
# end of 'bincmd.h'
fi
if test -f 'branchcm.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'branchcm.h'\"
else
echo shar: Extracting \"'branchcm.h'\" \(818 characters\)
sed "s/^X//" >'branchcm.h' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	BranchCmd
X
Description:
X	Commands for flow control
X
X
Modification history:
X
X	0.0	hjp	89-07-14
X
X		initial version
X
X	0.1	hjp	89-08-28
X
X		if-then-else-endif and loops added.
X		WARNING: Syntax differs from HP28
X			 END replaced by ENDIF, ENDDO, ENDWHILE !!!
X
X****************************************************************/
X
X#ifndef I_branchcm
X
X	#define I_branchcm
X
X	void	c_ift	(void);
X	void	c_ifte	(void);
X	void	c_if	(void);
X	void	c_then	(void);
X	void	c_else	(void);
X	void	c_endif	(void);
X	void	c_start	(void);
X	void	c_for	(void);
X	void	c_next	(void);
X	void	c_step	(void);
X	void	c_while	(void);
X	void	c_repeat(void);
X	void	c_endwhile	(void);
X	void	c_do	(void);
X	void	c_until	(void);
X	void	c_enddo	(void);
X
X	extern
X	loopobj	* loopstack;
X
X#endif
END_OF_FILE
if test 818 -ne `wc -c <'branchcm.h'`; then
    echo shar: \"'branchcm.h'\" unpacked with wrong size!
fi
chmod +x 'branchcm.h'
# end of 'branchcm.h'
fi
if test -f 'cmplxcmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'cmplxcmd.c'\"
else
echo shar: Extracting \"'cmplxcmd.c'\" \(2380 characters\)
sed "s/^X//" >'cmplxcmd.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	CmplxCmd
X
Description:
X	Commands related to complex numbers (The CMPLX menu on HP28C)
X
Modification history:
X
X	0.0	hjp	89-12-03
X
X		initial version
X		R->C, C->R, RE, IM extracted from ArithCmd.
X
X****************************************************************/
X
X#include "cmplxcmd.h"
X#include "errors.h"
X#include "globvar.h"
X#include "rpl.h"
X#include "intcmd.h"
X#include "stackcmd.h"
X
X/*
X	R->C	convert two reals into a complex number
X
X	x	y	->	(x, y)
X
X	REAL	REAL	->	COMPLEX
X*/
X
void	c_r_c (void)
X{
X	realobj 	* a, * b;
X	complexobj	* c;
X
X	if (! stack && ! stack->next) {
X		error ("R->C", ERR_2FEWARG);
X		return;
X	}
X
X	if ((a = stack->obj)->id == REAL && (b = stack->next->obj)->id == REAL) {
X		if (!(c = mallocobj (COMPLEX)))
X		{
X			error ("R->C", ERR_NOMEM);
X			return;
X		}
X		c->val.x = b->val; c->val.y = a->val;
X		c_drop ();
X		c_drop ();
X		push (c);
X	} else {
X		error ("R->C", ERR_WRTYPE);
X	}
X}
X
X
X/*
X	C->R	convert a complex to two reals
X
X	(x, y)	->	x	y
X
X	COMPLEX ->	REAL	REAL
X*/
X
void	c_c_r (void)
X{
X	realobj 	* a, * b;
X	complexobj	* c;
X
X	if (! stack) {
X		error ("C->R", ERR_2FEWARG);
X		return;
X	}
X
X	if ((c = stack->obj)->id == COMPLEX) {
X
X		if (!(a = mallocobj (REAL)))
X		{
X			error ("R->C", ERR_NOMEM);
X			return;
X		}
X		a->val = c->val.x;
X		if (!(b = mallocobj (REAL)))
X		{
X			a->link ++;		/* set link to 1, so that destroy will really free a	*/
X			destroy (a, 1);
X			error ("R->C", ERR_NOMEM);
X			return;
X		}
X		b->val = c->val.y;
X		c_drop ();
X		push (a);
X		push (b);
X	} else {
X		error ("R->C", ERR_WRTYPE);
X	}
X}
X
X
X/*
X	RE	real part of complex number
X
X	(x, y)	->	x
X
X	COMPLEX ->	REAL
X*/
X
void	c_re (void)
X{
X	realobj 	* a;
X	complexobj	* c;
X
X	if (! stack) {
X		error ("RE", ERR_2FEWARG);
X		return;
X	}
X
X	if ((c = stack->obj)->id == COMPLEX) {
X
X		if (!(a = mallocobj (REAL)))
X		{
X			error ("RE", ERR_NOMEM);
X			return;
X		}
X		a->val = c->val.x;
X		c_drop ();
X		push (a);
X	} else {
X		error ("RE", ERR_WRTYPE);
X	}
X}
X
X
X/*
X	IM	imaginary part of complex number
X
X	(x, y)	->	y
X
X	COMPLEX ->	REAL
X*/
X
void	c_im (void)
X{
X	realobj 	* a;
X	complexobj	* c;
X
X	if (! stack) {
X		error ("IM", ERR_2FEWARG);
X		return;
X	}
X
X	if ((c = stack->obj)->id == COMPLEX) {
X
X		if (!(a = mallocobj (REAL)))
X		{
X			error ("IM", ERR_NOMEM);
X			return;
X		}
X		a->val = c->val.y;
X		c_drop ();
X		push (a);
X	}
X	else
X	{
X		error ("IM", ERR_WRTYPE);
X	}
X}
END_OF_FILE
if test 2380 -ne `wc -c <'cmplxcmd.c'`; then
    echo shar: \"'cmplxcmd.c'\" unpacked with wrong size!
fi
chmod +x 'cmplxcmd.c'
# end of 'cmplxcmd.c'
fi
if test -f 'cmplxcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'cmplxcmd.h'\"
else
echo shar: Extracting \"'cmplxcmd.h'\" \(402 characters\)
sed "s/^X//" >'cmplxcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Functions used for implementing user logarithmic commands
X
X0.0	hjp	89-12-03
X
X	initial version
X	R->C, C->R, RE, IM extracted from ArithCmd.
X
X****************************************************************/
X
X#ifndef I_cmplxcmd
X
X	#define I_cmplxcmd
X
X	void	c_c_r	(void);
X	void	c_im	(void);
X	void	c_r_c	(void);
X	void	c_re	(void);
X
X#endif
END_OF_FILE
if test 402 -ne `wc -c <'cmplxcmd.h'`; then
    echo shar: \"'cmplxcmd.h'\" unpacked with wrong size!
fi
chmod +x 'cmplxcmd.h'
# end of 'cmplxcmd.h'
fi
if test -f 'debug.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'debug.c'\"
else
echo shar: Extracting \"'debug.c'\" \(2002 characters\)
sed "s/^X//" >'debug.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	Debug
X
Description:
X	Contains variables of all types to enable casts in the debugger.
X	Contains functions used for debugging.
X
X	WARNING! This module is very compiler-dependent. If you are not
X		using Turbo C 2.0 on an IBM PC-compatible, you will have
X		to change it or simply throw it out.
X
Modification history:
X
X	0.0	hjp	89-07-08
X
X		initial version
X
X	0.1	hjp	89-07-25
X
X		#include <stdio.h> added to supress warnings
X
X	0.2	hjp	89-08-28
X
X		stringobjs added
X
X	0.3	hjp	89-08-28
X
X		opobjs added
X
X	0.4	hjp	89-09-04
X
X		memmap added.
X		clearmem added.
X
X	0.5	clearmem improved. 
X		uses variable blocksize now.
X
X****************************************************************/
X
X#include <alloc.h>
X#include <mem.h>
X#include <stdio.h>
X
X#include "rpl.h"
X#include "errors.h"
X
nameobj	no;
nameobj	* nop;
stringobj	so;
stringobj	* sop;
opobj	oo;
opobj	* oop;
realobj	ro;
realobj	* rop;
X
void * debugmalloc (unsigned n)
X{
X	void * p = malloc (n);
X
X	printf ("allocated %u bytes at %p\n", n, p);
X	return p;
X}
X
void	debugfree (void * p)
X{
X	printf ("freeing %lu bytes at %p\n", ((long *) p)[-2] - 1, p);
X
X	free (p);
X}
X
void * debugrealloc (void * p, unsigned n)
X{
X	void * p1;
X
X	printf ("reallocating %lu bytes at %p ", ((long *) p)[-2] - 1, p);
X	p1 = realloc (p, n);
X	printf ("to %u bytes at %p\n", n, p1);
X	return p1;
X}
X
void memmap (void)
X{
X	uint	seg;
X	uint	* p;
X	char	* s;
X
X	for (seg = _SS + (_stklen >> 4); seg < 0xA000; seg ++) {
X
X		p = (uint *) (((long) seg << 16) + 0x0008);
X		if (s = id2str (* p)) {
X			printf ("%x: %s (link = %u, size = %u)\n", seg, s, p [1], p [2]);
X		}
X	}
X}
X
X
X/*
X	clearmem
X
X	Allocate as much memory as possible, clear it, and release it again.
X*/
X
void clearmem (uint chunk)
X{
X	void * p;
X
X	if (chunk >= 16) {
X		if (p = malloc (chunk - 8)) {
X			printf ("clearmem: %d bytes at %p\n", chunk - 8, p);
X			memset (p, 0, chunk - 8);
X			clearmem (chunk);
X			free (p);
X		} else {
X			chunk >>= 1;
X			clearmem (chunk);
X		}
X	}
X}
END_OF_FILE
if test 2002 -ne `wc -c <'debug.c'`; then
    echo shar: \"'debug.c'\" unpacked with wrong size!
fi
chmod +x 'debug.c'
# end of 'debug.c'
fi
if test -f 'debug.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'debug.h'\"
else
echo shar: Extracting \"'debug.h'\" \(762 characters\)
sed "s/^X//" >'debug.h' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	Debug
X
Description:
X	Contains variables of all types to enable casts in the debugger.
X
X
Modification history:
X
X	0.0	hjp	89-07-08
X
X		initial version
X
X	0.2	hjp	89-08-28
X
X		opobjs added
X
X****************************************************************/
X
X#ifndef I_debug
X
X	#include "rpl.h"
X
X	extern nameobj	no;
X	extern nameobj	* nop;
X	extern stringobj	so;
X	extern stringobj	* sop;
X	extern opobj	oo;
X	extern opobj	* oop;
X
X	void * debugmalloc (unsigned);
X	void   debugfree (void *);
X	void * debugrealloc (void *, unsigned);
X
X	void	memmap (void);
X	void	clearmem (uint);
X
X	/*
X	#define malloc(a) debugmalloc(a)
X	#define free(a) debugfree(a)
X	#define realloc(a, b) debugrealloc(a, b)
X	*/
X
X#endif
END_OF_FILE
if test 762 -ne `wc -c <'debug.h'`; then
    echo shar: \"'debug.h'\" unpacked with wrong size!
fi
chmod +x 'debug.h'
# end of 'debug.h'
fi
if test -f 'errors.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'errors.c'\"
else
echo shar: Extracting \"'errors.c'\" \(2516 characters\)
sed "s/^X//" >'errors.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	Errors
X
Description:
X	Error messages
X
X
Modification history:
X
X	0.0	hjp	89-06-26
X
X		initial version
X
X	0.1	hjp	89-07-25
X
X		ERR_NXVAR added
X
X	0.2	hjp	89-08-15
X
X		parameter detail added to error
X		ERR_DOS added.
X
X	0.3	hjp	89-08-29
X
X		ERR_LOOP added.
X
X	0.4	hjp	89-10-05
X
X		INT_BADLINK added.
X		error has now variable parameter list.
X
X	0.5	hjp	89-11-15
X
X		parameter to ERR_SYNTAX added.
X
X	0.6	hjp	89-12-11
X
X		ERR_FPE added.
X
X	0.7	hjp	90-02-27
X
X		START, FOR, DO, WHILE, COMMENT added to id2str.
X
X****************************************************************/
X
X#define ERRORS_C
X
X#include <port.h>
X#include <stdarg.h>
X#include <stdio.h>
X
X#include "errors.h"
X#include "debug.h"
X
char * errstr [] =
X{
X	"No error\n",
X	"Wrong argument type %s\n",
X	"Stack empty\n",
X	"Too few arguments\n",
X	"Syntax error: %s\n",
X	"Out of Memory\n",
X	"No such variable: '%s'\n",
X	"No user variables\n",
X	"Error reported by DOS: %s\n",
X	"Loop nesting error\n",
X	"Floating Point Exception\n",
X
X	"(INTERNAL) stack is not a list\n",
X	"(INTERNAL) unknown object type %s\n",
X	"(INTERNAL) impossible link count %s",
X
X	"(PANIC) buffer overflow -- committing suicide ...\n",
X};
X
char * id2str (int id)
X{
X	char * rc;
X
X	switch (id) {
X	case REAL:
X		rc = "REAL";
X		break;
X	case COMPLEX:
X		rc = "COMPLEX";
X		break;
X	case BINARY:
X		rc = "BINARY";
X		break;
X	case PROGRAM:
X		rc = "PROGRAM";
X		break;
X	case OP:
X		rc = "OP";
X		break;
X	case UNAME:
X		rc = "UNAME";
X		break;
X	case QNAME:
X		rc = "QNAME";
X		break;
X	case STRING:
X		rc = "STRING";
X		break;
X	case LIST:
X		rc = "LIST";
X		break;
X	case VARIABLE:
X		rc = "VARIABLE";
X		break;
X	case START:
X		rc = "START";
X		break;
X	case DO:
X		rc = "DO";
X		break;
X	case FOR:
X		rc = "FOR";
X		break;
X	case WHILE:
X		rc = "WHILE";
X		break;
X	case COMMENT:
X		rc = "COMMENT";
X		break;
X	default:
X		rc = NULL;
X	}
X	return rc;
X}
X
X
X#ifdef STDARGBUG
X
X	void error (char * cmd, int errnum, long dummy )
X	{
X		va_list	argptr;
X
X	#ifdef TRACE
X		printf ("error (%s, %d, ...) {\n", cmd, errnum);
X	#endif
X		va_start (argptr, errnum);
X		printf ("%s: ", cmd);
X		vprintf (errstr [errnum], argptr);
X		va_end (argptr);
X	#ifdef TRACE
X		printf ("} error\n");
X	#endif
X	}
X#else
X
X	void error (char * cmd, int errnum, ... )
X	{
X		va_list	argptr;
X
X	#ifdef TRACE
X		printf ("error (%s, %d, ...) {\n", cmd, errnum);
X	#endif
X		va_start (argptr, errnum);
X		printf ("%s: ", cmd);
X		vprintf (errstr [errnum], argptr);
X		va_end (argptr);
X	#ifdef TRACE
X		printf ("} error\n");
X	#endif
X	}
X#endif
END_OF_FILE
if test 2516 -ne `wc -c <'errors.c'`; then
    echo shar: \"'errors.c'\" unpacked with wrong size!
fi
chmod +x 'errors.c'
# end of 'errors.c'
fi
if test -f 'errors.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'errors.h'\"
else
echo shar: Extracting \"'errors.h'\" \(970 characters\)
sed "s/^X//" >'errors.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Variables and constants used for error-messages
X
X0.0	hjp	89-06-14
X
X	initial version
X
X0.1	hjp	89-07-25
X
X	ERR_NXVAR added
X
X0.2	hjp	89-08-14
X
X	ERR_NOVAR added
X
X0.3	hjp	89-08-15
X
X	ERR_DOS added
X
X0.4	hjp	89-08-29
X
X	ERR_LOOP added
X
X0.5	hjp	89-10-05
X
X	INT_BADLINK added.
X	error () changed to variable arguments.
X
X0.6	hjp	89-12-11
X
X	ERR_FPE added.
X
X****************************************************************/
X
X#ifndef I_errors
X
X	#define I_errors
X
X	extern
X	char * errstr [];
X
X	enum {
X		ERR_NOERR,
X		ERR_WRTYPE,
X		ERR_STKEMPTY,
X		ERR_2FEWARG,
X		ERR_SYNTAX,
X		ERR_NOMEM,
X		ERR_NXVAR,
X		ERR_NOVAR,
X		ERR_DOS,
X		ERR_LOOP,
X		ERR_FPE,
X
X		INT_STKNOLIST,		/* internal errors	*/
X		INT_NXOBJ,
X		INT_BADLINK,
X
X		INT_BUFOVER,		/* internal fatal errors	*/
X	};
X
X	char *	id2str	(int id);
X
X	#if defined ERRORS_C && defined STDARGBUG
X		void	error	();
X	#else
X		void	error	(char * function, int errno, ...);
X	#endif
X
X#endif
END_OF_FILE
if test 970 -ne `wc -c <'errors.h'`; then
    echo shar: \"'errors.h'\" unpacked with wrong size!
fi
chmod +x 'errors.h'
# end of 'errors.h'
fi
if test -f 'filecmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'filecmd.c'\"
else
echo shar: Extracting \"'filecmd.c'\" \(2593 characters\)
sed "s/^X//" >'filecmd.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	FileCmd
X
Description:
X	Commands for file I/O
X
X
Modification history:
X
X	0.0	hjp	89-08-14
X
X		initial version.
X
X	0.1	hjp	89-08-15
X
X		SAVE	debugged
X		LOAD	added
X		SYSTEM	added.
X
X	0.2	hjp	89-11-23
X
X		SAVE now _appends_ to file.
X
X	0.3	hjp	89-12-02
X
X		PRINT added.
X
X	0.4	hjp	89-12-11
X
X		minor bug fixing.
X
X****************************************************************/
X
X#include <stddef.h>
X#include <stdlib.h>
X#include <stdio.h>
X
X#include "rpl.h"
X#include "errors.h"
X#include "filecmd.h"
X#include "globvar.h"
X#include "intcmd.h"
X#include "stackcmd.h"
X
X/*
X	SAVE: save object at level 2 to file at level 1
X
X	1: obj	2: string	->
X*/
X
void c_save (void)
X{
X	listobj	* a, * b;
X	FILE	* fp;
X
X	if ((b = stack) && (a = stack->next)) {
X
X		if (b->obj->id != STRING) {
X
X			error ("SAVE", ERR_WRTYPE, id2str (b->obj->id));
X
X		} else if (fp = fopen (((stringobj *) b->obj)->val, "a")) {
X
X			c_drop ();		/*	drop name	*/
X
X			iop = iobuffer;
X			printobj (a->obj);
X			fprintf (fp, "%s\n", iobuffer);
X			if (fclose (fp)) {
X				error ("SAVE", ERR_DOS, strerror (errno));
X			}
X			c_drop ();	/*	drop saved object	*/
X
X		} else {
X			error ("SAVE", ERR_DOS, strerror (errno));
X		}
X	} else {
X
X		error ("SAVE", ERR_2FEWARG, NULL);
X	}
X}
X
X
X/*
X	LOAD: load file into command line
X
X	1: string	->	??
X*/
X
void c_load (void)
X{
X	listobj	* b;
X	FILE	* fp;
X	int	rdcnt;
X
X	if ((b = stack)) {
X
X		if (b->obj->id != STRING) {
X
X			error ("LOAD", ERR_WRTYPE, id2str (b->obj->id));
X
X		} else if (fp = fopen (((stringobj *) b->obj)->val, "r")) {
X
X			c_drop ();						/*	drop name			*/
X
X			rdcnt = fread (cmdline, 1, PROGMAXSIZE - 1, fp);	/*	try to read max. program size	*/
X			cmdline [rdcnt] = 0;					/*	append EOS			*/
X			rdptr = cmdline; empty = 0;				/*	simulate edit ()		*/
X			if (fclose (fp)) {
X				error ("LOAD", ERR_DOS, strerror (errno));
X			}
X
X		} else {
X			error ("LOAD", ERR_DOS, strerror (errno));
X		}
X	} else {
X
X		error ("LOAD", ERR_2FEWARG, NULL);
X	}
X}
X
void c_system (void)
X{
X	listobj	* b;
X
X	if ((b = stack)) {
X
X		if (b->obj->id != STRING) {
X
X			error ("SYSTEM", ERR_WRTYPE, id2str (b->obj->id));
X
X		} else if (system (((stringobj *) b->obj)->val)) {
X
X			error ("SYSTEM", ERR_DOS, strerror (errno));
X
X		}
X		c_drop ();
X
X	} else {
X
X		error ("SYSTEM", ERR_2FEWARG, NULL);
X	}
X}
X
X
X/*
X	PRINT: write object at level 1 to stdout
X
X	1: obj	->
X*/
X
void c_print (void)
X{
X	listobj	* a;
X
X	if (a = stack) {
X
X		iop = iobuffer;
X		printobj (a->obj);
X		printf ("%s\n", iobuffer);
X		c_drop ();	/*	drop printed object	*/
X
X	} else {
X
X		error ("PRINT", ERR_2FEWARG, NULL);
X	}
X}
X
END_OF_FILE
if test 2593 -ne `wc -c <'filecmd.c'`; then
    echo shar: \"'filecmd.c'\" unpacked with wrong size!
fi
chmod +x 'filecmd.c'
# end of 'filecmd.c'
fi
if test -f 'filecmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'filecmd.h'\"
else
echo shar: Extracting \"'filecmd.h'\" \(389 characters\)
sed "s/^X//" >'filecmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	File commands
X
X0.0	hjp	89-08-15
X
X	initial version
X
X0.1	hjp	89-08-15
X
X	SYSTEM added
X
X0.2	hjp	89-12-02
X
X	PRINT added.
X
X****************************************************************/
X
X#ifndef I_filecmd
X
X	#define I_filecmd
X
X	void	c_save		(void);
X	void	c_load		(void);
X	void	c_print		(void);
X	void	c_system	(void);
X
X#endif
END_OF_FILE
if test 389 -ne `wc -c <'filecmd.h'`; then
    echo shar: \"'filecmd.h'\" unpacked with wrong size!
fi
chmod +x 'filecmd.h'
# end of 'filecmd.h'
fi
if test -f 'globvar.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'globvar.c'\"
else
echo shar: Extracting \"'globvar.c'\" \(5327 characters\)
sed "s/^X//" >'globvar.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	GlobVar
X
Description:
X	global variables
X
X
Modification history:
X
X	0.0	hjp	89-06-26
X
X		initial version
X
X	0.1	hjp	89-07-08
X
X		vars added
X
X	0.2	hjp	89-08-28
X
X		ip added
X
X	0.3	hjp	89-09-03
X
X		localvars added
X
X	0.4	hjp	89-11-23
X
X		radix added.
X
X	0.5	hjp	90-03-03
X
X		bincmd added.
X		constants added.
X
X	0.6	hjp	90-03-04
X
X		realcmd added.
X
X	0.7	hjp	90-03-06
X
X		opobj "MemMap" excluded for non Turbo-C environment.
X
X	0.8	hjp	90-03-07
X
X		main_loop added.
X
X****************************************************************/
X
X#include <setjmp.h>
X#include <stddef.h>
X
X#include "rpl.h"
X#include "arithcmd.h"
X#include "bincmd.h"
X#include "branchcm.h"
X#include "cmplxcmd.h"
X#include "debug.h"
X#include "filecmd.h"
X#include "logcmd.h"
X#include "misccmd.h"
X#include "realcmd.h"
X#include "relcmd.h"
X#include "stackcmd.h"
X#include "storecmd.h"
X#include "trigcmd.h"
X
X
listobj * stack = NULL;
X
varobj	* vars = NULL,		/* user variables	*/
X	* localvars = NULL;	/* local variables: created by FOR and -> operators	*/
X
int	radix = 16;		/* radix for i/o of binaries (2, 8, 10 or 16)	*/
X
genobj	** ip;
X
opobj ops [] =
X{
X	OP,	0,	sizeof (opobj), c_add,		"+",
X	OP,	0,	sizeof (opobj), c_sub,		"-",
X	OP,	0,	sizeof (opobj), c_mul,		"*",
X	OP,	0,	sizeof (opobj), c_div,		"/",
X	OP,	0,	sizeof (opobj), c_drop, 	"DROP",
X	OP,	0,	sizeof (opobj), c_off,		"OFF",
X	OP,	0,	sizeof (opobj), c_neg,		"NEG",
X	OP,	0,	sizeof (opobj), c_swap, 	"SWAP",
X	OP,	0,	sizeof (opobj), c_sq,		"SQ",
X	OP,	0,	sizeof (opobj), c_sqrt, 	"SQRT",
X	OP,	0,	sizeof (opobj), c_pow,		"^",
X	OP,	0,	sizeof (opobj), c_inv,		"INV",
X	OP,	0,	sizeof (opobj), c_clear,	"CLEAR",
X	OP,	0,	sizeof (opobj), c_pbegin,	"<<",   /*      \ these two tokens      */
X	OP,	0,	sizeof (opobj), c_pend, 	">>",   /*      / must stay together    */
X	OP,	0,	sizeof (opobj), c_eval, 	"EVAL",
X	OP,	0,	sizeof (opobj), c_sto,		"STO",
X	OP,	0,	sizeof (opobj), c_rcl,		"RCL",
X	OP,	0,	sizeof (opobj), c_ift,		"IFT",
X	OP,	0,	sizeof (opobj), c_ifte, 	"IFTE",
X	OP,	0,	sizeof (opobj), c_gt,		">",
X	OP,	0,	sizeof (opobj), c_ge,		">=",
X	OP,	0,	sizeof (opobj), c_eq,		"==",
X	OP,	0,	sizeof (opobj), c_le,		"<=",
X	OP,	0,	sizeof (opobj), c_lt,		"<",
X	OP,	0,	sizeof (opobj), c_ne,		"!=",
X	OP,	0,	sizeof (opobj), c_dup,		"DUP",
X	OP,	0,	sizeof (opobj), c_tron, 	"TRON",
X	OP,	0,	sizeof (opobj), c_troff,	"TROFF",
X	OP,	0,	sizeof (opobj), c_user, 	"USER",
X	OP,	0,	sizeof (opobj), c_purge,	"PURGE",
X	OP,	0,	sizeof (opobj), c_save, 	"SAVE",
X	OP,	0,	sizeof (opobj), c_load, 	"LOAD",
X	OP,	0,	sizeof (opobj), c_system,	"SYSTEM",
X	OP,	0,	sizeof (opobj), c_if,		"IF",
X	OP,	0,	sizeof (opobj), c_then, 	"THEN",
X	OP,	0,	sizeof (opobj), c_else, 	"ELSE",
X	OP,	0,	sizeof (opobj), c_endif,	"ENDIF",
X	OP,	0,	sizeof (opobj), c_start,	"START",
X	OP,	0,	sizeof (opobj), c_for,		"FOR",
X	OP,	0,	sizeof (opobj), c_next, 	"NEXT",
X	OP,	0,	sizeof (opobj), c_step, 	"STEP",
X	OP,	0,	sizeof (opobj), c_do,		"DO",
X	OP,	0,	sizeof (opobj), c_until,	"UNTIL",
X	OP,	0,	sizeof (opobj), c_enddo,	"ENDDO",
X	OP,	0,	sizeof (opobj), c_while,	"WHILE",
X	OP,	0,	sizeof (opobj), c_repeat,	"REPEAT",
X	OP,	0,	sizeof (opobj), c_endwhile,	"ENDWHILE",
X	OP,	0,	sizeof (opobj), c_time, 	"TIME",
X#ifdef __TURBOC__
X	OP,	0,	sizeof (opobj), memmap, 	"MemMap",       /*      for debugging only      */
X#endif
X	OP,	0,	sizeof (opobj), c_ln,		"LN",
X	OP,	0,	sizeof (opobj), c_exp,		"EXP",
X	OP,	0,	sizeof (opobj), c_local,	"->",
X	OP,	0,	sizeof (opobj), c_pi,		"PI",
X	OP,	0,	sizeof (opobj), c_e,		"e",
X	OP,	0,	sizeof (opobj), c_i,		"i",
X	OP,	0,	sizeof (opobj), c_sin,		"SIN",
X	OP,	0,	sizeof (opobj), c_cos,		"COS",
X	OP,	0,	sizeof (opobj), c_tan,		"TAN",
X	OP,	0,	sizeof (opobj), c_asin, 	"ASIN",
X	OP,	0,	sizeof (opobj), c_acos, 	"ACOS",
X	OP,	0,	sizeof (opobj), c_atan, 	"ATAN",
X	OP,	0,	sizeof (opobj), c_c_r,		"C->R",
X	OP,	0,	sizeof (opobj), c_im,		"IM",
X	OP,	0,	sizeof (opobj), c_re,		"RE",
X	OP,	0,	sizeof (opobj), c_r_c,		"R->C",
X	OP,	0,	sizeof (opobj), c_bin,		"BIN",
X	OP,	0,	sizeof (opobj), c_oct,		"OCT",
X	OP,	0,	sizeof (opobj), c_dec,		"DEC",
X	OP,	0,	sizeof (opobj), c_hex,		"HEX",
X	OP,	0,	sizeof (opobj), c_print,	"PRINT",
X	OP,	0,	sizeof (opobj), c_listend,	"}",
X	OP,	0,	sizeof (opobj), c_b_r,		"B->R",
X	OP,	0,	sizeof (opobj), c_r_b,		"R->B",
X	OP,	0,	sizeof (opobj), c_maxr, 	"MAXR",
X	OP,	0,	sizeof (opobj), c_minr, 	"MINR",
X	OP,	0,	sizeof (opobj), c_abs,		"ABS",
X	OP,	0,	sizeof (opobj), c_sign, 	"SIGN",
X	OP,	0,	sizeof (opobj), c_ip,		"IP",
X	OP,	0,	sizeof (opobj), c_fp,		"FP",
X	OP,	0,	sizeof (opobj), c_floor,	"FLOOR",
X	OP,	0,	sizeof (opobj), c_ceil, 	"CEIL",
X	OP,	0,	sizeof (opobj), c_max,		"MAX",
X	OP,	0,	sizeof (opobj), c_min,		"MIN",
X	OP,	0,	sizeof (opobj), c_mod,		"MOD",
X};
X
X
const noops = sizeof (ops) / sizeof (opobj);
X
X
int	traceflag = 0;
X
X/*	constant objects	*/
X
complexobj	complex_zero	= {COMPLEX, 1, sizeof (complexobj), {0.0, 0.0}};
complexobj	complex_one	= {COMPLEX, 1, sizeof (complexobj), {1.0, 0.0}};
complexobj	complex_i	= {COMPLEX, 1, sizeof (complexobj), {0.0, 1.0}};
X
realobj 	real_zero	= {REAL, 1, sizeof (realobj), 0.0};
realobj 	real_e		= {REAL, 1, sizeof (realobj), M_E};
realobj 	real_pi 	= {REAL, 1, sizeof (realobj), M_PI};
realobj 	real_min	= {REAL, 1, sizeof (realobj), TINY_VAL};
realobj 	real_max	= {REAL, 1, sizeof (realobj), HUGE_VAL};
X
X/*	stack backup for handling signals	*/
X
jmp_buf main_loop;
END_OF_FILE
if test 5327 -ne `wc -c <'globvar.c'`; then
    echo shar: \"'globvar.c'\" unpacked with wrong size!
fi
chmod +x 'globvar.c'
# end of 'globvar.c'
fi
if test -f 'globvar.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'globvar.h'\"
else
echo shar: Extracting \"'globvar.h'\" \(1019 characters\)
sed "s/^X//" >'globvar.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Global variables
X
X----------------------------------------------------------------
X
X0.0	hjp	89-06-14
X
X	initial version
X
X0.1	hjp	89-07-08
X
X	vars	added
X
X0.2	hjp	89-07-14
X
X	traceflag	added
X
X0.3	hjp	89-08-28
X
X	ip	added
X
X0.4	hjp	89-09-03
X
X	localvars added
X
X0.5	hjp	89-11-23
X
X	radix added
X
X0.6	hjp	90-03-03
X
X	constants added.
X
X0.6	hjp	90-03-03
X
X	main_loop added.
X
X****************************************************************/
X
X
X#ifndef I_globvar
X
X	#define I_globvar
X
X	#include <setjmp.h>
X	#include "rpl.h"
X
X	extern
X	listobj * stack;
X
X	extern
X	varobj	* vars,
X		* localvars;
X
X	extern
X	genobj	** ip;
X
X	extern
X	char 	cmdline [],
X		empty,
X		* rdptr,
X
X                pbuffer [];
X
X	extern
X	opobj ops [];
X
X	extern
X	const noops;
X
X	#define NOOPS	noops
X
X	extern
X	int	traceflag;
X
X	extern
X	int	radix;
X
X	extern
X	complexobj	complex_zero, complex_one, complex_i;
X
X	extern
X	realobj		real_zero, real_e, real_pi, real_max, real_min;
X
X	extern
X	jmp_buf		main_loop;
X
X#endif
END_OF_FILE
if test 1019 -ne `wc -c <'globvar.h'`; then
    echo shar: \"'globvar.h'\" unpacked with wrong size!
fi
chmod +x 'globvar.h'
# end of 'globvar.h'
fi
if test -f 'intcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'intcmd.h'\"
else
echo shar: Extracting \"'intcmd.h'\" \(813 characters\)
sed "s/^X//" >'intcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Internally used commands
X
X0.0	hjp	89-06-26
X
X	initial version
X
X0.1	hjp	89-09-03
X
X	findvar added
X
X0.2	hjp	89-12-02
X
X	mallocobj added.
X
X0.3	hjp	89-12-11
X
X	fpehandler added.
X
X0.4	hjp	90-03-07
X
X	inthandler added.
X
X****************************************************************/
X
X#ifndef I_intcmnds
X
X	#define I_intcmnds
X
X	void		push (genobj * p);
X	void		destroy (genobj * p, int level);
X	genobj *	duplicate (genobj * obj, int level);
X	void		fpehandler (int sig);
X	void		inthandler (int sig);
X	genobj *	mallocobj (int type);
X	void		printobj (genobj * obj);
X	void		psr (listobj * l, int n);
X	void		printstack (void);
X	void		interprete (genobj * obj, int level);
X	varobj *	findvar (char * name);
X
X	extern
X	char	iobuffer [],
X		* iop,
X		* ioend;
X
X#endif
END_OF_FILE
if test 813 -ne `wc -c <'intcmd.h'`; then
    echo shar: \"'intcmd.h'\" unpacked with wrong size!
fi
chmod +x 'intcmd.h'
# end of 'intcmd.h'
fi
if test -f 'logcmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'logcmd.c'\"
else
echo shar: Extracting \"'logcmd.c'\" \(2248 characters\)
sed "s/^X//" >'logcmd.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	LogCmd
X
Description:
X	Commands related to logarithms (The LOGS menu on HP28C)
X
Modification history:
X
X	0.0	hjp	89-12-03
X
X		initial version
X		LN and EXP extracted from ArithCmd.
X
X****************************************************************/
X
X#include "errors.h"
X#include "globvar.h"
X#include "rpl.h"
X#include "intcmd.h"
X#include "logcmd.h"
X#include "stackcmd.h"
X
X/*
X	ln	--	compute natural logarithm of object in level 1
X
X	x	->	ln(x)
X
X	REAL	->	REAL
X	REAL	->	COMPLEX
X	COMPLEX ->	COMPLEX
X*/
X
void c_ln (void)
X{
X	genobj		* a;
X	realobj 	* c;
X	complexobj	* b;
X
X	if (! stack) {
X		error ("ln", ERR_2FEWARG);
X		return;
X	}
X
X	if ((a = stack->obj)->id == REAL) {
X		if (((realobj *)a)->val >= 0.0) {
X			if (!(c = mallocobj (REAL)))
X			{
X				error ("LN", ERR_NOMEM);
X				return;
X			}
X			c->id = REAL;
X			c->link = 0;
X			c->size = sizeof (realobj);
X			c->val = log (((realobj *) a)->val);
X			c_drop ();
X			push (c);
X		} else {
X			if (! (b = mallocobj (COMPLEX)))
X			{
X				error ("LN", ERR_NOMEM);
X				return;
X			}
X			b->val.x = log (-((realobj *) a)->val);
X			b->val.y = M_PI;
X			c_drop ();
X			push (b);
X		}
X	} else if (a->id == COMPLEX) {
X		double	x = ((complexobj *) a)->val.x,
X			y = ((complexobj *) a)->val.y;
X
X		if (! (b = mallocobj (COMPLEX)))
X		{
X			error ("LN", ERR_NOMEM);
X			return;
X		}
X		b->val.x = log (sqrt (x * x + y * y));
X		b->val.y = x || y ? atan2 (y, x) : 0.0;
X		c_drop ();
X		push (b);
X	} else {
X		error ("inv", ERR_WRTYPE);
X	}
X}
X
X/*
X	EXP	compute e to the power of object in level 1
X
X	x	->	e ^ x
X
X	real	->	real
X	complex ->	complex
X*/
X
void c_exp (void)
X{
X	genobj		* a;
X	realobj 	* c;
X	complexobj	* b;
X
X	if (! stack) {
X		error ("EXP", ERR_2FEWARG);
X		return;
X	}
X
X	if ((a = stack->obj)->id == REAL) {
X		if (!(c = mallocobj (REAL)))
X		{
X			error ("EXP", ERR_NOMEM);
X			return;
X		}
X		c->val = exp (((realobj *) a)->val);
X		c_drop ();
X		push (c);
X	} else if (a->id == COMPLEX) {
X		double	x = ((complexobj *) a)->val.x,
X			y = ((complexobj *) a)->val.y;
X
X		if (! (b = mallocobj (COMPLEX)))
X		{
X			error ("EXP", ERR_NOMEM);
X			return;
X		}
X		b->val.x = exp (x) * cos (y);
X		b->val.y = exp (x) * sin (y);
X		c_drop ();
X		push (b);
X	} else {
X		error ("EXP", ERR_WRTYPE);
X	}
X}
END_OF_FILE
if test 2248 -ne `wc -c <'logcmd.c'`; then
    echo shar: \"'logcmd.c'\" unpacked with wrong size!
fi
chmod +x 'logcmd.c'
# end of 'logcmd.c'
fi
if test -f 'logcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'logcmd.h'\"
else
echo shar: Extracting \"'logcmd.h'\" \(350 characters\)
sed "s/^X//" >'logcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Functions used for implementing user logarithmic commands
X
X0.0	hjp	89-12-03
X
X	initial version
X	LN and EXP extracted from ArithCmd.
X
X****************************************************************/
X
X#ifndef I_logcmd
X
X	#define I_logcmd
X
X	void	c_exp	(void);
X	void	c_ln	(void);
X#endif
END_OF_FILE
if test 350 -ne `wc -c <'logcmd.h'`; then
    echo shar: \"'logcmd.h'\" unpacked with wrong size!
fi
chmod +x 'logcmd.h'
# end of 'logcmd.h'
fi
if test -f 'matherr.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'matherr.c'\"
else
echo shar: Extracting \"'matherr.c'\" \(689 characters\)
sed "s/^X//" >'matherr.c' <<'END_OF_FILE'
X
X/****************************************************************
X
Module:
X	matherr
X
Description:
X	Error handler for exceptions in math functions.
X
X
Modification history:
X
X	0.0	hjp	89-12-17
X
X		initial version.
X
X****************************************************************/
X
X#include <math.h>
X#include <port.h>
X
X
int matherr(struct exception *e)
X{
X	if (e->type == UNDERFLOW)
X	{
X		/* flush underflow to 0 */
X		e->retval = 0;
X		return 1;
X	}
X	if (e->type == TLOSS)
X	{
X		/* total loss of precision, but ignore the problem */
X		return 1;
X	}
X	if (e->type == OVERFLOW)
X	{
X		/* set overflow to HUGE_VAL */
X		e->retval = HUGE_VAL;
X		return 1;
X	}
X	/* all other errors are fatal */
X	return 0;
X}
X
END_OF_FILE
if test 689 -ne `wc -c <'matherr.c'`; then
    echo shar: \"'matherr.c'\" unpacked with wrong size!
fi
chmod +x 'matherr.c'
# end of 'matherr.c'
fi
if test -f 'mem.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'mem.h'\"
else
echo shar: Extracting \"'mem.h'\" \(67 characters\)
sed "s/^X//" >'mem.h' <<'END_OF_FILE'
X/*
X	mem.h
X
X*/
X
X#define memmove(dst, src, cnt) bcopy(src, dst, cnt)
END_OF_FILE
if test 67 -ne `wc -c <'mem.h'`; then
    echo shar: \"'mem.h'\" unpacked with wrong size!
fi
chmod +x 'mem.h'
# end of 'mem.h'
fi
if test -f 'misccmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'misccmd.c'\"
else
echo shar: Extracting \"'misccmd.c'\" \(3917 characters\)
sed "s/^X//" >'misccmd.c' <<'END_OF_FILE'
X/****************************************************************
X
X	Miscellaneous user commands
X
X0.0	hjp	89-06-27
X
X	initial version
X
X0.1	hjp	89-07-14
X
X	TRON, TROFF added
X
X0.2	hjp	89-08-29
X
X	TIME added
X
X0.3	hjp	89-09-03
X
X	TIME changed: uses ftime now instead of time
X
X0.4	hjp	89-10-04
X
X	-> added.
X
X0.5	hjp	89-11-23
X
X	BIN, OCT, DEC, HEX added.
X
X0.6	hjp	90-02-27
X
X	comment object added in local_var.
X
X0.7	hjp	90-03-02
X
X	} added.
X
X0.8	hjp	90-03-03
X
X	malloc replaced by mallocobj (at last!).
X
X0.9	hjp	90-03-06
X
X	sys/types.h added for UNIX-compatibility.
X
X****************************************************************/
X
X
X#include <math.h>
X#include <process.h>
X#include <string.h>
X#include <sys/types.h>
X#include <sys/timeb.h>
X
X#include "errors.h"
X#include "globvar.h"
X#include "rpl.h"
X#include "intcmd.h"
X#include "misccmd.h"
X#include "debug.h"
X#include "stackcmd.h"
X
X/*
X	exit from HP28-Emulator
X*/
X
void	c_off (void)
X{
X	exit (0);
X}
X
X
void c_pbegin (void)
X{
X	/*	dummy function -- does nothing	*/
X}
X
X
void c_pend (void)
X{
X	/*	dummy function -- does nothing	*/
X}
X
X
X/*
X	evaluate object in level 1
X*/
X
void	c_eval (void)
X{
X	listobj * l;
X
X	l = stack;
X
X	if (l) {
X		if (l->id == LIST) {
X			stack = l->next;
X
X			interprete (l->obj, 0);
X
X			destroy ((genobj *)l, 0);
X		} else {
X			error ("eval", INT_STKNOLIST);
X		}
X	} else {
X		error ("eval", ERR_STKEMPTY);
X	}
X}
X
void	c_tron (void)
X{
X	traceflag = 1;
X}
X
void	c_troff (void)
X{
X	traceflag = 0;
X}
X
X
void	c_time (void)
X{
X	struct timeb tb;
X
X	realobj * c;
X
X	ftime (&tb);
X	if (!(c = mallocobj (REAL))) {
X		error ("TIME", ERR_NOMEM);
X		return;
X	}
X	c->val = tb.time + tb.millitm * 0.001;
X	push (c);
X
X}
X
X/*
X	->
X
X	Syntax required:
X
X		-> UNAME { UNAME } PROGRAM
X
X	1. create local variable for each uname assigning values from the stack.
X	2. execute program.
X	3. delete the local variables created in step 1.
X
X	Example:
X
X		-> a b c << some program >>
X
X		Stack:
X			1
X			2
X			3
X			4
X
X		before execution of << some program >>, the stack will contain
X		the single value 1,
X		the local variable a will contain the value 2,
X				   b will contain the value 3,
X				   c will contain the value 4.
X
X		This twisted arrangement (the variable found last by the interpreter
X		gets the value in level one) makes programs more readable,
X		but complicates the assignment to local variables.
X*/
X
static
int	local_var (void)
X{
X	int	n_var;
X	varobj	* v;
X	nameobj	* n;
X
X	if ((* ++ ip)->id == UNAME) {
X
X		n = * ip;	/*	remember name	*/
X
X		/*	create local variables following in the list first	*/
X
X		n_var = local_var () + 1;
X
X		/*	is there a value on the stack ?	*/
X
X		if (! stack) {
X			error ("->", ERR_2FEWARG);
X			return (n_var - 1);
X		}
X
X		/* 	create local variable	*/
X
X		if (! (v = mallocobj (VARIABLE))) {
X			error ("->", ERR_NOMEM);
X			return (n_var - 1);
X		}
X
X		/*	and move value from stack to new var.	*/
X
X		v->id = VARIABLE;
X		v->size = sizeof (varobj);
X		v->link = 1;
X		strcpy (v->name, n->name);
X		v->val = stack->obj; stack->obj->link ++;
X		v->next = localvars; localvars = v;
X		c_drop ();
X		return	n_var;
X	} else if ((* ip)->id == COMMENT) {
X		/*	skip it and try next	*/
X		return local_var ();
X	} else {
X		return 0;
X	}
X}
X
void	c_local (void)
X{
X	int	n_var;		/*	number of local variables	*/
X
X	n_var = local_var ();
X
X	/*	now * ip should point to a program	*/
X
X	if ((* ip)->id != PROGRAM) {
X		error ("->", ERR_WRTYPE, id2str ((* ip)->id));
X		return;
X	}
X
X	interprete ((* ip), 0);
X
X	/*	remove all local variables created	*/
X
X	while (-- n_var >= 0) {
X		varobj * v = localvars->next;
X		destroy (localvars, 0);
X		localvars = v;
X	}
X}
X
X
X/*
X	BIN	set radix for binaries to 2.
X*/
X
void c_bin (void)
X{
X	radix = 2;
X}
X
X
X/*
X	OCT	set radix for binaries to 8.
X*/
X
void c_oct (void)
X{
X	radix = 8;
X}
X
X
X/*
X	DEC	set radix for binaries to 10.
X*/
X
void c_dec (void)
X{
X	radix = 10;
X}
X
X
X/*
X	HEX	set radix for binaries to 16.
X*/
X
void c_hex (void)
X{
X	radix = 16;
X}
X
X
void c_listend (void)
X{
X	/*	dummy function -- does nothing	*/
X}
END_OF_FILE
if test 3917 -ne `wc -c <'misccmd.c'`; then
    echo shar: \"'misccmd.c'\" unpacked with wrong size!
fi
chmod +x 'misccmd.c'
# end of 'misccmd.c'
fi
if test -f 'misccmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'misccmd.h'\"
else
echo shar: Extracting \"'misccmd.h'\" \(739 characters\)
sed "s/^X//" >'misccmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Miscellaneous user commands
X
X0.0	hjp	89-06-27
X
X	initial version
X
X0.1	hjp	89-07-14
X
X	TRON, TROFF added
X
X0.2	hjp	89-08-29
X
X	TIME added
X
X0.3	hjp	89-10-04
X
X	-> (c_local) added
X
X0.4	hjp	89-11-23
X
X	BIN, OCT, DEC, HEX added.
X
X0.5	hjp	90-03-02
X
X	} added.
X
X****************************************************************/
X
X#ifndef I_misc_cmd
X
X	#define I_misc_cmd
X
X	void	c_bin		(void);
X	void	c_dec		(void);
X	void	c_hex		(void);
X	void	c_listend	(void);		/*	}	*/
X	void	c_oct		(void);
X	void	c_off		(void);
X	void	c_pbegin 	(void);
X	void	c_pend		(void);
X	void	c_eval		(void);
X	void	c_tron		(void);
X	void	c_troff 	(void);
X	void 	c_time		(void);
X	void	c_local		(void);		/*	->	*/
X
X#endif
END_OF_FILE
if test 739 -ne `wc -c <'misccmd.h'`; then
    echo shar: \"'misccmd.h'\" unpacked with wrong size!
fi
chmod +x 'misccmd.h'
# end of 'misccmd.h'
fi
if test -f 'parser.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'parser.h'\"
else
echo shar: Extracting \"'parser.h'\" \(518 characters\)
sed "s/^X//" >'parser.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Parser.h
X
X0.0	hjp	89-06-14
X
X	initial version
X
X****************************************************************/
X
extern
char	cmdline [],				/* The command line     */
X	empty,					/* is it empty	*/
X	* rdptr,				/* rdptr points to the first character not yet read by getobj	*/
X
X	pbuffer []; 				/* buffer for building programs */
X
void	findwhite (void);
void	skipwhite (void);
genobj	* getobj (void);
void	edit	(genobj * obj);
void	* readvalue (void);
END_OF_FILE
if test 518 -ne `wc -c <'parser.h'`; then
    echo shar: \"'parser.h'\" unpacked with wrong size!
fi
chmod +x 'parser.h'
# end of 'parser.h'
fi
if test -f 'porting.tips' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'porting.tips'\"
else
echo shar: Extracting \"'porting.tips'\" \(2995 characters\)
sed "s/^X//" >'porting.tips' <<'END_OF_FILE'
Tips for porting RPL to other systems:
X
X
I ported RPL to gcc (Version 1.36, MIPS) to find out how
portable the code is. I needed about two days and most of 
the problems were with gcc's header files.
X
This sources are the result and compile both with Turbo-C 
and gcc without errors (but a lot of warnings because of many
missing casts -- I had the warning 'suspicious pointer conversion'
turned off on Turbo-C).
X
Here is a list of the problems I had and how I solved them.
X
arithcmd.c:
X	The function
X		double cabs (struct complex z)
X	and the
X		struct complex {double x, y;}
X	were not defined in math.h.
X
X	I had to define them myself.
X	cabs was, however, in cc's math library, but there 
X	seems to a difference in how cc and gcc handle structures 
X	as arguments. After finding sources for cabs and recompiling
X	them it worked.
X
debug.c
X	This file should be left out. It contains very compiler-dependent
X	functions.
X
errors.c
X	The function error uses a variable argument list. This did not work 
X	correctly, because the va_start macro was inside a #ifdef host_mips.
X	Defining host_mips caused the program to compile without errors, but
X	the optional arguments are not passed correctly.
X
X	A (admittedly clumsy) workaround for this is to define error () with
X	additional dummy arguments.
X
filecmd.c
X	The function strerror () does not exist in gcc's library. 
X	I wrote a replacement.
X
globvar.c
X	The line 
X		OP,	0,	sizeof (opobj), memmap,		"MemMap",
X	should be deleted.
X
intcmd.c
X	Printstack () uses coreleft () and _SP to find out how much memory and
X	stack are left. Both are unique to Turbo-C, so change them or leave
X	them out.
X
X	Gcc's signal.h had a syntax error in it. It used #ifdef...#endif inside
X	a comment! I split the comment.
X
X	The functions itoa () and ultoa () do not exist in gcc's library. 
X	I wrote replacements.
X
misccmd.c
X	c_time () uses ftime (), which may not be available on some systems.
X
parser.c
X	Turbo-Cs sscanf has difficulties reading double values. To work around
X	this bug I made real long double and checked the value read against
X	HUGE_VAL. If your system does not know long doubles or the constant
X	HUGE_VAL, you can change it back.
X
X	The function strtoul () does not exist in gcc's library. 
X	I wrote a replacement.
X
rpl.c
X	The line
X		uint _stklen = 0x4000; 
X	can be left out. If stacks are limited in size on your system, use
X	compiler or linker options (or somewhat else) to ensure that the stack
X	is large enough. 16kB should suffice for everyday work.
X
X	Start_prof () starts a profiling system published in comp.sources.misc
X	last summer. It works with Microsoft C and Turbo C. Change it to your
X	profiling system or leave it out.
X
X	clearmem () should be left out.
X
storecmd.c
X	The function strerror () does not exist in gcc's library. 
X	I wrote a replacement.
X
hjp.h
X	some of the types defined in hjp.h are already defined on some systems.
X	Remove these to prevent "duplicate typedef" errors.
X
X*.c
X	#include <alloc.h> must be replaced by #include <malloc.h>.
END_OF_FILE
if test 2995 -ne `wc -c <'porting.tips'`; then
    echo shar: \"'porting.tips'\" unpacked with wrong size!
fi
# end of 'porting.tips'
fi
if test -f 'problems' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'problems'\"
else
echo shar: Extracting \"'problems'\" \(1604 characters\)
sed "s/^X//" >'problems' <<'END_OF_FILE'
pending:
X
X89-11-30	Exception handling needed.
X
solved:
X
X89-08-15        89-08-15        LOAD missing
X89-08-15        89-08-22        Error in parsing strings: skips EOL
X89-08-15        89-08-22        Strings should be C-like
X89-08-15        89-08-22        cr/lf not recognized as white space
X89-08-23        89-10-05        loosing memory w/ calls
X89-09-03        89-10-05        loosing memory w/ relcmds -- push but no destroy
X89-09-03        89-10-05        loosing memory w/ arithcmds -- push but no destroy -- link count neccessary
X89-09-03        89-10-05        introducing link count: arithcmd <= c_sqrt
X                                                        intcmd
X                                rest is still unchanged ==> extremly unstable
X                                *link count should now be implemented everywhere.
X89-08-15        89-11-08	STO should globber existing variables.
X89-11-09	89-11-11	ACOS wrong results with complex
X89-11-09	89-11-11	ATAN wrong results with complex
X89-11-11        89-11-11	SQ changes argument
X89-11-11	89-11-15	TAN wrong w/ some complex args
X89-11-15	89-11-23	need function to append object to a file (modify SAVE ??)
X89-11-23	89-12-02	Ops for binary not implemented.
X89-10-05        89-12-11	Problems with local variables in recursive functions.
X				(89-11-11: didn't occur since, the SQ bug could have been the reason)
X				*considered fixed
X89-11-23	89-12-11	Find shorter algorithm to resolve overloading.
X				*still not optimal, but a lot better than before.
X90-03-03	90-03-03	malloc still used in branchcmd.c, intcmd.c misccmd.c relcmd.c stocmd.c
END_OF_FILE
if test 1604 -ne `wc -c <'problems'`; then
    echo shar: \"'problems'\" unpacked with wrong size!
fi
chmod +x 'problems'
# end of 'problems'
fi
if test -f 'realcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'realcmd.h'\"
else
echo shar: Extracting \"'realcmd.h'\" \(478 characters\)
sed "s/^X//" >'realcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Commands related to real objects.
X
X0.0	hjp	90-03-04
X
X	initial version.
X
X****************************************************************/
X
X#ifndef I_realcmd
X
X	#define I_realcmd
X
X	void	c_minr	(void);
X	void	c_maxr	(void);
X	void	c_abs	(void);
X	void	c_sign	(void);
X	void	c_mod	(void);
X	void	c_max	(void);
X	void	c_min	(void);
X	void	c_floor	(void);
X	void	c_ceil	(void);
X	void	c_ip	(void);
X	void	c_fp	(void);
X
X#endif
END_OF_FILE
if test 478 -ne `wc -c <'realcmd.h'`; then
    echo shar: \"'realcmd.h'\" unpacked with wrong size!
fi
chmod +x 'realcmd.h'
# end of 'realcmd.h'
fi
if test -f 'relcmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'relcmd.c'\"
else
echo shar: Extracting \"'relcmd.c'\" \(3675 characters\)
sed "s/^X//" >'relcmd.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	RelCmd
X
Description:
X	Commands implementing relational operations
X
X
Modification history:
X
X0.0	hjp	89-07-14
X
X	initial version
X
X0.1	hjp	89-09-04
X
X	destroy added after push to prevent memory loss.
X
X0.2	hjp	89-10-01
X
X	link count added. destroy now superfluos - removed.
X
X0.3	hjp	90-03-03
X
X	malloc replaced by mallocobj (at last!).
X
X0.4	hjp	90-03-07
X
X	argument checking fixed in all functions.
X
X****************************************************************/
X
X#include "rpl.h"
X#include "relcmd.h"
X#include "globvar.h"
X#include "errors.h"
X#include "intcmd.h"
X#include "stackcmd.h"
X
X#include "debug.h"
X
X/*
X	Level 2 > Level 1 ?
X*/
X
void c_gt (void)
X{
X	genobj * a, * b, * c;
X
X	if (! stack || ! stack->next) {
X		error (">", ERR_2FEWARG);
X		return;
X	}
X
X	b = stack->obj; a = stack->next->obj;
X
X	if (a->id == REAL && b->id == REAL) {
X		c = mallocobj (REAL);
X		((realobj *)c)->val = ((realobj *) a)->val > ((realobj *) b)->val;
X		c_drop ();
X		c_drop ();
X		push (c);
X	} else {
X		if (a->id != REAL) error (">", ERR_WRTYPE, id2str (a->id));
X		if (b->id != REAL) error (">", ERR_WRTYPE, id2str (b->id));
X	}
X}
X
X
X/*
X	Level 2 >= Level 1 ?
X*/
X
void c_ge (void)
X{
X	genobj * a, * b, * c;
X
X	if (! stack || ! stack->next) {
X		error (">=", ERR_2FEWARG);
X		return;
X	}
X
X	b = stack->obj; a = stack->next->obj;
X
X	if (a->id == REAL && b->id == REAL) {
X		c = mallocobj (REAL);
X		((realobj *)c)->val = ((realobj *) a)->val >= ((realobj *) b)->val;
X		c_drop ();
X		c_drop ();
X		push (c);
X	} else {
X		if (a->id != REAL) error (">=", ERR_WRTYPE, id2str (a->id));
X		if (b->id != REAL) error (">=", ERR_WRTYPE, id2str (b->id));
X	}
X}
X
X
X/*
X	Level 2 == Level 1 ?
X*/
X
void c_eq (void)
X{
X	genobj * a, * b, * c;
X
X	if (! stack || ! stack->next) {
X		error ("==", ERR_2FEWARG);
X		return;
X	}
X
X	b = stack->obj; a = stack->next->obj;
X
X	if (a->id == REAL && b->id == REAL) {
X		c = mallocobj (REAL);
X		((realobj *)c)->val = ((realobj *) a)->val == ((realobj *) b)->val;
X		c_drop ();
X		c_drop ();
X		push (c);
X	} else {
X		if (a->id != REAL) error ("==", ERR_WRTYPE, id2str (a->id));
X		if (b->id != REAL) error ("==", ERR_WRTYPE, id2str (b->id));
X	}
X}
X
X
X/*
X	Level 2 <= Level 1 ?
X*/
X
void c_le (void)
X{
X	genobj * a, * b, * c;
X
X	if (! stack || ! stack->next) {
X		error ("<=", ERR_2FEWARG);
X		return;
X	}
X
X	b = stack->obj; a = stack->next->obj;
X
X	if (a->id == REAL && b->id == REAL) {
X		c = mallocobj (REAL);
X		((realobj *)c)->val = ((realobj *) a)->val <= ((realobj *) b)->val;
X		c_drop ();
X		c_drop ();
X		push (c);
X	} else {
X		if (a->id != REAL) error ("<=", ERR_WRTYPE, id2str (a->id));
X		if (b->id != REAL) error ("<=", ERR_WRTYPE, id2str (b->id));
X	}
X}
X
X
X/*
X	Level 2 < Level 1 ?
X*/
X
void c_lt (void)
X{
X	genobj * a, * b, * c;
X
X	if (! stack || ! stack->next) {
X		error ("<", ERR_2FEWARG);
X		return;
X	}
X
X	b = stack->obj; a = stack->next->obj;
X
X	if (a->id == REAL && b->id == REAL) {
X		c = mallocobj (REAL);
X		((realobj *)c)->val = ((realobj *) a)->val < ((realobj *) b)->val;
X		c_drop ();
X		c_drop ();
X		push (c);
X	} else {
X		if (a->id != REAL) error ("<", ERR_WRTYPE, id2str (a->id));
X		if (b->id != REAL) error ("<", ERR_WRTYPE, id2str (b->id));
X	}
X}
X
X
X/*
X	Level 2 != Level 1 ?
X*/
X
void c_ne (void)
X{
X	genobj * a, * b, * c;
X
X	if (! stack || ! stack->next) {
X		error ("!=", ERR_2FEWARG);
X		return;
X	}
X
X	b = stack->obj; a = stack->next->obj;
X
X	if (a->id == REAL && b->id == REAL) {
X		c = mallocobj (REAL);
X		((realobj *)c)->val = ((realobj *) a)->val != ((realobj *) b)->val;
X		c_drop ();
X		c_drop ();
X		push (c);
X	} else {
X		if (a->id != REAL) error ("!=", ERR_WRTYPE, id2str (a->id));
X		if (b->id != REAL) error ("!=", ERR_WRTYPE, id2str (b->id));
X	}
X}
END_OF_FILE
if test 3675 -ne `wc -c <'relcmd.c'`; then
    echo shar: \"'relcmd.c'\" unpacked with wrong size!
fi
chmod +x 'relcmd.c'
# end of 'relcmd.c'
fi
if test -f 'relcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'relcmd.h'\"
else
echo shar: Extracting \"'relcmd.h'\" \(431 characters\)
sed "s/^X//" >'relcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	RelCmd
X
Description:
X	Commands implementing relational operations
X
X
Modification history:
X
X	0.0	hjp	89-07-14
X
X		initial version
X
X****************************************************************/
X
X#ifndef I_relcmd
X
X	#define I_relcmd
X
X	void c_gt (void);
X	void c_ge (void);
X	void c_eq (void);
X	void c_le (void);
X	void c_lt (void);
X	void c_ne (void);
X
X#endif
END_OF_FILE
if test 431 -ne `wc -c <'relcmd.h'`; then
    echo shar: \"'relcmd.h'\" unpacked with wrong size!
fi
chmod +x 'relcmd.h'
# end of 'relcmd.h'
fi
if test -f 'rpl.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpl.c'\"
else
echo shar: Extracting \"'rpl.c'\" \(1311 characters\)
sed "s/^X//" >'rpl.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	HP main module
X
Description:
X	interactive loop
X
X
Modification history:
X
X	0.0	hjp	89-06-26
X
X		initial version
X
X	0.1	hjp	89-07-25
X
X		main greatly simplified by replacement of switch (obj->id)
X		through interprete (obj, 1);
X
X	0.2	hjp	89-12-11
X
X		FPE handling added.
X
X	0.3	hjp	90-03-06
X
X		Stack length, profiling and clearmem excluded for 
X		non-Turbo-C environment.
X
X****************************************************************/
X
X
X#include <signal.h>
X#include <stdio.h>
X#include <string.h>
X
X#include "rpl.h"
X#include "globvar.h"
X#include "intcmd.h"
X#include "parser.h"
X#include "debug.h"
X
X#ifdef __TURBOC__
uint _stklen = 0x4000;	/*	16 k Bytes of stack	*/
X#endif
X
main (int argc, char ** argv)
X{
X	genobj * obj;
X
X#ifdef __TURBOC__
X	if (! strcmp (argv [1], "-p")) {
X		prof_start (argv [0]);
X	}
X#endif
X
X	/*	clear memory so that MemMap will work right	*/
X
X#ifdef __TURBOC__
X	clearmem (0x8000);
X#endif
X
X	/*	set up floating point exception handler	*/
X
X	signal (SIGFPE, fpehandler);
X	signal (SIGINT, inthandler);
X
X	for (;;) {
X		setjmp (main_loop);
X		obj = readvalue ();
X		if (obj) {
X			interprete (obj, 1);
X			obj->link ++;		/* destroy original instance of object	*/
X			destroy (obj, 1);
X		} else {
X			empty = 1;
X			printstack ();
X		}
X	}
X}
X
END_OF_FILE
if test 1311 -ne `wc -c <'rpl.c'`; then
    echo shar: \"'rpl.c'\" unpacked with wrong size!
fi
chmod +x 'rpl.c'
# end of 'rpl.c'
fi
if test -f 'rpl.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpl.h'\"
else
echo shar: Extracting \"'rpl.h'\" \(2534 characters\)
sed "s/^X//" >'rpl.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Typedefs and constants
X
X0.0	hjp	89-06-14
X
X	initial version
X
X0.1	hjp	89-07-08
X
X	function prototypes moved to intcmds.h
X
X0.2	hjp	89-07-25
X
X	stringobj added
X
X0.3	hjp	89-08-29
X
X	loopobj added
X
X0.4	hjp	89-09-04
X
X	link count added to all objects.
X
X0.5	hjp	89-11-23
X
X	binary object added.
X
X0.6	hjp	89-12-02
X
X	object types changed to be continuous.
X	macro t22int (convert 2 types to int) added.
X
X0.7	hjp	89-12-02
X
X	Comment object added.
X
X0.8	hjp	90-03-06
X
X	port.h added.
X
X****************************************************************/
X
X
X#ifndef I_hp
X
X	#define I_hp
X
X	#include <hjp.h>
X	#include <math.h>
X	#include <port.h>
X
X	#define	PROGMAXSIZE	4096
X	#define NAMELEN		32
X
X	#define NOOBJ	-1
X	#define REAL	1
X	#define COMPLEX	2
X	#define STRING	3
X	#define RVECT   4
X	#define RMAT    5
X	#define CVECT   6
X	#define CMAT    7
X	#define LIST	8
X	#define QNAME	9
X	#define UNAME	10
X	#define OP	11
X	#define PROGRAM	12
X	#define BINARY	13
X
X	#define VARIABLE 16		/*	internal use only	*/
X	#define START	17		/*	internal use only	*/
X	#define FOR	18		/*	internal use only	*/
X	#define DO	19		/*	internal use only	*/
X	#define WHILE	20		/*	internal use only	*/
X	#define COMMENT	21		/*	internal use only	*/
X
X	#define t22int(a, b)	(((a)<<8)|(b))
X
X
X	typedef struct complex
X		complex;
X
X	typedef struct genobj {
X		int	id;
X		uint	link;
X		uint	size;
X	} genobj;
X
X	typedef struct realobj {
X		int	id;
X		uint	link;
X		uint	size;
X		double	val;
X	} realobj;
X
X	typedef struct complexobj {
X		int	id;
X		uint	link;
X		uint	size;
X		complex	val;
X	} complexobj;
X
X	typedef struct opobj {
X		int	id;
X		uint	link;
X		uint	size;
X		void	(* fptr)(void);
X		char	name [32];
X	} opobj;
X
X	typedef struct listobj {
X		int	id;
X		uint	link;
X		uint	size;
X		genobj	* obj;
X		struct listobj
X			* next;
X	} listobj;
X
X	typedef struct nameobj {
X		int	id;
X		uint	link;
X		uint	size;
X		char	name [NAMELEN];
X	} nameobj;
X
X	typedef struct varobj {
X		int	id;
X		uint	link;
X		uint	size;
X		char	name [NAMELEN];
X		genobj	* val;
X		struct varobj
X			* next;
X	} varobj;
X
X	typedef struct stringobj {
X		int	id;
X		uint	link;
X		uint	size;
X		char	val [1];	/* dummy to calm the compiler.							*/
X					/* The string can be up to 65521 chars long (including '\0')			*/
X	} stringobj;
X
X	typedef struct loopobj {
X		int	id;
X		uint	link;
X		uint	size;
X		struct
X		loopobj	* next;
X		genobj	** addr;
X		double	cnt;
X		varobj * var;
X	} loopobj;
X
X
X	typedef struct binaryobj {
X		int	id;
X		uint	link;
X		uint	size;
X		long	val;
X	} binaryobj;
X
X	typedef stringobj commentobj;
X
X#endif
END_OF_FILE
if test 2534 -ne `wc -c <'rpl.h'`; then
    echo shar: \"'rpl.h'\" unpacked with wrong size!
fi
chmod +x 'rpl.h'
# end of 'rpl.h'
fi
if test -f 'rpl.prj' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rpl.prj'\"
else
echo shar: Extracting \"'rpl.prj'\" \(1223 characters\)
sed "s/^X//" >'rpl.prj' <<'END_OF_FILE'
arithcmd.c	(arithcmd.h	debug.h errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h)
bincmd.c	(bincmd.h)
branchcm.c	(branchcm.h	debug.h errors.h	rpl.h	intcmd.h	misccmd.h	stackcmd.h)
cmplxcmd.c	(cmplxcmd.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h)
debug.c 	(debug.h	rpl.h	errors.h)
errors.c	(errors.h	debug.h)
filecmd.c	(errors.h	filecmd.h	globvar.h	rpl.h	intcmd.h)
globvar.c	(arithcmd.h	branchcm.h	cmplxcmd.h	debug.h filecmd.h	globvar.h	rpl.h	logcmd.h	misccmd.h	relcmd.h	stackcmd.h	storecmd.h	trigcmd.h)
rpl.c		(debug.h	globvar.h	rpl.h	intcmd.h	parser.h)
intcmd.c	(debug.h	errors.h	rpl.h	globvar.h	intcmd.h	misccmd.h)
logcmd.c	(errors.h	globvar.h	rpl.h	intcmd.h	logcmd.h	stackcmd.h)
matherr.c
misccmd.c	(debug.h	errors.h	globvar.h	rpl.h	intcmd.h	misccmd.h	stackcmd.h)
parser.c	(debug.h	errors.h	globvar.h	intcmd.h	misccmd.h	parser.h	rpl.h)
realcmd.c	(realcmd.h	debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h)
relcmd.c	(relcmd.h	debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h)
stackcmd.c	(debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h)
storecmd.c	(debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h	storecmd.h)
trigcmd.c	(debug.h	errors.h	globvar.h	rpl.h	intcmd.h	stackcmd.h	trigcmd.h)
X
X/tc/cprof/lprof.obj
END_OF_FILE
if test 1223 -ne `wc -c <'rpl.prj'`; then
    echo shar: \"'rpl.prj'\" unpacked with wrong size!
fi
chmod +x 'rpl.prj'
# end of 'rpl.prj'
fi
if test -f 'stackcmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stackcmd.c'\"
else
echo shar: Extracting \"'stackcmd.c'\" \(1268 characters\)
sed "s/^X//" >'stackcmd.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	StackCmd
X
Description:
X	Commands for manipulating the stack
X
X
Modification history:
X
X	0.0	hjp	89-06-26
X
X		initial version: DROP, SWAP, CLEAR
X
X	0.1	hjp	89-06-26
X
X		DUP added
X
X****************************************************************/
X
X#include <stddef.h>
X
X#include "errors.h"
X#include "globvar.h"
X#include "rpl.h"
X#include "intcmd.h"
X#include "stackcmd.h"
X#include "debug.h"
X
X/*
X	drop the element at the top of the stack
X*/
X
void c_drop (void)
X{
X	listobj * l;
X
X	l = stack;
X
X	if (l) {
X		if (l->id == LIST) {
X			stack = l->next;
X			destroy ((genobj *)l, 0);
X		} else {
X			error ("drop", INT_STKNOLIST, NULL);
X		}
X	} else {
X		error ("drop", ERR_STKEMPTY, NULL);
X	}
X}
X
X
X/*
X	swap two topmost arguments
X*/
X
void c_swap (void)
X{
X	listobj * a, * b;
X
X	if ((a = stack) && (b = stack->next)) {
X		a->next = b->next;
X		b->next = a;
X		stack = b;
X	} else {
X		error ("swap", ERR_2FEWARG, NULL);
X	}
X}
X
X
X/*
X	clear stack
X*/
void c_clear (void)
X{
X	while (stack) {
X		c_drop ();
X	}
X}
X
X/*
X	duplicate topmost element
X*/
X
void c_dup (void)
X{
X#ifdef TRACE
X	printf ("c_dup () {\n");
X#endif
X	if (stack) {
X		push (stack->obj);
X	} else {
X		error ("DUP", ERR_2FEWARG);
X	}
X#ifdef TRACE
X	printf ("} c_dup\n");
X#endif
X}
END_OF_FILE
if test 1268 -ne `wc -c <'stackcmd.c'`; then
    echo shar: \"'stackcmd.c'\" unpacked with wrong size!
fi
chmod +x 'stackcmd.c'
# end of 'stackcmd.c'
fi
if test -f 'stackcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'stackcmd.h'\"
else
echo shar: Extracting \"'stackcmd.h'\" \(369 characters\)
sed "s/^X//" >'stackcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Stack commands
X
X0.0	hjp	89-06-14
X
X	initial version: DROP, SWAP, CLEAR
X
X0.1	hjp	89-07-14
X
X	DUP added
X
X****************************************************************/
X
X#ifndef I_stackcmd
X
X	#define I_stackcmd
X
X	void	c_drop	(void);
X	void	c_swap	(void);
X	void	c_clear	(void);
X	void	c_dup	(void);
X
X#endif
END_OF_FILE
if test 369 -ne `wc -c <'stackcmd.h'`; then
    echo shar: \"'stackcmd.h'\" unpacked with wrong size!
fi
chmod +x 'stackcmd.h'
# end of 'stackcmd.h'
fi
if test -f 'storecmd.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'storecmd.c'\"
else
echo shar: Extracting \"'storecmd.c'\" \(3166 characters\)
sed "s/^X//" >'storecmd.c' <<'END_OF_FILE'
X/****************************************************************
X
Module:
X	StoreCmd
X
Description:
X	Commands for manipulating variables
X
X
Modification history:
X
X0.0	hjp	89-07-08
X
X	initial version.
X
X0.1	hjp:	89-07-25
X
X	comments added.
X
X0.2	hjp:	89-08-14
X
X	PURGE and USER added.
X
X0.3	hjp:	89-11-08
X
X	STO now globbers existing variables.
X
X0.4	hjp:	89-11-23
X
X	PURGE now can delete files.
X	(This would belong into FileCmd, but I didn't want 2 purges.)
X
X0.5	hjp	90-03-03
X
X	malloc replaced by mallocobj (at last!).
X
X****************************************************************/
X
X#include <stddef.h>
X#include <stdio.h>
X#include <string.h>
X
X#include "rpl.h"
X#include "errors.h"
X#include "intcmd.h"
X#include "stackcmd.h"
X#include "storecmd.h"
X#include "globvar.h"
X#include "debug.h"
X
X/*
X	STO: store object in variable
X
X	2: obj	1: qname	->
X*/
X
void	c_sto	(void)
X{
X	listobj * a, * b;
X	varobj	* p;
X
X	if ((b = stack) && (a = stack->next)) {
X
X		if (b->obj->id != QNAME) {
X
X			error ("STO", ERR_WRTYPE, NULL);
X
X		} else if (p = findvar (((nameobj *) b->obj)->name)) {
X
X			destroy (p->val, 1);	/*	destroy old contents of variable	*/
X
X			c_drop ();		/*	drop name	*/
X
X			p->val = a->obj;
X
X			stack = a->next;	/*	drop stored object w/o destroing it !!	*/
X			a->obj = NULL;
X			destroy (a, 0);
X
X		} else if (p = mallocobj (VARIABLE)) {
X
X			p->id = VARIABLE;
X			p->link = 1;
X			p->size = sizeof (varobj);
X			strcpy (p->name, ((nameobj *) b->obj)->name);
X
X			c_drop ();		/*	drop name	*/
X
X			p->val = a->obj;
X
X			stack = a->next;	/*	drop stored object w/o destroing it !!	*/
X			a->obj = NULL;
X			destroy (a, 0);
X
X			p->next = vars; 	/*	hook it into variable list	*/
X			vars = p;
X
X		}
X	} else {
X
X		error ("STO", ERR_2FEWARG, NULL);
X	}
X}
X
X/*
X	RCL: recall variable
X	1: qname	->	1: obj
X*/
X
void	c_rcl (void)
X{
X	nameobj * a;
X	varobj	* p;
X
X	if (! stack) {
X		error ("RCL", ERR_2FEWARG, NULL);
X		return;
X	}
X
X	if ((a = stack->obj)->id != QNAME) {
X		error ("RCL", ERR_WRTYPE, NULL);
X		return;
X	}
X
X	for (p = vars; p && strcmp (a->name, p->name); p = p->next);
X
X	c_drop ();
X
X	if (p) {
X		push (p->val);
X	} else {
X		error ("RCL", ERR_NXVAR, NULL);
X		return;
X	}
X}
X
X/*
X	USER: show user variables
X*/
X
void	c_user (void)
X{
X	varobj	* p;
X
X	if (vars) {
X		for (p = vars; p; p = p->next) {
X			printf ("'%s'\n", p->name);
X		}
X	} else {
X		error ("USER", ERR_NOVAR, NULL);
X		return;
X	}
X}
X
X/*
X	PURGE: purge user variable(s) or file.
X
X	1:qname	->
X	1:v	->		(the variable with name v is purged)
X
X	1:string	->
X	1:s		->	(the file with name s is unlinked)
X*/
X
void	c_purge (void)
X{
X	nameobj * a;
X	varobj	* p, * pp;
X
X	if (! stack) {
X		error ("PURGE", ERR_2FEWARG, NULL);
X		return;
X	}
X
X	if ((a = stack->obj)->id == QNAME) {
X
X		for (pp = NULL, p = vars;
X		     p && strcmp (a->name, p->name);
X		     pp = p, p = p->next);
X
X		c_drop ();
X
X		if (p) {
X			if (pp) {
X				pp->next = p->next;
X			} else {
X				vars = p->next;
X			}
X			destroy (p, 1);
X		} else {
X			error ("PURGE", ERR_NXVAR, NULL);
X			return;
X		}
X	} else if ((a = stack->obj)->id == STRING) {
X		if (unlink (((stringobj *) a)->val) == -1) {
X			error ("PURGE", ERR_DOS, strerror (errno));
X		}
X		c_drop ();
X	} else {
X		error ("PURGE", ERR_WRTYPE, NULL);
X		return;
X	}
X}
END_OF_FILE
if test 3166 -ne `wc -c <'storecmd.c'`; then
    echo shar: \"'storecmd.c'\" unpacked with wrong size!
fi
chmod +x 'storecmd.c'
# end of 'storecmd.c'
fi
if test -f 'storecmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'storecmd.h'\"
else
echo shar: Extracting \"'storecmd.h'\" \(360 characters\)
sed "s/^X//" >'storecmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Store commands
X
X0.0	hjp	89-07-08
X
X	initial version
X
X0.1	hjp	89-08-14
X
X	PURGE and USER added
X
X****************************************************************/
X
X#ifndef I_storecmd
X
X	#define I_storecmd
X
X	void	c_sto	(void);
X	void	c_rcl	(void);
X	void	c_purge	(void);
X	void	c_user	(void);
X
X#endif
END_OF_FILE
if test 360 -ne `wc -c <'storecmd.h'`; then
    echo shar: \"'storecmd.h'\" unpacked with wrong size!
fi
chmod +x 'storecmd.h'
# end of 'storecmd.h'
fi
if test -f 'trigcmd.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'trigcmd.h'\"
else
echo shar: Extracting \"'trigcmd.h'\" \(460 characters\)
sed "s/^X//" >'trigcmd.h' <<'END_OF_FILE'
X/****************************************************************
X
X	Functions used for implementing user trigonometric commands
X
X0.0	hjp	89-12-03
X
X	initial version
X	SIN, COS, TAN, ASIN, ACOS, ATAN extracted from ArithCmd.
X
X****************************************************************/
X
X#ifndef I_trigcmd
X
X	#define I_trigcmd
X
X	void	c_acos	(void);
X	void	c_asin	(void);
X	void	c_atan	(void);
X	void	c_cos	(void);
X	void	c_sin	(void);
X	void	c_tan	(void);
X
X#endif
END_OF_FILE
if test 460 -ne `wc -c <'trigcmd.h'`; then
    echo shar: \"'trigcmd.h'\" unpacked with wrong size!
fi
chmod +x 'trigcmd.h'
# end of 'trigcmd.h'
fi
echo shar: End of shell archive.
exit 0