[net.micro.atari16] Proff Part 1 of 4

bammi@cwruecmp.UUCP (Jwahar R. Bammi) (03/22/86)

#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	debug.h
#	decl.h
#	defs.h
#	dostuff2.c
#	eval.c
#	lextab.d
#	lextab.h
#	lnk
#	look.c
#	lookup.c
#	lookup.h
#	ltb.c
#	make.sh
#	makefile
#	map.c
# This archive created: Fri Mar 21 22:45:00 1986
# By:	Jwahar R. Bammi ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'debug.h'" '(123 characters)'
if test -f 'debug.h'
then
	echo shar: over-writing existing file "'debug.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'debug.h'
X/*
X#define DEBUG
X#define PROFILE
X*/
X
X#ifdef PROFILE
X#define dprintf(str)	printf((str));
X#else
X#define dprintf(str)
X#endif
X
SHAR_EOF
if test 123 -ne "`wc -c 'debug.h'`"
then
	echo shar: error transmitting "'debug.h'" '(should have been 123 characters)'
fi
echo shar: extracting "'decl.h'" '(3858 characters)'
if test -f 'decl.h'
then
	echo shar: over-writing existing file "'decl.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'decl.h'
X/*
X * Decl.h
X *	Declarations for commonly used C functions.
X *	The way we use it is in stdio.h we put in
X *	the following lines:
X *
X *	#ifdef DECL
X *	#include <decl.h>
X *	#endif
X *
X *	and when we compile, we declare DECL, so that it
X *	decl.h gets included and we have all the functions
X *	that return types other than int, appropriately declared.
X */
X
X
X/*
Xchar *getcwd(char *, int);
X*/
X
X/*
Xchar *calloc(unsigned int, unsigned int);
X*/
Xextern	char *calloc();
X
X/*
Xchar *malloc(unsigned int);
X*/
Xextern	char *malloc();
X
X/*
Xchar *realloc(char *, unsigned int);
X*/
Xextern	char *realloc();
X
X/*
Xchar *sbrk(int);
X*/
Xextern	char *sbrk();
X
X
X#ifndef HUGE
X	/* HUGE is defined if math.h has been included */
X/*
Xdouble acos(double);
X*/
Xextern	double acos();
X
X/*
Xdouble asin(double);
X*/
Xextern	double asin();
X
X/*
Xdouble atan(double);
X*/
Xextern	double atan();
X
X/*
Xdouble atan2(double, double);
X*/
X/*
Xextern	double atan2();
X*/
X
X/*
Xdouble atof(char *);
X*/
Xextern	double atof();
X
X/*
Xdouble ceil(double);
X*/
Xextern	double ceil();
X
X/*
Xdouble cos(double);
X*/
Xextern	double cos();
X
X/*
Xdouble cosh(double);
X*/
Xextern	double cosh();
X
X/*
Xdouble exp(double);
X*/
Xextern	double exp();
X
X/*
Xdouble fabs(double);
X*/
Xextern	double fabs();
X
X/*
Xdouble floor(double);
X*/
Xextern	double floor();
X
X/*
Xdouble fmod(double, double);
X*/
Xextern	double fmod();
X
X/*
Xdouble frexp(double, int *);
X*/
X/*
Xextern	double frexp();
X*/
X
X/*
Xdouble hypot(double, double);
X*/
X/*
Xextern	double hypot();
X*/
X
X/*
Xdouble j0(double);
X*/
X/*
Xextern	double j0();
X*/
X
X/*
Xdouble j1(double);
X*/
X/*
Xextern	double j1();
X*/
X
X/*
Xdouble jn(int, double);
X*/
X/*
Xextern	double jn();
X*/
X
X/*
Xdouble ldexp(double, double);
X*/
X/*
Xextern	double ldexp();
X*/
X
X/*
Xdouble log(double);
X*/
Xextern	double log();
X
X/*
Xdouble log10(double);
X*/
Xextern	double log10();
X
X/*
Xdouble modf(double, double *);
X*/
Xextern	double modf();
X
X/*
Xdouble pow(double, double);
X*/
Xextern	double pow();
X
X/*
Xdouble sin(double);
X*/
Xextern	double sin();
X
X/*
Xdouble sinh(double);
X*/
X/*
Xextern	double sinh();
X*/
X
X/*
Xdouble sqrt(double);
X*/
Xextern	double sqrt();
X
X/*
Xdouble tan(double);
X*/
X/*
Xextern	double tan();
X*/
X
X/*
Xdouble tanh(double);
X*/
X/*
Xextern	double tanh();
X*/
X
X/*
Xdouble y0(double);
X*/
X/*
Xextern	double y0();
X*/
X
X/*
Xdouble y1(double);
X*/
X/*
Xextern	double y1();
X*/
X
X/*
Xdouble yn(int, double);
X*/
X/*
Xextern	double yn();
X*/
X
X#endif	/* HUGE */
X
X
X/*
Xint (*signal(int, int (*)()))();
X*/
Xextern	int (*signal())();
X
X/*
XFILE *fdopen(int, char *);
X*/
Xextern	FILE *fdopen();
X
X/*
Xchar *fgets(char *, int, FILE *);
X*/
Xextern	char *fgets();
X
X/*
XFILE *fopen(char *, char *);
X*/
Xextern	FILE *fopen();
X
X/*
XFILE *freopen(char *, char *, FILE *);
X*/
Xextern	FILE *freopen();
X
X/*
Xlong ftell(FILE *);
X*/
Xextern	long ftell();
X
X/*
Xchar *gets(char *);
X*/
Xextern	char *gets();
X
X/*
Xlong lseek(int, long, int);
X*/
Xextern	long lseek();
X
X/*
Xchar *mktemp(char *);
X*/
Xextern	char *mktemp();
X
X/*
Xlong tell(int);
X*/
Xextern	long tell();
X
X
X/*
Xlong atol(char *);
X*/
Xextern	long atol();
X
X/*
Xchar *ecvt(double, int, int *, int *);
X*/
Xextern	char *ecvt();
X
X/*
Xchar *fcvt(double, int, int *, int *);
X*/
Xextern	char *fcvt();
X
X/*
Xchar *gcvt(double, int, char *);
X*/
Xextern	char *gcvt();
X
X/*
Xchar *getenv(char *);
X*/
Xextern	char *getenv();
X
X/*
Xchar *itoa(int, char *, int);
X*/
Xextern	char *itoa();
X
X/*
Xlong labs(long);
X*/
Xextern	long labs();
X
X/*
Xchar *ltoa();
X*/
Xextern	char *ltoa();
X
X/*
Xchar *ultoa(unsigned long, char *, int);
X*/
Xextern	char *ultoa();
X
X
X/*
Xchar *strcat(char *, char *);
X*/
Xextern	char *strcat();
X
X/*
Xchar *strcpy(char *, char *);
X*/
Xextern	char *strcpy();
X
X/*
Xunsigned int strlen(char *);
X*/
Xextern	unsigned int strlen();
X
X/*
Xchar *strncat(char *, char *, unsigned int);
X*/
Xextern	char *strncat();
X
X/*
Xchar *strncpy(char *, char *, unsigned int);
X*/
Xextern	char *strncpy();
X
X/*
Xchar	*index(char *, char);
X*/
Xextern	char	*index();
X
X/*
Xchar	*rindex(char *, char);
X*/
Xextern	char	*rindex();
SHAR_EOF
if test 3858 -ne "`wc -c 'decl.h'`"
then
	echo shar: error transmitting "'decl.h'" '(should have been 3858 characters)'
fi
echo shar: extracting "'defs.h'" '(1855 characters)'
if test -f 'defs.h'
then
	echo shar: over-writing existing file "'defs.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'defs.h'
X/*
X * defs.h
X *
X * #define rainbow	- rainbow CP/M-86 version
X * #define vms		- vms version (predefined by VAX11C compiler)
X * #define unix		- unix version
X * #define ATARIST	- Atari St series
X */
X
X/*
X *  Synonyms for ASCII control characters
X *
X */
X
X#define	BACKSPACE	8
X#define	BEL		7
X#define BELL		7
X#define	BLANK		32
X#define	CARRIAGE_RETURN	13
X#define	NEWLINE		10
X#define	RUBOUT		127
X#define	TAB		9
X
X/*
X * misc. definitions
X *
X */
X
X#define	EOS		0
X#define	HUGE		30000
X#define	NO		0
X#define	OK		0
X#define	YES		1
X#define FALSE		0
X#define TRUE		1
X#define	FILENAMESIZE	50
X#define	MAXCHARS	20
X#define MAXLINE		256
X#define MAXTOK		80
X#define ARB		MAXLINE
X
X#define	MAXCARD		MAXLINE-1
X#define	MAXNAME		FILENAMESIZE
X
X#define	NCHARS		33
X#define MAXOFILES	12
X
X#define	ARGFLAG	'$' 
X#define	INSIZE	MAXLINE 
X#define	MAXOUT	2*MAXLINE 
X#define	MAXDEF	200 
X#define	NFILES	MAXOFILES-4
X#define	PAGENUM		'#' 
X#define	CURRENTDATE	'%' 
X#define ESCAPE		'@'
X#define VESCAPE		'$'
X#define	PAGEJECT	12          /* 12 is ASCII formfeed (control-L) */
X#define	PAGEWIDTH	65 
X#define	PAGELEN		62 
X#define	BUFSIZE		512    	    /* push back buffer */
X/*
X * lexical analyser values
X *
X * include lexical analyser return constants
X * generated by ltb.
X *
X */
X#include "lextab.d"		/* expended format & roff & runoff */
X
X#define	UNKNOWN	999
X#define MACRO	0
X#define NEGATED -1
X#define	LEFT	1 
X#define	CENTER	2 
X#define	RIGHT	3
X
X/*
X * structure definition for contents linked list
X *
X */
X
Xstruct clist {		/* list struct for contents  */
X	char level;
X	char *str;
X	int  page;
X	struct clist *nextc;
X};
X
X#ifdef putchar
X#undef putchar
X#ifdef ATARIST
X#define putchar(c) st_putc((c),poutput);
X#else
X#define putchar(c) putc((c),poutput);
X#endif
X#endif
X
X/*
X * The following definitions are required
X * till they fix gemlib
X */
X
X#ifdef ATARIST
X#define printf st_printf
X#define fprintf st_fprintf
X#endif
SHAR_EOF
if test 1855 -ne "`wc -c 'defs.h'`"
then
	echo shar: error transmitting "'defs.h'" '(should have been 1855 characters)'
fi
echo shar: extracting "'dostuff2.c'" '(2935 characters)'
if test -f 'dostuff2.c'
then
	echo shar: over-writing existing file "'dostuff2.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'dostuff2.c'
X#include <stdio.h>
X#include <ctype.h>
X#include "proff.h"
X#include "debug.h"
X
X/*
X * dodef - define a command macro (".de xx" is in buf.)
X *
X */
Xdodef(buf,fd)
Xchar buf[];
XFILE *fd;
X{
X	char name[MAXNAME],defn[MAXDEF];
X	int i,junk;
X
X#ifdef DEBUG
X	printf("dodef++: Fd %ld\n",fd);
X#endif
X
X	dprintf("dodef  ");
X	i = 0;
X	junk = getwrd(buf, &i, name);
X	i = getwrd(buf, &i, name);	/* get the name */
X	if (i == 0)
X		error("missing name in command def.");
X	i = 0;
X	while (ngetln(buf,fd) != EOF) {
X		if (buf[0] == cchar && buf[1] == 'e' &&
X		    buf[2] == 'n' && !isalnum(buf[3]))
X			break;
X		junk = addstr(buf, defn, &i, MAXDEF);
X	}
X	if (addset(EOS, defn, &i, MAXDEF) == NO)
X		error("definition too long.\n");
X	if (install(name, defn, macrotab) == NULL)
X		fprintf(stderr,"no room for new definition.\n");
X#ifdef DEBUG
X	printf("dodef: %s (name) %s (defn)\n",name,defn);
X#endif
X}
X
X/*
X * doesc - expand escapes in buf
X *
X */
Xdoesc(buf, tbuf, size)
Xchar buf[];
Xchar tbuf[];
Xint size;
X{
X	int i,j;
X
X	dprintf("doesc  ");
X	j = 0;
X	for (i = 0; buf[i] != EOS && j < size-1; i++)
X		/*
X		 * clean up generic escapes along the way.
X		 */
X		if (buf[i] == genesc)
X			tbuf[j++] = buf[++i];
X
X		else if (buf[i] != ESCAPE) {
X			tbuf[j] = buf[i];
X			j++;
X		}
X		else if (buf[i+1] == 'n' &&
X		    (buf[i+2] >= 'a' && buf[i+2] <= 'z')) {
X			j += itoc(nr[buf[i+2] - 'a'],
X			&tbuf[j], size - j - 1);
X			i += 2;
X		}
X		else {
X			tbuf[j] = buf[i];
X			j++;
X		}
X	tbuf[j] = EOS;
X	strcpy(buf, tbuf);
X}
X
X/*
X * dovar - expand variables in buf
X *
X */
Xdovar(tbuf, buf)
Xchar *buf;
Xchar *tbuf;
X{
X	register char *c, *p, t;
X	struct hashlist *xp;
X
X	while (*buf != '\0') {
X		if (*buf == genesc) {
X			*tbuf++ = *buf++;
X			*tbuf++ = *buf;
X		}
X		else if (*buf != VESCAPE)
X			*tbuf++ = *buf;
X		else {
X			buf++;	 /* skip the ESCAPE */
X			if (*buf == '{')
X				buf++;
X			p = buf; /* save the beginning address of variable */
X			while (isalnum(*buf))
X				buf++;
X			t = *buf;	/* save the character*/
X			*buf = '\0';	/* hack a null there */
X			if ((xp = lookup(p,gentab)) != NULL) {
X				c = xp->def;	/* point to def */
X				while (*c != '\0')
X					*tbuf++ = *c++;
X			}
X			if (*(p-1) != '{')
X				*tbuf++ = t;
X			else if (t != '}')
X				fprintf(stderr, "missing \"}\" in %s\n",p);
X		}
X		buf++;
X	}
X	*tbuf = '\0';
X}
X
X
X/*
X * dotabs - expand tabs in buf
X *
X */
Xdotabs(buf,tbuf,size)
Xchar buf[];
Xchar tbuf[];
Xint size;
X{
X	int i,j;
X	dprintf("dotabs  ");
X
X	j = 0;
X	for (i = 0; buf[i] != EOS && j < size - 1; i++)
X		if (buf[i] == '\t')
X			while (j < size - 1) {
X				tbuf[j] = ' ';
X				j++;
X				if (tabs[j] == YES || j > INSIZE)
X					break;
X			}
X		else {
X			tbuf[j] = buf[i];
X			j++;
X		}
X	tbuf[j] = EOS;
X	strcpy(buf, tbuf);
X}
X
X/*
X * docline - produce a "contents" line.
X *
X */
Xdocline(str,width,cline,page)
Xchar *str;
Xint width;
Xchar *cline;
Xint page;
X{
X	int i;
X
X	for (i = 0; i < width - 6 && cline[i] != '\0'; i++)
X		str[i] = cline[i];
X	while (i < width - 6)
X		str[i++] = '.';
X	sprintf(str+i,"%5d\n",page);
X}
X
SHAR_EOF
if test 2935 -ne "`wc -c 'dostuff2.c'`"
then
	echo shar: error transmitting "'dostuff2.c'" '(should have been 2935 characters)'
fi
echo shar: extracting "'eval.c'" '(1296 characters)'
if test -f 'eval.c'
then
	echo shar: over-writing existing file "'eval.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'eval.c'
X#include <stdio.h>
X#include <ctype.h>
X#include "proff.h"
X#include "debug.h"
X
X
X/*
X * eval - evaluate defined command (push back definition)
X *
X */
Xeval(buf,defn)
Xchar buf[];
Xchar defn[];
X{
X	register int j,k;
X	int i;
X	int argptr[10];
X
X	for (i = 0; i < 10 ; i++)
X		argptr[i] = 0;
X 
X	buf[0] = '\0';		/* buf[0] is cchar */
X	dprintf(defn);
X	dprintf("eval  ");
X	i = 1;
X	argptr[0] = 1;		/* first parm is macro name */
X	while (buf[i] != ' ' && buf[i] != '\t' &&
X	    buf[i] != '\n' && buf[i] != '\0')
X		i++;
X	buf[i++] = '\0';		/* EOS terminate */
X	/*
X	 * start scanning remaining macro parameters.
X	 * delimiters are blanks or commas. Any string
X	 * enclosed with double quotes are accepted as
X	 * parameters as well
X	 *
X	 */
X	for (j = 1; j < 10; j++) {
X		skipbl(buf, &i);
X		if (buf[i] == '\n' || buf[i] == '\0')
X			break;
X		argptr[j] = i;
X		while (buf[i] != ' ' && buf[i] != '\t' &&
X		    buf[i] != ',' && buf[i] != '\n' && buf[i] != '\0')
X			i++;
X		buf[i] = '\0';
X		i++;
X	}
X	for (k = strlen(defn) - 1; k >= 0; k--)
X		if (defn[k-1] != ARGFLAG)
X			putbak(defn[k]);
X		else {
X			if (defn[k] < '0' || defn[k] > '9')
X				putbak(defn[k]);
X			else {
X				i = defn[k] - '0';
X				i = argptr[i];
X				pbstr(&buf[i]);
X				k--;		/* skip over $ */
X			}
X		}
X	if (k = 0)	/* do the last character */
X		putbak(defn[k]);
X}
X
SHAR_EOF
if test 1296 -ne "`wc -c 'eval.c'`"
then
	echo shar: error transmitting "'eval.c'" '(should have been 1296 characters)'
fi
echo shar: extracting "'lextab.d'" '(856 characters)'
if test -f 'lextab.d'
then
	echo shar: over-writing existing file "'lextab.d'"
fi
sed 's/^X//' << \SHAR_EOF > 'lextab.d'
X#define  DBO	5
X#define  EBO	7
X#define  NAP	101
X#define  NPA	13
X#define  GET	95
X#define  PGI	11
X#define  M1	45
X#define  M2	47
X#define  M3	49
X#define  ELT	109
X#define  M4	51
X#define  LEX	89
X#define  SAV	85
X#define  CC	19
X#define  BD	3
X#define  SET	93
X#define  EC	27
X#define  CE	21
X#define  DE	25
X#define  EF	29
X#define  HE	37
X#define  EH	31
X#define  LTR	107
X#define  CL	103
X#define  FI	33
X#define  IG	91
X#define  AP	99
X#define  BP	9
X#define  PC	105
X#define  NE	53
X#define  OE	63
X#define  NF	55
X#define  BR	15
X#define  RST	87
X#define  OF	65
X#define  FO	35
X#define  BS	17
X#define  OH	67
X#define  IN	39
X#define  NJ	57
X#define  CU	23
X#define  PL	69
X#define  TI	81
X#define  PN	97
X#define  RM	73
X#define  PO	71
X#define  LS	43
X#define  JU	41
X#define  NR	59
X#define  UL	83
X#define  SO	75
X#define  SP	77
X#define  OU	61
X#define  ST	79
X#define  WR	111
X#define  RESET	1
SHAR_EOF
if test 856 -ne "`wc -c 'lextab.d'`"
then
	echo shar: error transmitting "'lextab.d'" '(should have been 856 characters)'
fi
echo shar: extracting "'lextab.h'" '(9281 characters)'
if test -f 'lextab.h'
then
	echo shar: over-writing existing file "'lextab.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'lextab.h'
X#ifndef STRUC_DEFINED
X
X/*	lextab.h	*/
X
Xstruct _lex_h { 	char 	*__s;
X		  	int 	 __v;
X		  	int  	 __f;
X		struct  _lex_h  *__l;
X};
X
X#define STRUC_DEFINED
X#endif
Xstruct
X_lex_h __ce = {  "ce",
X                  21,     0,NULL };
Xstruct
X_lex_h __ec = {  "ec",
X                  27,     0,&__ce };
Xstruct
X_lex_h __de = {  "de",
X                  25,     0,NULL };
Xstruct
X_lex_h __f = {  "f",
X                  33,     1,NULL };
Xstruct
X_lex_h __ef = {  "ef",
X                  29,     0,NULL };
Xstruct
X_lex_h __nojustify = {  "nojustify",
X                  57,     0,&__ef };
Xstruct
X_lex_h __eh = {  "eh",
X                  31,     0,NULL };
Xstruct
X_lex_h __he = {  "he",
X                  37,     0,&__eh };
Xstruct
X_lex_h __j = {  "j",
X                  41,     1,NULL };
Xstruct
X_lex_h __fi = {  "fi",
X                  33,     0,NULL };
Xstruct
X_lex_h __na = {  "na",
X                  99,     0,&__fi };
Xstruct
X_lex_h __cl = {  "cl",
X                 103,     0,&__na };
Xstruct
X_lex_h __ig = {  "ig",
X                  91,     0,NULL };
Xstruct
X_lex_h __dbo = {  "dbo",
X                   5,     1,NULL };
Xstruct
X_lex_h __pa = {  "pa",
X                  11,     1,&__dbo };
Xstruct
X_lex_h __ap = {  "ap",
X                  99,     1,&__pa };
Xstruct
X_lex_h __el = {  "el",
X                 109,     1,&__ap };
Xstruct
X_lex_h __ebo = {  "ebo",
X                   7,     1,NULL };
Xstruct
X_lex_h __bp = {  "bp",
X                   9,     0,&__ebo };
Xstruct
X_lex_h __ne = {  "ne",
X                  53,     0,NULL };
Xstruct
X_lex_h __pc = {  "pc",
X                 105,     0,&__ne };
Xstruct
X_lex_h __br = {  "br",
X                  15,     1,NULL };
Xstruct
X_lex_h __need = {  "need",
X                  53,     0,&__br };
Xstruct
X_lex_h __nf = {  "nf",
X                  55,     1,&__need };
Xstruct
X_lex_h __oe = {  "oe",
X                  63,     0,&__nf };
Xstruct
X_lex_h __noautoparagraph = {  "noautoparagraph",
X                 101,     1,&__oe };
Xstruct
X_lex_h __page = {  "page",
X                   9,     1,NULL };
Xstruct
X_lex_h __bs = {  "bs",
X                  17,     0,&__page };
Xstruct
X_lex_h __cchar = {  "cchar",
X                  19,     0,&__bs };
Xstruct
X_lex_h __fo = {  "fo",
X                  35,     0,&__cchar };
Xstruct
X_lex_h __of = {  "of",
X                  65,     0,&__fo };
Xstruct
X_lex_h __pg = {  "pg",
X                   9,     1,NULL };
Xstruct
X_lex_h __echar = {  "echar",
X                  27,     0,&__pg };
Xstruct
X_lex_h __in = {  "in",
X                  39,     0,&__echar };
Xstruct
X_lex_h __oh = {  "oh",
X                  67,     0,&__in };
Xstruct
X_lex_h __s = {  "s",
X                  77,     1,&__oh };
Xstruct
X_lex_h __cu = {  "cu",
X                  23,     0,NULL };
Xstruct
X_lex_h __nj = {  "nj",
X                  57,     1,&__cu };
Xstruct
X_lex_h __bold = {  "bold",
X                   3,     0,NULL };
Xstruct
X_lex_h __break = {  "break",
X                  15,     1,&__bold };
Xstruct
X_lex_h __header = {  "header",
X                  37,     0,&__break };
Xstruct
X_lex_h __lm = {  "lm",
X                  39,     1,&__header };
Xstruct
X_lex_h __define = {  "define",
X                  25,     0,NULL };
Xstruct
X_lex_h __nap = {  "nap",
X                 101,     1,&__define };
Xstruct
X_lex_h __pl = {  "pl",
X                  69,     0,NULL };
Xstruct
X_lex_h __get = {  "get",
X                  95,     0,&__pl };
Xstruct
X_lex_h __ti = {  "ti",
X                  81,     0,NULL };
Xstruct
X_lex_h __vg = {  "vg",
X                  95,     0,&__ti };
Xstruct
X_lex_h __np = {  "np",
X                  13,     0,NULL };
Xstruct
X_lex_h __pn = {  "pn",
X                  97,     0,&__np };
Xstruct
X_lex_h __fill = {  "fill",
X                  33,     1,NULL };
Xstruct
X_lex_h __ju = {  "ju",
X                  41,     0,&__fill };
Xstruct
X_lex_h __ls = {  "ls",
X                  43,     0,&__ju };
Xstruct
X_lex_h __po = {  "po",
X                  71,     0,&__ls };
Xstruct
X_lex_h __rm = {  "rm",
X                  73,     1,&__po };
Xstruct
X_lex_h __nr = {  "nr",
X                  59,     0,NULL };
Xstruct
X_lex_h __lt = {  "lt",
X                 107,     1,&__nr };
Xstruct
X_lex_h __ul = {  "ul",
X                  83,     0,NULL };
Xstruct
X_lex_h __spc = {  "spc",
X                  43,     1,NULL };
Xstruct
X_lex_h __so = {  "so",
X                  75,     0,&__spc };
Xstruct
X_lex_h __ps = {  "ps",
X                  69,     1,NULL };
Xstruct
X_lex_h __sp = {  "sp",
X                  77,     0,&__ps };
Xstruct
X_lex_h __left = {  "left",
X                  81,     1,&__sp };
Xstruct
X_lex_h __tp = {  "tp",
X                  53,     1,NULL };
Xstruct
X_lex_h __ou = {  "ou",
X                  61,     0,&__tp };
Xstruct
X_lex_h __req = {  "req",
X                  75,     1,&__ou };
Xstruct
X_lex_h __lx = {  "lx",
X                  89,     0,&__req };
Xstruct
X_lex_h __rs = {  "rs",
X                  87,     0,NULL };
Xstruct
X_lex_h __lex = {  "lex",
X                  89,     0,&__rs };
Xstruct
X_lex_h __paging = {  "paging",
X                  11,     1,NULL };
Xstruct
X_lex_h __st = {  "st",
X                  79,     0,NULL };
Xstruct
X_lex_h __save = {  "save",
X                  85,     0,&__st };
Xstruct
X_lex_h __set = {  "set",
X                  93,     0,NULL };
Xstruct
X_lex_h __sv = {  "sv",
X                  85,     0,NULL };
Xstruct
X_lex_h __vs = {  "vs",
X                  93,     0,&__sv };
Xstruct
X_lex_h __wr = {  "wr",
X                 111,     0,&__vs };
Xstruct
X_lex_h __skip = {  "skip",
X                  77,     1,NULL };
Xstruct
X_lex_h __include = {  "include",
X                  75,     0,NULL };
Xstruct
X_lex_h __center = {  "center",
X                  21,     0,NULL };
Xstruct
X_lex_h __spacing = {  "spacing",
X                  43,     1,&__center };
Xstruct
X_lex_h __nofill = {  "nofill",
X                  55,     0,NULL };
Xstruct
X_lex_h __ignore = {  "ignore",
X                  91,     0,&__nofill };
Xstruct
X_lex_h __reset = {  "reset",
X                   1,     0,NULL };
Xstruct
X_lex_h __offset = {  "offset",
X                  71,     0,&__reset };
Xstruct
X_lex_h __literal = {  "literal",
X                 107,     1,NULL };
Xstruct
X_lex_h __enablebolding = {  "enablebolding",
X                   7,     1,NULL };
Xstruct
X_lex_h __nopaging = {  "nopaging",
X                  13,     1,NULL };
Xstruct
X_lex_h __footer = {  "footer",
X                  35,     0,NULL };
Xstruct
X_lex_h __outend = {  "outend",
X                  63,     0,&__footer };
Xstruct
X_lex_h __write = {  "write",
X                 111,     0,&__outend };
Xstruct
X_lex_h __pagesize = {  "pagesize",
X                  69,     1,NULL };
Xstruct
X_lex_h __source = {  "source",
X                  75,     0,NULL };
Xstruct
X_lex_h __m1 = {  "m1",
X                  45,     0,NULL };
Xstruct
X_lex_h __disablebolding = {  "disablebolding",
X                   5,     1,NULL };
Xstruct
X_lex_h __m2 = {  "m2",
X                  47,     0,&__disablebolding };
Xstruct
X_lex_h __m3 = {  "m3",
X                  49,     0,NULL };
Xstruct
X_lex_h __contline = {  "contline",
X                 103,     0,&__m3 };
Xstruct
X_lex_h __endliteral = {  "endliteral",
X                 109,     1,&__contline };
Xstruct
X_lex_h __m4 = {  "m4",
X                  51,     0,NULL };
Xstruct
X_lex_h __testpage = {  "testpage",
X                  53,     1,&__m4 };
Xstruct
X_lex_h __pagenumber = {  "pagenumber",
X                  97,     0,NULL };
Xstruct
X_lex_h __leftmargin = {  "leftmargin",
X                  39,     1,NULL };
Xstruct
X_lex_h __require = {  "require",
X                  75,     1,&__leftmargin };
Xstruct
X_lex_h __skipto = {  "skipto",
X                  79,     0,NULL };
Xstruct
X_lex_h __underline = {  "underline",
X                  83,     0,&__skipto };
Xstruct
X_lex_h __restore = {  "restore",
X                  87,     0,NULL };
Xstruct
X_lex_h __rightmargin = {  "rightmargin",
X                  73,     1,NULL };
Xstruct
X_lex_h __justify = {  "justify",
X                  41,     1,NULL };
Xstruct
X_lex_h __output = {  "output",
X                  61,     0,NULL };
Xstruct
X_lex_h __autoparagraph = {  "autoparagraph",
X                  99,     1,NULL };
Xstruct
X_lex_h __printcont = {  "printcont",
X                 105,     0,NULL };
Xstruct
X_lex_h __bd = {  "bd",
X                   3,     0,NULL };
Xstruct
X_lex_h __db = {  "db",
X                   5,     0,&__bd };
Xstruct
X_lex_h __cc = {  "cc",
X                  19,     0,&__db };
Xstruct
X_lex_h __eb = {  "eb",
X                   7,     0,NULL };
X
X
X/*  Hash Table */
X
Xstruct _lex_h *lextab[100] = {
X	&__ec,	
X	&__de,	&__f,	&__nojustify,	NULL,	
X	&__he,	&__j,	&__cl,	&__ig,	
X	&__el,	&__bp,	&__pc,	&__noautoparagraph,	
X	&__of,	NULL,	&__s,	&__nj,	
X	&__lm,	NULL,	&__nap,	&__get,	
X	&__vg,	&__pn,	&__rm,	&__lt,	
X	&__ul,	&__so,	&__left,	&__lx,	
X	&__lex,	&__paging,	&__save,	&__set,	
X	&__wr,	NULL,	NULL,	NULL,	
X	NULL,	NULL,	&__skip,	&__include,	
X	&__spacing,	NULL,	NULL,	&__ignore,	
X	NULL,	NULL,	&__offset,	NULL,	
X	&__literal,	&__enablebolding,	&__nopaging,	NULL,	
X	NULL,	NULL,	&__write,	&__pagesize,	
X	&__source,	&__m1,	&__m2,	&__endliteral,	
X	&__testpage,	&__pagenumber,	NULL,	NULL,	
X	&__require,	&__underline,	NULL,	NULL,	
X	NULL,	NULL,	NULL,	&__restore,	
X	NULL,	NULL,	NULL,	NULL,	
X	NULL,	NULL,	NULL,	&__rightmargin,	
X	NULL,	&__justify,	NULL,	NULL,	
X	NULL,	NULL,	NULL,	NULL,	
X	&__output,	NULL,	&__autoparagraph,	NULL,	
X	&__printcont,	NULL,	NULL,	NULL,	
X	NULL,	&__cc,	&__eb   };
SHAR_EOF
if test 9281 -ne "`wc -c 'lextab.h'`"
then
	echo shar: error transmitting "'lextab.h'" '(should have been 9281 characters)'
fi
echo shar: extracting "'lnk'" '(110 characters)'
if test -f 'lnk'
then
	echo shar: over-writing existing file "'lnk'"
fi
sed 's/^X//' << \SHAR_EOF > 'lnk'
Xproff.68k=gems,proff,proff01,proff02,lookup,pinit,putwrd,pxlex,\
Xpxxparse,dostuff2,eval,stack,map,gemlib,libf
SHAR_EOF
if test 110 -ne "`wc -c 'lnk'`"
then
	echo shar: error transmitting "'lnk'" '(should have been 110 characters)'
fi
echo shar: extracting "'look.c'" '(3051 characters)'
if test -f 'look.c'
then
	echo shar: over-writing existing file "'look.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'look.c'
X/*
X * from K&R "The C Prograamming language"
X * Table lookup routines
X *
X */
X#define INLOOK 1
X
X#include <stdio.h>
X#include "lookup.h"
X
Xextern struct
Xlexlist	(*(*lextable))[];/* global pointer for lexical analyser hash table */
X
X/*
X * hash - for a hash value for string s
X *
X */
Xint hash(s)
Xchar *s;
X{
X	int	hashval;
X
X	for (hashval = 0; *s != '\0';)
X		hashval += *s++;
X	return (hashval % HASHMAX);
X}
X
X/*
X * lookup - lookup for a string s in the hash table
X *
X */
Xstruct hashlist
X*lookup(s, hashtab)
Xchar *s;
Xstruct hashlist *hashtab[];
X{
X	struct hashlist *np;
X
X	for (np = hashtab[hash(s)]; np != NULL; np = np->next)
X		if (strcmp(s, np->name) == 0)
X			return(np);	/* found     */
X	return(NULL);		/* not found */
X}
X
X/*
X * install - install a string name in hashtable and its value def
X * at a given hashtable.
X */
Xstruct hashlist
X*install(name,def,hashtab)
Xchar *name;
Xchar *def;
Xstruct hashlist *hashtab[];
X{
X	int hashval;
X	struct hashlist *np, *lookup();
X	char *strsave(), *malloc();
X
X	if ((np = lookup(name, hashtab)) == NULL) {	/* not found.. */
X		np = (struct hashlist *) malloc(sizeof(*np));
X				if (np == NULL)
X			return(NULL);
X		if ((np->name = strsave(name)) == NULL)
X			return(NULL);
X		hashval = hash(np->name);
X		np->next = hashtab[hashval];
X		hashtab[hashval] = np;
X	} else					/* found..     */
X		free(np->def);			/* free prev.  */
X	if ((np->def = strsave(def)) == NULL)
X		return(NULL);
X	return(np);
X}
X
X/*
X * strsave - save string s somewhere
X *
X */
Xchar
X*strsave(s)
Xchar *s;
X{
X	char *p, *malloc();
X	register int n;
X
X	n = strlen(s) + 1;
X	if ((p = malloc(n)) != NULL)
X			strcpy(p, s);
X	return(p);
X}
X
X/*
X * lexinstal - instal a string name in hashtable and its value
X *	       used by lexical analyser to quickly match a token
X *	       and return its lexical value.
X *
X */
Xstruct lexlist
X*lexinstal(name,val,flag,lextable)
Xchar *name;
Xint val;
Xint flag;
Xstruct lexlist *lextable[];
X{
X	int hashval;
X	struct lexlist *np,*lexlook();
X	char *strsave(), *malloc();
X
X	if ((np = lexlook(name,lextable)) == NULL) {	/* not found.. */
X		np = (struct lexlist *) malloc(sizeof(*np));
X		if (np == NULL)
X			return(NULL);
X		if ((np->name = strsave(name)) == NULL)
X			return(NULL);
X		hashval = hash(np->name);
X		np->link = lextable[hashval];
X		lextable[hashval] = np;
X	}
X	np->val = val;				/* replace prev */
X	np->flag = flag;
X	return(np);
X}
X
X/*
X * lexlook - lookup for a string s in the hash table
X *	     used by lexinstal only.
X *
X */
Xstruct lexlist
X*lexlook(s,table)
Xchar *s;
Xstruct lexlist *table[];
X{
X	struct lexlist *np;
X
X	for (np = table[hash(s)]; np != NULL; np = np->link)
X		if (strcmp(s, np->name) == 0)
X			return(np);	/* found     */
X	return(NULL);		/* not found */
X}
X
X/*
X * remove an item from the hash table forever
X *
X */
Xstruct lexlist
X*remove(s, table)
Xchar *s;
Xstruct lexlist *table[];
X{
X	struct lexlist *np, *xp;
X
X	np = table[hash(s)];
X	xp = np; 
X	while (np != NULL) {
X		if (strcmp(s, np->name) == 0) {
X			xp->link = np->link;	/* remoe the link */
X			return(np);		/* return the lost */
X		}
X		xp = np; 
X		np = np->link;
X	}
X	return(NULL);
X}
X
SHAR_EOF
if test 3051 -ne "`wc -c 'look.c'`"
then
	echo shar: error transmitting "'look.c'" '(should have been 3051 characters)'
fi
echo shar: extracting "'lookup.c'" '(3122 characters)'
if test -f 'lookup.c'
then
	echo shar: over-writing existing file "'lookup.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'lookup.c'
X/*
X * from K&R "The C Programming language"
X * Table lookup routines
X *
X */
X#define INLOOK 1
X
X#include <stdio.h>
X#include "proff.h"
X
Xstruct
Xlexlist	(*(*lextable))[];/* global pointer for lexical analyser hash table */
X
X/*
X * hash - for a hash valuue for string s
X *
X */
Xint hash(s)
Xchar *s;
X{
X	int	hashval;
X
X	for (hashval = 0; *s != '\0';)
X		hashval += *s++;
X	return (hashval % HASHMAX);
X}
X
X/*
X * lookup - lookup for a string s in the hash table
X *
X */
Xstruct hashlist
X*lookup(s, hashtab)
Xchar *s;
Xstruct hashlist *hashtab[];
X{
X	struct hashlist *np;
X
X	for (np = hashtab[hash(s)]; np != NULL; np = np->next)
X		if (strcmp(s, np->name) == 0)
X			return(np);	/* found     */
X	return(NULL);		/* not found */
X}
X
X/*
X * install - install a string name in hashtable and its value def
X * at a given hashtable.
X */
Xstruct hashlist
X*install(name,def,hashtab)
Xchar *name;
Xchar *def;
Xstruct hashlist *hashtab[];
X{
X	int hashval;
X	struct hashlist *np, *lookup();
X	char *strsave(), *malloc();
X
X	if ((np = lookup(name, hashtab)) == NULL) {	/* not found.. */
X		np = (struct hashlist *) malloc(sizeof(*np));
X		p_memoryus += sizeof(*np);
X		if (np == NULL)
X			return(NULL);
X		if ((np->name = strsave(name)) == NULL)
X			return(NULL);
X		hashval = hash(np->name);
X		np->next = hashtab[hashval];
X		hashtab[hashval] = np;
X	} else					/* found..     */
X		free(np->def);			/* free prev.  */
X	if ((np->def = strsave(def)) == NULL)
X		return(NULL);
X	return(np);
X}
X
X/*
X * strsave - save string s somewhere
X *
X */
Xchar
X*strsave(s)
Xchar *s;
X{
X	char *p, *malloc();
X	register int n;
X
X	n = strlen(s) + 1;
X	if ((p = malloc(n)) != NULL) {
X		p_memoryus += n;
X		strcpy(p, s);
X	}
X	return(p);
X}
X
X/*
X * lexinstal - instal a string name in hashtable and its value
X *	       used by lexical analyser to quickly match a token
X *	       and return its lexical value.
X *
X */
Xstruct lexlist
X*lexinstal(name,val,flag,lextable)
Xchar *name;
Xint val;
Xint flag;
Xstruct lexlist *lextable[];
X{
X	int hashval;
X	struct lexlist *np,*lexlook();
X	char *strsave(), *malloc();
X
X	if ((np = lexlook(name,lextable)) == NULL) {	/* not found.. */
X		np = (struct lexlist *) malloc(sizeof(*np));
X		p_memoryus += sizeof(*np);
X		if (np == NULL)
X			return(NULL);
X		if ((np->name = strsave(name)) == NULL)
X			return(NULL);
X		hashval = hash(np->name);
X		np->link = lextable[hashval];
X		lextable[hashval] = np;
X	}
X	np->val = val;				/* replace prev */
X	np->flag = flag;
X	return(np);
X}
X
X/*
X * lexlook - lookup for a string s in the hash table
X *	     used by lexinstal only.
X *
X */
Xstruct lexlist
X*lexlook(s,table)
Xchar *s;
Xstruct lexlist *table[];
X{
X	struct lexlist *np;
X
X	for (np = table[hash(s)]; np != NULL; np = np->link)
X		if (strcmp(s, np->name) == 0)
X		return(np);	/* found     */
X	return(NULL);		/* not found */
X}
X
X/*
X * remove an item from the hash table forever
X *
X */
Xstruct lexlist
X*remove(s, table)
Xchar *s;
Xstruct lexlist *table[];
X{
X	struct lexlist *np, *xp;
X
X	np = table[hash(s)];
X	xp = np; 
X	while (np != NULL) {
X		if (strcmp(s, np->name) == 0) {
X			xp->link = np->link;	/* remove the link */
X			return(np);		/* return the lost */
X		}
X		xp = np; 
X		np = np->link;
X	}
X	return(NULL);
X}
X
SHAR_EOF
if test 3122 -ne "`wc -c 'lookup.c'`"
then
	echo shar: error transmitting "'lookup.c'" '(should have been 3122 characters)'
fi
echo shar: extracting "'lookup.h'" '(463 characters)'
if test -f 'lookup.h'
then
	echo shar: over-writing existing file "'lookup.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'lookup.h'
X/*
X * from K&R "The C Programming language"
X * Table lookup routines 
X * structure and definitions
X *
X */
X
X					/* basic table entry */
Xstruct hashlist {
X	char	*name;
X	char	*def;
X	struct	hashlist *next;		/* next in chain     */
X};
X					/* basic table entry */
Xstruct lexlist {
X	char	*name;
X	int	val;			/* lexical value     */
X	int	flag;			/* optional flag val */
X	struct	lexlist  *link;		/* next in chain     */
X};
X
X
X#define HASHMAX	100			/* size of hashtable */
SHAR_EOF
if test 463 -ne "`wc -c 'lookup.h'`"
then
	echo shar: error transmitting "'lookup.h'" '(should have been 463 characters)'
fi
echo shar: extracting "'ltb.c'" '(6581 characters)'
if test -f 'ltb.c'
then
	echo shar: over-writing existing file "'ltb.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'ltb.c'
X/*
X * ltb.c - Lexical Table Builder
X *
X * Functional description:
X *
X *	This program builds a file containing the data
X *	structures of a compile-time-initialised hash table. 
X *	This hash table may later be used for lexical analysis,
X *	where number of symbols to look up is sufficiently large
X *	to avoid a run-time table initialization.
X *	In order to guarantee the success of this setup, the 
X *	hash routine, the lookup and install routines should be
X *	the same between ltb and the lexical analysis.
X *
X * synopsis:
X *
X *	ltb <input file> [table name]
X *
X * input file format:
X *
X *	<token>  <value identifier> [flag value]
X *
X *	token: 		string of alphanumeric characters to be 
X *		       	matched by the lexical analyser (no blanks).
X *			these token strings are "installed" to a hash
X *			table by ltb to avoid run-time overhead.
X *	value 
X *	identifier:	A constant name to be used internally by the
X *			lexical analyser in place of the actual
X *			token value. a "#define <indentifier> <value>"
X *			is generated for each value identifier, where
X *			value is an odd and unique integer constant. If
X *			the value identifier is a `*' (star), then the
X *			previous value is repeated. Thus:
X *
X * 			      token   ident.   flag
X *
X *				sp	SP	1
X *				space	*	 	{ inherits SP  }
X *				blank	* 	 	{ inherits SP  }
X *				.	.	.
X *				.	.	.
X *
X *	flag value:	An additional integer field to pass flags etc. to
X *			the lexical analyser. If not specified, set to
X *			0. token value field must be present for this field
X *			to be obtained.
X *
X * outputs:
X *
X *	ltb generates two C include files:
X *
X *		[tablename].d:  compile time lexical constants (defines)
X *		[tablename].h:	initialised hash table.
X *
X *	where [tablename] is the name of the hash table as specified
X *	in the command line of ltb. If not specified, "lextab" is used
X *	as a default.
X *
X * routines used by LTB:
X *
X *	hash, lookup and a modified version of install routines,
X *	as defined in K&R, pp. 134 - 136.
X *
X * Application areas:
X *
X *	Lexical analysers for compilers, interpreters, spelling
X *	checkers.
X *
X * Author:
X *	Ozan S. Yigit
X *	Dept. of Computer Science
X *	York University
X *
X */
X
X#define MAXLINE		80
X#define MAXSYM		80
X
X#include <stdio.h>
X#include <ctype.h>
X#include "lookup.h"
X
Xstruct
Xlexlist	(*(*lextable))[];/* global pointer for lexical analyser hash table */
X
Xstatic struct lexlist *hashtab[HASHMAX];
Xstatic struct lexlist *defitab[HASHMAX];
X
Xchar *tabnam;		/* table name */
X
Xextern int hash();
Xextern struct hashlist *lookup();
Xextern struct hashlist *install();
Xextern char *strsave();
Xextern struct lexlist *lexinstal();
Xextern struct lexlist *lexlook();
Xextern struct lexlist *remove();
Xextern FILE *fopen(), *fclose();
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	FILE *fp;
X	char line[MAXLINE];
X	char sym[MAXSYM],def[MAXSYM];
X	register int val;
X	register int prev, *p;
X	register char *ptr;
X	int flag;
X	struct lexlist *np, *lexlook();
X
X	if (argc <= 2) {
X		fprintf(stderr,"%s [-<base>] <symbol file> [tablename]\r\n",
X		argv[0]);
X		exit(1);
X	}
X
X	if (*argv[1] == '-') {
X		val = atoi(argv[1]+1);	/* skip "-" and convert */
X		val = (val & 1) ? val : val+1;
X		p = (int *)argv[2];
X	}
X	else {
X		val = 1;
X		p = (int *)argv[1];
X	}
X
X	if (argc < 3)
X		tabnam = "lextab";
X	else
X		tabnam = argv[argc-1];
X
X	if ((fp = fopen(p,"r")) == NULL) {
X		fprintf(stderr,"%s:cannot open.\r\n",argv[1]);
X		exit(1);
X	}
X	else {
X		prev = val;
X		while (fgets(line,MAXLINE,fp) != NULL) {
X			if (*line != '!') {
X				flag = 0; 
X				def[0] = '\0';
X				ptr = line;
X				while (isspace(*ptr))
X					ptr++;
X				if (*ptr == '\0')
X					continue;
X				sscanf(line,"%s %s %d",sym,def,&flag);
X				if (!(def[0] == '*' && def[1] == '\0')) {
X					if ((np = lexlook(def,defitab)) == NULL) {
X						/* value define  */
X						lexinstal(def,val,0,defitab);
X						prev = val;
X						val += 2;
X					}
X					else
X						prev = np->val;
X				}
X				 /* lexical token */
X				lexinstal(sym,prev,flag,hashtab);
X			}
X		}
X		defgen();
X		lexgen();
X	}
X}
X/*
X * lexgen - print out the hash table in static form
X *
X */
Xlexgen()
X{
X	register int i;
X	register struct lexlist *np;
X	char filebuf[12];
X	char *file;
X	FILE *op;
X
X	file = filebuf;
X
X	strncpy(file,tabnam,8);
X	strcat(file,".h");
X
X	if ((op = fopen(file,"w")) == NULL) {
X		fprintf(stderr,"%s: cannot create.\r\n",file);
X		exit(1);
X	}
X
X	fprintf(op,"#ifndef STRUC_DEFINED\n\n");
X	fprintf(op,"\/\*\t%s\t\*\/\n\n%s\n%s\n%s\n%s\n%s\n",file,
X	"struct _lex_h { 	char 	*__s;",
X	"		  	int 	 __v;",
X	"		  	int  	 __f;",
X	"		struct  _lex_h  *__l;",
X	"};");
X	fprintf(op,"\n#define STRUC_DEFINED\n#endif\n");
X
X	/*
X			 * generate the hash table entries.
X			 * each entry is followed by the next entry in its
X			 * chain.
X			 * In the operating systems with memory paging, this
X			 * should have the extra advantage of localized
X			 * memory referances.
X			 *
X	 */
X
X	for (i=0; i < HASHMAX; i++)
X		if ((np = hashtab[i]) != NULL)
X			prnode(np,op);
X	/*
X			 * At last, we generate the pointer array (hashtable).
X			 * this table should be assigned to lextable global
X			 * variable before using with lexlook() or lexinstal().
X			 * lextable is defined in lookup.h
X			 *
X	 */
X
X	fprintf(op,"\n\n\/\*  Hash Table \*\/\n\n");
X	fprintf(op,"struct _lex_h *%s[%d] = {\n\t",tabnam,HASHMAX);
X	for (i=0; i < HASHMAX - 1; i++) {
X		np = hashtab[i];
X		if(np == NULL)
X			fprintf(op,"NULL,\t");
X		else
X			fprintf(op,"\&__%s,\t", np->name);
X		if (i % 4 == 0)
X			fprintf(op,"\n\t");
X	}
X	np = hashtab[i];
X	if (np == NULL)
X		fprintf(op,"NULL  };\n");
X	else
X		fprintf(op,"\&__%s   };\n", np->name);
X
X	fclose(op);
X}
X
X/*
X * prnode - print the current node. This routine is 
X *	    recursive such that printing starts from
X *	    the end of the given list
X *
X */
Xprnode(np,op)
Xregister struct
Xlexlist *np;
XFILE *op;
X{
X	if (np->link != NULL)
X		prnode(np->link,op);
X	fprintf(op,"struct\n_lex_h __%s = {  ",
X	np->name);
X	fprintf(op,"\"%s\",\n              %6d,%6d,",
X	np->name,
X	np->val,
X	np->flag);
X	if (np->link != NULL)
X		fprintf(op,"\&__%s };\n",
X		(np->link)->name);
X	else
X		fprintf(op,"NULL };\n");
X}	
X
X/*
X * defgen - generate a file containing the lexical
X *	    constants to be equated to lexical symbols
X */
Xdefgen()
X{
X	register int i;
X	register struct lexlist *np;
X	char *file;
X	char filebuf[12];
X	FILE *op;
X
X	file = filebuf;
X	strncpy(file,tabnam,8);
X	strcat(file,".d");
X
X	if ((op = fopen(file,"w")) == NULL) {
X		fprintf(stderr,"%s: cannot create.\r\n",file);
X		exit(1);
X	}
X	for (i=0; i < HASHMAX; i++) {
X		for (np = defitab[i]; np != NULL; np = np->link)
X			fprintf(op,"\#define  %s\t%d\n",
X			np->name,
X			np->val);
X	}
X	fclose(op);
X}
X
SHAR_EOF
if test 6581 -ne "`wc -c 'ltb.c'`"
then
	echo shar: error transmitting "'ltb.c'" '(should have been 6581 characters)'
fi
echo shar: extracting "'make.sh'" '(426 characters)'
if test -f 'make.sh'
then
	echo shar: over-writing existing file "'make.sh'"
fi
sed 's/^X//' << \SHAR_EOF > 'make.sh'
Xcc -c -DDECL ltb.c
Xcc -c -DDECL look.c
Xlink68 ltb.68k=gems,ltb.o,look.o,gemlib,libf
Xrelmod ltb
Xltb proffsym.new lextab
Xcc -c -DDECL proff.c
Xcc -c -DDECL proff01.c
Xcc -c -DDECL proff02.c
Xcc -c -DDECL lookup.c
Xcc -c -DDECL pinit.c
Xcc -c -DDECL putwrd.c
Xcc -c -DDECL pxlex.c
Xcc -c -DDECL pxxparse.c
Xcc -c -DDECL dostuff2.c
Xcc -c -DDECL eval.c
Xcc -c -DDECL map.c
Xcc -c -DDECL stack.c
Xlink68 [u,com[lnk]]
Xrelmod proff
Xrm proff.68k
SHAR_EOF
if test 426 -ne "`wc -c 'make.sh'`"
then
	echo shar: error transmitting "'make.sh'" '(should have been 426 characters)'
fi
echo shar: extracting "'makefile'" '(376 characters)'
if test -f 'makefile'
then
	echo shar: over-writing existing file "'makefile'"
fi
sed 's/^X//' << \SHAR_EOF > 'makefile'
XCFLAGS=-O
XOBJS= 	proff.o proff01.o proff02.o lookup.o pinit.o putwrd.o\
X	pxlex.o pxxparse.o dostuff2.o eval.o stack.o map.o
Xproff: $(OBJS)
X	cc -s -o proff $(OBJS)
X
X$(OBJS): lextab.h lextab.d
X
Xlextab.h lextab.d: proffsym.new ltb
X	ltb proffsym.new lextab
X
Xltb: ltb.o look.o
X	cc -s -o ltb ltb.o look.o
Xclean:
X	rm proff *.o
Xarch:
X	./archc Makefile *.c *.h proffsym.new >proff.arc
SHAR_EOF
if test 376 -ne "`wc -c 'makefile'`"
then
	echo shar: error transmitting "'makefile'" '(should have been 376 characters)'
fi
echo shar: extracting "'map.c'" '(1222 characters)'
if test -f 'map.c'
then
	echo shar: over-writing existing file "'map.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'map.c'
X#include <stdio.h>
X/*
X * map map every character of s1 that is specified in s2
X * into s3 and replace in s. (source s1 remains untouched)
X */
X 
Xmap(s,s1,s2,s3)
Xregister char *s;
Xregister char *s1;
Xregister char *s2;
Xregister char *s3;
X{
X	char *t, *t1;
X	if (*s1 != '\0') {
X		t = s;
X		t1 = s1;
X		strcpy(t,t1);
X
X		while (*s2 != '\0' && *s3 != '\0') {
X			while (*t1 != '\0') {
X				if (*t1 == *s2)
X					*t = *s3;
X				t++; 
X				t1++;
X			}
X			t = s;
X			t1 = s1;
X			s2++;
X			s3++;
X		}
X	}
X	else
X		*s = '\0';
X}
X
X/*
X * roman - convert a numeric string into roman numerals
X *
X * icon version:
X *procedure roman(n)
X * local arabic, result
X * static equiv
X * initial equiv := ["","I","II","III","IV","V","VI","VII","VIII","IX"]
X * integer(n) > 0 | fail
X * result := ""
X * every arabic := !n do
X *    result := map(result,"IVXLCDM","XLCDM**") || equiv[arabic+1]
X * if find("*",result) then fail else return result
X * end
X *
X */
Xint 
Xcvtroman(num,rom)
Xchar *num;
Xchar *rom;
X{
X	char tmp[20];
X
Xstatic char *equiv_U[] = { "","I","II","III","IV","V","VI","VII","VIII","IX" };
X
X	*rom = NULL;
X	while (*num != '\0') {
X		map(tmp,rom,"IVXLCDM","XLCDM**");
X		strcpy(rom,tmp);
X		strcat(rom,equiv_U[*num - '0']);
X		num++;
X	}
X	return(strlen(rom));
X}
X
SHAR_EOF
if test 1222 -ne "`wc -c 'map.c'`"
then
	echo shar: error transmitting "'map.c'" '(should have been 1222 characters)'
fi
#	End of shell archive
exit 0

-- 
					Jwahar R. Bammi
			       Usenet:  .....!decvax!cwruecmp!bammi
			        CSnet:  bammi@case
				 Arpa:  bammi%case@csnet-relay
			   CompuServe:  71515,155