[net.micro.atari16] Proff repost

sansom@trwrb.UUCP (Richard Sansom) (10/07/86)

In article <8610061437.AA18001@ucbvax> FONETIEK@HNYKUN52.BITNET writes:
>A few weeks ago I got UNITERM, but it is almost impossible to read the
>documentation without Proff, so if anyone could send me the Proff
>sources I would be very grateful..

There have been several requests for Proff lately, so what the heck.

-Rich

#!/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
-- 
 __________ ______ ____ _____ ___
/_________//___   ||__|/____|/__/   Richard E. Sansom
   ___    ____/  / ____________	    TRW Electronics & Defense Sector
  /  /   /  /\  <  |    /|    /     One Space Park Drive, R3/1028
 /  /   /  /  \  \ |   / |   /	    Redondo Beach, CA 90278
/__/   /__/    \__\|__/  |__/	    {...decvax,ucbvax,ihnp4}!trwrb!sansom

sansom@trwrb.UUCP (Richard Sansom) (10/07/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:
#	pinit.c
#	proff.c
#	proff.h
#	proff01.c
#	proff02.c
#	proffman.prf
#	proffsym.new
# This archive created: Fri Mar 21 22:45:05 1986
# By:	Jwahar R. Bammi ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'pinit.c'" '(1231 characters)'
if test -f 'pinit.c'
then
	echo shar: over-writing existing file "'pinit.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'pinit.c'
X#include <stdio.h>
X#include <ctype.h>
X#include "proff.h"
X#include "debug.h"
X
X/*
X * finit - initialise parameters, set default values
X *	   used by .reset command
X *
X */
Xfinit()
X{
X	int i;
X
X	inval = 0;
X	rmval = PAGEWIDTH;
X	tival = 0;
X	lsval = 1;
X	fill = YES;
X	ceval = 0;
X	ulval = 0;
X	boval = 0;
X	cchar = '.';
X	genesc = '_';
X	tjust[0] = LEFT;
X	tjust[1] = CENTER;
X	tjust[2] = RIGHT;
X	bsval = 0;
X	rjust = YES;
X	ulblnk = BLANK;
X
X	for (i = 0; i < INSIZE; i++)
X		if (i % 8 == 0)
X			tabs[i] = YES;
X		else
X			tabs[i] = NO;
X
X	lineno = 0;
X	curpag = 0;
X	newpag = 1;
X	plval = PAGELEN;
X	m1val = 3;
X	m2val = 2;
X	m3val = 2;
X	m4val = 3;
X	bottom = plval - m3val - m4val;
X	ehead[0] = '\n';
X	ehead[1] = EOS;
X	ohead[0] = '\n';
X	ohead[1] = EOS;
X	efoot[0] = '\n';
X	efoot[1] = EOS;
X	ofoot[0] = '\n';
X	ofoot[1] = EOS;
X	ehlim[0] = inval;
X	ehlim[1] = rmval;
X	ohlim[0] = inval;
X	ohlim[1] = rmval;
X	eflim[0] = inval;
X	eflim[1] = rmval;
X	oflim[0] = inval;
X	oflim[1] = rmval;
X	verbose = NO;   
X	stopx = 0;
X	frstpg = 0;
X	lastpg = HUGE;
X	print = YES;
X	offset = 0;
X	outp = 0;
X	outw = 0;
X	outwds = 0;
X	bp = -1;
X	for (i = 0; i < 26; i++)
X		nr[i] = 0;
X
X	CEon = FALSE;
X	ULon = FALSE;
X	BDon = FALSE;
X
X	onlyrunoff = FALSE;
X	roman = FALSE;
X	bolding = YES;
X	autopar = NO;
X}
SHAR_EOF
if test 1231 -ne "`wc -c 'pinit.c'`"
then
	echo shar: error transmitting "'pinit.c'" '(should have been 1231 characters)'
fi
echo shar: extracting "'proff.c'" '(9415 characters)'
if test -f 'proff.c'
then
	echo shar: over-writing existing file "'proff.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'proff.c'
Xchar *version = "v.1.1";
X
X#define GLOBALS 1
X
X#include <stdio.h>
X#include <ctype.h>
X#include "debug.h"
X#include "defs.h"
X#include "lookup.h"
X
X#define brk brrk
X
X/*
X * G L O B A L S
X *
X */
X#ifndef vms
X#define globaldef
X#endif
X
X	/* next available char; init = 0 */
Xglobaldef int bp = -1;
X	/* pushed-back characters */
Xglobaldef char buf[BUFSIZE];
X	/* stack of file descriptors */
Xglobaldef FILE *infile[NFILES];
X	/* current file is infile[level] */
Xglobaldef int level;
X	/* stack of output file descriptors */
Xglobaldef FILE *outfile[NFILES];
X	/* current output is outfile[olevel]; */
Xglobaldef int olevel;
X	/* current output file pointer */
Xglobaldef FILE *poutput;
X	/* number registers a..z */
Xglobaldef int nr[26] = {  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X			  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
X	/* system registers a..z */
Xglobaldef int sr[26] = {  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
X			  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
X	/* last char position in outbuf; init = 0 */
Xglobaldef int outp = 0;
X	/* width of text currently in outbuf; init = 0 */
Xglobaldef int outw = 0;
X	/* number of words in outbuf; init = 0 */
Xglobaldef int outwds = 0;
X	/* lines to be filled collect here */
Xglobaldef char outbuf[MAXOUT];
X                       /* word in outbuf; init=0 */
X	/* current output page number; init = 0 */
Xglobaldef int curpag = 0;
X	/* next output page number; init = 1 */
Xglobaldef int newpag = 1;
X	/* next line to be printed; init = 0 */
Xglobaldef int lineno = 0;
X	/* page length in lines; init = PAGELEN = 66 */
Xglobaldef int plval = PAGELEN;
X	/* page length save area */
Xglobaldef int savpl = PAGELEN;
X	/* margin before and including header */
Xglobaldef int m1val = 3;
X	/* margin after header */
Xglobaldef int m2val = 2;
X	/* margin after last text line */
Xglobaldef int m3val = 2;
X	/* bottom margin, including footer */
Xglobaldef int m4val = 3;
X	/* last live line on page, = plval-m3val-m4val */
Xglobaldef int bottom = PAGELEN - 5;
X	/* top of page title for even pages;init=NEWLINE */
Xglobaldef char ehead[MAXLINE];
X	/* top of page title for odd  pages;init=NEWLINE */
Xglobaldef char ohead[MAXLINE];
X	/* left,right margins for even header;init=inval,rmval */
Xglobaldef int ehlim[2] = { 0, PAGEWIDTH };
X	/* left,right margins for odd  header;init=inval,rmval */
Xglobaldef int ohlim[2] = { 0, PAGEWIDTH };
X	/* bot of page title for even pages;init=NEWLINE */
Xglobaldef char efoot[MAXLINE];
X	/* bot of page title for odd  pages;init=NEWLINE */
Xglobaldef char ofoot[MAXLINE];
X	/* left,right margins for even footer;init=inval,rmval */
Xglobaldef int eflim[2] = { 0, PAGEWIDTH };
X	/* left,right margins for odd  footer;init=inval,rmval */
Xglobaldef int oflim[2] = { 0, PAGEWIDTH };
X	/* flag for pausing between pages */
Xglobaldef int stopx = 0;
X	/* first page to begin printing with */
Xglobaldef int frstpg = 0;
X	/* last page to be printed */
Xglobaldef int lastpg = HUGE;
X	/* flag to indicate whether page should be printed */
Xglobaldef int print = YES;
X	/* number of blanks to offset page by; init = 0 */
Xglobaldef int  offset = 0;
X	/* verbose option; init = NO */
Xglobaldef int verbose = NO;
X	/* bolding option; init = YES; */
Xglobaldef char bolding = YES;
X	/* fill if YES; init = YES */
Xglobaldef int fill = YES;
X	/* current line spacing; init = 1 */
Xglobaldef int lsval = 1;
X	/* current indent; >= 0; init = 0 */
Xglobaldef int inval = 0;
X	/* current right margin; init = PAGEWIDTH = 60 */
Xglobaldef int rmval = PAGEWIDTH;
X	/* current temporary indent; init = 0 */
Xglobaldef int tival = 0;
X	/* number of lines to center; init = 0 */
Xglobaldef int ceval = 0;
X	/* flag for continuous center */
Xglobaldef char CEon = FALSE;
X	/* number of lines to underline; init = 0 */
Xglobaldef int ulval = 0;
X	/* flag for continuous underline */
Xglobaldef char ULon = FALSE;
X	/* number of lines to boldface; init = 0 */
Xglobaldef int boval = 0;
X	/* flag for continuous bolding */
Xglobaldef char BDon = FALSE;
X	/* justification types for heads and foots; */
X	/* init = LEFT, CENTER, RIGHT */
Xglobaldef int tjust[3] = { LEFT, CENTER, RIGHT };  
X	/* number of lines to blank suppress; init=0 */
Xglobaldef int bsval = 0;
X	/* right justify filled lines if YES; init=YES */
Xglobaldef int rjust = YES;
X	/* tab stops; init every 8 spaces */
Xglobaldef int tabs[INSIZE];
X	/* line control character; init = PERIOD */
Xglobaldef char cchar = '.';
X	/* universal escape - init = UNDERBAR */
Xglobaldef char genesc = '_';
X	/* character used to underline a BLANK; init = BLANK */
Xglobaldef char ulblnk = ' ';
X	/* scratch arrays for use by various routines */
Xglobaldef char tbuf1[MAXLINE];
Xglobaldef char tbuf2[MAXLINE];
Xglobaldef char tbuf3[MAXLINE];
Xglobaldef char ttl[MAXLINE];
X	/* flag to process runoff symbols only */
Xglobaldef char onlyrunoff = NO;
X	/* Flag to turn paging off */
Xglobaldef char paging = YES;
X	/* page number in roman numerals. Init = NO */
Xglobaldef char roman = NO;
X	/* autopar flag. Init = NO */
Xglobaldef char autopar = NO;
X	/* temporary indent value for autopar */
Xglobaldef int autoprv = 5;
X	/* hash tables for macros and variables */
Xglobaldef struct hashlist *macrotab[HASHMAX];
Xglobaldef struct hashlist *gentab[HASHMAX];
X	/* linked list entries for contents	*/
Xglobaldef struct clist *chead = NULL;
Xglobaldef struct clist *clast = NULL;
X	/* keep track of what is done - VERBOSE */
Xglobaldef int p_txtlines = 0;
Xglobaldef int p_outlines = 0;
Xglobaldef int p_outpages = 0;
Xglobaldef int p_memoryus = 0;
X
X
X
X/*
X * M A I N L I N E   OF   P R O F F
X *
X */
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X        int i,j,val,type;
X        char *p,c;
X        FILE *fp, *fopen();
X
X        for (i = 1; i < argc; i++) {
X                p = argv[i];
X                if (*p == '-') {
X                        ++p;
X                        if (isalpha(*p)) {
X                                c = *p++;
X                                switch(c) {
X
X/* verbose stats */		case 'v':
X				case 'V':
X					verbose = TRUE;
X					break;
X/* runoff only   */		case 'r':
X				case 'R':
X					onlyrunoff = TRUE;
X					break;
X/* stop for page */             case 's':
X                                case 'S':
X                                        stopx = 1;
X                                        break;
X/* page offset   */             case 'p':
X                                case 'P':
X                                        if (*p == 'o' || *p == 'O') {
X                                                p++;
X                                                j = 0;
X                                                val = getval(p, &j, &type);
X                                                set(&offset, val, type, 0, 0,
X                                                    rmval - 1);
X                                        }
X                                        else
X                                                usage();
X                                        break;
X/* include file  */ 		case 'i':
X				case 'I': /* simulate .so <filename> */
X					pbstr("\n");
X					pbstr(p);
X					pbstr(".so ");
X					break;
X
X/* disable some  */		case 'd':
X				case 'D':
X					switch (*p) {
X
X					case 'b':
X					case 'B':
X						bolding = NO;
X						break;
X					case 'p':
X					case 'P':
X						paging = NO;
X						break;
X					default:
X						break;
X					}
X					break;
X
X/* garbage       */             default:
X                                        usage();
X                                }
X                        }
X                        else
X			         lastpg = atoi(p);
X                }
X                else if (*p == '+') {
X                        p++;
X                        if ((frstpg = atoi(p)) == 0)
X                                usage();
X                }
X                else
X                        break;
X        }
X        if (i == argc)
X                usage();
X        if ((fp = fopen(argv[i], "r")) == NULL) {
X                fprintf(stderr, "%s: cannot open.\n",argv[i]);
X                exit(1);
X        }
X
X#ifdef DEBUG
X	fprintf(stderr,"OPened %s for Input Fp = %ld\n",argv[i],fp);
X#endif
X        if (p = argv[++i]) {
X                if ((outfile[0] = fopen(p, "w")) == NULL) {
X                        fprintf(stderr,"%s: cannot create.\n\n", p);
X                        exit(1);
X                }
X#ifdef DEBUG
X	fprintf(stderr,"OPened %s for Output\n",p);
X#endif
X
X	}
X	else
X	{
X		outfile[0] = stdout;
X#ifdef DEBUG
X	fprintf(stderr,"USing stdout for output\n");
X#endif
X	}
X
X			/* set output file level */
X	olevel = 0;
X	poutput = outfile[0];
X	/*
X	 * some minor initialisation
X	 */
X
X	for (i = 0; i < INSIZE; i++)
X		if (i % 8 == 0)
X			tabs[i] = YES;
X		else
X			tabs[i] = NO;
X
X	ehead[0] = '\n';
X	ehead[1] = EOS;
X	ohead[0] = '\n';
X	ohead[1] = EOS;
X	efoot[0] = '\n';
X	efoot[1] = EOS;
X	ofoot[0] = '\n';
X	ofoot[1] = EOS;
X
X			/* initialise contents linked list */
X
X	chead = (struct clist *) malloc(sizeof(struct clist));
X	clast = chead;
X	p_memoryus += sizeof(struct clist);
X
X        doroff(fp);
X        brk();
X        if (plval <= 100 && (lineno > 0 | outp > 0))
X                space(HUGE);
X        putchar('\n');
X
X	if(verbose) {
X		fprintf(stderr,"proff read in %6d textlines to produce\n",
X			p_txtlines);
X		fprintf(stderr,"              %6d lines\n",
X			p_outlines);
X		fprintf(stderr,"              %6d pages of formatted text.\n",
X			p_outpages);
X		fprintf(stderr,"\n%d bytes of memory was required\n",
X			p_memoryus);
X		fprintf(stderr,"for internal tables and lists.\n");
X	}
X#ifdef vms
X        exit(1);
X#else
X        exit(0);
X#endif
X}
SHAR_EOF
if test 9415 -ne "`wc -c 'proff.c'`"
then
	echo shar: error transmitting "'proff.c'" '(should have been 9415 characters)'
fi
echo shar: extracting "'proff.h'" '(4948 characters)'
if test -f 'proff.h'
then
	echo shar: over-writing existing file "'proff.h'"
fi
sed 's/^X//' << \SHAR_EOF > 'proff.h'
X
X
X#include "defs.h"
X#include "lookup.h"
X
X#ifndef GLOBALS
X#ifdef vms
X#define extern globalref
X#endif
X	/* next available char; init = 0 */
Xextern int bp;
X	/* pushed-back characters */
Xextern char buf[BUFSIZE];
X	/* stack of file descriptors */
Xextern FILE *infile[NFILES];
X	/* current file is infile[level] */
Xextern int level;
X	/* stack of output file descriptors */
Xextern FILE *outfile[NFILES];
X	/* current output file is outfile[olevel] */
Xextern int olevel;
X	/* current output file pointer */
Xextern FILE *poutput;
X	/* system registers a..z */
Xextern int nr[26];
X	/* last char position in outbuf; init = 0 */
Xextern int outp;
X	/* width of text currently in outbuf; init = 0 */
Xextern int outw;
X	/* number of words in outbuf; init = 0 */
Xextern int outwds;
X	/* lines to be filled collect here */
Xextern char outbuf[MAXOUT];
X                       /* word in outbuf; init=0 */
X	/* current output page number; init = 0 */
Xextern int curpag;
X	/* next output page number; init = 1 */
Xextern int newpag;
X	/* next line to be printed; init = 0 */
Xextern int lineno;
X	/* page length in lines; init = PAGELEN = 66 */
Xextern int plval;
X	/* page length save area */
Xextern int savpl;
X	/* margin before and including header */
Xextern int m1val;
X	/* margin after header */
Xextern int m2val;
X	/* margin after last text line */
Xextern int m3val;
X	/* bottom margin, including footer */
Xextern int m4val;
X	/* last live line on page, = plval-m3val-m4val */
Xextern int bottom;
X	/* top of page title for even pages;init=NEWLINE */
Xextern char ehead[MAXLINE];
X	/* top of page title for odd  pages;init=NEWLINE */
Xextern char ohead[MAXLINE];
X	/* left,right margins for even header;init=inval,rmval */
Xextern int ehlim[2];
X	/* left,right margins for odd  header;init=inval,rmval */
Xextern int ohlim[2];
X	/* bot of page title for even pages;init=NEWLINE */
Xextern char efoot[MAXLINE];
X	/* bot of page title for odd  pages;init=NEWLINE */
Xextern char ofoot[MAXLINE];
X	/* left,right margins for even footer;init=inval,rmval */
Xextern int eflim[2];
X	/* left,right margins for odd  footer;init=inval,rmval */
Xextern int oflim[2];
X	/* flag for pausing between pages */
Xextern int stopx;
X	/* first page to begin printing with */
Xextern int frstpg;
X	/* last page to be printed */
Xextern int lastpg;
X	/* flag to indicate whether page should be printed */
Xextern int print;
X	/* number of blanks to offset page by; init = 0 */
Xextern int  offset;
X	/* verbose option; init = FALSE */
Xextern int verbose;
X	/* bolding option; init = YES; */
Xextern char bolding;
X	/* fill if YES; init = YES */
Xextern int fill;
X	/* current line spacing; init = 1 */
Xextern int lsval;
X	/* current indent; >= 0; init = 0 */
Xextern int inval;
X	/* current right margin; init = PAGEWIDTH = 60 */
Xextern int rmval;
X	/* current temporary indent; init = 0 */
Xextern int tival;
X	/* number of lines to center; init = 0 */
Xextern int ceval;
X	/* flag for continuous center */
Xextern char CEon;
X	/* number of lines to underline; init = 0 */
Xextern int ulval;
X	/* flag for continuous underline */
Xextern char ULon;
X	/* number of lines to boldface; init = 0 */
Xextern int boval;
X	/* flag for continuous bolding */
Xextern char BDon;
X	/* justification types for heads and foots; */
Xextern int tjust[3];          /* init = LEFT, CENTER, RIGHT */
X	/* number of lines to blank suppress; init=0 */
Xextern int bsval;
X	/* right justify filled lines if YES; init=YES */
Xextern int rjust;
X	/* tab stops; init every 8 spaces */
Xextern int tabs[INSIZE];
X	/* line control character; init = PERIOD */
Xextern char cchar;
X	/* universal escape - init = UNDERBAR */
Xextern char genesc;
X	/* character used to underline a BLANK; init = BLANK */
Xextern char ulblnk;
X	/* scratch arrays for use by various routines */
Xextern char tbuf1[MAXLINE];
Xextern char tbuf2[MAXLINE];
Xextern char tbuf3[MAXLINE];
Xextern char ttl[MAXLINE];
X	/* flag to process runoff symbols only */
Xextern char onlyrunoff;
X	/* flag to turn paging off */
Xextern char paging;
X	/* page number in roman numerals. Init = NO */
Xextern char roman;
X	/* autopar flag. Init = NO */
Xextern char autopar;
X	/* temporary indent value for autopar */
Xextern int autoprv;
X	/* hash tables for macros and variables */
Xextern struct hashlist *macrotab[HASHMAX];
Xextern struct hashlist *gentab[HASHMAX];
X	/* linked list entries for contents	*/
Xextern struct clist *chead;
Xextern struct clist *clast;
X	/* keep track of the work - VERBOSE opt.*/
X
Xextern int p_txtlines;
Xextern int p_outlines;
Xextern int p_outpages;
Xextern int p_memoryus;
X
X#ifdef vms
X#undef extern
X#endif
X
X#endif
X
X 	/* Why the hell can't people decare the routines they use */
X
X#ifndef INLOOK
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();
X#endif
X
Xextern char *strcpy(), *strcat(), *malloc();
Xextern unsigned int strlen();
Xextern FILE *fopen(), *fclose();
SHAR_EOF
if test 4948 -ne "`wc -c 'proff.h'`"
then
	echo shar: error transmitting "'proff.h'" '(should have been 4948 characters)'
fi
echo shar: extracting "'proff01.c'" '(11642 characters)'
if test -f 'proff01.c'
then
	echo shar: over-writing existing file "'proff01.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'proff01.c'
X#include <stdio.h>
X#include <ctype.h>
X#include "proff.h"
X#include "debug.h"
X
X#define brk brrk
X
X/*
X * bold - bold face or overstrike a line
X *
X */
Xbold(buf,tbuf,size)
Xchar buf[];
Xchar tbuf[];
Xint  size;
X{
X	int  i,j;
X	dprintf("bold  ");
X
X	j = 0;
X	for (i = 0; buf[i] != '\n' && j < size - 2; i++) {
X		tbuf[j] = buf[i];
X		j++;
X		if (buf[i] != ' ' && buf[i] != '\t' &&
X		    buf[i] != BACKSPACE ) {
X			tbuf[j] = BACKSPACE;
X			tbuf[j+1] = tbuf[j-1];
X			j += 2;
X		}
X	}
X	tbuf[j] = '\n';
X	tbuf[j+1] = '\0';
X	strcpy(buf,tbuf);
X}
X
X/*
X * brk - end current filled line
X *
X */
Xbrk()
X{
X	dprintf("brk  ");
X	if (outp > 0) {
X		outbuf[outp] = '\n';
X		outbuf[outp+1] = EOS;
X		put(outbuf);
X	}
X	outp = 0;
X	outw = 0;
X	outwds = 0;
X}
X
X/*
X * center - center a line by setting tival
X *
X */
Xcenter(buf)
Xchar buf[];
X{
X	int	i;
X
X	dprintf("center  ");
X
X	i = (rmval + tival - width(buf)) / 2;
X	tival = (i > 0) ? i : 0;
X}
X
X/*
X * doroff - format text in file fp
X *
X */
Xdoroff(fp)
XFILE *fp;
X{
X	char inbuf[INSIZE];
X
X	infile[0] = fp;
X	for (level = 0; level > -1; level--) {
X
X#ifdef DEBUG
Xprintf("doroff: level %d FileP %ld\n",level, infile[level]);
X#endif
X
X		while (ngetln(inbuf, infile[level]) != EOF) {
X			if (inbuf[0] == cchar)	/* a command */
X				command(inbuf);
X			else {
X#ifdef rainbow
X				if (biosb(2))
X					exit(0);
X#endif
X				text(inbuf);
X				p_txtlines++;
X			}
X		}
X#ifdef DEBUG
Xprintf("doroff: Got EOF level %d FileP %ld\n",level, infile[level]);
X#endif
X
X		if (level > 0 && infile[level] > 0) {
X			fclose(infile[level]);
X			if (verbose)
X				fprintf(stderr,"       done.\n");
X		}
X	}
X}
X
X/*
X * gettl - copy title from buf to ttl
X *
X * modifies lim
X */
Xgettl(buf,ttl,lim)
Xchar *buf;
Xchar *ttl;
Xint lim[];
X{
X	while (!isspace(*buf))
X		buf++;
X	while (isspace(*buf))
X		buf++;
X	strcpy(ttl,buf);
X	lim[0] = inval;
X	lim[1] = rmval;
X}
X
X/*
X * getwrb - get a word INCLUDING the trailing blanks
X *
X */
Xint
Xgetwrb(in,i,out)
Xchar in[];
Xchar out[];
Xint *i;
X{
X	int j,k;
X	dprintf("getval  ");
X	k = *i;
X	j = 0;
X	while (in[k] != EOS && in[k] != ' ' &&
X	    in[k] != '\t' && in[k] != '\n') {
X		out[j] = in[k];
X		k++;
X		j++;
X	}
X	while (in[k] == ' ') {
X		out[j] = ' ';
X		k++;
X		j++;
X	}
X	*i = k;
X	out[j] = EOS;
X	return(j);
X}
X
X
X/*
X * gfield - get next tab or title field
X *
X */
Xint
Xgfield(buf, i, n, temp, delim)
Xchar buf[];
Xint *i;
Xint n;
Xchar temp[];
Xchar delim;
X{
X	int j,k;
X
X	dprintf("gfield  ");
X	j = 0;
X	k = *i;
X	if (n > 0) {
X		if (buf[k] == delim)
X			k++;
X		while (buf[k] != delim && buf[k] != EOS && buf[k] != '\n' &&
X		    j <= n) {
X			temp[j] = buf[k];
X			j++;
X			k++;
X		}
X	}
X	temp[j] = EOS;
X	while (buf[k] != delim && buf[k] != EOS && buf[k] != '\n')
X		k++;
X	*i = k;
X	return(j);
X}
X
X/*
X * jcopy - scopy without copying EOS
X *
X */
Xjcopy(from, i, to, j)
Xchar from[];
Xchar to[];
Xint i;
Xint j;
X{
X	int k1, k2;
X	dprintf("jcopy  ");
X
X	k1 = i;
X	k2 = j;
X	while (from[k1] != EOS) {
X		to[k2] = from[k1];
X		k1++;
X		k2++;
X	}
X}
X
X/*
X * justfy - justifies string in its tab column
X * */
Xjustfy(in, left, right, type, out)
Xchar in[];
Xchar out[];
Xint left;
Xint right;
Xint type;
X{
X	int j,k, n;
X
X	dprintf("justfy  ");
X	n = width(in);
X	if (type == RIGHT)
X		jcopy(in, 0, out, right-n);
X	else if (type == CENTER) {
X		k = (right+left-n) / 2;
X		j = (k > left) ? k : left;
X		jcopy(in, 0, out, j);
X	}
X	else 
X	    jcopy(in, 0, out, left);
X}
X
X/*
X * leadbl - delete leading blanks, set tival
X *
X */
Xleadbl(buf)
Xchar buf[];
X{
X	int i, j;
X
X	dprintf("leadbl  ");
X	brk();
X	for (i = 0; buf[i] == ' '; i++)     /* find 1st non-blank */
X		;
X	if (buf[i] != '\n')
X		if (autopar) {
X			put("\n");	/* blank line */
X			tival = inval + autoprv;
X		}
X		else
X			tival = inval + i;	    /* ??????????? */
X	for (j = 0; buf[i] != EOS; j++) {   /* move line to left */
X		buf[j] = buf[i];
X		i++;
X	}
X	buf[j] = EOS;
X}
X
X/*
X * ngetln - get next line from f into line
X *
X */
Xint
Xngetln(line, f)
Xchar line[];
XFILE *f;
X{
X	int c, i;
X
X#ifdef DEBUG
X	printf("ngetln+++: bp %d\n",bp);
X#endif
X
X	for (i = 0; (c = (bp >= 0) ? buf[bp--] : getc(f)) != EOF; ) {
X		if (i < MAXLINE - 1) {
X			line[i++] = (char) c;
X#ifdef DEBUG
X	printf("ngetln++: i %d c %c %d\n",i,c,c);
X#endif
X		}
X		if (c == '\n' || c == '\r')
X			break;
X	}
X	line[i] = EOS;
X	if (i == 0 && c == EOF)
X		i = EOF;
X#ifdef DEBUG
X	printf("ngetln: %s (%d, %d) (line)\n",line,strlen(line),i);
X#endif
X	return(i);
X}
X
X/*
X * pbstr - push string back onto input
X *
X */
Xpbstr(in)
Xchar in[];
X{
X
X	int i;
X
X	dprintf("pbstr  ");
X	for (i = strlen(in) - 1; i >= 0; i--)
X		putbak(in[i]);
X}
X
X/*
X * pfoot - put out page footer
X *
X */
Xpfoot()
X{
X
X	dprintf("pfoot  ");
X	skipl(m3val);
X	if (m4val > 0) {
X		if (curpag % 2 == 1)
X			puttl(efoot, eflim, curpag);
X		else
X			puttl(ofoot, oflim, curpag);
X	}
X	if (print == YES)		/* flush the page */
X	{
X		putchar(PAGEJECT);	/* ...		  */
X		p_outpages++;
X		if (stopx > 0)		/* -s, so flush ^L*/
X			putchar('\n');
X	}
X}
X
X/*
X * phead - put out page header
X *
X */
Xphead()
X{
X	dprintf("phead  ");
X
X	curpag = newpag;
X	if (curpag >= frstpg && curpag <= lastpg)
X		print = YES;
X	else 
X	    print = NO;
X	if(stopx > 0 && print == YES)
X		prmpt(&stopx);
X	newpag++;
X	if (m1val > 0) {
X		skipl(m1val-1);
X		if (curpag % 2 == 0)
X			puttl(ehead, ehlim, curpag);
X		else
X			puttl(ohead, ohlim, curpag);
X	}
X	skipl(m2val);
X	lineno = m1val + m2val + 1;
X}
X
X/*
X * prmpt - pause for paper insertion
X * prompt if i == 1; increment i
X *
X */
Xprmpt(i)
Xint *i;
X{
X	int junk,j;
X	static char bellst[2] = { BEL, EOS};
X
X	dprintf("prmpt  ");
X	j = *i;
X	if (j == 1)
X#ifdef rainbow
X		printf("%s\033[7minsert paper and type return\033[0m ",bellst);
X#else
X		printf("%sinsert paper and type return ",bellst);
X#endif
X	else
X		printf(bellst);
X	junk = getchar();
X	*i = ++j;
X}
X
X/*
X * Put - put out line with proper spacing and indenting
X *
X */
Xput(buf)
Xchar buf[];
X{
X	register int i;
X	dprintf("put  ");
X	if (lineno == 0 || lineno > bottom)
X		phead();
X
X	if ( print == YES ) {
X		if (buf[0] == '\n') {	/* empty line.. */
X			putchar('\n');
X			p_outlines++;
X		}
X		else {
X			for ( i = 1 ; i <= offset ; i++ ) /* page offset */
X				putchar(' ');
X			for ( i = 1 ; i <= tival ; i++ )  /* indenting   */
X				putchar(' ');
X
X			while (*buf != '\0') {
X				putchar(*buf);
X				buf++;
X			}
X			p_outlines++;
X		}
X	}
X
X	tival = inval;
X	skipl(((lsval-1 < bottom-lineno) ? lsval-1 : bottom-lineno));
X	lineno += lsval;
X
X	if (lineno > bottom)
X		pfoot();
X
X}
X
X/*
X * putbak - push character back onto input
X *
X */
Xputbak(c)
Xchar c;
X{
X	dprintf("putbak  ");
X
X	bp++;
X	if (bp > BUFSIZE)
X		error("too many characters pushed back.\n");
X	buf[bp] = c;
X}
X
X
X/*
X * puttl - put out title line with optional page number & date
X * 
X */
Xputtl(buf, lim, pageno)
Xchar buf[];
Xint lim[];
Xint pageno;
X{
X	char chars[9],cdate[27];
X	char rmstr[MAXTOK];
X	char delim;
X	char *tp;
X	int j;
X	int nc, n, i, left, right, ncd;
X
X	dprintf("puttl  ");
X	if (print == NO)
X		return;
X	left = lim[0];	/* no more +1 here */
X	right = lim[1]; /* no more +1 here */
X	nc = itoc(pageno, chars, MAXCHARS);
X	if (roman) {
X		nc = cvtroman(chars,rmstr);
X		strcpy(chars,rmstr);
X	}
X	getnow(cdate);
X	ncd = strlen(cdate);
X	i = 0;
X	delim = buf[i];
X	for (j = 0; j < right; j++)
X		ttl[j] = ' ';
X	n = 0;
X	do {
X		if (gfield(buf, &i, right-left, tbuf1, delim) > 0) {
X			subst(tbuf1, PAGENUM, tbuf2, chars, nc);
X			subst(tbuf2, CURRENTDATE, tbuf1, cdate, ncd);
X			justfy(tbuf1, left, right, tjust[n], ttl);
X		}
X		n++;		/* update title counter */
X	} 
X	while (buf[i] != EOS && buf[i] != '\n' && n != 3);
X
X	for( ; right >= 1 ; right--)
X		if( ttl[right-1] != ' ' )
X			break;
X	ttl[right] = '\n';
X	ttl[right+1] = EOS;
X	for (i = 1; i <= offset; i++)
X		putchar(' ');  			/* offset */
X	tp = ttl;
X	while (*tp != '\0') {
X		putchar(*tp);
X		tp++;
X	}
X	p_outlines++;
X}
X
X/*
X * set - set parameter and check range
X *
X */
Xset(param, val, argtyp, defval, minval, maxval)
Xint *param;
Xint val;
Xint argtyp;
Xint defval;
Xint minval;
Xint maxval;
X{
X	int i;
X	dprintf("set  ");
X	i = *param;
X	if (argtyp == '\n')      		/* defaulted */
X		i = defval;
X	else if (argtyp == '+')		      	/* relative +*/
X		i += val;
X	else if (argtyp == '-')   		/* relative -*/
X		i -= val;
X	else               			/* absolute  */
X	i = val;
X	i = (i < maxval) ? i : maxval; 		/* min 	     */
X	i = (i > minval) ? i : minval; 		/* max 	     */
X	*param = i;
X}
X
X/*
X* skipl - output  n  blank lines
X*
X*/
Xskipl(n)
Xregister int n;
X{
X	register int i;
X
X	dprintf("skip  ");
X	if (print == YES)
X		for (i = 1; i <= n; i++) {
X			putchar('\n');
X			p_outlines++;
X		}
X}
X
X/*
X * space - space  n  lines or to bottom of page
X *
X */
Xspace(n)
Xint n;
X{
X
X	dprintf("space  ");
X	brk();
X	if (lineno > bottom)
X		return;
X	if (lineno == 0)
X		phead();
X	skipl(((n < bottom+1-lineno) ? n : bottom+1-lineno));
X	lineno += n;
X	if (lineno > bottom)
X		pfoot();
X}
X
X/*
X * spread - spread words to justify right margin
X *
X */
Xspread(buf, outp, nextra, outwds)
Xchar buf[];
Xint outp;
Xint nextra;
Xint outwds;
X{
X	int dir = 0;
X
X	register int i, j;
X	int nb, ne, nholes;
X
X	dprintf("spread  ");
X	if (nextra <= 0 || outwds <= 1)
X		return;
X	dir = 1 - dir;   /* reverse previous direction */
X	ne = nextra;
X	nholes = outwds - 1;
X	if (tival != inval && nholes > 1)
X		nholes--;
X	i = outp - 1;
X	j = (MAXOUT-2 < i+ne) ? MAXOUT-2 : i+ne; /* leave room for '\n', EOS */
X	while (i < j) {
X		buf[j] = buf[i];
X		if (buf[i] == ' ' && buf[i-1] != ' ') {
X			if (dir == 0)
X				nb = (ne-1) / nholes + 1;
X			else
X				nb = ne / nholes;
X			ne -= nb;
X			nholes--;
X			for ( ; nb > 0; nb--) {
X				j--;
X				buf[j] = ' ';
X			}
X		}
X		i--;
X		j--;
X	}
X}
X
X/*
X * subst - substitutes a string for a specified character
X *
X */
Xsubst(in, chr, out, subara, n)
Xchar in[];
Xchar chr;
Xchar out[];
Xchar subara[];
Xint n;
X{
X	register int i, j, k;
X
X	dprintf("subst  ");
X	j = 0;
X	for (i = 0; in[i] != EOS; i++)
X		if (in[i] == chr)
X			for (k = 0; k < n; k++) {
X				out[j] = subara[k];
X				j++;
X			}
X		else {
X			out[j] = in[i];
X			j++;
X		}
X	out[j] = EOS;
X}
X
X/*
X * Text	process text lines
X *
X */
X
Xtext(inbuf)
Xchar inbuf[];
X{
X	int	i;
X	register int j;
X	char	wrdbuf[INSIZE];
X
X	dovar(wrdbuf,inbuf);		/*  expand variables */
X	strcpy(inbuf,wrdbuf);
X	doesc(inbuf, wrdbuf, INSIZE);	/*  expand escapes   */
X	dotabs(inbuf, wrdbuf, INSIZE);  /*  expand tabs      */
X
X	if(inbuf[0] == ' ' || inbuf[0] == '\n')
X		leadbl(inbuf); 		/* move left, set tival */
X	if(ulval > 0 || ULon) 		/* word underlining */
X	{
X		underl(inbuf, wrdbuf, INSIZE);
X		ulval--;
X	}
X	if(boval > 0 || BDon) 		/* boldfacing */
X	{
X		bold( inbuf, wrdbuf, INSIZE);
X		boval--;
X	}
X	if(ceval > 0 || CEon) 		/* centering */
X	{
X		center(inbuf);
X		put(inbuf);
X		ceval--;
X	}
X	else if( inbuf[0] == '\n' ) 	/* all blank line */
X		put(inbuf);
X	else if( fill == NO ) 		/* unfilled text */
X		put(inbuf);
X	else 				/* filled text */
X	{
X		i = strlen(inbuf) - 1;
X		inbuf[i] = ' ';
X		if( inbuf[i-1] == '.' )
X		{
X			i++;
X			inbuf[i] = ' ';
X		}
X		inbuf[i+1] = EOS;
X		for( i = 0 ; getwrb(inbuf, &i, wrdbuf) > 0 ; )
X			putwrd(wrdbuf);
X	}
X}
X
X/*
X * Underl	underline words in a line
X *
X */
Xunderl(buf, tbuf, size)
Xchar buf[];
Xchar tbuf[];
Xint size;
X{
X	int i, j;
X
X	j = 0;
X	for(i = 0 ; buf[i] != '\n' && j < size - 2; i++) {
X		if( buf[i] != ' ' && buf[i] != BACKSPACE && buf[i] != '_' ) {
X			tbuf[j++] = '_';
X			tbuf[j++] = BACKSPACE;
X		}
X		if( buf[i] == BLANK )
X			tbuf[j++] = ulblnk;
X		else
X			tbuf[j++] = buf[i];
X	}
X
X	tbuf[j] = '\n';
X	tbuf[j+1] = '\0';
X	strcpy(buf, tbuf);
X}
X
X/*
X * width - compute width of character string
X *
X */
Xint
Xwidth(buf)
Xchar buf[];
X{
X	int k,i;
X
X	dprintf("width  ");
X	k = 0;
X	for (i = 0; buf[i] != EOS; i++)
X		if (buf[i] == BACKSPACE)
X			k--;
X		else if (buf[i] >= ' ' && buf[i] <= '~')
X			k++;
X	return(k);
X}
X/*
X * getnow - get the date from command line if present.
X *          if not specified, prompt user for it.
X *
X * (stub)
X */
Xgetnow(date)
Xchar date[];
X{
X	dprintf("getnow  ");
X	strcpy(date,"00-xxx-1900 00:00:00");
X}
SHAR_EOF
if test 11642 -ne "`wc -c 'proff01.c'`"
then
	echo shar: error transmitting "'proff01.c'" '(should have been 11642 characters)'
fi
echo shar: extracting "'proff02.c'" '(2680 characters)'
if test -f 'proff02.c'
then
	echo shar: over-writing existing file "'proff02.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'proff02.c'
X#include <stdio.h>
X#include <ctype.h>
X#include "defs.h"
X#include "debug.h"
X
X/*
X * addset - put c in array[i], if it fits, increment i
X *
X */
Xint
Xaddset(c,array,i,maxsize)
Xchar c;
Xchar array[];
Xint *i;
Xint maxsize;
X{
X	int n,status = NO;
X	dprintf("addset  ");
X	n = *i;
X	if (n <= maxsize - 1) {
X		array[n++] = c;
X		status = YES;
X	}
X	*i = n;
X	return(status);
X}
X
X/*
X * addstr - add string s to str[i] if it fits, increment i
X *
X */
Xint
Xaddstr(s,str,i,maxsize)
Xchar s[];
Xchar str[];
Xint *i;
Xint maxsize;
X{
X	int k,j,status = NO;
X
X	dprintf("addstr  ");
X	j = *i;
X	if (j + strlen(s) <= maxsize - 1) {
X		for (k = 0; s[k] != EOS; k++)
X			str[j++] = s[k];
X		status = YES;
X	}
X	*i = j;
X	return(status);
X}
X
X/*
X * ctoi - convert string at in[i] to integer, increment i
X *
X */
Xint
Xctoi(in,i)
Xchar in[];
Xint *i;
X{
X	int j,n,sign;
X
X	dprintf("ctoi  ");
X	n = 0;
X	for (j = *i; in[j] == ' ' || in[j] == '\t'; j++)
X		;         /* skip leading garbage */
X	sign = 1;
X	if (in[j] == '+' || in[j] == '-') /* sign */
X		sign = (in[j++] == '+') ? 1 : -1;
X	for (n = 0; in[j] >= '0' && in[j] <= '9'; j++)
X		n = 10 * n + in[j] - '0';
X	*i = j;
X	return(sign * n);
X}
X
X/*
X * error - print message and terminate
X *
X */
Xerror(s)
Xchar s[];
X{
X	fprintf(stderr,"%s\n",s);
X	exit(1);
X}
X
X/*
X * getwrd - get non-blank word from in[i] into out, increment i
X *
X */
Xint
Xgetwrd(in,i,out)
Xchar in[];
Xint *i;
Xchar out[];
X{
X	int j,size = 0;
X
X	for (j = *i; in[j] == '\t' || in[j] == ' '; j++)
X		;         /* skip leading garbage */
X	while (in[j] != ' ' && in[j] != '\t' && 
X	    in[j] != EOS && in[j] != '\n')
X		out[size++] = in[j++];
X	out[size++] = EOS;
X	*i = j;
X#ifdef DEBUG
X	printf("getwrd: %s\n",out);
X#endif
X	return(size);
X}
X/*
X * skipbl - skip blanks, tabs at str[i], increment i
X *
X */
Xskipbl(str,i)
Xchar str[];
Xint *i;
X{
X	int n;
X	dprintf("skipbl  ");
X	n = *i;
X	while (str[n] == ' ' || str[n] == '\t')
X		n++;
X	*i = n;
X}
X
X/*
X * itoc - special version of itoa
X *
X */
Xint
Xitoc(n,str,size)
Xint n;
Xchar str[];
Xint size;
X{
X
X	int i,j,k,sign;
X	char c;
X
X	dprintf("itoc  ");
X	if ((sign = n) < 0)
X		n = -n;
X	i = 0;
X	do {
X		str[i++] = n % 10 + '0'; 
X	} 
X	while ((n /= 10) > 0 && i < size-2);
X	if (sign < 0 && i < size-1)
X		str[i++] = '-';
X	str[i] = EOS;
X	/*
X		 * reverse the string and plug it back in
X		 *
X */
X	for (j = 0, k = strlen(str) - 1; j < k; j++, k--) {
X		c = str[j];
X		str[j] = str[k];
X		str[k] = c;
X	}
X	return(i);
X}
X
X/*
X * usage - obvious..
X *
X */
Xusage()
X{
X#ifdef rainbow
X	fprintf(stderr,"%s %s",
X	"usage: proff \033[7m[+n] [-n] [-v] [-ifile] [-s] [-pon]\033[0m",
X	"\033[1minfile\033[0m \033[7m[outfile]\033[0m\n");
X#else
X	fprintf(stderr,
X	"usage: proff [+n] [-n] [-v] [-ifile] [-s] [-pon] infile [outfile]\n");
X#endif
X	exit(0);
X}
SHAR_EOF
if test 2680 -ne "`wc -c 'proff02.c'`"
then
	echo shar: error transmitting "'proff02.c'" '(should have been 2680 characters)'
fi
echo shar: extracting "'proffman.prf'" '(46207 characters)'
if test -f 'proffman.prf'
then
	echo shar: over-writing existing file "'proffman.prf'"
fi
sed 's/^X//' << \SHAR_EOF > 'proffman.prf'
X
X.! Proff user's manual
X.! Feb. 1984 by Ozan S. Yigit
X.!
X.! Edited by Steven Tress and Terry Lim
X.! vers. 1.0
X.!
X.! ----------- macros ----------
X.! sect - produce a bold section header and
X.! enter a contents line. First parameter
X.! is indent level for contents line.
X.define sect
X.sp
X.cl $1 $2 $3 $4 $5 $6 $7
X.bd
X$2 $3 $4 $5 $6 $7
X.en
X.! -----------------------------
X.define note
X.sp
X.ce
XNOTE
X.sp
X.fi
X.in +5
X.rm -5
X.en
X.define endnote
X.sp
X.nf
X.in -5
X.rm +5
X.en
X.! -----------------------------
X.! Macros to create a point-form lists. 
X.! Note the use of number registers within
X.! the macros. See section 5.
X.!		      
X.define list
X.nr a $1
X.in +$1
X.en
X
X.define item
X.sp
X.ti -@na
X$1
X.en
X
X.define nolist
X.in -@na
X.sp
X.en
X.! -----------------------------
X.ce 100
X.st 8
XPROFF User's Guide
X.sp
XVersion 1.0
X.ce 0
X.nf
X.in +25
X.sp 15
X***  *******
X***  *********
X     **	     **
X     **	     **
X     *********
X     *******
X     **
X     **
X     **
X******
X****
X.in -25
X.fi
X.ce 100
X.st -8
XOzan S. Yigit & Steven Tress
XMarch 1984
X.ce 0
X.bp 1
X.he /1.0/Proff User's Guide/#/
X.ap
X.fi
X.ju
X.sect 0 1.0 Introduction
X This manual describes PROFF, a formatter based on the FORMAT utility
Xpresented in
X.ul
XSoftware Tools.
X PROFF was produced to provide a powerful formatter that can be used under
Xa variety of microcomputers, thus providing a consistent formatting tool
Xacross environments. PROFF can be used to format memos, reports, form letters 
Xand
Xdocuments such as this manual. It can also be configured to mimic 
Xother formatting
Xsystems of similar nature.
X This document itself was produced with PROFF, using most of its advanced features.
XPROFF took care of such things as auto-paragraphing and the production of 
Xthe Table of Contents as the manual was being formatted.
X PROFF was developed under a Digital Equipment Corporation Rainbow 100,
Xusing Mark Williams C Compiler for portability reasons. PROFF is
Xavailable under VAX/VMS operating system. PROFF implementations for 
XIBM PC and APPLE ][ microcomputers are also underway.
X.st -14
XRainbow, VAX/VMS are trademarks of Digital Equipment Corporation.
X.br
XMark Williams C Compiler is a trademark of Mark Williams Company.
X.br
XIBM is a registered trademark of International Business Machines Inc.
X.br
XAPPLE is a trademark of Apple Computer Inc.
X.br
XUNIX is a trademark of Bell Laboratories.
X.bp
X.cl
X.sect 0 2.0 General Description
X.cl
X.sect 1 2.1 The Input
X The text that is to be formatted by PROFF is typed into an input file
Xusing any text editor. This file contains the text to be formatted
Xas well as PROFF commands.
X Each line in the input file is either a command line or a text line. A
Xcommand line is a line that begins with a period ("."). All other lines are
Xtext lines. The command lines are not printed - they tell PROFF how you want
Xit to format the text that follows. Appendix A summarizes all of the PROFF
Xcommands for a quick reference.
X.sect 2 2.1.1 Text
X Text can be entered into the input file in any format. PROFF removes all extra
Xblanks and tabs between words when operating in fill mode. This means you do
Xnot have to worry about how many words you put on a line, and you can break 
Xlines wherever it is convenient to your typing. Note however, that you cannot
Xbreak a word between two lines.
X Blanks and tabs at the beginning of a line are not removed. This is useful
Xfor producing special tables and performing special types of indentation.
XThus, normal text lines should not have any leading tabs or blanks.
X.sect 2 2.1.2 Commands
X A command is a line that starts with a period. Immediately following the
Xperiod is a command name. Some commands accept a numeric quantity or a
Xcharacter string parameter, which must be separated from the command name
Xby a space or a comma. For example, an indent command might appear as follows:
X.save
X.in +5
X.nf
X.nj
X.sp
X|
X|It is to do nothing that the elect exists.
X|.in 5
X|- Oscar Wilde
X|
X.restore
X Assuming that the left margin was at column 1, PROFF would produce the
Xfollowing:
X.save
X.in +5
X.nf
X.nj
X.sp
X.need 4
X|
X|It is to do nothing that the elect exists.
X|     - Oscar Wilde
X|
X.restore
X.sp
X(In the examples above, as in those following, the vertical line indicates
Xthe left edge of input or the left edge of the printed page).
X The number following the command may be preceeded by a "+" or "-" sign.
XThis plus or minus sign indicates an addition or subtraction of the number
Xto or from the current value for the command. for example, the text:
X.sp
X.save
X.in +5
X.nf
X.nj
X.need 11
X|
X|Nothing to do but work,
X|.in +3
X|Nothing to eat but food,
X|.in -3
X|Nothing to wear but clothes
X|.in +3
X|To keep one from going nude.
X|.in +7
X|-Benjamin King
X|
X.in -5
X.sp
Xwill produce as output:
X.sp
X.in +5
X.need 6
X|
X|Nothing to do but work,
X|   Nothing to eat but food,
X|Nothing to wear but clothes
X|   To keep one from going nude.
X|          -Benjamin King
X|
X.restore
X If a number is not supplied with a command that requires a number, PROFF
Xwill use a default value. The defaults for each command are summarized in
XAppendix A.
X.cl
X.sect 1 2.2 The Output
X The main functions performed by PROFF are 
X.ul
Xfilling
Xand 
X.ul
Xjustifying.
XA line is
Xfilled by packing as many words onto it as will fit. The line is justified
Xby spacing words evenly between the left and right margins. When PROFF starts,
Xit assumes that the text is to be filled and justified. Of course, when fill
Xand justify are not needed (as in the case of a letter or a table), there are
Xcommands to turn these features off, and back on again, as necessary.
X When PROFF is in fill mode, it normally strips out extra spaces and tabs 
Xbetween words.
X Many PROFF commands cause a
X.ul
Xbreak
Xto occur in the output. This means that the line currently being filled is 
Ximmediately output. Any following text goes into a new output line.
X.cl
X.sect 1 2.3 Executing PROFF
X Once a text file is ready for formatting, PROFF is started by typing
Xthe program name, various options, name of the input file and the name
Xof the output file. For example the command
X.sp
X.in +5
XA> proff  -po5 proffman.prf proff.man
X.sp
X.in -5
Xwould produce this document as proff.man, from an input file proffman.prf, 
Xshifted right by 5 spaces.
X(The symbol "A>" is CP/M system prompt).
X.cl
X.sect 1 2.4 Bibliographic Notes
X  PROFF wa produced by re-writing the Software Tools Formatter FORMAT.
XSome of the ideas are from Freshwater Institute RUNOFF, NROFF, 
XUniversity of Waterloo SCRIPT
Xand other formatters of similar nature. The underlying ideas of the
Xmentioned above formatters may be found in
X.ul
XSoftware Tools
Xby B.W. Kernighan and P.J. Plauger. 1976. (Addison-Wesley, Reading, Mass.).
X.cl
X.sect 1 2.5 References and Readings
X.nf
X.nap
X.sp
XBrian W. Kernighan and P. J. Plauger,
X.ul
XSoftware Tools
XAddison-Wesley (1976)
X.sp
XR. Furuta, J. Scofield and A. Shaw,
X.ul
XDocument Formatting Systems:
X.ul
XSurvey, Concepts, and issues
XACM Computing Surveys, Sept. 1982, Pp. 417
X.sp
XMark Stuart Brader,
X.ul
XAn Incremental Text Formatter
XDepartment of Computer Science
XUniversity of Waterloo, CS-81-12
X.bp
X.fi
X.ap
X.cl
X.sect 0 3.0 Command Descriptions
X This section describes PROFF commands. Commands specify how the program is
Xto process the text lines in the input file. Lines in the input file that
Xbegin with a period (or the control character selected by the user) 
Ximmediately followed by a command name are commands. Any line that begins
Xwith a period and followed by a _# or _! is a comment line and is ignored
Xby PROFF - this allows you to put information in the file that will be neither
Xprocessed nor output by PROFF.
X As described earlier, some of the commands can be followed by "parameters".
XParameters are used in executing a command; for example, in the command
X".sp 3", the parameter "3" tells the formatter to insert 3 blank lines into
Xthe document. The following conventions are used in describing the parameters:
X.sp
X.in +5
X.ti -2
Xo Parameters surrounded by square brackets are optional. If not supplied, PROFF
Xassumes a default value. 
X.br
X(e.g. .sp [n])
X.sp
X.ti -2
Xo Parameters surrounded by angle brackets are mandatory. PROFF will display
Xa fatal error message if the parameter is absent. (e.g. .set <variable name>)
X.sp
X.ti -2
Xo Parameters surrounded by squiggly brackets are to be typed exactly as
Xindicated. (e.g. .pn {roman})
X.sp
X.ti -2
Xo A bar character seperating the parameters within brackets indicate an
Xalternative. (e.g. .st [+|-][n] means both .st [+n] and .st [-n])
X.in -5
X In describing the commands, the command is typed exacty as accepted by PROFF
Xwith the associated control character default ("."). If more than one form of
Xthe command is accepted by PROFF, the command names are separated with a
Xbar indicating an alternative.
X.bp
X.cl
X.sect 1 3.1 Filling and Justifying
X.nap
X.in +5
X.!
X.! define a simple macro for generating the headers.
X.! note that the second "$" within macro is for 
X.! variable expansion. Initially, the variable name
X.! is passed into the macro WITHOUT any expension.
X.! we also use the new control character within macro.
X.!
X.define comm
X\sp
X\cl 2 $$1
X\ti -5
X$$1
X\sp
X.en
X.! change the control character from period (".") to a backslash ("\")
X.! to avoid the interpretation of the command headers
X.!
X.cchar \
X\!
X\! Variable creation
X\! We use variables to avoid re-typing of multiple options over
X\! and over again. These variable names will be reused in the
X\! appendix to produce a quick referance
X\!
X\set FILL ".fi | .f | .fill"
X\comm FILL
XThe fill command causes a line to be filled with as many words as the right
Xmargin allows. For this purpose, all extra blanks and tabs are removed between
Xwords. Each word is separated with a single blank. PROFF automatically assumes
Xfill mode during the startup.
X\set NOFILL ".nf | .nofill"
X\comm NOFILL
XNo fill discontinues the filling of the text. PROFF simply copies the text
Xto the output. This command may be used to pass tables and other text
Xunaltered through the formatter.
X\set JUST ".ju | .j | .justify"
X\comm JUST
XJustify causes the words on a line to be evenly spaced between the left and
Xthe right margins. Note that lines can be justified only if lines are also
Xbeing filled. PROFF automatically assumes justify mode during the startup.
X\set NOJUST ".nj | .nojustify"
X\comm NOJUST
XNo justify discontinues the text justification.
X\in -5
X\cchar .
X.bp
X.cl
X.sect 1 3.2 Text Formatting
X.in +5
X.cchar \
X\set BREAK ".br | .break"
X\comm BREAK
XBreak causes a break: the current line is printed without justification,
Xand the next word is placed at the beginning of a new line. Note that many
XPROFF commands cause an implicit break.
X\set INDENT ".in | .lm | .leftmargin [+|-][n]"
X\comm INDENT
XIndent causes a break and indents the following lines [n] spaces to the
Xright of the left margin. [n] can be negative to allow beginning a line
Xto the left of the left margin, however, a line cannot begin to the left of
Xcolumn 0. If a plus or minus sign is used with n, then [n] is added or
Xsubtracted to or from the current value.
X\set TINDENT ".ti | .i | .left [+|-][n]"
X\comm TINDENT
XTemporary indent is identical to the indent command except that it 
Xapplies only to the next line of printed text. Thus, the command
X".ti +5" would cause the next line to be printed 5 spaces to the right
Xof those that follow.
X\set SPACETO ".st | .spaceto [-][n]"
X\comm SPACETO
XSpaceto allows spacing to line [n] from the top of the current page.
XIf a negative [n] is specified, than spacing is performed to line [n]
Xfrom the bottom of the page (excluding the footer lines). Thus, footnotes
Xcan be set at a fixed distance from the bottom of the page by a command such
Xas ".st -5".
X\set SPACE ".sp | .s | .skip [n]"
X\comm SPACE
XSpace causes a break and skips [n] lines, except at the top of 
Xa page. The space command
Xis dependent on the setting of line spacing.
X\set CENTER ".ce | .center [n | on | off]"
X\comm CENTER
XCenter causes the next [n] lines of text to be centered between the left
Xand right margins. Centering may be started with "on" and terminated with
X"off", in which case all input lines between these commands will be centered.
X\set UNDLINE ".ul | .underline [n | on | off]"
X\comm UNDLINE
XUnderline command causes the text on the next [n] input lines to be underlined
Xwhen printed. If [n] is omitted, only the next line is underlined. This command
Xdoes not cause a break, so words in filled text may be underlined by:
X\sp
X\save
X\cchar .
X.in +5
X.nf
X.need 11
X.sp
X|
X|The "Pay-off" Theory: Only
X|.ul
X|losers
X|believe in luck, horses, horoscopes
X|and
X|.ul
X|lotteries.
X|
X.in -5
X.sp
Xto get
X.in +5
X.sp
X.fi
X|
X.br
X|The "Pay-off" Theory: Only
X.ul
Xlosers
Xbelieve in
X.br
X|luck, horses, horoscopes and
X.ul
Xlotteries.
X.br
X|
X.sp
X.restore
XUnderlining may be started with "on" and terminated with "off", similar to
Xthe centering command.
X\set CUNDLINE ".ul | .underline [all | words]"
X\comm CUNDLINE
XThis version of the underline command is used to set the mode of
Xunderlining:
X\sp
X\nap
X\in +5
X\nf
Xall   - underline across all characters,
X        including spaces.
X\br
Xwords - underline words only
X\fi
X\sp
X\in -5
X\ap
X\set BOLD ".bd | .bold [n | on | off]"
X\comm BOLD
XThe bold command causes the text on the next [n] input lines to be highlighted
Xby overstriking. If [n] is omitted, only the next line is highlighted.
XBolding may be started with "on" and terminated with "off" as in the
Xcase of the center and underline commands.
X\set DBO ".db | .dbo | .disablebolding"
X\comm DBO
XTurns the bolding off, all bolding commands are ignored. This feature is
Xuseful for rough drafts.
X\set EBO ".eb | .ebo | .enablebolding"
X\comm EBO
XTurns the bolding feature back on. Bolding is turned on during the PROFF
Xstartup.
X\in -5
X\cchar .
X.bp
X.cl
X.sect 1 3.3 Page Formatting
X.in +5
X.cchar \
X\set LS ".ls | .spc | .spacing [n]"
X\comm LS
XLine spacing is the command to set line spacing. Set n to 1 for single spacing,
X2 for double spacing etc. 
X\set BP ".bp | .pg | .page [n]"
X\comm BP
XThe begin page command causes a break, ends the current page, outputs
Xfooters if required and begins a new page. If [n] is present, the page number
Xis set to [n]. The default action is to number the pages incrementally.
X\set PN ".pn | .pagenumber {roman} | {arabic}"
X\comm PN
XPage number command defines the format of the page number. Uppercase roman
Xnumerals may be obtained with "roman" keyword. To convert the page numbers
Xback to normal, "arabic" is specified. PROFF uses arabic numerals as
Xa default.
X\set NPA ".np | .nopaging"
X\comm NPA
XNo paging disables the pagination. When PROFF is in no paging mode,
X"begin page" (.bp) and "page length" (.pl) commands are ignored. This mode
Xof operation is especially useful for using the proff output with the
Xmulti-column formatter (MC).
X\set PA ".pa | .paging"
X\comm PA
XPaging enables normal page generation. This command starts a 
Xnew page and restores the page length to the
Xvalue previous to the ".np" command.
X\set NE ".ne | .need | .tp | .testpage [n]"
X\comm NE
XTest page checks to see whether at least [n] lines remain in the
Xcurrent page. If less than this number of lines remain, printing will resume
Xat the top of a new page. If [n] is missing, it is assumed to be zero.
X\set HE ".he | .header <text>"
X\comm HE
XHeader sets the text to be printed on top of each page. <text> is 
Xdivided into sections which are to be left justified, centered and right
Xjustified. To divide <text> into these three parts, the first character is
Xassumed to be a separator. (e.g. /left/center/right/) But any non-alphanumeric
Xcharacter may also be used. The characters "#" and "%" are replaced with the
Xcurrent page number and day/time in the header. 
X\set FO ".fo | .footer <text>"
X\comm FO
XFooter is identical to header except that it sets the text to be printed
Xat the bottom of each page.
X\set OHE ".oh <text>"
X\comm OHE
XThe odd header command sets the header for odd pages only.
X\set EHE ".eh <text>"
X\comm EHE
XThe even header command sets the header for even pages only.
X\set OFO ".of <text>"
X\comm OFO
XThe odd footer command sets the footer for odd pages only.
X\set EFO ".ef <text>"
X\comm EFO
XThe even footer command sets the footer for even pages only.
X\in -5
X\cchar .
X.bp
X.cl
X.sect 1 3.4 Page Layout
X.ap
X These commands are used to specify where on the page you want the formatted
Xtext to be placed. The general layout of a page is as follows:
X.nap
X.need 30
X.nf
X
X	page offset (.po)				|
X	|						|
X	V						|
X	+----+-------------------------------------+----+ -+
X	|    |	top margin (m1) includes header	   |	|  |
X	+----+-------------------------------------+----+  |
X	|    |		top margin 2 (m2)	   |	|  |
X	+----+-------------------------------------+----+  |
X	|    |			.		   |	|  P
X	|    |<-- indent (.in)	.		   |    |  A
X	|    |			.		   |    |  G
X	|    |		        T		   |	|  E
X	|    |		     	E		   |	|
X	|    |	           	X      		   |	|  L
X	|    |		     	T		   |	|  E
X	|    |			.		   |	|  N
X	|    |		     right margin (.rm) -->|	|  G
X	|    |			.		   |    |  T
X	|    |			.		   |	|  H
X	|    |			.		   |    |  |
X	+----+-------------------------------------+----+  |
X	|    |	        bottom margin 3 (m3)   	   |	|  |
X	+----+-------------------------------------+----+  |
X	|    |	bottom margin (m4) includes footer |	|  |
X	+----+-------------------------------------+----+ -+
X	|						|
X	|						|
X.fi
X.in +5
X.cchar \
X\set PO ".po | .offset [+|-][n]"
X\comm PO
XThe page offset command moves the entire page to the right or left depending on the
Xspecified value. All indentation is according to the page offset. PROFF
Xassumes a page offset of 0 during the startup. If [n] is specified with a
Xplus or minus, it will be added or subtracted from the current value.
X\set RM ".rm | .rightmargin [+|-][n]"
X\comm RM 
XRight Margin sets the position of the last printable character from the
Xleft edge of the page to [n]. Default value for right margin is 65.
XA plus or minus value will be added or subtracted from the current value.
XIf [n] is not specified, right margin is set to the default value.
X\set PL ".pl | .ps | .pagesize [n]"
X\comm PL
XPage length is used to set the number of lines that are to be printed
Xon a page including the header and footer lines. After [n] lines are printed,
Xthe paper will advance to the top of next page. The default page length is
X66 lines (11 inches for 6 lines/inch). This command is disabled if nopaging
Xis set.
X\set M1 ".m1 [n]"
X\comm M1
XMargin 1 sets the number of lines (including the header) which will be left at
Xthe top of the page to [n]. The default setting is 3. If [n] is omitted, is
Xset to the default.
X\set M2 ".m2 [n]"
X\comm M2
XMargin 2 sets the number of blank lines between the header and the first
Xline of text. The default setting is 2.
X\set M3 ".m3 [n]"
X\comm M3
XMargin 3 sets the number of blank lines between the footer and the last line
Xof text. The default setting is 2.
X\set M4 ".m4 [n]"
X\comm M4
XMargin 4 sets the number of lines (including the footer) which will be left at
Xthe bottom of the page to [n]. The default setting is 3.
X\in -5
X\cchar .
X.bp
X.cl
X.ap
X.sect 1 3.5 Table of Contents
X This section describes the the commands that are used to generate a table of
Xcontents. Basically, a contents line command is used in every place in
Xthe document where an entry is needed in the table of contents. PROFF
Xstores the text and the page number when it encounters this command.
XAfter the the body of the document is processed, a print contents command
Xdumps the contents table. The contents should be dumped in a new page, with
Xnofill. Page numbering should be disabled if the table of contents is to be
Xused in front of the document.
X.sp
X.in +5
X.ap
X.cchar \
X\set CL ".cl | .contline [<n> <text>]"
X\comm CL
XContents line specifies a line of <text> to be entered into the table of
Xcontents. <n> specifies the level at which the item is to be printed
Xin the table. When the table is printed, each level of entry will be
Xindented by specific number of spaces. 
X<text> appears in the output exactly as it appears
Xin the contents line command, except that leading blanks are removed.
XIf no options specified in the contents line, a blank is inserted during
Xthe table output.
X\set PC ".pc | .printcont [n]"
X\comm PC
XPrint Contents causes the currently accumulated table of contents to be
Xprinted. If [n] is specified, it is used as the indent value for each
Xlevel.  If [n] is not specified, it is defaulted to 3.
X A contents line at level 0 is as wide as rightmargin-indent. The
Xoutlook of the table of contents may be changed by altering the right
Xmargin and indent values. A typical table of contents may be produced as
Xfollows:
X\in +5
X\nf
X\sp
X|.page
X|.he ////
X|.fo ////
X|.nofill
X|.sp
X|.center
X|Table of Contents
X|.sp
X|.printcont
X\in -5
X\fi
X\sp
XThe following example illustrates the generation of a table of contents. Note
Xthat only one table of contents is active for a PROFF session.
X\need 40
X\sp
X\in +5
X\nf
X\nap
X.cl
X.cl 0 A. Introduction
XIntroduction
X	text
X	.
X.cl
X.cl 0 B. Methods
XMethods
X	text
X	.
X.cl 1 a) Sampling Procedures
XSampling
X	text
X	.
X.cl 1 b) Laboratory Procedures
XLaboratory
X	text
X	.
X.cl
X.cl 0 C. Results
XResults
X	text
X	.
X	.
X.pg
X.nf
X.he ////
X.fo ////
X.ce
XTable of Contents
X.sp
X.pc
X\sp
X\in -5
XThese commands will produce the following table:
X\sp
X\in +5
X		Table of Contents
X
XA. Introduction...............................   1
X
XB. Methods....................................   3
X   a) Sampling Procedures.....................   3
X   b) Laboratory Procedures...................   4
X
XC. Results....................................   5
X\sp
X\in -5
X\fi
XMacros may be defined as described in the following sections to help the generation
Xof the table of contents.
X\cchar .
X.in -5
X.bp
X.cl
X.ap
X.sect 1 3.6 Miscellaneous
X This section describes miscellaneous commands that radically increase the
Xformatting powers of PROFF. With the assistance of variables, PROFF can 
Xgenerate form letters and documents with dynamic parts. The ability to save
Xand restore formatter context eliminates the need to remember the exact
Xsettings of the formatter across the document.
X.in +5
X.cchar \
X\set VSET ".vs | .set <variable> [definition]"
X\comm VSET
XSet variable  defines a variable to be later used in the document.
XIf the definition part is left out, PROFF uses the variable name as a prompt
Xand allows the user to define the variable interactively. Variable names cannot
Xstart with a numeric character, and may only contain alphanumeric 
Xcharacters. The definition of a variable may not contain any blanks, unless
Xthey are surrounded by double-quotes. To get a double quote within a a quoted 
Xdefinition, two double-quotes are used.
X Once the variable is
Xdefined, it can be used anywhere in the document, including the command
Xline itself. A variable substitution is invoked by a dollar sign (_$). (A 
Xliteral _$ is inserted into text using ___$).
XA variable name must be delimited by a non-alphanumeric character within the 
Xtext. If the contents of the variable is to be appended to other 
Xalphanumeric characters, it must be surrounded by wiggly braces 
X("{" and "}"). The following is an example of variable usage:
X\need 12
X\sp
X\nf
X|.nf
X|.vs v1 Murphy
X|_${v1}'s first law:
X|	Nothing is as easy as it looks.
X|_${v1}'s second law:
X|	Everything takes longer than you think.
X|Charley's observation:
X|	Computers were invented by _$v1.
X|
X\sp
XProduces the following:
X\sp
X\need 8
X|
X|Murphy's first law:
X|	Nothing is as easy as it looks.
X|Murphy's second law:
X|	Everything takes longer than you think.
X|Charley's observation:
X|	Computers were invented by Murphy.
X|
X\sp
X\fi
X\set VGET ".vg | .get <variable> <prompt>"
X\comm VGET
XGet variable is the interactive version of variable definition. In this 
Xvariant, a prompt string is used to obtain the value of the variable,
Xwhich is typed at the user's terminal. If the prompt string is to 
Xcontain blanks, tabs etc., it must be enclosed in double quotes. No quotes
Xare necessary for input text.
X\set VRG ".nr <a-z> [+|-][n]"
X\comm VRG
XNumber register is used to define registers that contain numeric values.
XThere are 26 number registers, named a-z. The command ".nr x n" sets the
Xnumber register "x" to value n; ".nr x +n" increments the number register
Xby n; ".nr x -n" decrements the number register by n. The value of the
Xnumber register x is placed in the text by the appearance of _@nx. A literal
X_@ may be inserted using ___@.
XNumber registers may be used on command lines and anywhere in the text.
X\set CCHAR ".cc | .cchar [char]"
X\comm CCHAR
XControl Character  sets the character that distinguishes PROFF 
Xcommands from text to be formatted. As a default, control character is set to 
X(".") period.
XThis character may be changed to something other than a period, either
Xto mimic other formatters or to disallow interpretation of lines beginning
Xwith a period. (This document makes heavy use of the .cc command).
X\set ECHAR ".ec | .echar [char]"
X\comm ECHAR
XEscape Character  sets the character that disallows the 
Xinterpretation of spacial characters such as _@ and _$. PROFF uses an
Xunderline ("__") character as a default.
X\set SOU ".so | .source | .include | .require [filename]"
X\comm SOU
XThe source (include) command allows external files to be inserted into the 
Xinput file
Xduring the formatting. Using this feature, tables, graphs and other 
Xdocuments generated outside PROFF may be included into the document
Xbeing formatted. This feature is also very useful in including a common set
Xof macros during formatting. Include files may be nested inside other
Xinclude files. Currently, PROFF only allows a nested include
Xfiles level of 8. Filename may be enclosed in quotes.
X\set SAVE ".sv | .save"
X\comm SAVE
XThe save command allows the saving of the current formatter context on a 
Xpushdown stack. The saved context of the formatter segment (FSECT) includes
Xthe following values and flags:
X\need 14
X\sp
X\nf
X\nap
Xvalues			flags		on   |  off
X------			-----		
Xindent 		(.in)	fill		(.fi | .nf)
Xright margin	(.rm)	justify 	(.ju | .nj)
Xoffset		(.po)	paging  	(.pa | .np)
Xline spacing	(.ls)	number type   	(.pn)
Xpage length	(.pl)	bolding		(.eb | .db)
Xmargin values	(.m1)	autoparagraph	(.ap | .na)
X		(.m2)
X		(.m3)
X		(.m4)
Xcontrol char	(.cc)
Xescape char	(.ec)
X\sp
X\ap
X\fi
X\set RST ".rs | .restore"
X\comm RST
XThe restore command pops the context stack and restores the values and flags
Xas defined above.
X\set LEX ".lx | .lex <command> [equate]"
X\comm LEX
XThe lexical modification command is essentially a permanent replacement of a
Xgiven command. This command is used for changing the command names without
Xresorting to the macro facility. Lex permanently removes the old
Xcommand name from command tables and replaces it with the new definition.
XIf the equate is not specified, the command  becomes undefined and is
Xno longer recognised by PROFF. The command equate should not contain 
Xnon-alphanumeric characters.
X\set APR ".ap | .autoparagraph"
X\comm APR
XThe autoparagraph command turns on the automatic paragraphing feature. If
Xauto-paragraphing is on, every line that starts with a 
X\ul
Xblank
Xor a 
X\ul
Xtab
Xcharacter starts a new paragraph. A new line is generated (.sp) and
Xthe beginning of the paragraph is indented by five spaces.
XAutoparagraphing is the equivalent of the following commands:
X\in +5
X\nf
X|
X|textextextextext
X|.sp
X|.ti +5
X|textextextextext
X|
X\in -5
X\fi
X\set NAP ".na | nap | .noautoparagraph"
X\comm NAP
XNo Autoparagraph command disables auto-paragraphing.
X\set WRT ".wr | .write <string>"
X\comm WRT
XWrite is a special output command, only to be used to configure printers
Xand other output devices with escape sequences. This command outputs the
Xassociated string as it is encountered, without going through the normal
Xoutput routines of the formatter. Currently, the output string may contain
Xcontrol characters specified as "^<char>", decimal numbers within the range
Xof 1-255, and other characters. Blanks within the string are skipped. Any
Xportion of the string enclosed with double quotes is output as is. To output
Xa double quote, two double quotes must be used within the quoted string.
XFollowing is a typical string to set a Digital La-100 printer to letter
Xquality print mode:
X\sp
X\nf
X\in +5
X|
X|.wr ^["[2z"
X|
X\sp
X\fi
X\in -5
XIn the control string, "^[" is the ASCII equivalent of the Escape (esc) character.
XFollowing mapping table is used to convert characters starting with a caret
Xto their binary equivalents: ("|" indicates an alternative)
X\nf
X\nap
X\sp
X\in +5
XControl chr	Dec.	Oct.	Hex.
X-----------	----	----	----
X^a | ^A	(soh)	1	01      01
X^b | ^B	(stx)	2	02	02
X^c | ^C	(etx)	3	03	03
X^d | ^D	(eot)	4	04	04
X^e | ^E	(enq)	5	05	05
X^f | ^F	(ack)	6	06	06
X^g | ^G	(bel)	7	07	07
X^h | ^H	(bs)	8	10	08
X^i | ^I	(ht)	9	11	09
X^j | ^J	(nl)	10	12	0A
X^k | ^K	(vt)	11	13	0B
X^l | ^L	(np)	12	14	0C
X^m | ^M	(cr)	13	15	0D
X^n | ^N	(so)	14	16	0E
X^o | ^O	(si)	15	17	0F
X^p | ^P	(dle)	16	20	10
X^q | ^Q	(dc1)	17	21	11
X^r | ^R	(dc2)	18	22	12
X^s | ^S	(dc3)	19	23	13
X^t | ^T	(dc4)	20	24	14
X^u | ^U	(nak)	21	25	15
X^v | ^V	(syn)	22	26	16
X^w | ^W	(etb)	23	27	17
X^x | ^X	(can)	24	30	18
X^y | ^Y	(em)	25	31	19
X^z | ^Z	(sub)	26	32	1A
X^[	(esc)	27	33	1B
X^\	(fs)	28	34	1C
X^]	(gs)	29	35	1D
X^^	(rs)	30	36	1E
X^__	(us)	31	37	1F
X\sp
X\in -5
X\ap
X\fi
X\cchar .
X.in -5
X.bp
X.cl
X.sect 1 3.7 Defining New Commands (Macros)
X In document formatting, it is common to repeat a series of commands at
Xseveral places in the document. PROFF allows you to define a new command
Xthat will replace these repeated commands. This not only saves typing but
Xensures that
X.ul
Xexactly
Xthe same sequence of commands are applied throughout the document. A new
Xcommand that you define is formally called a
X.ul
Xmacro.
XTo define a macro, you must use the define macro (.de | .define) and
Xend macro (.en) commands.
X.in +5
X.cchar \
X\set DEF ".de | .define <macro name>"
X\comm DEF
XDefine is used to define a <macro name> to which a series of commands to
Xbe assigned. This definition line is followed by any number of PROFF
Xcommands and/or text which define the action that the macro
Xwill subsequently produce. Macros may refer to other macros.
X\set ENM ".en"
X\comm ENM
XEnd macro is the last line in the command definition. You must put in this
Xcommand to finish a currently defined macro. ".en" command should not be
Xre-defined as a macro.
X\in -5
X\sp
XThe example below defines macros ".note" and ".endnote", similar to the
XRUNOFF commands of the same name.
X\in +5
X\nap
X\nf
X\need 20
X\sp
X|
X|.define note
X|.sp
X|.ce
X|NOTE
X|.sp
X|.fi
X|.in +5
X|.rm -5
X|.en
X|
X|.define endnote
X|.sp
X|.nf
X|.in -5
X|.rm +5
X|.en
X|
X\in -5
X\ap
X\fi
X A macro is used like any other PROFF command, control character followed
Ximmediately  by the name of the macro. For example, the above macros
Xmay be used as follows:
X\in +5
X\nap
X\need 9
X\nf
X\sp
X|
X|.note
X|textextextextextextextextextext
X|              .
X|	       .
X|	       .
X|.endnote
X|
X\in -5
X\sp
X\fi
XThe following note is generated by the same macros described previously.
X\cc .
X.nap
X.note
XFlap's Law: Any inanimate object, regardless of its position or configuration,
Xmay be expected to perform at any time in a totally unexpected manner for
Xreasons that are either entirely obscure or else completely mysterious.
X.endnote
X.fi
X.cc \
X\ap
XSpecial symbols may be used within a macro definition. These symbols represent
Xthe parameters passed to a macro, delimited by blanks or commas.
XThese symbols are _$0 for macro name, _$1 for the first parameter, _$2 for
Xthe second parameter and so on, up to _$9 for the ninth parameter. Currently,
Xmacro parameters may only contain alphanumerics, no string parameters are
Xpossible. The previous macro "note" may now be defined as follows:
X\in +5
X\nap
X\nf
X\need 20
X\sp
X|
X|.define note
X|.sp
X|.ce
X|_$2 _$3 _$4 _$5 _$6 _$7 _$8 _$9
X|.nr m _$1
X|.sp
X|.fi
X|.in +_$1
X|.rm -_$1
X|.en
X|
X|.define endnote
X|.sp
X|.nf
X|.in -_@nm
X|.rm +_@nm
X|.en
X|
X\in -5
X\ap
X\fi
X In this version of the "note" and "endnote" macros, the first parameter (_$1)
Xis used to pass the value for indentation and right margin adjustment.
XAll the rest of the macro parameters (_$2 - _$9) are used as the title of
Xthe note. The indent value passed as the first parameter is also saved in the
Xnumber register "m" to communicate it to the "endnote" macro, such that
Xwhen the endnote macro is called, both indent and right margin values are
Xadjusted back to normal. It is possible and may be more useful to use
X".save" and ".restore" commands to accomplish the same task, especially if
Xthe macro alters the current formatting context drastically. The ".note"
Xand ".endnote" macros may be called as follows:
X\in +5
X\nap
X\need 9
X\nf
X\sp
X|
X|.note 5 Asimov's Law of Robotics
X|textextextextextextextextextext
X|              .
X|	       .
X|	       .
X|.endnote
X|
X\in -5
X\fi
X\ap
X In this usage, the indent value will be adjusted by +5, right margin will
Xbe adjusted by -5, and the title "Asimov's Law of Robotics" will appear
Xcentered above the note.
X\cchar .
X.bp
X.cl
X.sect 0 4.0 Executing PROFF
X The PROFF program  may be invoked with a series of optional parameters and
Xfilenames on the command line. The command synopsis is:
X
XPROFF [+n] [-n] [-v] [-s] [-pon] [-ifile] input [output]
X
XThe square brackets indicate an optional parameter. Interpretation of the
Xparameters is as follows:
X.nap
X.in +10
X.define opt
X.need 5
X.sp
X.ti -5
X.bd
X$1
X.br
X.en
X.opt +n
XStart the printing of the document at the first page with
Xnumber n.
X.opt -n
XStop printing at the first page numbered higher than n.
X.opt -v
XVerbose mode. PROFF indicates the source files being included into
Xdocument, and produces a summary of the number of textlines read in, the number
Xof lines and actual pages generated. A memory usage summary of internal
Xstorage for macros, stacks and tables is also displayed.
X.opt -s
XStop before each page, including the first one to allow paper
Xadjustment. A prompt is given just before the first page. For each
Xpage thereafter, the terminal bell is rung to indicate that another sheet
Xof paper is needed.
X.opt -pon
XSets the page offset to n. This is equivalent to ".po" command within
Xthe document. It is recommended that -pon option be used instead of
Xembedding the offset value within the document.
X.opt -ifile
XIncludes the given file to the formatted document. This is equivalent to
Xa ".include file" command within the document. This option may be
Xrepeated more than once, -ifile1 -ifile2 etc. 
X.opt input
XSpecifies the input file to be formatted. PROFF does not impose any
Xfile extension. The recommended extension is ".PRF".
X.opt output
XSpecifies the output file for the formatted document. If this is omitted,
Xoutput is directed to the user's terminal.
X.in -10
X
XFollowing are some examples of PROFF command lines:
X
X.ti +5
XA>PROFF -v proffman.prf
X
XFormat this document (proffman.prf) in verbose mode, and output the
Xformatted document to the
Xterminal.
X
X.ti +5
XA>PROFF +5 -imacros.pma proffman.prf
X
XFormat this document, include the external file MACROS.PMA, skip the first
Xfour pages and output the formatted document to the terminal.
X
X.ti +5
XA>PROFF -po10 proffman.prf proff.man
X
XFormat this document, shift the entire document by 10 spaces to right and
Xoutput to a file called proff.man.
X.bp
X.cl
X.sect 0 5.0 Tips on using PROFF
X.ap
X.sect 1 5.1 Care and Feeding of Memory
X PROFF uses a dynamic memory allocation scheme for some of its operations.
XThese are macro definitions, contents lines, variables and save context 
Xoperation.
XRunning PROFF under microcomputers with limited memory resources (64k or less)
Xrequire some care in using these commands:
X.list 3
X.item a)
XDo not declare macros that are not needed within the document.
X.item b)
XDo not use comments within macros. Due to delayed evaluation, comments
Xwill also be stored as a part of the macro definition.
X.item c)
XWhere possible, avoid using too much text within macros. It is just as
Xeasy to pass the information during the macro call.
X.item d)
XUse only the shortest form of commands within macros.
X.item e)
XBe brief in contents line text.
X.item f)
XUse short variable names as long as it is not so cryptic as to be confusing.
X.item g)
XAvoid unnecessary blanks within the variable definitions.
X.item h)
XAvoid too many context saves without a corresponding restore. The restore
Xoperation reclaims the memory used for a save.
X.nolist
X Even if the formatter is used with a system of large memory resources,
Xsome of the precautions above are applicable. (Utz's 4th law of Computer
XProgramming: Any given program will eventually expand to fill all the
Xavailable memory.) Using the -v option under memory-restricted systems
Xmay be useful in determining the memory usage.
X
X.sect 1 5.2 Formatting without fuss
X PROFF, using its default settings, may provide reasonably formatted output
Xin many situations.
XAs an example, examine the document PROFF.TUT. This document does not use
XANY formatting commands. All formatting is done with the default settings.
X
X.sect 1 5.3 Variables within macros
X Variable expansions may be performed within the macros. Typically, one
Xof the parameters of the macro is assumed to be a variable, which is expanded
Xonly after the macro is used. Thus:
X.in +5
X.nf
X
X|
X|.define xx
X|.ce
X|_$_$1
X|.cl _$_$1
X|.en
X|
X
X.in -5
X.fi
XThe macro xx assumes the first parameter to be a variable, which is
Xcentered on the page, and also entered in the table of contents.
XNote the usage of "_$_$1". The lines within a macro are scanned from
Xright to left for parameter expansion. Thus, "_$1" is expanded first,
Xresulting in "_$<first parameter>". This is later expanded as a variable.
X
X.bp
X.cl
X.sect 0 6.0 Example macros
X
X.nf
X.in +5
X.cc \
X.!
X.! macros to create a point-form lists.
X.! note the use of number registers within
X.! the macros.
X.!------------
X.define list
X.nr a _$1	
X.in _$1
X.en
X.!------------
X.define item
X.sp
X.ti -_@na
X_$1
X.en
X.!------------
X.define nolist
X.in -_@na
X.sp
X.en
X.!------------
X
X\in -5
X\fi
XThe "list" macro is used to generate point-form lists. The first parameter
Xis an indent value, size of point-str + 1. A typical usage may be as 
Xfollows:
X\need 16
X\in +5
X
X\nf
X|
X|Project work involves:
X|.sp
X|.list 3		{ size-of-point-str + 1 }
X|.item a)		{ "a)" is the point-str }
X|choosing a topic
X|.item b)
X|defining the topic
X|.item c)
X|research
X|.item d)
X|organizing the notes
X|{etc.}
X|.nolist		{ readjusts the indent  }
X|
X\in -5
X
XThe above usage will produce the following:
X\need 12
X\in +5
X
X|
X|Project work involves:
X|
X|a) choosing a topic
X|
X|b) defining the topic
X|
X|c) research
X|
X|d) organizing the notes
X|
X
X\in -5
X\fi
XThe point-form recommendations under section 5.1 (Care and Feeding of 
XMemory) were generated with the same set of macros described above.
X\cc .
X.bp
X.cl
X.sect 0 7.0 Acknowledgements
X This document was edited by Terry Lim and Steven Tress.
XThe format of the document is largely based on The Freshwater Institute
XRUNOFF User's Guide. The Quotes for the various formatting examples are
Xfrom THE QUOTABLE NOTHING BOOK and from 1001 LOGICAL LAWS, ACCURATE
XAXIOMS, PROFOUND PRINCIPLES, TRUSTY TRUISMS, HOMEY HOMILIES, COLORFUL
XCOROLLARIES, QUOTABLE QUOTES, AND RAMBUNCTIOUS RUMINATIONS FOR ALL
XWALKS OF LIFE, by Peers, Bennet and Booth, Fawcett Columbine Books,
XNew York.
X.bp
X.cl
X.sect 0 Appendix A
X.he /1.0/Appendix A/#/
X.cc \
X\nf
X\nap
X\ce
XSummary of Commands
X
X----------------------------------------------------------
X$FILL
X		default:	initial: yes	break: yes
X		begin filling output lines
X----------------------------------------------------------
X$NOFILL
X		default:	initial: no	break: yes
X		stop filling
X----------------------------------------------------------
X$JUST
X		default:	initial: yes	break: yes
X		begin justifying filled lines
X----------------------------------------------------------
X$NOJUST
X		default:	initial: no	break: yes
X		stop justifying
X----------------------------------------------------------
X$BREAK
X		default:	initial:	break: yes
X		cause a break and output current line
X----------------------------------------------------------
X$INDENT
X		default: 0	inital: 0	break: yes
X		set left margin to column n+1
X----------------------------------------------------------
X$TINDENT
X		default: 0	initial:	break: yes
X		temporarily indent next output n spaces
X----------------------------------------------------------
X$SPACETO
X		default: 0 	initial:	break: yes
X		space to line +n from top
X		space to line -n from bottom
X----------------------------------------------------------
X$SPACE
X		default: 1 	initial:	break: yes
X		space n lines except at top of page
X----------------------------------------------------------
X$CENTER
X		default: 1	initial		break: yes
X		center next n lines
X		center until turned off
X----------------------------------------------------------
X$UNDLINE
X		default: 1	initial		break: no
X		underline next n lines
X		underline until turned off
X----------------------------------------------------------
X\bp
X----------------------------------------------------------
X$CUNDLINE
X		default: words	initial: words	break: no
X		set mode for underline - words or all
X----------------------------------------------------------
X$BOLD
X		default: 1	initial:	break: no
X		boldface (overstrike) next n lines
X		boldface until turned off
X----------------------------------------------------------
X$DBO
X		default:	initial: no	break: no
X		disable bolding
X----------------------------------------------------------
X$EBO
X		default:	initial: yes	break: no
X		enable bolding
X----------------------------------------------------------
X$LS
X		default: 1	initial: 1	break: no
X		set line spacing to n
X----------------------------------------------------------
X$BP
X		default: +1	initial: 1	break: yes
X		begin a new page and number it n
X----------------------------------------------------------
X$PN
X		default:	initial: arabic	break: no
X		set page numbering to arabic or roman
X----------------------------------------------------------
X$NPA
X		default:	initial: no	break: yes
X		disable paging
X----------------------------------------------------------
X$PA
X		default:	initial: yes	break: yes
X		enable paging
X----------------------------------------------------------
X$NE
X		default: 0	initial:	break: yes/no
X		need n lines. Break and generate a new page
X		if not available
X----------------------------------------------------------
X$HE
X		default: null	initial: null	break: no
X		set header to text (/left/center/right/)
X----------------------------------------------------------
X$FO
X		default: null	initial: null	break: no
X		set footer to text (/lef/center/right/)
X----------------------------------------------------------
X\bp
X----------------------------------------------------------
X$OHE
X		default: null	initial: null	break: no
X		set header on odd pages to text
X----------------------------------------------------------
X$EHE
X		default: null	initial: null	break: no
X		set header on even pages to text
X----------------------------------------------------------
X$OFO
X		default: null	initial: null	break: no
X		set footer on odd pages to text
X----------------------------------------------------------
X$EFO
X		default: null	initial: null	break: no
X		set footer on odd pages to text
X----------------------------------------------------------
X$PO
X		default: 0	initial: 0	break: yes
X		set page offset to n spaces
X----------------------------------------------------------
X$RM 
X		default: 65	initial: 65	break: no
X		set right margin to column n
X----------------------------------------------------------
X$PL
X		default: 66	initial: 66	break: no
X		set page length to n lines
X----------------------------------------------------------
X$M1
X		default: 3	initial: 3	break: no
X		lines between top of page and header
X----------------------------------------------------------
X$M2
X		default: 2	initial: 2	break: no
X		lines between header and text
X----------------------------------------------------------
X$M3
X		default: 2 	initial: 2	break: no
X		lines between text and footer
X----------------------------------------------------------
X$M4
X		default: 3	initial: 3	break: no
X		lines between footer and bottom
X----------------------------------------------------------
X$CL
X		default:	initial:	break: yes
X		enter text into table of contents at level
X		n
X----------------------------------------------------------
X\bp
X----------------------------------------------------------
X$PC
X		default: 3	initial: 3	break: yes
X		print table of contents, indent each level
X		n spaces
X----------------------------------------------------------
X$VSET
X		default:	initial:	break: no
X		set variable to text
X----------------------------------------------------------
X$VGET
X		default:	initial:	break: no
X		set variable interactively, using text
X		as prompt
X----------------------------------------------------------
X$VRG
X		default: 0	initial: 0	break: no
X		set number register (a-z) to n
X----------------------------------------------------------
X$CCHAR
X		default: "."	initial: "."	break: no
X		set command control character to char
X----------------------------------------------------------
X$ECHAR
X		default: "__"	initial: "__"	break: no
X		set universal escape character to char
X----------------------------------------------------------
X$SOU
X		default: 	initial: input	break: no
X		switch input to file
X----------------------------------------------------------
X$SAVE
X		default:	initial:	break: yes
X		save the current formatter context on 
X		context stack
X----------------------------------------------------------
X$RST
X		default:	initial:	break: yes
X		restore the formatter context from context
X		stack
X----------------------------------------------------------
X$LEX
X		default:	initial:	break: no
X		rename a command
X----------------------------------------------------------
X$APR
X		default:	initial: no	break: no
X		enable auto-paragraphing
X----------------------------------------------------------
X\bp
X----------------------------------------------------------
X$NAP
X		default:	initial: yes	break: no
X		disable auto-paragraphing
X----------------------------------------------------------
X$WRT
X		default:	initial:	break: no
X		write a special string to output. line
X		counter does not change
X----------------------------------------------------------
X$DEF
X		default:	initial:	break: no
X		define a macro command - ends at ".en"
X----------------------------------------------------------
X$ENM
X		default:	initial:	break: no
X		end the macro definition
X----------------------------------------------------------
X\cc .
X.bp 1
X.pn roman
X.he ////
X.fo //- # -//
X.ce on
XTable Of Contents
X
XPROFF 1.0
X.ce off
X.pc
SHAR_EOF
if test 46207 -ne "`wc -c 'proffman.prf'`"
then
	echo shar: error transmitting "'proffman.prf'" '(should have been 46207 characters)'
fi
echo shar: extracting "'proffsym.new'" '(3451 characters)'
if test -f 'proffsym.new'
then
	echo shar: over-writing existing file "'proffsym.new'"
fi
sed 's/^X//' << \SHAR_EOF > 'proffsym.new'
X
X! proff symbols
X! flag value of 1 indicate
X! a runoff-supported symbol
X! feb. 1984
X!
X! reset the formatter
X!
Xreset		RESET
X!
X! bolding
X!
Xbd		BD
Xbold		*
X!disable_bolding		DBO		1
Xdisablebolding		DBO		1
Xdbo			*		1
Xdb			*
X!enable_bolding		EBO		1
Xenablebolding		EBO		1
Xebo			*		1
Xeb			*
X!
X! new page & paging modes
X!
Xbp		BP
Xpage		*		1
Xpg		*		1
Xpaging			PGI		1
Xpa			*		1
Xnopaging		NPA		1
Xnp			*
X!
X! break
X!
Xbr		BR		1
Xbreak		*		1
X!
Xbs		BS
X!
X! setup control character
X!
Xcc		CC
Xcchar		*
X!
X! centering
X!
Xce		CE
Xcenter		*
X!
Xcu		CU
X!
X! macro definitions
X!
Xde		DE
Xdefine		*
X!
X! setup generic escape character
X!
Xec		EC
Xechar		*
X!
X! even footers and headers
X!
Xef		EF
Xeh		EH
X!
X! end macro definition
X!
X!en		EN
X!
X! fill the lines
X!
Xfi		FI
Xf		*		1
Xfill		* 		1
X!
X! general footers and headers
X!
Xfo		FO
Xfooter		*
Xhe		HE
Xheader		*
X!
X! indentation (permanent)
X!
Xin		IN
Xlm		*		1
X!left_margin	*		1
Xleftmargin	*		1
X!
X! justification
X!
Xju		JU
Xj		*		1
Xjustify		* 		1
X!
X! line spacing
X!
Xls		LS
Xspacing		*		1
Xspc		*		1
X!
X! margin spacing
X!
Xm1		M1
Xm2		M2
Xm3		M3
Xm4		M4
X!
X! test for page
X!
Xne		NE
Xneed		*
X!test_page	*		1
Xtestpage	*		1
Xtp		*		1
X!
X! disable fill
X!
Xnf		NF		1
Xnofill		*
X!no_fill		*		1
X!
X! disable justification
X!
Xnj		NJ		1
Xnojustify 	*
X!no_justify	*		1
X!
X! number registers
X!
Xnr		NR
X!
X! external output
X!
Xou		OU
Xoutput		*
Xoe		OE
Xoutend		*
X!
X! odd footers and headers
X!
Xof		OF
Xoh		OH
X!
X! page length
X!
Xpl		PL
Xps		*		1
X!page_size	*		1
Xpagesize	*		1
X!
X! page offset
X!
Xpo		PO
Xoffset		*
X!
X! right margin
X!
Xrm		RM		1
X!right_margin	*		1
Xrightmargin	*		1
X!
X! external input (include)
X!
Xso		SO
Xsource		*
Xinclude		*
Xrequire		*		1
Xreq		*		1
X!
X! skip line (blank lines) according to spacing
X! sp is not the same as runoff sp
X!
Xsp		SP
Xskip		*		1
Xs		* 		1
X!
X! blank line
X!
X!blank		BL		1
X!b		*		1
X!
X! space from top (or bottom)
X!
Xst		ST
Xskipto		*
X!
X! temporary indent
X!
Xti		TI
Xleft		*		1
X!
X! underline 
X!
Xul		UL
Xunderline 	*
X!
X! substitute (using reqular expresions)
X!
X!su		SU
X!subs		*
X!substitute	*
X!esu		ESU
X!enable_subs	*
X!dsu		DSU
X!disable_subs	*
X!
X! save and restore of FSECT
X!
Xsv		SAV
Xsave		*
Xrs		RST
Xrestore		*
X!
X! looping formatting for each variable
X!
X!for		FOR
X!foreach		*
X!enf		ENF
X!endfor		*
X!
X! permanent symbol replacement
X!
Xlx		LEX
Xlex		LEX
X!
X! ignore character
X!
Xig		IG
Xignore		IG
X!
X! variable definition
X!
Xvs		SET
Xset		*
Xvg		GET
Xget		*
X!
X! page numbering (roman or arabic)
X!
Xpn		PN
Xpagenumber	*
X!
X! paragraphing
X!
Xap			AP		1
Xautoparagraph		*		1
Xna			*
Xnap			NAP             1
X!no_autoparagraph	*               1
Xnoautoparagraph		*		1
X!paragraph		PAR		1
X!p			*		1
X!set_paragraph		SPR		1
X!setparagraph		*		1
X!spr			*		1	
X!
X!
X!comment			COM		1
X!
X! same as pagenumber
X!
X!display_number		DNM		1
X!dnm			*		1
X!
X! entry into an index listing
X!
X!entry			ENT		1
X!y			*		1
X!
X! entry into contents table
X!
Xcl			CL
Xcontline		*
Xpc			PC
Xprintcont		*
X!
X! conditional formatting
X!
X!if			CIF		1
X!else			CELSE		1
X!endif			CENDIF		1
X!ifnot			CIFNOT		1
X!
X! list generation
X!
X!list			LST		1
X!end_list		ELS		1
X!endlist			ELS		1
X!els			*		1
X!list_element		LEM		1
X!listelement		LEM		1
X!le			*		1
X!
X! literal mode (nf-nj-lm0-rm150)
X!
Xliteral			LTR		1
Xlt			*		1
X!end_literal		ELT		1
Xendliteral		ELT		1
Xel			*		1
X!
X! overstrike control
X!
X!enable_overstriking	EOV		1
X!eov			*		1
X!disable_overstriking	DOV		1
X!dov			*		1
X!
X! repeat a string
X!
X!repeat			REP		1
X!rpt			*		1
X!
X! flush right margin
X!
X!right			RIG		1
X!r			*		1
X!
X! write out a special string
X!
Xwr			WR
Xwrite			*
X!
X! end of definitions
SHAR_EOF
if test 3451 -ne "`wc -c 'proffsym.new'`"
then
	echo shar: error transmitting "'proffsym.new'" '(should have been 3451 characters)'
fi
#	End of shell archive
exit 0
-- 
 __________ ______ ____ _____ ___
/_________//___   ||__|/____|/__/   Richard E. Sansom
   ___    ____/  / ____________	    TRW Electronics & Defense Sector
  /  /   /  /\  <  |    /|    /     One Space Park Drive, R3/1028
 /  /   /  /  \  \ |   / |   /	    Redondo Beach, CA 90278
/__/   /__/    \__\|__/  |__/	    {...decvax,ucbvax,ihnp4}!trwrb!sansom

sansom@trwrb.UUCP (Richard Sansom) (10/07/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:
#	putwrd.c
#	pxlex.c
#	pxxparse.c
#	read.me
#	see.me
#	stack.c
# This archive created: Fri Mar 21 22:45:09 1986
# By:	Jwahar R. Bammi ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'putwrd.c'" '(993 characters)'
if test -f 'putwrd.c'
then
	echo shar: over-writing existing file "'putwrd.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'putwrd.c'
X#include <stdio.h>
X#include "proff.h"
X#include "debug.h"
X
X#define brk brrk
X
X/*
X * putwrd - put a word in outbuf; includes margin justification
X *
X */
Xputwrd(wrdbuf)
Xchar wrdbuf[];
X{
X	int last, llval, extra, w;
X
Xdprintf("putwrd  ");
X	w = width(wrdbuf);
X	last = strlen(wrdbuf) + outp;         /* new end of outbuf */
X#ifdef DEBUG
Xprintf("strlen(wrdbuf) = %d\n",strlen(wrdbuf));
X#endif
X	llval = rmval - tival;
X	if (outw + w > llval || last >= MAXOUT) {    /* too big */
X		last -= outp;
X		extra = llval - outw;
X#ifdef DEBUG
Xprintf("extra = %d\n",extra);
X#endif
X		for ( ; outp > 0; outp--)
X			if (outbuf[outp-1] == ' ')
X				extra++;
X			else
X				break;
X		if (rjust == YES) {
X			spread(outbuf, outp, extra, outwds);
X			if (extra > 0 && outwds > 1)
X				outp += extra;
X		}
X		brk();		/* flush previous line */
X	}
X#ifdef DEBUG
Xprintf("putwrd: last=%d w=%d outp=%d llval=%d outw=%d extra=%d\n",
X		last,w,outp,llval,outw,extra);
X#endif
X	strcpy(&outbuf[outp],wrdbuf);
X	outp = last;
X	outw += w;
X	outwds++;
X}
SHAR_EOF
if test 993 -ne "`wc -c 'putwrd.c'`"
then
	echo shar: error transmitting "'putwrd.c'" '(should have been 993 characters)'
fi
echo shar: extracting "'pxlex.c'" '(3355 characters)'
if test -f 'pxlex.c'
then
	echo shar: over-writing existing file "'pxlex.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'pxlex.c'
X#include <stdio.h>
X#include <math.h>
X#include <ctype.h>
X
X/* translation table for control chars */
X
Xchar c_ctrl[] = { 
X		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
X		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
X		0,  0,  0,  0,  0,  0,  0,  0,
X		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
X		0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
X		0,  0,  0,  0,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
X		10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
X		23, 25, 26, 27, 28, 29, 30, 31, 0,  1,  2,  3,  4,  5,
X		6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
X		20, 21, 22, 23, 24, 25, 26, 0,  0,  0,  0,  0
X		};
X
X/*
X * getval - evaluate optional numeric argument
X *
X * increments i
X */
Xint
Xgetval(buf,i,argtyp)
Xchar buf[];
Xint *i;
Xint *argtyp;
X{
X	int j,k;
X
X	j = *i;
X	k = *argtyp;
X
X	skipbl(buf, &j);
X	k = buf[j];
X	if (k == '+' || k == '-')
X		j++;
X	*i = j;
X	*argtyp = k;
X	return(ctoi(buf,i));
X}
X
X/*
X * getarg - get the next argument from the buffer
X *
X * return values:      -1 - no argument
X *			n - number of chars in argument
X *
X * also handles quoted ("..") strings. If a quote is wanted
X * in the string, use "" or \". quotes are stripped.
X *
X * argument delimiters: blank, tab or comma (,).
X *
X * increments i
X *
X */
Xint
Xgetarg(buf,i,arg)
Xchar buf[];
Xint *i;
Xchar arg[];
X{
X	int j,k;
X	register char ch;
X
X	j = *i;
X
X	k = -1;
X	skipbl(buf,&j);
X	if (buf[j] != '\0') {
X		k = 0;
X		if (buf[j] == '\"') {
X			j++;
X			while (buf[j] != '\0') {
X				if (buf[j] == '\"') {
X					if (buf[j+1] == '\"') {
X						arg[k++] = '\"';
X						j += 2;
X					}
X					else
X						break;
X				}
X				arg[k++] = buf[j++];
X			}
X			arg[k] = '\0';
X			j++;			/* skip the quote */
X			/* peek next char */
X			if (isalnum(buf[j]))
X				error("improper argument list.");
X			j++;			/* skip the delimeter */
X		}
X		else {
X			ch = buf[j];
X			while (ch != ' '&& 
X			    ch != '\t' 	&& 
X			    ch != ',' 	&&
X			    ch != '\r' 	&& 
X			    ch != '\n' 	&& 
X			    ch != '\0') {
X				arg[k++] = buf[j++];
X				ch = buf[j];
X			}
X			arg[k] = '\0';
X			if (ch != '\0')	/* if non-null delimiter, skip */
X				j++;
X		}
X		*i = j;
X	}
X	return(k);
X}
X
X/*
X * getpstr - get a special string to print out
X *
X */
Xgetpstr(buf,out)
Xregister char *buf;
Xregister char *out;
X{
X	register int i;
X	register char c, cc;
X	register char *num;
X	char numbuf[9];
X
X	while(*buf != '\n' && *buf != '\0') {
X		c = *buf;
X		switch(c) {
X		case ' ':
X		case '\t':
X			while (*buf == ' ' || *buf == '\t')
X				buf++;	/* skip blanks */
X			break;
X		case '\\':
X			if (*(buf+1) != '\0') {
X				*out++ = *(buf+1);
X				buf += 2;
X			}
X			else
X				buf++;
X			break;
X		case '^':
X			if ((cc = c_ctrl[*(buf+1)]) != 0)
X				*out++ = cc;
X			buf += 2;
X			break;
X		case '\"':
X			buf++;	/* skip the quote */
X			while (*buf != '\0') {
X				if (*buf != '\"')
X					*out++ = *buf++;
X				else if (*(buf+1) == '\"') {
X						*out++ = '\"';
X						buf += 2;
X				}
X				else
X					break;
X			}
X			buf++;	/* skip the quote */
X			break;
X		case '0':
X		case '1':
X		case '2':
X		case '3':
X		case '4':
X		case '5':
X		case '6':
X		case '7':
X		case '8':
X		case '9':
X			num = numbuf;
X			while (isdigit(*buf))
X				*num++ = *buf++;
X			*num = '\0';
X			if ((i = atoi(numbuf)) > 256)
X				error("non-ascii char value in write string.");
X			else if (i > 0)		/* do not output null */
X				*out++ = (char) i;
X			break;
X		default:
X			*out++ = *buf++;
X		}
X	}
X	*out = '\0';
X}
SHAR_EOF
if test 3355 -ne "`wc -c 'pxlex.c'`"
then
	echo shar: error transmitting "'pxlex.c'" '(should have been 3355 characters)'
fi
echo shar: extracting "'pxxparse.c'" '(9665 characters)'
if test -f 'pxxparse.c'
then
	echo shar: over-writing existing file "'pxxparse.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'pxxparse.c'
X#include <stdio.h>
X#include <ctype.h>
X#include "proff.h"
X#include "debug.h"
X#include "lextab.h"
X
X#define brk brrk
X
X#define RUNOFF	1 		/* recognise RUNOFF commands */
X
Xchar literal = NO;		/* literal flag		     */
X
X/*
X * command - perform formatting command
X *
X */
Xcommand(buf)
Xchar buf[];
X{
X	char token[MAXTOK], xtoken[MAXTOK], variable[MAXTOK], *defn;
X	char special[MAXTOK];
X	int argtyp, ct, at, spval, i, flags;
X	register int val, n, rest;
X	char onflag = FALSE; 
X	char offlag = FALSE;
X	struct lexlist *xp;
X
X	dovar(tbuf1,buf);	/* use scratch buffer to expand variables */
X	strcpy(buf,tbuf1);
X
X	i = 1;
X	n = getwrd(buf, &i, token);	/* get the command token */
X	rest = i;			/* remaining string */
X	ct = comtype(token, n, &defn, &flags);
X	if (ct == UNKNOWN)
X		return;
X	if (literal && ct != ELT) {	/* ignore while literal  */
X		put(buf);
X		return;
X	}
X
X#ifdef DOUBLEWORD
X	if (flags == 2) {	/* check for 2-word command */
X		n = getwrd(buf, &i, xtoken);
X		if (n == 0) {
X			fprintf(stderr,"%c%s what ?\n", cchar, token);
X			return;
X		}
X		if ((at = comtype(xtoken, n, &defn, &flags)) == UNKNOWN) {
X			fprintf(stderr,"%c%s %s unknown.\n", cchar,
X			token,
X			xtoken);
X			return;
X		}
X		else
X			ct += at;
X	}
X#endif
X
X	doesc(buf, variable, MAXLINE);	/* expand escapes */
X	n = getarg(buf, &i, xtoken);	/* first parameter*/
X	argtyp = '\n';	/* defaulted ** cludge ** */
X	val = 0;
X	if (n > 0) {
X		if (*xtoken == '+' || *xtoken == '-') {
X			argtyp = *xtoken;
X			val = atoi(xtoken+1);
X		}
X		else if (isdigit(*xtoken)) {
X			argtyp = 0;
X			val = atoi(xtoken);
X		}
X		else {
X			/* check some common flags */
X			if (strcmp("on",xtoken) == 0)
X				onflag = TRUE;
X			else if (strcmp("off",xtoken) == 0)
X				offlag = TRUE;
X		}
X	}
X
X	switch(ct) {
X
X	case MACRO:
X		eval(buf, defn);
X		break;
X	case FI:
X		brk();
X		fill = YES;
X		break;
X	case NF:
X		brk();
X		fill = NO;
X		break;
X	case BR:
X		brk();
X		break;
X	case LS:
X		set(&lsval, val, argtyp, 1, 1, HUGE);
X		break;
X	case CE:
X		brk();
X		if (onflag)
X			CEon = TRUE;
X		else if (offlag) {
X			CEon = FALSE;
X			ceval = 0;		/* reset */
X		}
X		else
X			set(&ceval, val, argtyp, 1, 0, HUGE);
X		break;
X	case UL:
X		if (onflag) {
X			ULon = TRUE;
X			break;
X		}
X		else if (offlag) {
X			ULon = FALSE;
X	 		ulval = 0;		/* reset */
X			break;
X		}
X		else 
X			set(&ulval, val, argtyp, 0, 1, HUGE);
X
X		if (!isdigit(*xtoken)) {
X			if (strcmp("all",xtoken) == 0) {
X					ulblnk = '_';
X					ulval = 0;
X			}
X			else if (strcmp("words",xtoken) == 0) {
X				ulblnk = ' ';
X				ulval = 0;
X			}
X		}
X		break;
X	case BD:
X		if (bolding == YES) {
X			if (onflag)
X				BDon = TRUE;
X			else if (offlag) {
X				BDon = FALSE;
X				boval = 0;	/* reset */
X			}
X			else
X				set(&boval, val, argtyp, 0, 1, HUGE);
X		}
X		break;
X	case HE:
X		gettl(buf, ehead, ehlim);
X		gettl(buf, ohead, ohlim);
X		break;
X	case FO:
X		gettl(buf, efoot, eflim);
X		gettl(buf, ofoot, oflim);
X		break;
X	case BP:
X		if (paging == NO)
X			break;
X		brk();
X		if (lineno > 0)
X			space(HUGE);
X		set(&curpag, val, argtyp, curpag+1, -HUGE, HUGE);
X		newpag = curpag;
X		break;
X	case SP:
X		set(&spval, val, argtyp, 1, 0, HUGE);
X		space(spval);
X		break;
X	case IN:
X		brk();
X		set(&inval, val, argtyp, 0, 0, rmval-1);
X		tival = inval;
X		break;
X	case RM:
X		set(&rmval, val, argtyp, PAGEWIDTH, tival+1, HUGE);
X		break;
X	case TI:
X		brk();
X		set(&tival, val, argtyp, 0, 0, rmval);
X		break;
X	case LEX:	/****/
X		if ((xp = remove(xtoken,lextab)) != NULL) {
X			if (getwrd(buf, &i, variable) != 0)
X				lexinstal(variable,xp->val,xp->flag,lextab);
X		}
X		else 
X		    fprintf(stderr,"%s undefined.\n",xtoken);
X		break;
X	case PN:	/****/
X		if (strcmp(xtoken,"roman") == 0)
X			roman = TRUE;
X		else if (strcmp(xtoken,"arabic") == 0)
X			roman = FALSE;
X		else
X			fprintf(stderr,"%c%s does not have %s option.\n",
X			cchar,token,xtoken);
X		break;
X	case IG:	/****/
X		break;
X	case SET:	/****/
X		if (n > 0) {
X			if (isdigit(*xtoken)) {
X				fprintf(stderr,"illegal variable name %s\n",
X				xtoken);
X				break;
X			}
X			*variable = '\0';
X			n = getarg(buf, &i, variable);
X			if (n <= 0) {
X				fprintf(stderr,"%s: ", xtoken);
X				gets(variable);
X
X			}
X			if (*variable != '\0')
X				install(xtoken, variable, gentab);
X		}
X		else
X			fprintf(stderr,"%c%s needs a variable name.\n",
X			cchar, token);
X		break;
X	case GET:	/****/
X		if (n > 0) {
X			if (isdigit(*xtoken)) {
X				fprintf(stderr,"illegal variable name %s\n",
X				xtoken);
X				break;
X			}
X			*variable = '\0';
X			n = getarg(buf, &i, tbuf3); /* using temp buf3 */
X			if (n > 0) {
X				fprintf(stderr,"%s", tbuf3);
X				gets(variable);
X
X			}
X			if (*variable != '\0')
X				install(xtoken,variable, gentab);
X		}
X		else
X			fprintf(stderr,"%c%s needs a variable name.\n",
X			cchar, token);
X		break;
X	case CL:	/****/
X		if (argtyp == '\n') {
X			clast->level = 0;
X			clast->str = NULL;
X		}
X		else {
X			skipbl(buf,&i);
X			if (*(buf+i) == '\0')
X				break;		/* no contents line here ! */
X			clast->level = val * 3; /* level * indent 	   */
X			n = i;
X			while(*(buf+n) != '\n')
X				n++;
X			*(buf+n) = '\0';	/* destroy CR with a null  */
X			clast->str = strsave(buf+i);
X			clast->page = curpag;
X		}
X		clast->nextc = (struct clist *) malloc(sizeof(struct clist));
X		p_memoryus += sizeof(struct clist);
X		clast = clast->nextc;
X		clast->nextc = NULL;
X		break;
X	case PC:	/****/
X		brk();
X		clast = chead;
X		while(clast->nextc != NULL) {
X			if (clast->str == NULL)
X				put("\n");
X			else {
X				tival = (int) clast->level + inval;
X				i = rmval - tival;
X				docline(variable, i, clast->str, clast->page);
X				put(variable);
X			}
X			clast = clast->nextc;
X		}
X		break;
X	case DBO:	/****/
X		bolding = NO;
X		break;
X	case EBO:	/****/
X		bolding = YES;
X		break;
X	case AP:	/****/
X		autopar = YES;
X		break;
X	case NAP:	/****/
X		autopar = NO;
X		break;
X	case SAV:	/****/
X		brk();
X		save();
X		break;
X	case RST:	/****/
X		brk();
X		restore();
X		break;
X	case NPA:	/****/
X		paging = NO;
X		savpl = plval;
X		plval = HUGE;
X		bottom = plval - m3val - m4val;
X		break;
X	case PGI:	/****/
X		bottom = lineno - 1;	/* force end-of-page */
X		brk();
X		plval = savpl;
X		break;
X	case LTR:	/****/
X		brk();
X		if (save()) {
X			inval = 0;
X			rmval = 132;
X			autopar = NO;
X			lsval = 0;
X			fill = NO;
X			literal = YES;
X		}
X		break;
X	case ELT:	/****/
X		restore();
X		literal = NO;
X		break;
X	case WR:	/****/
X		brk();
X		getpstr(buf+rest,special);
X		defn = special;
X		while(*defn)
X			putchar(*defn++);
X		break;
X	case PL:
X		if (paging == NO)
X			break;
X		set(&plval, val, argtyp, PAGELEN,
X		m1val + m2val + m3val + m4val + 1, HUGE);
X		bottom = plval - m3val - m4val;
X		break;
X	case PO:
X		set(&offset, val, argtyp, 0, 0, rmval - 1);
X		break;
X	case M1:
X		set(&m1val, val, argtyp, 3, 0,
X		plval - m2val - m3val - m4val - 1);
X		break;
X	case M2:
X		set(&m2val, val, argtyp, 2, 0,
X		plval - m1val - m3val - m4val - 1);
X		break;
X	case M3:
X		set(&m3val, val, argtyp, 2, 0,
X		plval - m1val - m2val - m4val - 1);
X		bottom = plval - m3val - m4val;
X		break;
X	case M4:
X		set(&m4val, val, argtyp, 3, 0,
X		plval - m1val - m2val - m3val - 1);
X		bottom = plval - m3val - m4val;
X		break;
X	case EH:
X		gettl(buf, ehead, ehlim);
X		break;
X	case OH:
X		gettl(buf, ohead, ohlim);
X		break;
X	case EF:
X		gettl(buf, efoot, eflim);
X		break;
X	case OF:
X		gettl(buf, ofoot, oflim);
X		break;
X	case CC:
X		cchar = *xtoken;
X		if (cchar == '\0' || cchar == '\n')
X			cchar = '.';
X		if ((lineno + val) > bottom && lineno <= bottom) {
X			space(val);
X			lineno = 0;
X		}
X		break;
X	case EC:
X		genesc = *xtoken;
X		if (genesc == '\0' || genesc == '\n')
X			genesc = '_';
X		break;
X	case NE:
X		if ((lineno + val) > bottom && lineno <= bottom) {
X			space(val);
X			lineno = 0;
X		}
X		break;
X	case BS:
X		set(&bsval, val, argtyp, 1, 0, HUGE);
X		break;
X	case JU:
X		rjust = YES;
X		break;
X	case NJ:
X		rjust = NO;
X		break;
X	case SO:
X		if (n <= 0)
X			return;
X		if (level + 1 == NFILES)
X			error("? SO commands nested too deeply.");
X		if ((infile[level + 1] = fopen(xtoken, "r")) != NULL) {
X			level++;
X			if (verbose == YES)
X#ifdef rainbow
X				fprintf(stderr,"source \033[7m%s\033[0m\n",
X					xtoken);
X#else
X				fprintf(stderr,"source %s\n",xtoken);
X#endif
X		}
X		else
X			fprintf(stderr,"%s: cannot open.\n",xtoken);
X		break;
X	case OU:	/*****/
X		/* skip for now. */
X		break;
X
X	case OE:	/*****/
X		/* skip for now. */
X		break;
X
X	case CU:
X		ulblnk = '_';
X		set(&ulval, val, argtyp, 0, 1, HUGE);
X		break;
X	case DE:
X
X#ifdef DEBUG
Xprintf("Command++: calling dodef Fp %ld\n",infile[level]);
X#endif
X		dodef(buf, infile[level]);
X		break;
X	case NR:
X		if (n <= 0)
X			return;
X		if (*xtoken < 'a' || *xtoken > 'z')
X			error("invalid number register [%c].",*xtoken);
X
X		val = getval(buf, &i, &argtyp);
X		set(&nr[xtoken[0] - 'a'], val, argtyp, 0, -HUGE, HUGE);
X		break;
X	case ST:
X		if (argtyp == '-')
X			spval = plval;
X		else
X			spval = 0;
X		set(&spval, val, argtyp, 0, 1, bottom);
X		if (spval > lineno && lineno == 0)
X			phead();
X		if (spval > lineno)
X			space(spval - lineno);
X		break;
X	case RESET:	/****/
X		finit();
X		break;
X	default:
X		error("? Botch in command.");
X		break;
X	}
X}
X
X/*
X * comtype - decode the command type
X *
X */
Xint
Xcomtype(buf, siz, defn, flags)
Xchar buf[];
Xint siz;
Xchar **defn;
Xint *flags;
X{
X
X	struct hashlist *np;
X	struct lexlist *xp;
X	extern	struct lexlist *lexlook();
X	int i,comtyp;
X	char c1,c2;
X
X
X#ifdef DEBUG
X	printf("comtype:  (token)\n");
X#endif
X
X	if ((np = lookup(buf, macrotab)) != NULL) {
X		*defn=np->def;
X		return(MACRO);
X	}
X	comtyp = UNKNOWN;
X
X	if (*buf == '#' || *buf == '!')
X		return(comtyp);
X
X	if ((xp = lexlook(buf,lextab)) != NULL)
X		if (onlyrunoff && (xp->flag != RUNOFF)) {
X			fprintf(stderr,"%c%s is not a runoff command.\n",
X			cchar,buf);
X			return(UNKNOWN);
X		}
X		else {	
X			comtyp = xp->val;
X			*flags = xp->flag;
X		}
X
X	if (comtyp == UNKNOWN)
X		fprintf(stderr,"unknown command %c%s\n",cchar,buf);
X	return(comtyp);
X}
SHAR_EOF
if test 9665 -ne "`wc -c 'pxxparse.c'`"
then
	echo shar: error transmitting "'pxxparse.c'" '(should have been 9665 characters)'
fi
echo shar: extracting "'read.me'" '(1426 characters)'
if test -f 'read.me'
then
	echo shar: over-writing existing file "'read.me'"
fi
sed 's/^X//' << \SHAR_EOF > 'read.me'
XProff - A portable formatter
X
XThis is the first distribution of PROFF, a formatter based
Xon software tools ROFF. It is mainly a C re-write of ROFF,
X(now known as FORMAT), with some expansions. It is mainly
Xintended for non-UN*X systems, CP/M, MS-DOS and the like.
X
XProff was originally written for The Faculty of Administrative
XStudies, York University, tto supplement their microcomputer
Xenvironment. As of this release, the formatter is in the
Xcontrol of The Faculty of Administrative Studies.
X
XThere is no man page for proff, for it was never intended
Xfor UN*X systems. There is, however two comprehensive
Xdocuments to answer all questions.
X
XThe C code for PROFF is quite warped, and should be approached
Xcarefully. [Ok..Ok.. it is all my fault.. too much midnight
Xoil..]	It is reasonably customazible, by changing proffsym.new.
XThis file is processed by ltb, a static hash table generator.
XThis approach is most useful to change the operator keywords,
Xcreate aliases, and it also bypassess the initialization
Xoverhead. [see the makefile for the right output file names
Xfor ltb]
X
XPROFF is not copyrighted, at least for this release. Future
Xreleases may contain York University copyright.
X
XPlease send me all updates, bugfixes and other tidbits,
Xso that future releases may be coordinated smoothly.
X
Xenjoy.
X		oz
X		bitnet: oz@yuyetti
X			oz@yusol
X		useet: {ihnp4|decvax|allegra|linus}!utzoo!yetti!oz
X		phonet: (416) 667 3976
X
SHAR_EOF
if test 1426 -ne "`wc -c 'read.me'`"
then
	echo shar: error transmitting "'read.me'" '(should have been 1426 characters)'
fi
echo shar: extracting "'see.me'" '(2491 characters)'
if test -f 'see.me'
then
	echo shar: over-writing existing file "'see.me'"
fi
sed 's/^X//' << \SHAR_EOF > 'see.me'
X	After capturing and unshar'ing all the parts of this proff
Xposting you should end up with the following files:
X
Xproff.uud			lookup.h	proff.c		putwrd.c
Xdebug.h		lextab.d	ltb.c		proff.h		pxlex.c
Xdecl.h		lextab.h	make.sh		proff01.c	pxxparse.c
Xdefs.h		lnk		makefile	proff02.c	read.me
Xdostuff2.c	look.c		map.c		proffman.prf	see.me
Xeval.c		lookup.c	pinit.c		proffsym.new	stack.c
X
XThis file is see.me
X
XHow to make proff on the ST:
X
X	1) You will have to edit stdio.h supplied with the dev. system
Xto include the following lines at the bottom of stdio.h.
X
X	#ifdef DECL
X	#include <decl.h>
X	#endif
X
X	We do this so that when the pre-processor symbol DECL is
Xdefined the file decl.h gets included, and if it isn't then stdio.h
Xlooks exactly like it did before we added the lines. In decl.h we
Xdeclare all the commonly used function in C that do not returns the
Xtype int. This a important as in the Alcyon C compiler
X sizeof(int) != sizeof(int *). You may if you like include decl.h
Xelsewhere, but you will have to ensure that each of the modules
X(source files) has decl.h included. We found it convenient to put it
Xin stdio.h as above.
X
X	2) For those of you who have Micro C Shell and CC that i had
Xposted earlier to this newgroup, you can simply hit
X
X	make
X	
Xat the Micro C Shell prompt. 
X
X	3) For those who don't have Micro C Shell, but have CC, see
Xthe file make.sh, and enter those commands.
X
X	4) For those who don't have either, you will have to see
Xmake.sh and compile each C file such that DECL is defined, so you may
Xhave to  change your normal batch file somewhat to have the
Xpreprocessor switch in there to define the symbol DECL.
X
XPlease note that make.sh was set up to have all the sources, objects
Xetc in the current directory. If you are compiling on floppies you may
Xhave to  change that.
X
XThe file lnk contains the list of files to be linked, and is used with
Xlink68 as follows
X
X	link68 [com[lnk]]
X	relmod proff
X
XThe above process should yield proff.prg. If you want to use it from
Xthe desktop, rename it to proff.ttp.
X
X
XMaking Proff on the Vax
X	Simply hit
X	make
X
XMaking the users guide
X	On either the St or Vax hitting
X
X	proff -po8 proffman.prf proff.man
X	
X	Will result in proff.man. (You may want to play with -po<n> to
Xget the correct left margin spacing for your printer).
X
X	If you have any problems/suggestions i may be reached at the
Xfollowing addresses:
X
X	   Usenet:  .....!decvax!cwruecmp!bammi
X	   CSnet:  bammi@case
X	   Arpa:  bammi%case@csnet-relay
X	   CompuServe:  71515,155
SHAR_EOF
if test 2491 -ne "`wc -c 'see.me'`"
then
	echo shar: error transmitting "'see.me'" '(should have been 2491 characters)'
fi
echo shar: extracting "'stack.c'" '(1909 characters)'
if test -f 'stack.c'
then
	echo shar: over-writing existing file "'stack.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'stack.c'
X#include <stdio.h>
X#include "proff.h"
X
Xstruct _proffitem {
X		int	Xinval;
X		int	Xrmval;
X		int	Xoffset;
X		int	Xlsval;
X		int	Xplval;
X		int	Xm1val;
X		int	Xm2val;
X		int	Xm3val;
X		int	Xm4val;
X		int	Xfill;
X		int	Xrjust;
X
X		char	Xcchar;
X		char	Xgenesc;
X		char	Xroman;
X		char	Xbolding;
X		char	Xpaging;
X		char	Xautopar;
X
X		struct 	_proffitem *prev;
X};
X
Xstatic struct
X_proffitem *head = NULL;
Xstatic struct
X_proffitem *top  = NULL;
X
X
Xchar *pusherr = "save: stack overflow.\n";
Xchar *poperr  = "restore: stack underflow.\n";
X
X/*
X * save - save proff parameters
X *
X */
Xsave()
X{
X	struct _proffitem *sp;
X	char *malloc();
X
X	if ((sp = (struct _proffitem *) malloc(sizeof(*sp))) == NULL) {
X		fprintf(stderr,pusherr);
X		return(FALSE);
X	}
X	else {
X		p_memoryus += sizeof(struct _proffitem);
X		if (head == NULL) {	/* first element in stack */
X			head = sp;
X			top = NULL;	
X		}
X		
X		sp->Xinval = inval;
X		sp->Xrmval = rmval;
X		sp->Xoffset= offset;
X		sp->Xlsval = lsval;
X		sp->Xplval = plval;
X		sp->Xm1val = m1val;
X		sp->Xm2val = m2val;
X		sp->Xm3val = m3val;
X		sp->Xm4val = m4val;
X		sp->Xfill  = fill;
X		sp->Xrjust = rjust;
X		sp->Xcchar = cchar;
X		sp->Xgenesc= genesc;
X		sp->Xroman = roman;
X		sp->Xbolding = bolding;
X		sp->Xpaging = paging;
X		sp->Xautopar = autopar;
X
X		sp->prev = top;
X		top = sp;
X	}
X	return(TRUE);
X}
X
Xrestore()
X{
X	struct _proffitem *sp;
X
X	if (top != NULL) {
X
X		inval = top->Xinval;
X		rmval = top->Xrmval;
X		offset= top->Xoffset;
X		lsval = top->Xlsval;
X		plval = top->Xplval;
X		m1val = top->Xm1val;
X		m2val = top->Xm2val;
X		m3val = top->Xm3val;
X		m4val = top->Xm4val;
X		fill  = top->Xfill;
X		rjust = top->Xrjust;
X		cchar = top->Xcchar;
X		genesc= top->Xgenesc;
X		roman = top->Xroman;
X		bolding = top->Xbolding;
X		paging = top->Xpaging;
X		autopar = top->Xautopar;
X
X		sp = top->prev;
X		free(top);
X		p_memoryus -= sizeof(struct _proffitem);
X		if ((top = sp) == NULL)
X			head = NULL;
X	}
X	else
X		fprintf(stderr,poperr);
X}
SHAR_EOF
if test 1909 -ne "`wc -c 'stack.c'`"
then
	echo shar: error transmitting "'stack.c'" '(should have been 1909 characters)'
fi
#	End of shell archive
exit 0
-- 
 __________ ______ ____ _____ ___
/_________//___   ||__|/____|/__/   Richard E. Sansom
   ___    ____/  / ____________	    TRW Electronics & Defense Sector
  /  /   /  /\  <  |    /|    /     One Space Park Drive, R3/1028
 /  /   /  /  \  \ |   / |   /	    Redondo Beach, CA 90278
/__/   /__/    \__\|__/  |__/	    {...decvax,ucbvax,ihnp4}!trwrb!sansom

sansom@trwrb.UUCP (Richard Sansom) (10/07/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:
#	proff.uud
# This archive created: Fri Mar 21 22:45:15 1986
# By:	Jwahar R. Bammi ()
export PATH; PATH=/bin:$PATH
echo shar: extracting "'proff.uud'" '(46940 characters)'
if test -f 'proff.uud'
then
	echo shar: over-writing existing file "'proff.uud'"
fi
sed 's/^X//' << \SHAR_EOF > 'proff.uud'
Xbegin 644 proff.prg
XM8!H  &F6   4T@  -1@                  $*%3KD  &!F8$9#3$5!4C8X
XM2R!6,#(N,# L($-O<'ER:6=H="AC*2 Q.3@T+"!$:6=I=&%L(%)E<V5A<F-H
XM(%A86%@M,# P,"TV-30S,C$ (&\ !"/(  !^:")H !C3Z  <(\D  'YL1>@ 
XM@! : H    #_/P O"IW.3KD  $!^3OD   #&(&\ !" (0>@! +_(9 1P_TYU
XM(\   'YL0H!.=4Y6   P+P ((B\ "DY"O_D  'YL9!0P/  )0?D  &F6(@A.
XM0C\\  !.04Y>3G4@;P $,B\ "# O  I(P%. ;P80P5'(__Q"@$YU(&\ !# O
XM  A*$&8$0H!.=; 89O0@"%. 3G5.5O_J/7P  ?_^8  !GC!N__[1R-'(T>X 
XM"BU0__0@;O_T#!  +68  512KO_T(&[_]! 02( P0")\  !]DA PF !(@,!\
XM !AG  $@(&[_]!U0__)2KO_T$"[_\DB 8   \C/\  $  &I<8   _!/\  $ 
XM &J&8   \#/\  $  &I28   Y"!N__0,$ !O9PH@;O_T#!  3V9(4J[_]$)N
XM__PNCE&7+PY9ER\N__1.N0  (&Q0CSU __H^N0  :F935T)G0F<_+O_X/R[_
XM^B\\  !J6DZY   1#M_\    #& &3KD  !I$8   ?BZ\  !K#DZY   +:"ZN
XM__1.N0  "V@NO   :Q!.N0  "VA@6"!N__00$$B 8!1".0  :EY@)D(Y  !J
XMB& >8!Q@&K!\ $)GYK!\ %!GZ+!\ &)GVK!\ '!GW&#B8!Y.N0  &D1@%DC 
XM('P  &J@<@RPF%?)__P@:  P3M!@$"ZN__1.N0  /F(SP   :E9@*B!N__0,
XM$  K9AY2KO_T+J[_]$ZY   ^8C/   !J5&8&3KD  !I$8 )@$%)N__XP+O_^
XML&X "&T _EHP+O_^L&X "&8&3KD  !I$+KP  &L5(&X "C)N__[3R=/)+S"8
XM $ZY   _[%B/+4#_[F8N(&X "C)N__[3R=/)+K"8 "\\  !K%R\\  ![P$ZY
XM  !!.%"//KP  4ZY  !)+E)N__XP;O_^T<C1R-'N  HM4/_T9SXNO   :RDO
XM+O_T3KD  #_L6(\CP   A]QF(BZN__0O/   :RLO/   >\!.N0  03A0CSZ\
XM  %.N0  22Y@"B/\  ![L@  A]Q">0  B_PC^0  A]P  'Z40F[__F T,"[_
XM_DC @?P "$A 2D!F$C!N__[1R-'\  "$*#"\  %@#C!N__[1R-'\  "$*$)0
XM4F[__@QN 0#__FW$$_P "@  A_Q".0  A_T3_  *  "*_$(Y  "*_1/\  H 
XM +* 0CD  +*!$_P "@  @9A".0  @9D^O  ,3KD  %3.(\   &J0(_D  &J0
XM  !JE 9Y  P  &J>+J[_[DZY   &<DZY   %Y QY &0  &HT;BI*>0  :C)N
XM!$) 8 )P 4IY  !J*&X$0D%@ G(!@$%G"CZ\=3!.N0  $=(NN0  ?I0_/  *
XM3KD  %*^5(]*>0  :EQG?#ZY  !JF"\\  !K0"\\  ![P$ZY  !!.%"//KD 
XM &J:+SP  &MH+SP  'O 3KD  $$X4(\^N0  :IPO/   :X$O/   >\!.N0  
XM03A0CSZY  !JGB\\  !KK2\\  ![P$ZY  !!.%"/+KP  &O/+SP  'O 3KD 
XM $$X6(]"5TZY  !)+DY>3G5.5O_X0F[__$)N__Y@  !Z(&X ##)N__S1R2)N
XM  @T;O_^T\H0D5)N__P@;@ (,F[__M')#!  (&=*(&X "#)N__[1R0P0  EG
XM.B!N  @R;O_^T<D,$  (9RH@;@ ,,F[__-')$+P ""!N  PR;O_\T<DR;O_\
XMT^X #!%I__\  51N__Q2;O_^(&X "#)N__[1R0P0  IG#C N !!50+!N__QN
XM /]L(&X ##)N__S1R1"\  H@;@ ,,F[__-')0B@  2ZN  PO+@ (3KD  %[Z
XM6(].7DYU3E;__$IY  !J*&\N('P  (S^,GD  &HHT<D0O  *('P  (S^,GD 
XM &HHT<E"*  !+KP  (S^80 '3$)Y  !J*$)Y  !J*D)Y  !J+$Y>3G5.5O_Z
XM+JX "&$ $ 8_ # Y  !J9M!Y  !J:)!?2,"!_  "/4#__DIN__YO!C N__Y@
XM D) ,\   &IH3EY.=4Y6_OPC[@ (  "'O$)Y  "._F   +1@,! N_P!(@+ Y
XM  !J@&80+HX&E____P!.N0  (UY@$BZ.!I?___\ 80 ,]E)Y  !JF#!Y  ".
XM_M'(T<@B?   A[PNL)@ +PX&E____P!A  /\6(^P?/__9JA*>0  COYO2C!Y
XM  "._M'(T<C1_   A[Q*D&,V,'D  ([^T<C1R")\  "'O"ZPF !.N0  27A*
XM>0  :EQG%"Z\  !K\B\\  ![P$ZY  !!.%B/4WD  ([^#'G__P  COYN /]$
XM3EY.=4Y6__Q@!%*N  @@;@ ($!!(@$C T+P  'V2($ ($  %9^1@!%*N  @@
XM;@ ($!!(@$C T+P  'V2($ ($  %9N0NK@ (+RX #$ZY  !>^EB/(&X $#"Y
XM  !J9"!N ! Q>0  :F8  DY>3G5.5O_X(&X ##U0__Q";O_^8!X@;@ 0,F[_
XM_M')(FX "#1N__S3RA"14F[__%)N__X@;@ (,F[__-')2A!G,"!N  @R;O_\
XMT<D,$  @9R @;@ (,F[__-')#!  "6<0(&X "#)N__S1R0P0  IFI& 6(&X 
XM$#)N__[1R1"\ "!2;O_\4F[__B!N  @R;O_\T<D,$  @9]H@;@ ,,*[__"!N
XM ! R;O_^T<E"$# N__Y.7DYU3E;_^$)N__X@;@ ,/5#__$IN !!O  !V,&[_
XM_")N  @0,)@ 2("P+@ 79@12;O_\8!X@;@ 2,F[__M')(FX "#1N__S3RA"1
XM4F[__E)N__PP;O_\(FX "! PF !(@+ N !=G*"!N  @R;O_\T<E*$&<:(&X 
XM"#)N__S1R0P0  IG"C N__ZP;@ 0;Z8@;@ 2,F[__M')0A!@!%)N__PP;O_\
XM(FX "! PF !(@+ N !=G'B!N  @R;O_\T<E*$&<0(&X "#)N__S1R0P0  IF
XMRB!N  PPKO_\,"[__DY>3G5.5O_X/6X #/_^/6X $O_\8!X@;@ .,F[__-')
XM(FX "#1N__[3RA"14F[__E)N__P@;@ (,F[__M')2A!FU$Y>3G5.5O_V+JX 
XM"&$ #+(]0/_Z#&X  P 09AX^K@ .,"[_^I%7+RX $D)G+RX "&&0W_P    *
XM8&@,;@ " !!F2# N  [0;@ ,D&[_^DC @?P  CU __PP+O_\L&X #&\&,"[_
XM_& $,"X ##U __X^KO_^+RX $D)G+RX "&$ _T+?_     I@&#ZN  PO+@ 2
XM0F<O+@ (80#_*-_\    "DY>3G5.5O_X80#[M$)N__Y@!%)N__X@;@ (,F[_
XM_M')#!  (&?L(&X "#)N__[1R0P0  IG-DHY  !JC&<>+KP  &P 80 "_# Y
XM  !J9-!Y  !JCC/   !J:& 0,#D  &IDT&[__C/   !J:$)N__Q@'B!N  @R
XM;O_\T<DB;@ (-&[__M/*$)%2;O_^4F[__"!N  @R;O_^T<E*$&;4(&X "#)N
XM__S1R4(03EY.=4Y6__A";O_\8"P,;@#___QL%# N__Y(@#)N__S3[@ ($H!2
XM;O_\#&X "O_^9SX,;@ -__YG-DIY  !IOFT:,'D  &F^(GP  (C\$#"8 $B 
XM4WD  &F^8 HNK@ ,3KD  $%8/4#__K!\__]FGB!N  @R;O_\T<E"$$IN__QF
XM#@QN_____F8&/7S____\,"[__$Y>3G5.5O_Z+JX "$ZY  !?'%- /4#__F 8
XM,&[__B)N  @0,)@ 2( ^@&$  OQ3;O_^2F[__FSB3EY.=4Y6__P^N0  :CQA
XM  7D2GD  &H^;T8P.0  :BY(P('\  )(0+!\  %F&CZY  !J+B\\  !J2B\\
XM  "R@&$  N10CV 8/KD  &HN+SP  &I.+SP  (&880 "RE"/#'D  0  :EAF
XM,BZY  !^E#\\  Q.N0  4KY4CU)Y  !JG$IY  !J4F\2+KD  'Z4/SP "DZY
XM  !2OE2/3EY.=4Y6__PS^0  :C   &HN,#D  &HNL'D  &I4;1@P.0  :BZP
XM>0  :E9N"C/\  $  &I88 9">0  :EA*>0  :E)O% QY  $  &I89@HNO   
XM:E)A  ""4GD  &HP2GD  &HX;U ^N0  :CA35V$ !.8P.0  :BY(P('\  )(
XM0$I 9AH^N0  :BXO/   :D(O/   A_QA  'P4(]@&#ZY  !J+B\\  !J1B\\
XM  "*_&$  =90CSZY  !J.F$ !)@P.0  :CC0>0  :CI20#/   !J,DY>3G5.
XM5O_X(&X "#U0__P,;@ !__QF%BZ\  !K\"\\  !L DZY  !!%EB/8 PNO   
XM:_!.N0  018NO   >Z1.N0  05@]0/_^4F[__"!N  @PKO_\3EY.=4Y6  !(
XMYP, 2GD  &HR9PXP.0  :C*P>0  :D!O!&$ _K0,>0 !  !J6&8  )(@;@ (
XM#!  "F8:+KD  'Z4/SP "DZY  !2OE2/4GD  &J:8&Q^ 6 4+KD  'Z4/SP 
XM($ZY  !2OE2/4D>^>0  :EIOY'X!8!0NN0  ?I0_/  @3KD  %*^5(]21[YY
XM  !J:&_D8!PNN0  ?I0@;@ ($!!(@#\ 3KD  %*^5(]2K@ ((&X "$H09MQ2
XM>0  :IHS^0  :F0  &IH,#D  &IB4T R.0  :D"2>0  :C*P06P*/KD  &IB
XM4U=@#CZY  !J0# Y  !J,I%780 #+C Y  !J8M%Y  !J,C Y  !J,K!Y  !J
XM0&\$80#]($J?3-\ @$Y>3G5.5O_\4GD  &F^#'D"    :;YO#"Z\  !L(DZY
XM   82B!\  "(_#)Y  !IOM')$*X "4Y>3G5.5O]R2GD  &I89P "/"!N  P]
XM4/]Z(&X ##UH  +_>#Z\ !0O#@:7____]C\N !!.N0  &6!<CSU _X!*.0  
XM:HIG-"Z.!I?___^*+PX&E_____9.N0  /=Y8CSU _X NC@:7____BB\.!I?_
XM___V3KD  %[Z6(\NC@:7____VF$ !V(NC@:7____VDZY  !?'#U _W9";O]\
XM(&X "#)N_WS1R1U0_XA";O^"8!0@?   B_XR;O^"T<D0O  @4F[_@C N_X*P
XM;O]X;>)";O]^$"[_B$B /H O/   ?I@_+O]X,"[_>I%7+PX&E____WPO+@ (
XM80#XKM_\    #DI ;P  ?#ZN_X O#@:7____]B\\  !_F#\\ ",O/   ?IAA
XM  -:W_P    ./J[_=B\.!I?____:+SP  'Z8/SP )2\\  !_F&$  S3?_   
XM  XNO   B_XP;O]^T<@B?   :G8_,)@ /R[_>#\N_WHO/   ?IAA /E0W_P 
XM   *4F[_?B!N  @R;O]\T<E*$&<:(&X "#)N_WS1R0P0  IG"@QN  /_?F8 
XM_RA@%C!N_WC1_   B_X,*  @__]F#%-N_W@,;@ !_WALXB!\  "+_C)N_WC1
XMR1"\  H@?   B_XR;O]XT<E"*  !/7P  ?]\8!8NN0  ?I0_/  @3KD  %*^
XM5(]2;O]\,"[_?+!Y  !J6F_>+7P  (O^_X1@'"ZY  !^E"!N_X00$$B /P!.
XMN0  4KY4CU*N_X0@;O^$2A!FW%)Y  !JFDY>3G5.5O_Z(&X "#U0__X,;@ *
XM  YF"#UN !#__F J#&X *P .9@HP+@ ,T6[__F 8#&X +0 .9@HP+@ ,D6[_
XM_F &/6X #/_^,"[__K!N !1L!C N__Y@!# N !0]0/_^,"[__K!N !)O!C N
XM__Y@!# N !(]0/_^(&X "#"N__Y.7DYU3E8  $CG!P ^+@ (#'D  0  :EAF
XM(GP!8!HNN0  ?I0_/  *3KD  %*^5(]2>0  :II21KQ';^)*GTS? ,!.7DYU
XM3E;__&$ ] PP.0  :C*P>0  :D!N5DIY  !J,F8$80#Z2C Y  !J0%) D'D 
XM &HRL&X "&\&/JX "& 0/KD  &I 4E<P.0  :C*15V$ _W P+@ (T7D  &HR
XM,#D  &HRL'D  &I ;P1A /ED3EY.=4Y6__A(YP< 0F[__DIN  YO  #@#&X 
XM 0 0;P  UG !D&[__CU __X];@ .__HP+@ 04T ]0/_X,#D  &IHL'D  &ID
XM9PP,;@ !__AO!%-N__@^+@ ,4T<P!]!N__JP? '^;P8P/ '^8 8P!]!N__H\
XM &   'HP1M'N  @R1]/N  @0D3!'T>X " P0 "!F6C!'T>X " PH "#__V=,
XM2F[__F84,"[_^E- 2,"![O_X4D ]0/_\8 XP+O_Z2,"![O_X/4#__# N__R1
XM;O_Z4V[_^& 04T8P1M'N  @0O  @4V[__$IN__QNZE-'4T:^1FV$2I],WP# 
XM3EY.=4Y6  !(YP\ 0D9"1V! (&X "! P< !(@+ N  UF'D)%8!(P1M'N  XR
XM1=/N !(0D5)&4D6Z;@ 6;>A@$#!&T>X #C)'T^X "!"14D921S!'T>X "$H0
XM9K8P1M'N  Y"$$J?3-\ X$Y>3G5.5O[^2.<# "ZN  @O#@:7___^_DZY   V
XME%B/+HX&E____OXO+@ (3KD  %[Z6(\^O $ +PX&E____OXO+@ (3KD  #5&
XM4(\^O $ +PX&E____OXO+@ (3KD  #>P4(\@;@ (#!  (&<*(&X " P0  IF
XM""ZN  AA /8(2GD  &IN;@A*.0  :G!G'#Z\ 0 O#@:7___^_B\N  AA  $0
XM4(]3>0  :FY*>0  :G)N"$HY  !J=&<</KP! "\.!I?___[^+RX "&$ \)Q0
XMCU-Y  !J<DIY  !J:FX(2CD  &IL9QHNK@ (80#QHBZN  AA /C.4WD  &IJ
XM8   J"!N  @,$  *9@PNK@ (80#XLF   ))*>0  :F!F#"ZN  AA /B>8   
XM?BZN  A.N0  7QQ30#U __X@;@ (,F[__M')$+P (#!N__[1[@ (#"@ +O__
XM9A)2;O_^(&X "#)N__[1R1"\ " @;@ (,F[__M')0B@  4)N__Y@#BZ.!I?_
XM__[^3KD  !]6+HX&E____OXO#E67+RX "&$ \G!0CTI ;MA*GTS? (!.7DYU
XM3E;_^$)N__Q";O_^8   DB!N  @R;O_^T<D,$  @9T @;@ (,F[__M')#!  
XM"&<P(&X "#)N__[1R0P0 %]G(#!N__S1[@ ,$+P 7U)N__PP;O_\T>X #!"\
XM  A2;O_\(&X "#)N__[1R0P0 "!F%#!N__S1[@ ,$+D  &J$4F[__& 8,&[_
XM_-'N  PB;@ (-&[__M/*$)%2;O_\4F[__B!N  @R;O_^T<D,$  *9PXP+@ 0
XM54"P;O_\;@#_5"!N  PR;O_\T<D0O  *(&X ##)N__S1R4(H  $NK@ ,+RX 
XM"$ZY  !>^EB/3EY.=4Y6__A";O_^0F[__& ^(&X "#)N__S1R0P0  AF!E-N
XM__Y@)"!N  @R;O_\T<D,$  @;10@;@ (,F[__-')#!  ?FX$4F[__E)N__P@
XM;@ (,F[__-')2A!FM# N__Y.7DYU3E;__"Z\  !L1"\N  A.N0  7OI8CTY>
XM3G5.5O_X0F[__"!N  X]4/_^,"X $E- L&[__FT6,&[__M'N  H0K@ )4F[_
XM_CU\  '__"!N  XPKO_^,"[__$Y>3G5.5O_V0F[_^B!N ! ]4/_\+JX "$ZY
XM  !?'-!N__PR+@ 44T&P06(V0F[__F <,&[__-'N  PB;@ (-&[__M/*$)%2
XM;O_\4F[__B!N  @R;O_^T<E*$&;6/7P  ?_Z(&X $#"N__PP+O_Z3EY.=4Y6
XM__9";O_\(&X ##U0__Y@!%)N__X@;@ (,F[__M')#!  (&?L(&X "#)N__[1
XMR0P0  EGW#U\  '_^B!N  @R;O_^T<D,$  K9Q @;@ (,F[__M')#!  +68@
XM,&[__M'N  @,$  K0,!2;O_^1,!F!' !8 )P_SU __I";O_\8"0P+O_\P?P 
XM"B)N  @T;O_^T\H2$4B!T$'0?/_0/4#__%)N__X@;@ (,F[__M')#!  ,&T0
XM(&X "#)N__[1R0P0 #EOO"!N  PPKO_^,"[_^L'N__Q.7DYU3E;__"ZN  @O
XM/   ;%HO/   >\!.N0  03A0CSZ\  %.N0  22Y.7DYU3E;_^$)N__P@;@ ,
XM/5#__F $4F[__B!N  @R;O_^T<D,$  )9^P@;@ (,F[__M')#!  (&?<8!HP
XM;O_\T>X $#)N__[3[@ ($)%2;O_^4F[__"!N  @R;O_^T<D,$  @9RX@;@ (
XM,F[__M')#!  "6<>(&X "#)N__[1R4H09Q @;@ (,F[__M')#!  "F:H,&[_
XM_-'N !!"$%)N__P@;@ ,,*[__C N__Q.7DYU3E;_^B!N  P]4/_^8 12;O_^
XM(&X "#)N__[1R0P0 "!G["!N  @R;O_^T<D,$  )9]P@;@ ,,*[__DY>3G5.
XM5O_R/6X "/_X; HP+@ (1$ ]0  (0F[__C N  A(P('\  I(0-!\ # R;O_^
XMT^X "A* 4F[__C N  A(P('\  H]0  (;PPP+@ .54"P;O_^;L9*;O_X;!PP
XM+@ .4T"P;O_^;Q P;O_^T>X "A"\ "U2;O_^(&X "C)N__[1R4(00F[__"ZN
XM  I.N0  7QQ30#U __I@.B!N  HR;O_\T<D=4/_V(&X "C)N__S1R2)N  HT
XM;O_ZT\H0D2!N  HR;O_ZT<D0KO_V4F[__%-N__HP+O_\L&[_^FV\,"[__DY>
XM3G5.5O_\+KP  &Q>+SP  'O 3KD  $$X6(]"5TZY  !)+DY>3G5.5O_Z0F[_
XM_F 0(&X "! 02(#1;O_^4JX ""!N  A*$&;H,"[__DC @?P 9$A 3EY.=4Y6
XM__@NK@ (8<0P0-'(T<C1[@ ,+5#__& F(&[__"Z0+RX "$ZY  !>N%B/2D!F
XM!B N__Q@$B!N__PM:  (__Q*KO_\9M1"@$Y>3G5.5O_V+JX $"\N  AAIEB/
XM+4#_^F9L/KP #$ZY  !4SBU __H&>0 ,  !JGDJN__IF!D* 8   ="ZN  AA
XM  !P+P @;O_Z()]F!$* 8%P@;O_Z+I!A /\L/4#__B!N__HR;O_^T\G3R=/N
XM ! A40 (,&[__M'(T<C1[@ 0(*[_^F .(&[_^BZH  1.N0  5EPNK@ ,81@O
XM "!N__HA7P $9@1"@& $("[_^DY>3G5.5O_\2.<# "ZN  A.N0  7QP^ %)'
XM/H=.N0  5,XM0/_\9Q;?>0  :IXNK@ (+R[__$ZY  !>^EB/("[__$J?3-\ 
XM@$Y>3G5.5O_V+JX $"\N  AA  ".6(\M0/_Z9F@^O  ,3KD  %3.+4#_^@9Y
XM  P  &J>2J[_^F8$0H!@8"ZN  AA /]Z+P @;O_Z()]F!$* 8$H@;O_Z+I!A
XM /XV/4#__B!N__HR;O_^T\G3R=/N ! A40 (,&[__M'(T<C1[@ 0(*[_^B!N
XM__HQ;@ ,  0@;O_Z,6X #@ &("[_^DY>3G5.5O_X+JX "&$ _>8P0-'(T<C1
XM[@ ,+5#__& F(&[__"Z0+RX "$ZY  !>N%B/2D!F!B N__Q@$B!N__PM:  (
XM__Q*KO_\9M1"@$Y>3G5.5O_T+JX "&$ _9@P0-'(T<C1[@ ,+5#__"UN__S_
XM^& Z(&[__"Z0+RX "$ZY  !>N%B/2D!F%"!N__@B;O_\(6D "  (("[__& 8
XM+6[__/_X(&[__"UH  C__$JN__QFP$* 3EY.=4Y6__I">0  :F0S_ !!  !J
XM9D)Y  !J:#/\  $  &IB,_P  0  :F!">0  :FI">0  :FY">0  :G(3_  N
XM  !J@!/\ %\  &J",_P  0  :G8S_  "  !J>#/\  ,  &IZ0GD  &I\,_P 
XM 0  :GX3_  @  !JA$)N__Y@-# N__Y(P('\  A(0$I 9A(P;O_^T<C1_   
XMA"@PO  !8 XP;O_^T<C1_   A"A"4%)N__X,;@$ __YMQ$)Y  !J,D)Y  !J
XM+C/\  $  &HP,_P /@  :C0S_  #  !J.#/\  (  &HZ,_P  @  :CPS_  #
XM  !J/C Y  !J-)!Y  !J/)!Y  !J/C/   !J0!/\  H  (?\0CD  (?]$_P 
XM"@  BOQ".0  BOT3_  *  "R@$(Y  "R@1/\  H  (&80CD  (&9,_D  &ID
XM  !J0C/Y  !J9@  :D0S^0  :F0  &I&,_D  &IF  !J2#/Y  !J9   :DHS
XM^0  :F8  &I,,_D  &ID  !J3C/Y  !J9@  :E!">0  :EQ">0  :E)">0  
XM:E0S_'4P  !J5C/\  $  &I80GD  &I:0GD  &HH0GD  &HJ0GD  &HL,_S_
XM_P  :;Y";O_^8!(P;O_^T<C1_   :<!"4%)N__X,;@ :__YMYD(Y  !J;$(Y
XM  !J<$(Y  !J=$(Y  !JAD(Y  !JBA/\  $  &I>0CD  &J,3EY.=4Y6__0N
XMK@ (3KD  !9$/4#_^"ZN  A.N0  7QS0>0  :B@]0/_^,#D  &IFD'D  &IH
XM/4#__# Y  !J*M!N__BP;O_\;@H,;@( __YM  ".,#D  &HHD6[__C N__R0
XM>0  :BH]0/_Z8"(P>0  :BC1_   C/X,*  @__]F!E)N__I@ F .4WD  &HH
XM2GD  &HH;M8,>0 !  !J?F8X/KD  &HL/R[_^C\Y  !J*"\\  ",_DZY   2
XM0E"/2F[_^F\4#'D  0  :BQO"C N__K1>0  :BA.N0  !>0NK@ ((#P  (S^
XM,CD  &HH2,'0@2\ 3KD  %[Z6(\S[O_^  !J*# N__C1>0  :BI2>0  :BQ.
XM7DYU3E;_^"!N  P]4/_^(&X $#U0__PNCE67+RX "$ZY   9(EB/,&[__B)N
XM  @0,)@ 2( ]0/_\#&X *__\9P@,;@ M__QF!%)N__X@;@ ,,*[__B!N ! P
XMKO_\+JX #"\N  A.N0  %W!8CTY>3G5.5O_\2.<# "!N  P]4/_^/7S____\
XM+HY5ER\N  A.N0  &2)8CR!N  @R;O_^T<E*$&<  39";O_\(&X "#)N__[1
XMR0P0 ")F  "N4F[__F!4(&X "#)N__[1R0P0 ")F*B!N  @R;O_^T<D,*  B
XM  %F%C!N__S1[@ 0$+P (E)N__Q4;O_^8 )@*#!N__S1[@ 0,F[__M/N  @0
XMD5)N__Y2;O_\(&X "#)N__[1R4H09IX@;@ 0,F[__-')0A!2;O_^,&[__B)N
XM  @0,)@ 2( P0")\  !]DA PF !(@,!\ !QG#"Z\  !MHDZY   82E)N__Y@
XM:B!N  @R;O_^T<D>$& F,&[__-'N ! R;O_^T^X "!"14F[__E)N__P@;@ (
XM,F[__M')'A"^/  @9QR^/  )9Q:^/  L9Q"^/  -9PJ^/  *9P1*!V:X(&X 
XM$#)N__S1R4(02@=G!%)N__X@;@ ,,*[__C N__Q*GTS? (!.7DYU3E;_]DCG
XM#QPJ;@ (*&X #&   .(<%1 &2(!@  #"8 )2C0P5 "!G^ P5  EG\F   ,1*
XM+0 !9P@8[0 !5(U@ E*-8   L! M  %(@$C T+P  &RB($ :$&<"&,54C6  
XM )12C6 <#!4 (F<$&-U@$@PM "(  68(&/P (E2-8 )@!$H59N!2C6!J1^[_
XM]F "%MT0%4B 2,#0O   ?9(@0 @0  )FZD(3+HX&E_____9.N0  /F(^ # '
XML'P! &\.+KP  &VZ3KD  !A*8 I*1V\&, =(@!C 8!H8W6 62, @?   ;2)R
XM#["85\G__"!H #Q.T P5  IG!DH59@#_%D(42I],WSC@3EY.=4Y6_JA(YP\ 
XM0B[^KD(N_JPNK@ (+SP  'Z83KD  #:46(\NO   ?I@O+@ (3KD  %[Z6(\]
XM?  !_K(NC@:7____L"\.!I?___ZR+RX "$ZY   8=%"//  Z+OZR+HX&E___
XM_K O#@:7____##\&+PX&E____[!A  \HW_P    */4#^N QN ^?^N&< #PI*
XM.0  =-1G%@QN &W^N&<.+JX "$ZY   -:&  #NP^O $ +PX&E____Q O+@ (
XM3KD  #5&4(\NC@:7____8"\.!I?___ZR+RX "$ZY   @VE"//  ]?  *_KI"
XM1TI&;P  G PN "O_8&<(#"X +?]@9AP0+O]@2( ]0/ZZ+HX&E____V%.N0  
XM/F(^ &!N('P  'V2$B[_8$B!2,'1P0@0  )G%D)N_KHNC@:7____8$ZY   ^
XM8CX 8$(NC@:7____8"\\  !XW$ZY  !>N%B/2D!F"!U\  '^KF @+HX&E___
XM_V O/   >-].N0  7KA8CTI 9@8=?  !_JPP+OZX8  -\BZN_PPO+@ (3KD 
XM #CD6(]@  WR3KD   7D,_P  0  :F!@  W@3KD   7D0GD  &I@8  -T$ZY
XM   %Y&  #<8^O'4P/SP  3\\  $_+OZZ/P<O/   :F).N0  $0[?_     Q@
XM  V>3KD   7D2B[^KF<*$_P  0  :FQ@-DHN_JQG#D(Y  !J;$)Y  !J:F B
XM/KQU,$)G/SP  3\N_KH_!R\\  !J:DZY   1#M_\    #&  #4Y*+OZN9PX3
XM_  !  !J<&  #3Q@.DHN_JQG$D(Y  !J<$)Y  !J;F  #21@(CZ\=3 _/  !
XM0F<_+OZZ/P<O/   :FY.N0  $0[?_     P@?   ?9(2+O]@2(%(P='!"!  
XM F92+HX&E____V O/   >.-.N0  7KA8CTI 9A 3_ !?  !JA$)Y  !J;F H
XM+HX&E____V O/   >.=.N0  7KA8CTI 9@X3_  @  !JA$)Y  !J;F  #)0,
XM.0 !  !J7F9&2B[^KF<*$_P  0  :G1@-DHN_JQG#D(Y  !J=$)Y  !J<F B
XM/KQU,#\\  %"9S\N_KH_!R\\  !J<DZY   1#M_\    #&  #$ NO   :D(O
XM/   A_PO+@ (3KD   =*4(\NO   :D8O/   BOPO+@ (3KD   =*4(]@  P,
XM+KP  &I*+SP  +* +RX "$ZY   '2E"/+KP  &I.+SP  (&8+RX "$ZY   '
XM2E"/8  +V$HY  !JB&< "\Y.N0  !>1*>0  :C)O"CZ\=3!.N0  $=(^O'4P
XM/SR*T#\Y  !J+E)7/R[^NC\'+SP  &HN3KD  !$.W_P    ,,_D  &HN  !J
XM,&  "X ^O'4P0F<_/  !/R[^NC\'+PX&E____K1.N0  $0[?_     P^KOZT
XM3KD  !'28  +3DZY   %Y#ZY  !J9E-70F="9S\N_KH_!R\\  !J9$ZY   1
XM#M_\    ##/Y  !J9   :FA@  L6/KQU,#\Y  !J:%)7/SP 03\N_KH_!R\\
XM  !J9DZY   1#M_\    #&  "NI.N0  !>0^N0  :F9"9T)G/R[^NC\'+SP 
XM &IH3KD  !$.W_P    ,8  *OBZ\  !S1"\.!I?___]@3KD  !S&6(\M0/ZH
XM9T@NC@:7____$"\.!I?___ZR+RX "$ZY   8=%"/2D!G)BZ\  !S1"!N_J@_
XM*  &(&[^J#\H  0O#@:7____$$ZY   ;W%"/8!PNC@:7____8"\\  !X[2\\
XM  ![P$ZY  !!.%"/8  *.BZ\  !X_"\.!I?___]@3KD  %ZX6(]*0&8*$_P 
XM 0  :HI@5"Z\  !Y B\.!I?___]@3KD  %ZX6(]*0&8(0CD  &J*8#(NC@:7
XM____8"\.!I?___^P$#D  &J 2( _ "\\  !Y"2\\  ![P$ZY  !!.-_\    
XM#F  ";Y@  FZ2D9O  "N('P  'V2$B[_8$B!2,'1P0@0  )G("Z.!I?___]@
XM+SP  'DH+SP  'O 3KD  $$X4(]@  E^0B[_$"Z.!I?___\0+PX&E____K(O
XM+@ (3KD  "#:4(\\ $I&;BHNC@:7____8"\\  !Y0B\\  ![P$ZY  !!.%"/
XM+HX&E____Q!.N0  0#9*+O\09QXNO   ABPO#@:7____$"\.!I?___]@3KD 
XM !KF4(]@*BZ.!I?___^P$#D  &J 2( _ "\\  !Y1R\\  ![P$ZY  !!.-_\
XM    "F  "-I*1F\  *H@?   ?9(2+O]@2(%(P='!"!   F<@+HX&E____V O
XM/   >60O/   >\!.N0  03A0CV  ")Y"+O\0+KP  ("8+PX&E____K(O+@ (
XM3KD  "#:4(\\ $I&;R@NO   @)@O/   >7XO/   >\!.N0  03A0CRZ.!I?_
XM__\03KD  $ V2B[_$&<>+KP  (8L+PX&E____Q O#@:7____8$ZY   :YE"/
XM8"HNC@:7____L! Y  !J@$B /P O/   >8$O/   >\!.N0  03C?_     I@
XM  ?^#&X "OZZ9AH@>0  :I1"$"!Y  !JE"%\       "8   ?BZ.!I?___ZR
XM+RX "$ZY   9(EB/(&X "#)N_K+1R4H09P 'N# 'P?P  R)Y  !JE!* /"[^
XMLF "4D8P1M'N  @,$  *9O(P1M'N  A"$" N  @R+OZR2,'0@2Z 3KD  !N4
XM+P @>0  :I0A7P "('D  &J4,7D  &HN  8^O  ,3KD  %3.+P @>0  :I0A
XM7P (!GD #   :IX@>0  :I0CZ  (  !JE"!Y  !JE"%\       (8  '(DZY
XM   %Y"/Y  !JD   :I1@  "*('D  &J42J@  F8.+KP  'F>3KD   UH8& @
XM>0  :I00$$B T'D  &ID,\   &IH,#D  &IFD'D  &IH/4#^LB!Y  !JE#ZH
XM  8@>0  :I0O*  "/R[^LB\.!I?___\03KD  #ADW_P    *+HX&E____Q!.
XMN0  #6@@>0  :I0CZ  (  !JE"!Y  !JE$JH  AF /]L8  &=$(Y  !J7F  
XM!FH3_  !  !J7F  !EX3_  !  !JC&  !E)".0  :HQ@  9(3KD   7D3KD 
XM #KD8  &.$ZY   %Y$ZY   \&&  !BA".0  :H@S^0  :C0  &HV,_QU,   
XM:C0P.0  :C20>0  :CR0>0  :CXSP   :D!@  7T,#D  &HR4T SP   :D!.
XMN0  !>0S^0  :C8  &HT8  %TDZY   %Y$ZY   ZY$I 9RA">0  :F0S_ "$
XM  !J9D(Y  !JC$)Y  !J8D)Y  !J8!/\  $  '348  %EDZY   \&$(Y  !T
XMU&  !89.N0  !>0NC@:7___^O# %2,#0K@ (+P!.N0  (E)8CT'N_KPM2/\,
XM8!PNN0  ?I0@;O\,$!!(@#\ 3KD  %*^5(]2KO\,(&[_#$H09MQ@  4T2CD 
XM &J(9P %*CZ\=3 _.0  :C@P.0  :CK15S Y  !J/-%7,#D  &H^T5=25S\\
XM #X_+OZZ/P<O/   :C1.N0  $0[?_     PP.0  :C20>0  :CR0>0  :CXS
XMP   :D!@  3./KD  &IF4U="9T)G/R[^NC\'+SP  &I:3KD  !$.W_P    ,
XM8  $ICZY  !J-# Y  !J.I%7,#D  &H\D5<P.0  :CZ15U-70F<_/  #/R[^
XMNC\'+SP  &HX3KD  !$.W_P    ,8  $9#ZY  !J-# Y  !J.)%7,#D  &H\
XMD5<P.0  :CZ15U-70F<_/  "/R[^NC\'+SP  &HZ3KD  !$.W_P    ,8  $
XM(CZY  !J-# Y  !J.)%7,#D  &HZD5<P.0  :CZ15U-70F<_/  "/R[^NC\'
XM+SP  &H\3KD  !$.W_P    ,,#D  &HTD'D  &H\D'D  &H^,\   &I 8  #
XMR#ZY  !J-# Y  !J.)%7,#D  &HZD5<P.0  :CR15U-70F<_/  #/R[^NC\'
XM+SP  &H^3KD  !$.W_P    ,,#D  &HTD'D  &H\D'D  &H^,\   &I 8  #
XM;BZ\  !J0B\\  "'_"\N  A.N0  !TI0CV   U(NO   :D8O/   BOPO+@ (
XM3KD   =*4(]@  ,V+KP  &I*+SP  +* +RX "$ZY   '2E"/8  #&BZ\  !J
XM3B\\  "!F"\N  A.N0  !TI0CV   OX3[O]@  !J@$HY  !J@&<*##D "@  
XM:H!F"!/\ "X  &J , ?0>0  :C*P>0  :D!O'# Y  !J,K!Y  !J0&X./H=.
XMN0  $=)">0  :C)@  *L$^[_8   :H)*.0  :H)G"@PY  H  &J"9@@3_ !?
XM  !J@F   H8P!]!Y  !J,K!Y  !J0&\<,#D  &HRL'D  &I ;@X^ATZY   1
XMTD)Y  !J,F   E8^O'4P0F<_/  !/R[^NC\'+SP  &I\3KD  !$.W_P    ,
XM8  ",#/\  $  &I^8  ")$)Y  !J?F   AI*1F\  A0P.0  COY20+!\  AF
XM#"Z\  !YH$ZY   82BZ\  !YP2\.!I?___]@3KD  #_L6(\O #!Y  "._E)(
XMT<C1R-'\  "'O""?9RY2>0  COX,>0 !  !J7&8<+HX&E____V O/   ><,O
XM/   >\!.N0  03A0CV <+HX&E____V O/   ><XO/   >\!.N0  03A0CV  
XM 7Y@  %Z8  !=A/\ %\  &J$/KQU,#\\  %"9S\N_KH_!R\\  !J;DZY   1
XM#M_\    #&   4@P>0  CO[1R-'((GP  (>\+K"8 "\N  A.N0  ,_18CV  
XM 21*1F\  1X,+@!A_V!M" PN 'K_8&\6$"[_8$B /H O/   >>!.N0  &$I8
XMCRZ.!I?___ZZ+PX&E____K(O+@ (3KD  "!L4(\^ #Z\=3 _/(K00F<_+OZZ
XM/P<0+O]@2(#0?/^?XT!(P-"\  !IP"\ 3KD  !$.W_P    ,8   I QN "W^
XMNF8*/7D  &HT_K1@!$)N_K0^N0  :D _/  !0F<_+OZZ/P<O#@:7___^M$ZY
XM   1#M_\    ## N_K2P>0  :C)O#DIY  !J,F8&3KD   P\,"[^M+!Y  !J
XM,F\2/J[^M# Y  !J,I%73KD  !'28"Q.N0  '2Y@)"Z\  !Y_DZY   82F 6
XM8!2P? !O8NKE0#! T?P  '36(%!.T$J?3-\ X$Y>3G5.5O_L+KP  (*8+RX 
XM"$ZY   :FEB/+4#__&<2(&X #B)N__P@J0 $0D!@  #&/7P#Y__T(&X " P0
XM "-G"B!N  @,$  A9@@P+O_T8   I"Z\  !S1"\N  A.N0  ''A8CRU __AG
XM6$HY  !JAF<Z(&[_^ QH  $ !F<N+JX "! Y  !J@$B /P O/   >A(O/   
XM>\!.N0  03C?_     HP/ /G8$I@%B!N__@]:  $__0@;@ 2(F[_^#"I  8,
XM;@/G__1F)BZN  @0.0  :H!(@#\ +SP  'HQ+SP  'O 3KD  $$XW_P    *
XM,"[_]$Y>3G5.5O[^0F[_!"Z.!I?____.+PX&E____P0O+@ (3KD  !AT4(\]
XM0/\"+HX&E____\XO#@:7____!"\N  A.N0  &'10CSU _P1*;O\$9@PNO   
XM>DA.N0  &$I";O\$8&X@;@ ($!!(@+ Y  !J@&8V(&X " PH &4  68J(&X 
XM" PH &X  F8>(&X "! H  -(@#! (GP  'V2$#"8 $B P'P '&= /KP R"\.
XM!I?___\$+PX&E____P8O+@ (3KD  !<"W_P    ,/4#_ BZN  PO+@ (3KD 
XM  K46(^P?/__9@#_?#Z\ ,@O#@:7____!"\.!I?___\&0F=.N0  %L#?_   
XM  I*0&8,+KP  'IE3KD  !A*+KP  (*8+PX&E____P8O#@:7____SDZY   :
XMYE"/2H!F%"Z\  !Z>R\\  ![P$ZY  !!.%B/3EY.=4Y6__A";O_\0F[__F  
XM 00P;O_^(FX "! PF !(@+ Y  !J@F8>4F[__C!N__S1[@ ,,F[__M/N  @0
XMD5)N__Q@  #,(&X "#)N__[1R0P0 $!G'B!N  PR;O_\T<DB;@ (-&[__M/*
XM$)%2;O_\8   GB!N  @R;O_^T<D,* !N  %F<"!N  @R;O_^T<D,* !A  )M
XM7B!N  @R;O_^T<D,* !Z  )N3#ZN ! P+O_\D5=35R N  PR+O_\2,'0@2\ 
XM,&[__B)N  @0,)@"2(#0?/^?,$#1R")\  !IP#\PF !.N0  &6!<C]%N__Q4
XM;O_^8!H@;@ ,,F[__-')(FX "#1N__[3RA"14F[__%)N__X@;@ (,F[__M')
XM2A!G#C N !!30+!N__QN /[D(&X ##)N__S1R4(0+JX #"\N  A.N0  7OI8
XMCTY>3G5.5O_\2.<##&   /@@;@ ,$!!(@+ Y  !J@F8D(&X "")N  P0D5*N
XM  Q2K@ ((&X "")N  P0D5*N  A@  # (&X # P0 "1G$B!N  @B;@ ,$)%2
XMK@ (8   I%*N  P@;@ ,#!  >V8$4JX #"AN  Q@!%*N  P@;@ ,$!!(@#! 
XM(GP  'V2$#"8 $B P'P '&;@(&X #!X0(&X #$(0+KP  (8L+PQ.N0  &II8
XMCRU __QG&"!N__PJ:  $8 H@;@ ($)U2K@ (2A5F\@PL 'O__V<,(&X "!"'
XM4JX "& <OCP ?6<6+HPO/   >I@O/   >\!.N0  03A0CU*N  P@;@ ,2A!F
XM /\"(&X "$(02I],WS" 3EY.=4Y6__A";O_\0F[__F!J(&X "#)N__[1R0P0
XM  EF/& L(&X ##)N__S1R1"\ "!2;O_\,&[__-'(T?P  (0H#%   6<4#&X!
XM /_\;@PP+@ 04T"P;O_\;LA@&B!N  PR;O_\T<DB;@ (-&[__M/*$)%2;O_\
XM4F[__B!N  @R;O_^T<E*$&<.,"X $%- L&[__&X _WP@;@ ,,F[__-')0A N
XMK@ ,+RX "$ZY  !>^EB/3EY.=4Y6__I";O_^8!H@;@ (,F[__M')(FX #C1N
XM__[3RA"14F[__C N  Q=0+!N__YO#B!N  XR;O_^T<E*$&;,8! P;O_^T>X 
XM"!"\ "Y2;O_^,"X #%U L&[__F[D/JX $B\\  !ZJR N  @R+O_^2,'0@2\ 
XM3KD  $RP4(].7DYU3E;_ZDCG!P!";O_^8!(@3C)N__[3R=')0FC_ZE)N__X,
XM;@ *__YMYB!N  A"$#U\  '__CU\  '_ZF $4F[__B!N  @R;O_^T<D,$  @
XM9RX@;@ (,F[__M')#!  "6<>(&X "#)N__[1R0P0  IG#B!N  @R;O_^T<E*
XM$&:^,&[__M'N  A"$%)N__Y^ 6   *@NCE67+RX "$ZY   9(EB/(&X "#)N
XM__[1R0P0  IG  ".(&X "#)N__[1R4H09P  ?B!.,D?3R='),6[__O_J8 12
XM;O_^(&X "#)N__[1R0P0 "!G/B!N  @R;O_^T<D,$  )9RX@;@ (,F[__M')
XM#!  +&<>(&X "#)N__[1R0P0  IG#B!N  @R;O_^T<E*$&:N(&X "#)N__[1
XMR4(04F[__E)'OGP "FT _U0NK@ ,3KD  %\</ !31F   (HP1M'N  P,*  D
XM__]G%"!N  P0,&  2( ^@$ZY   .C&!D,$;1[@ ,#!  ,&T,,$;1[@ ,#!  
XM.6\4(&X #! P8 !(@#Z 3KD   Z,8#@@;@ ,$#!@ $B T'S_T#U __X@3C)N
XM__[3R=')/6C_ZO_^("X "#(N__Y(P="!+H!.N0  "VA31E-&2D9L /]T0D9G
XM$B!N  P0,&  2( ^@$ZY   .C$J?3-\ P$Y>3G5.5O_X/KP ($ZY  !4SBU 
XM__QF'BZY  !ZN"\\  ![P$ZY  !!.%B/0D!@  $$8   _@9Y "   &J>2KD 
XM 'JP9@XC[O_\  !ZL$*Y  !ZM"!N__PPN0  :F0@;O_\,7D  &IF  (@;O_\
XM,7D  &I:  0@;O_\,7D  &IB  8@;O_\,7D  &HT  @@;O_\,7D  &HX  H@
XM;O_\,7D  &HZ  P@;O_\,7D  &H\  X@;O_\,7D  &H^ ! @;O_\,7D  &I@
XM !(@;O_\,7D  &I^ !0@;O_\$7D  &J  !8@;O_\$7D  &J" !<@;O_\$7D 
XM &J* !@@;O_\$7D  &I> !D@;O_\$7D  &J( !H@;O_\$7D  &J, !L@;O_\
XM(7D  'JT !PC[O_\  !ZM' !3EY.=4Y6__A*N0  >K1G  $@('D  'JT,]  
XM &ID('D  'JT,^@  @  :F8@>0  >K0SZ  $  !J6B!Y  !ZM#/H  8  &IB
XM('D  'JT,^@ "   :C0@>0  >K0SZ  *  !J."!Y  !ZM#/H  P  &HZ('D 
XM 'JT,^@ #@  :CP@>0  >K0SZ  0  !J/B!Y  !ZM#/H !(  &I@('D  'JT
XM,^@ %   :GX@>0  >K03Z  6  !J@"!Y  !ZM!/H !<  &J"('D  'JT$^@ 
XM&   :HH@>0  >K03Z  9  !J7B!Y  !ZM!/H !H  &J(('D  'JT$^@ &P  
XM:HP@>0  >K0M:  <__PNN0  >K1.N0  5EP$>0 @  !JGB/N__P  'JT9@9"
XMN0  >K!@%"ZY  !ZO"\\  ![P$ZY  !!.%B/3EY.=4Y6__A(YP$<*FX ""AN
XM  PF;@ 02A1G7BU-__PM3/_X+J[_^"\N__Q.N0  7OI8CV V8!X@;O_X$!!(
XM@+ 39@H@;O_\(FX %!"14J[__%*N__@@;O_X2A!FVBU-__PM3/_X4HM2K@ 4
XM2A-G""!N !1*$&:^8 )"%4J?3-\X $Y>3G5.5O_H(&X #$(08&(NO   >T O
XM/   >S@O+@ ,+PX&E____^QA /]8W_P    ,+HX&E____^PO+@ ,3KD  %[Z
XM6(\@;@ ($!!(@-!\_] P0-'(T<@B?   >O(NL)@ +RX #$ZY  !>CEB/4JX 
XM""!N  A*$&:6+JX #$ZY  !?'$Y>3G5.5@  2.<'!"IN  A"1T)&8 )2C1 5
XM2(!(P-"\  !]DB! "!  !6;J#!4 *V8$4HU@"@P5 "UF!%*-4D9@#L_\  H0
XM'4B WD#>?/_0#!4 ,&T&#!4 .6_F2D9G!C '1$ ^ # '2I],WR# 3EY.=4Y6
XM  !(YP<<*FX ""AN  Q"1V (OGP $&P:4D<P!\'\  XF0-?\  ![I# K  + 
XM?  #9N"^?  0;09"@&   -0,% !W9P8,% !79A@^K@ 0/SP  2\-3KD  $@N
XM7(\\ &   ' ,% !A9P8,% !!9CX^K@ 0/SP  2\-3KD  $KZ7(\\ &P6/JX 
XM$#\\  $O#4ZY  !(+ER// !@$#Z\  )"IS\&3KD  $P^7(]@) P4 ')G!@P4
XM %)F%#ZN !!"9R\-3KD  $KZ7(\\ & $0H!@0$I&; 1"@& X0FL ##:&0H G
XM0  ()T  ! P4 ')G!@P4 %)F"#=\  $  F &-WP  @ "2FX $&8& &L!   "
XM( M*GTS?.,!.7DYU3E;__$)7+RX #"\N  AA /[44(].7DYU3E;__$)7+RX 
XM#"\N  AA /Z\4(].7DYU3E;__#Z\  $O+@ ,+RX "&$ _J)0CTY>3G5.5O_\
XM2.<#!"IN  @M3?_\8 (:QRZ\  ![I$ZY  !!6#X OGS__V<&OGP "F;D0A6^
XM?/__9@1"@& $("[__$J?3-\@@$Y>3G5.5@  2.<!!$ZY  !:SD)7+SP  &FO
XM3KD  $OT6(\^O  !+SP  &FO3KD  $OT6(\^O  !+SP  &FO3KD  $OT6(\@
XM;@ (,FX #-')0A J;@ (8"80%4B 2,#0O   ?9(@0 @0  -G"A 52(#0?  @
XM8 00%4B &H!2C4H59M8^K@ ,+RX "$ZY  !$GEB/2I],WR  3EY.=4Y6__PN
XMC@:7    #"\N  @O/   >[).N0  30A0CTY>3G5.5O_\+HX&EP   ! O+@ ,
XM+RX "$ZY  !-"%"/3EY.=4Y6  !(YP$$*FX "%-M  QM%"!M  @0$$B P'P 
XM_U*M  A@"F (+HU.N0  09!*GTS?( !.7DYU3E8  $CG 00J;@ (""T    #
XM9@9P_V   -0(+0 '  -G# !M "   G#_8   P$JM  1F)@@M  ,  V80/KP"
XM $ZY  !4SBM   1F" !M  @  F & &T !  """T  P #9PXP%4C T+P  'YR
XM*T  !+O\  ![I&86"#D !@  >[5G#"Z\  ![LDZY  !*8 @M  ,  V<&/KP 
XM 6 $/KP" "\M  0_%4ZY  !"AER/.T  #$IM  QN&@QM__\ #&8( &T ,  "
XM8 8 ;0 @  )P_V :4VT #"MM  0 ""!M  @0$$B P'P _U*M  A*GTS?( !.
XM7DYU3E8  $CG 00^K@ (3KD  %M>*D @#68$</]@8@@M  4  6<$0D!@5@@M
XM  (  6<6,_P "0  ?8XS^0  ?G   'V0</]@. @M  0  6<:0H P+@ .+H O
XM+@ *+PU.N0  0PY0CV 88!9"@# N  XN@"\N  HO#4ZY  !$,%"/2I],WR  
XM3EY.=4Y6__A(YP,,*FX ""AN  PN+@ 0+4?__&   )8^O  !( <_ "\,+RT 
XM!B\-!I<    23KD  &!VW_P    ./4#_^D)N__A@%"!,D\DR;O_XT<D,$  :
XM9Q!2;O_X0D P+O_XL&[_^F7@2F[_^F<0($R3R3)N__C1R0P0 !IF"CUN__C_
XM^@!5 " ^KO_Z+PQA4%B//4#_^$* ,"[_^M&M  9"@# N__C9P$* ,"[_^)Z 
XM2H=O"@@M  4  6< _V"?KO_\("T !K"M  YO!BMM  8 #B N__Q*GTS?,(!.
XM7DYU3E;_^$CG 0PJ;@ (+4W__" -0H$R+@ ,T($M0/_X*$U@"@P4  UG AK4
XM4HRY[O_X9? @#9"N__Q*GTS?, !.7DYU3E;__DCG PPJ;@ (*&X #"XN ! ^
XMO  !( <_ "\,+RT !B\-!I<    23KD  &!VW_P    ./4#__DIN__YF! !5
XM "!"@# N__[1K0 &("T !K"M  YO!BMM  8 #D) ,"[__DJ?3-\P@$Y>3G5.
XM5O_>2.<'#$)73KD  %F (\   'Z$(\   'Z(0GD  'Z"+KP  &FE80 #%BIN
XM  A@  ).8 )2C4H59Q00%4B 2,#0O   ?9(@0 @0  5FYDH59P ",@P5 ")G
XM!@P5 "=F1AP5$ 9(@#Z +PU2ETZY    [%B/*$ @#&8.+KP  'M(+PUA  )6
XM6(\@#$C D(T^ "!-,D?1R4(04D<NC5*780 "GF   =A"1V "4D<@33)'T<E*
XM$&<6$#5P $B 2,#0O   ?9(@0 @0  5GWDHU< !G"B!-,D?1R4(04D<0%4B 
XM8  !AD)73KD  $G00E<O#5*73KD  $P,6(]*0&<0+HU2ER\\  ![6F$  =!8
XMCV   6P^O  !3KD  $G0#"T /@ !9D ^O  !+PU4ETZY  !,#%B/L'P  688
XM/KP  D*G/SP  4ZY  !,/ER/L'S__V80+HU2ER\\  ![9V$  7Q8CV D0E<O
XM#5*73KD  $C\6(^P?  !9Q NC5*7+SP  'MV80 !5EB/8   \CZ\ #\O#4ZY
XM    [%B/2H!F%#Z\ "HO#4ZY    [%B/2H!G  "P+7P  )6H__PNKO_\!I< 
XM   X/SP &DZY    HE2//KP $2\-/SP  TZY  !=2ER/' "\/ #_9@XNO   
XM>X4O#6$  .98CV!>+HX&E____]X0!DB /P O+O_\80 !6ER/+HX&E____]Y.
XMN0  7QP^@%)73KD  %^\*$ NC@:7____WB\,3KD  %[Z6(\NC&$  /P^O  2
XM+PT_/  #3KD  %U*7(\< +P\ /]FG& &+HUA  #:8!2P?  \9P#^=K!\ #YG
XM /Z<8 #_$MK'2A5F /VP0I=A  "V4WD  'Z"+KD  'Z(3KD   "&L'S__V80
XM+KP  'N?+SP  'N082I8CT*7+SD  'Z$/SD  'Z"3KD   $&7(\^@$ZY  !)
XM+DJ?3-\PP$Y>3G5.5O]\+JX ""\.!I?___^ 3KD  %[Z6(\NK@ ,+PX&E___
XM_X!.N0  7HY8CRZ\  ![H"\.!I?___^ 3KD  %Z.6(\NC@:7____@#\\  E.
XMN0   *)4CSZ\__].N0  22Y.7DYU3E8  $CG 00J;@ (('D  'Z(((U8N0  
XM?HA2>0  ?H)*GTS?( !.7DYU3E8  $CG QPJ;@ ('BX #2AN  Y'[0!6&-MF
XM_$J?3-\X@$Y>3G5.5@  2.<#!$ZY  !::#X OGS__V8&</]@  "2/H=.N0  
XM6O P!\'\ C@J0-O\  "/ $IN  YF! !5 ! NO   ::\O+@ (3KD  %]*6(]*
XM0&8* %4  S '8%)@'BZ\  !IM"\N  A.N0  7TI8CTI 9@@ 50 %, =@,CZ\
XM !8O+@ (/P=.N0  74I<CTI 9Q8S_  C  !]CC/Y  !^<   ?9!P_V & %4 
XM 3 '2I],WR" 3EY.=4Y6__Q"5S\N  PO+@ (80#_.ER/3EY.=4Y6__Q"5S\N
XM  PO+@ (80#_(ER/3EY.=4Y6__P^O  !/RX #"\N  AA /\(7(].7DYU3E;_
XM_$ZY  !)1CZN  A.N0   ,9.7DYU3E8  $CG P!"1V 6, ?!_  .T+P  'ND
XM+H!.N0  27A21[Y\ !!MY$J?3-\ @$Y>3G5.5@  2.<!!"IN  @P+0 "P'P 
XM V<J+HU.N0  2F (+0 "  -G"BZM  1.N0  5EQ"0$C *T  ""M   1";0 ,
XM FW_@  "/I5.N0  2=!*GTS?( !.7DYU3E8  $CG#P0^+@ (/H=.N0  6UXJ
XM0" -9A8S_  )  !]CC/Y  !^<   ?9!P_V!.0D8P%<!\  9F%CZM  0_/  ^
XM3KD  &#N5(\\ &P"?/\^ATZY  !:\#Z'3KD  %JR2D9F!C &8!9@%#/\  4 
XM 'V.,_D  'YP  !]D'#_2I],WR#@3EY.=4Y6__Q.7DYU3E8  $CG!P0J;@ (
XM,"T  L!\  JP?  "9BP@+0 (D*T !#P ;R ^AB\M  0_%4ZY  !9ZER//@"\
XM1V<* &T $  "</]@2@@M  $  V<>2JT !&<6""T  P #9P@[?  !  Q@!CM\
XM ?\ #& </KP  3 M  Q$0$C +P _%4ZY  !,/ER/0FT #"MM  0 "$) 2I],
XMWR# 3EY.=4Y6  !(YP,$3KD  %IH/@"^?/__9@9P_V   -8^ATZY  !:\# '
XMP?P"."I V_P  (\ 2FX #&8$ %4 "$IN  YF! !5 ! NO   ::\O+@ (3KD 
XM %]*6(]*0&82 %4  SMN  P !# '8   AF >+KP  &FT+RX "$ZY  !?2EB/
XM2D!F" !5  4P!V!D/KP #R\N  @_!TZY  !=2ER/2D!G'CZ'3KD  %JR,_P 
XM @  ?8XS^0  ?G   'V0</]@, !5  $^O  "0J<0+0 #2( _ $ZY  !,/ER/
XM0E="IQ M  -(@#\ 3KD  $P^7(\P!TJ?3-\@@$Y>3G5.5O_\0E<_+@ ,+RX 
XM"&$ _O9<CTY>3G5.5O_\0E<_+@ ,+RX "&$ _MY<CTY>3G5.5O_\/KP  3\N
XM  PO+@ (80#^Q%R/3EY.=4Y6  !(YP$$/JX "$ZY  !;7BI ( UF%C/\  D 
XM 'V.,_D  'YP  !]D'#_8"0^K@ ./RT !"\N  H_/ !"3KD  &#N4(\K0  &
XM E7_WR M  9*GTS?( !.7DYU3E;__#Z\  %"IS\N  AAE%R/3EY.=4Y6__)(
XMYP,$2^[_\CM\?_\ #" N  @K0  $*T  "#M\ ((  CJ\__\NC@:7    $"\N
XM  PO#4ZY  !-"%"//@ NC4)G3KD  %*^5(\P!TJ?3-\@@$Y>3G5.5OWD2.</
XM!"IN !!";OWL2JX #&< !&A@  1@0D4M;@ ,__)@!E*N__)212!N__)*$&<*
XM(&[_\@P0 "5FZ$I%;QPNK@ (/P4O+@ ,3KD  %).7(\M;O_R  S;;OWL(&X 
XM# P0 "5 P%*N  Q$P&8 ! Y";OWJ(&X #! 02( > +!\ "U P%*N  Q$P&8.
XM(&X #!X04JX #%)N_>H=?  @__:^/  P9@X=1__V(&X #!X04JX ##U\___]
XM\+X\ "IF&BU-__@@;O_X/5#]\%2-(&X #!X04JX #& X8"I*;OWP; 1";OWP
XM$ =(@#(N_?##_  *T$'0?/_0/4#]\"!N  P>$%*N  R^/  P;0:^/  Y;\I\
XM_[X\ "YF#$)&(&X #!X04JX #+X\ "IF&"U-__@@;O_X/!!4C2!N  P>$%*N
XM  Q@*F <$ =(@#(&P_P "M!!/ #<?/_0(&X #!X04JX #+X\ #!M!KX\ #EO
XMV$)N_>B^/ !L9P:^/ !,9@Y2;OWH(&X #!X04JX #$'N_?(M2/_R$ =(@&  
XM @Q2;OWH2F[]Z&<((#P  %A<8 8@/   61(CP   ?HPNN0  ?HP_/  !/SP 
XM"B\.!I?___WR+PU.N0  5^K?_     Q*;OWH9P1P!& "< )(P-O 8  !SE)N
XM_>A*;OWH9P@@/   6%Q@!B \  !9$B/   !^C"ZY  !^C$)G/SP "B\.!I?_
XM__WR+PU.N0  5^K?_     Q*;OWH9P1P!& "< )(P-O 8  !>E)N_>A*;OWH
XM9P@@/   6%Q@!B \  !9$B/   !^C"ZY  !^C$)G/SP ""\.!I?___WR+PU.
XMN0  5^K?_     Q*;OWH9P1P!& "< )(P-O 8  !)E)N_>A*;OWH9P@@/   
XM6%Q@!B \  !9$B/   !^C"ZY  !^C$)G/SP $"\.!I?___WR+PU.N0  5^K?
XM_     Q*;OWH9P1P!& "< )(P-O 8   TBU-__P@;O_\+5#_\EB-8   P"U-
XM__@@;O_X,!# ? #_'4#]\D(N_?-4C6   *00!TB /H _!B\.!I?___WR+PU.
XMN0  4<S?_     I8C7S_8   ?A '2( ^@#\&+PX&E____?(O#4ZY  !1E-_\
XM    "EB-?/]@6! '2( ^@#\&+PX&E____?(O#4ZY  !2!-_\    "EB-?/]@
XM-"ZN  @0!TB /P!.N0  4KY4CU)N_>Q@  #68!B0? !#L'P -6+:Y4 P0-'\
XM  !\A"!03M NKO_R3KD  %\<.@"\16P&2D9M CH&,"[]\)!%/4#][DIN_>IF
XM6 PN ##_]F8J(&[_\@P0 "UF(%-%+JX ""!N__(0$$B /P!.N0  4KY4CU*N
XM__)2;OWL8!@NK@ ($"[_]DB /P!.N0  4KY4CU)N_>PP+OWN4V[][DI ;MPN
XMK@ (/P4O+O_R3KD  %).7(_;;OWL8!@NK@ ($"[_]DB /P!.N0  4KY4CU)N
XM_>PP+OWN4V[][DI ;MQ@ /N@,"[][$J?3-\@X$Y>3G5.5O_X2FX $&P$< 9@
XM!# N ! ]0  0(&X "" 0+4#__#ZN ! O+@ ,+R[__$ZY  !A4E"/3EY.=4Y6
XM__A*;@ 0; 1P!F $,"X $#U  ! @;@ ((! M0/_\/JX $"\N  PO+O_\3KD 
XM &-04(].7DYU3E;_^#ZN ! O+@ ,+RX "&$ _WY0CRU __PNK@ ,3KD  %\<
XM,BX $%Y!L$%O%#ZN ! O+@ ,+RX "&&,4(\M0/_\("[__$Y>3G5.5@  2.<#
XM#"IN  @^+@ ,*&X #@@L  ,  V<D0FP ##Z'+PT_%$ZY  !9ZER/L$=G"@!L
XM !   G#_8"I"0& F8!HNC! =2( _ $ZY  !2OE2/L'S__V8$</]@"C '4T=*
XM0&;>0D!*GTS?,(!.7DYU3E8  $CG P0>+@ )*FX "E-M  QM%A '2( B;0 (
XM$H# ? #_4JT "& 28! NC1 '2( _ $ZY  !3!%2/2I],WR" 3EY.=4Y6__Y(
XMYP\$'BX "2IN  I"1CH&""T  0 #9@9P_V   21*K0 $9E8(+0 #  -F3CZ\
XM @!.N0  5,XK0  $*T  "&8( &T "  "8#( ;0 $  (^E4ZY  !44DI 9P@ 
XM;0!   )@&#M\ ?X #! '2( B;0 ($H!2K0 (8   R @M  ,  V<.0>[__BM(
XM  0@""M   @@;0 ($(=2K0 (""T  P #9QIZ 3Z%+RT !#\53KD  %GJ7(\\
XM $)M  Q@;@@M  8  V<^OCP "F<0("T !-"\   " +"M  AB(B M  B0K0 $
XM.@ ^A2\M  0_%4ZY  !9ZER//  K;0 $  A";0 ,8"@@+0 (D*T !#H /H4O
XM+0 $/Q5.N0  6>I<CSP .WP!_P ,*VT !  (ND9G"@!M !   G#_8 @0!TB 
XMP'P _TJ?3-\@X$Y>3G5.5@  2.<!!#ZN  A.N0  6UXJ0" -9@1"0& .""T 
XM 0 !9@1"0& "< %*GTS?( !.7DYU3E8  $CG 00^K@ (3KD  %M>*D @#68$
XM0D!@!C 5P'P!!DJ?3-\@ $Y>3G5.5O_\/JX "&&62D!G"" \  !IKV "0H!.
XM7DYU3E8  $CG P0^+@ (7D?F3U)'/H=A'BI ( UF!$* 8 H^AR\-80  AEB/
XM2I],WR" 3EY.=4Y6  !(YP$,*'D  'UD*E1@6D) ,"T !$)!,BT !K- 1D!*
XM0&<./KP  4ZY  !7XD* 8#I"0# M  2P;@ (900@#& JN_D  'UD9AP^K@ (
XM80  IBI ( UF#CZ\  ).N0  5^)"@& &*$TJ56"D2I],WS  3EY.=4Y6  !(
XMYP$,(&X ""I00D P+@ ,6$"P;0 $90@@;@ (()5@1BA-0D P+@ ,YTA(0$) 
XM2$#9P$) ,"T !)!N  PY0  $0D P+  $1D Y0  &*)4@;@ (((P[;@ ,  1"
XM0# M  1&0#M   8C[@ (  !]9" -4(!*GTS?, !.7DYU3E8  $CG PP^+@ (
XMWGP /^Q'[4<P!^= /H!.N0  68 J0+O\_____V8$0H!@*B -4H# O/____XJ
XM0"A-.4< !$) ,"P !$9 .4  !BZ,4)=A$" Y  !]9$J?3-\P@$Y>3G5.5@  
XM2.<!#"IN  A1C4) ,"T !$)!,BT !K- 1D!*0&<0/KP  TZY  !7XG#_8   
XMQ"AY  !]9+O,902[U&40N=1E"+O48PB[S&0$*%1@Z+O,93(@#4)!,BT !.=)
XM2$%"04A!T($B#$)"-"P !.=*2$)"0DA"TH*P@6(*(\P  'UD0D!@;B -0D$R
XM+0 $YTE(04)!2$'0@;"49AP@5# H  31;0 $0D P+0 $1D [0  &(%0JD& "
XM*I0@#$)!,BP !.=)2$%"04A!T(&[P&8:0D P+0 $T6P !$) ,"P !$9 .4  
XM!BB58 (HC2/,  !]9$) 2I],WS  3EY.=4Y6__Q(YP,,*FX ""Z-80#^\CXN
XM  Q>1^9/4D<^AV$ _8@M0/_\9@1"@&!*(&[__"A04(R[S&<RN<UD$& &&-U3
XM;@ ,2FX #&;T8!Y"@# N  S9P$* ,"X #-O 8 89)5-N  Q*;@ ,9O0^AR\N
XM__QA /VN6(]*GTS?,(!.7DYU3E;__$Y>3G5.5O_\3EY.=4Y6__!(YP,,+PX&
XME_____ _+@ 2/RX $"\.!I<    ,+RX ""!N !1.D-_\    $"I ( [0O/__
XM__"[P&8"0ATH;@ ,8!(>)4B'WGP ,+Y\ #EO EY'&,<@#M"\____\+O 9N)"
XM%" ,2I],WS" 3EY.=4Y6__Q(YP\$+7P  'X2__PJ;@ 4/"X $$C&(&X ""X0
XM#&X $  09AIZ"& ,( ? ?  /&L#HAU-%2H=G!$I%9NQ@: QN  @ $&8D>@M@
XM#" 'P'P !QK YH=314J'9P1*16;L2D5F!@(M  /__V \2FX $F<:2H=L%B!N
XM  P@4!"\ "TB;@ ,4I$@!T2 +@!@%BZ&+P=.N0  7^I8CRX (&[__!KH  -*
XMAV;F( U*GTS?(.!.7DYU3E;__$CG!P0@;@ (,!!(P"U __P@+O_\P+P  /__
XM/@ J;@ 4/"X $$IN !)G'$I';!A"0# '1$ ^ "!N  P@4!"\ "TB;@ ,4I%@
XM$D* , > QDA &L!"@# '@,8^ $I'9NH@#4J?3-\@P$Y>3G5.5@  2.<###XN
XM  A(Q\Z\  #__P@'  !G E*'*GD  'YL*$?9^0  ?FPNC$ZY    AK!\__]F
XM%C/\  P  'V.,_D  'YP  !]D'#_8!(^K@ (0F<O#4ZY    T%R/( U*GTS?
XM,(!.7DYU3E8  $CG 00^K@ (3KD  %M>*D @#68$</]@6$IN  YF!$) 8$X(
XM+0 #  %G%C/\  D  'V.,_D  'YP  !]D'#_8# (+0 $  %G%CZN  XO+@ *
XM+PU.N0  6\!0CV 48!(^K@ .+RX "B\-3KD  %S04(]*GTS?( !.7DYU3E8 
XM $CG!P!\ 4)'8!@@!L"Y  !]:&8*C;D  'UH, =@'N.&4D>^?  0;>(S_  8
XM  !]CC/Y  !^<   ?9!P_TJ?3-\ P$Y>3G5.5O_\< $R+@ (XV!&0$C P;D 
XM 'UH0D!.7DYU3E8  $CG P!"1V &/H=A$E)'OGP $&WT2I],WP" 3EY.=4Y6
XM  !(YP$,,"X ",'\ C@J0-O\  "/ # N  @;0  #0E5"+0 "*WS_____  I"
XMK0 &0JT #CZ\ "!"9R\-!I<    23KD   #07(\^O  +/SP ("\-!I<    3
XM3KD   #07(]*GTS?, !.7DYU3E8  $CG P0^+@ (OGP $&46,_P "0  ?8XS
XM^0  ?G   'V00H!@,$) , ? _ (X*D#;_   CP (+0    %F%C/\  D  'V.
XM,_D  'YP  !]D$* 8 (@#4J?3-\@@$Y>3G5.5O_Z2.<##"IN  @H;@ ,/BX 
XM$$) /4#_^CU __Q@  #(8 12;O_ZOF[_^F,0($R3R3)N__K1R0P0  IFYD) 
XM,"[_^I!N__QC9CZ\  $_+O_Z0D P+O_\D5<@#$*!,B[__-"!+P O+0 &+PT&
XMEP   !).N0  8++?_     X]0/_^0H P+O_^T:T !DIN__YF%C/\  4  'V.
XM,_D  'YP  !]D'#_8%X];O_Z__Q@.%)N__H^O  !/SP  2\\  !];"\M  8O
XM#0:7    $DZY  !@LM_\    #CU __Y"@# N__[1K0 &OF[__&( _S0@+0 &
XML*T #F\&*VT !@ .0D P+O_\2I],WS" 3EY.=4Y6__Y(YP$$*FX "#Z\  $_
XM+@ 0+RX #"\M  8O#0:7    $DZY  !@LM_\    #CU __Y*;O_^9A8S_  %
XM  !]CC/Y  !^<   ?9!P_V @0H P+O_^T:T !B M  :PK0 .;P8K;0 &  Y"
XM0# N__Y*GTS?( !.7DYU3E;_^DCG QPJ;@ *,"X ",'\ CC0O   CP M0/_\
XM?O\NC6$  .PF36 "4HM*$V<&#!, .F;T2A-G'!UC__H,+@!!__IM# PN $__
XM^FX$*DM@!$OK  (P+@ .8   D$)7+PT_/  \3KD  &#N7(\^ &\*(&[__#%'
XM  1"1V   (9"5R\-/SP 3DZY  !@[ER/2H!G!$) 8 0P/ #_/@!@9#Z\ $].
XMN0  8.Y*@&<$0D!@!# \ /\^ &!*+HT_/  ]3KD  &#N5(\^ &\*(&[__#%'
XM  1"1V L+HT_/ !!3KD  &#N5(\^ & :8!B0?  /L'P !V(.Y4 P0-'\  !]
XM;B!03M P!TJ?3-\X@$Y>3G5.5O_\(&X " P0 &%M$B!N  @,$ !Z;@@@;@ (
XM!!  ("!N  @0$$B 4JX "$H 9M1.7DYU3E8  $CG 0PJ;@ ,*&X "& "4HQ*
XM%&;Z&-UF_" N  A*GTS?, !.7DYU3E8  $CG!PPJ;@ (*&X #& 4'AT<'+X&
XM;P1P 6 :O@9L!'#_8!)*%6<$2A1FY! 52( 2%$B!D$%*GTS?,,!.7DYU3E8 
XM $CG 0PJ;@ ,*&X "!C=9OP@+@ (2I],WS  3EY.=4Y6  !(YP$,*FX ""A-
XM8 )2C$H49OH@#$C D(U*GTS?, !.7DYU3E;__$Y>3G5.5@  2.<'#"IN  @H
XM;@ ,8"00'4B /H!A,!X $!Q(@#Z 828< +X&;P1P 6 2O@9L!'#_8 I*%6;8
XM2A1FU$) 2I],WS# 3EY.=4Y6  !(YP, /BX "+Y\ &%M"KY\ 'IN!-Y\_^ P
XM!TJ?3-\ @$Y>3G4@7T* ,!]:@ B    B>0  ?FQ#Z0$ 0_$( +_)8@9.^0  
XM +B?P$/O  0@"4[03E8  $CG'P N+@ (+"X #$J&9A8C_(       'X2(#R 
XM    @/P  &!(O(=C"B/'  !^$D* 8#J^AF8&>@%"AV H> &^AF4.( ;C@+R 
XM8@;CAN.$8.Y"A4J$9PZ^AF4$BH2>AN*,XHY@[B/'  !^$B %2I],WP#P3EY.
XM=4J%9PHNO/____^+_   3G5.5O_Z(&X "#UH__+__BZN ! P;@ 6+P@P;@ 4
XM+PA.N0  8/Y0CR\ /R[__C\\ #].N0  8.Y0CTY>3G5.5O_Z(&X "#UH__+_
XM_BZN ! P;@ 6+P@P;@ 4+PA.N0  8/Y0CR\ /R[__C\\ $!.N0  8.Y0CTY>
XM3G4CWP  ?I!.02\Y  !^D$YU3E;__$)"2JX "&P&1*X "%)"2JX #&P&1*X 
XM#%)","X "L#N  XM0/_\,"X ",#N  XR+@ ,PNX "M!!T&[__#U __P@+O_\
XM" (  &<"1(!.7DYU3E;_^$CG'P M;@ ,__Q*;@ 0;@1P 6 2#&X %@ 0;P1P
XM%V &,"X $%) . !"1T*G+RX "$ZY  !EA%"/;!P@;@ ,$+P +5*N  PO+@ (
XM3KD  &;Z6(\M0  (0J<O+@ (3KD  &6$4(]O+F 8+SR@  !$+RX "$ZY  !F
XMVE"/+4  "%-'+SR   !!+RX "$ZY  !EA%"/;=1@&"\\H   1"\N  A.N0  
XM9:)0CRU   A21R\\H   1"\N  A.N0  9810CVS4V$=\ 3 &2, O $ZY  !E
XMPEB/+4#_^& 8+SR@  !$+R[_^$ZY  !EHE"/+4#_^%)&O$1MY"\\@   0B\N
XM__A.N0  9:)0CR\ +RX "$ZY  !E9%"/+4  ""\\H   1"\N  A.N0  9810
XMCVT*+7R   !!  A21TI';#0@;@ ,$+P ,%*N  P@;@ ,$+P +E*N  Q*1&P"
XMGD1\_V .(&X #!"\ #!2K@ ,4T:\1V[N0D9@:B\N  A.N0  9E)8CSH , 70
XM?  P(FX #!* 4JX #+Q'9@P@;@ ,$+P +E*N  PP!4C +P!.N0  9<)8CRU 
XM__@O "\N  A.N0  9Q90CRU   @O/*   $0O+@ (3KD  &;:4(\M0  (4D:\
XM1&V2(&X #$(04JX #" N__Q*GTS? /!.7DYU3E;_^$CG'P M;@ ,__Q*;@ 0
XM;@1P 6 2#&X %@ 0;P1P%V &,"X $%) . !"1T*G+RX "$ZY  !EA%"/;!P@
XM;@ ,$+P +5*N  PO+@ (3KD  &;Z6(\M0  (0J<O+@ (3KD  &6$4(]O+F 8
XM+SR@  !$+RX "$ZY  !FVE"/+4  "%-'+SR   !!+RX "$ZY  !EA%"/;=1@
XM&"\\H   1"\N  A.N0  9:)0CRU   A21R\\H   1"\N  A.N0  9810CVS4
XM? $P!DC +P!.N0  9<)8CRU __A@&"\\H   1"\N__A.N0  9:)0CRU __A2
XM1KQ$;>0O/(   $(O+O_X3KD  &6B4(\O "\N  A.N0  9610CRU   @O/*  
XM $0O+@ (3KD  &6$4(]M"BU\@   00 (4D="1F!J+RX "$ZY  !F4EB/.@ P
XM!=!\ # B;@ ,$H!2K@ ,2D9F#"!N  P0O  N4JX ## %2, O $ZY  !EPEB/
XM+4#_^"\ +RX "$ZY  !G%E"/+4  ""\\H   1"\N  A.N0  9MI0CRU   A2
XM1KQ$;9(@;@ ,$+P 15*N  Q*1VP2, =$0#X (&X #!"\ "U2K@ ,, =(P('\
XM  K0?  P(FX #!* 4JX ## '2,"!_  *2$#0?  P(FX #!* 4JX #"!N  Q"
XM$%*N  P@+O_\2I],WP#P3EY.=4Y6__Q(YQ\ +BX ""PN  Q.N0  9U@@!TS?
XM /A.7DYU3E;__$CG'P N+@ (+"X #$ZY  !H*DS? /A.7DYU3E;__$CG'P N
XM+@ (+"X #$ZY  !H6B '3-\ ^$Y>3G5.5@  2.<' $JN  AL#GP!("X "$2 
XM+4  "& "0D9*K@ (9@1"@&!>?AA@#" N  CB@"U   A2AR N  C O'\   !F
XMZ& ,("X ".. +4  "%.'""X !P )9^P@+@ (X8 M0  (WKP   ! ( ? O   
XM '^!K@ (2D9G" "N    @  (("X "$J?3-\ P$Y>3G5.5@  2.</ " N  C 
XMO    '_0O/___\ \ $JN  AG!$I&; 1"@&!6("X ","\    @#H O'P 'V\4
XM2D5G"" \@    & &(#Q_____8# N+@ (X(?.O #___^<?  88 3BAU)&2D9M
XM^& $XX=31DI&;OA*16<&( =$@"X ( =*GTS? .!.7DYU3E;__$CG'P N+@ (
XM+"X #$ZY  !HS" '3-\ ^$Y>3G5.5O_\2.<? "XN  A.N0  9SP@!TS? /A.
XM7DYU3E;__$CG'P N+@ (+"X #$ZY  !G1B '3-\ ^$Y>3G7./ !_3G5*!V<$
XM"@< @$YU& 9G4@H$ (!K:AH':VQF#F ^& 9K7F<^&@=K7F<RF@1K.!@'NCP 
XM&&0L)@9" ^JK'CP @-Z#900>!$YUXI=2!&D"9/1^_U,$'@0 /  "3G4N!AX$
XM3G5*!TYUNCS_Z&_P1 4F!D('ZJ\6/ " WH-ES!X$3G4:!VNF9]9V@+<%F@1G
XM4&L\NCP &&3,& <> R8&0@/JJYZ#:Z :!$('4P2^O   ?_]B!DA'F#P $-Z'
XM6\S__+D%:P8>!&<"3G5^ $YUNCS_Z&^*1 4F!RX&'CP @&"^&@?+1!X&GH9G
XMX&JZ1(<8!6"VO@9F KZ&3G5*!TYUCOP  $J&9AR.O/___W]*!P \  ).=4A&
XM2$>]!V#J:_I^ $YU&@9GV"@'9^AV@-I%V$2W!;<$F 5IY$('2$=(1KY&:P94
XM!&G.XI](1QH#NT3B3"8'AL8Z \;&GH-(1TA&-@9" \;%GH-D""8&0@/>@U-%
XM)@9(0T)'CL-(16L(.@?:A5,$/@4Z!]J\    @"X%'@1GC$YU&@=G4A@&9VC:
XM1=A$=H"W!+<%V@1I7A@#N47B74A%.@9"!T(%. 7(QTA$)@=(0\;%V(-(1B8&
XMQL?8@T)$V01(1$A'SL9(1DA%WH1J#-Z\    @!X%9QI.=5,%:11E$GA WH3>
XMAV0$XI=2!1X%9P).=7X 3G5J^KT'CKS___]_2@< /  "3G5M8S8X,S0S(&9L
XM;V%T:6YG('!O:6YT(&9I<FUW87)E("AC*2!C;W!Y<FEG:'0@,3DX,2!B>2!M
XM;W1O<F]L82!I;F,N %-T86-K($]V97)F;&]W)$,@<G5N=&EM90!#3TXZ $Q3
XM5#H &@  :PC__P                                              
XM                                                            
XM                                             0   #X /@ #  ( 
XM @ # #D   !!    00   $$   !!     '4P  $      0   0 !    00  
XM                  $  @ #     2X 7P @     0        4         
XM                1    $D   !0    4@   %,   !6    9    &D   !P
XM    <@   ',   !V         A8   'R   !C    70   &    !:    A8 
XM  'R   !C    70   &    !:    E!V+C$N,0 * "YS;R  <@ E<SH@8V%N
XM;F]T(&]P96XN"@!W "5S.B!C86YN;W0@8W)E871E+@H* '!R;V9F(')E860@
XM:6X@)39D('1E>'1L:6YE<R!T;R!P<F]D=6-E"@ @(" @(" @(" @(" @("4V
XM9"!L:6YE<PH (" @(" @(" @(" @(" E-F0@<&%G97,@;V8@9F]R;6%T=&5D
XM('1E>'0N"@ *)60@8GET97,@;V8@;65M;W)Y('=A<R!R97%U:7)E9 H 9F]R
XM(&EN=&5R;F%L('1A8FQE<R!A;F0@;&ES=',N"@  !P @(" @(" @9&]N92X*
XM  H )7-I;G-E<G0@<&%P97(@86YD('1Y<&4@<F5T=7)N( !T;V\@;6%N>2!C
XM:&%R86-T97)S('!U<VAE9"!B86-K+@H ,# M>'AX+3$Y,# @,# Z,# Z,#  
XM "5S"@!U<V%G93H@<')O9F8@6RMN72!;+6Y=(%LM=ET@6RUI9FEL95T@6RUS
XM72!;+7!O;ET@:6YF:6QE(%MO=71F:6QE70H                         
XM                                                            
XM     0(#! 4&!P@)"@L,#0X/$!$2$Q05%A<7&1H;'!T>'P ! @,$!08'" D*
XM"PP-#@\0$1(3%!46%Q@9&@          "0   "     B    ,    #$    R
XM    ,P   #0    U    -@   #<    X    .0   %P   !>        (G  
XM ")P   BM   (MP  "+<   BW   (MP  "+<   BW   (MP  "+<   BW   
XM(MP  "*$   BF   (RQI;7!R;W!E<B!A<F=U;65N="!L:7-T+@!N;VXM87-C
XM:6D@8VAA<B!V86QU92!I;B!W<FET92!S=')I;F<N    =I8 %0          
XM=ID &P    !MX   =IP &0          =I\ (0 !        =J$ '0      
XM    =J0 .0    !N$   =JX 'P          =K$ )0    !N*   =K0 *0 !
XM        =K8 (0          =KD 8P    !N3   =KP 9P    !N6   =K\ 
XM6P          =L( !0 !        =L8 "P !  !N?   =LD 8P !  !NB   
XM=LP ;0 !  !NE   =L\ !P !        =M, "0    !NK   =M8 -0      
XM    =MD :0    !NQ   =MP #P !        =M\ -0    !NW   =N0 -P !
XM  !NZ   =N< /P    !N]   =NH 90 !  !O    =OH "0 !        =O\ 
XM$0    !O&   =P( $P    !O)   =P@ (P    !O,   =PL 00    !O/   
XM=PX "0 !        =Q$ &P    !O5   =Q< )P    !O8   =QH 0P    !O
XM;   =QT 30 !  !O>   =Q\ %P          =R( .0 !  !OD   =R4  P  
XM        =RH #P !  !OJ   =S  )0    !OM   =S< )P !  !OP   =SH 
XM&0          =T$ 90 !  !OV   =T4 10          =T@ 7P    !O\   
XM=TP 40          =T\ 7P    !P"   =U( #0          =U4 80    !P
XM(   =U@ (0 !        =UT *0    !P.   =V  *P    !P1   =V, 1P  
XM  !P4   =V8 20 !  !P7   =VD .P          =VP :P !  !P=   =V\ 
XM4P          =W( *P !        =W8 2P    !PF   =WD 10 !        
XM=WP 30    !PL   =W\ 40 !  !PO   =X0 -0 !        =X< /0    !P
XMU   =XH 2P !  !PX   =XX 60    !P[   =Y$ 5P          =Y0 60  
XM  !Q!   =Y@ "P !        =Y\ 3P          =Z( 50    !Q*   =Z< 
XM70          =ZL 50          =ZX 70    !Q3   =[$ ;P    !Q6   
XM=[0 30 !        =[D 2P          =\$ %0          =\@ *P !  !Q
XMB   =]  -P          =]< 6P    !QH   =]X  0          =^0 1P  
XM  !QN   =^L :P !        =_, !P !        > $ #0 !        > H 
XM(P          >!$ /P    !Q]   >!@ ;P    !R    >!X 10 !        
XM>"< 2P          >"X +0          >#$ !0 !        >$  +P    !R
XM/   >$, ,0          >$8 9P    !R5   >$\ ;0 !  !R8   >%H ,P  
XM        >%T -0 !  !R>   >&8 80          >'$ )P !        >'P 
XM2P !  !RG   >(0 3P          >(L 4P    !RM   >)4 5P          
XM>)T 20 !        >*D *0 !        >+$ /0          >+@ 8P !    
XM    >,8 :0          >-   P          >-, !0    !S%   >-8 $P  
XM  !S(   >-D !P          ;>P  &WX  !N!   ;AP       !N-   ;D  
XM &YD  !N<   ;J   &ZX  !NT   ;PP  &](        ;X0  &^<  !OS   
XM     &_D  !O_   <!0  ' L  !P:   <(   '",  !PI   <,@  '#X  !Q
XM$   <1P  '$T  !Q0   <60                             <7   '%\
XM  !QE             !QK             !QQ        ''0  !QW   <>@ 
XM                 '(,  !R&   <B0  '(P  !R2   <FP  '*$  !RD   
XM          !RJ   <L                              <LP         
XM                              !RV        '+D                
XM                  !R\        '+\        <P@                 
XM      !S+   <S@     )/   #+(   RT   )F(  #+0   L@@  ,M   "R,
XM   RT   )QX  #+0   M @  ,M   "S.   RT   )28  #+0   PH   ,M  
XM "_X   RT   )5@  #+0   Q@   ,M   #&N   RT   ,$H  #+0   OP   
XM,M   "^(   RT   )00  #+0   FZ@  ,M   ":V   RT   )Z@  #+0   P
XMQ@  ,M   "4P   RT   +E   #+0   ND@  ,M   "[4   RT   +RX  #+0
XM   P<   ,M   "46   RT   ,-(  #+0   QT@  ,M   #%X   RT   ,7P 
XM #+0   OW   ,M   "^D   RT   +<(  #+0   N*   ,M   "?@   RT   
XM,-P  #+0   G=@  ,M   #)2   RT   * P  #+0   EJ   ,M   "RN   R
XMT   ++X  #+0   H.   ,M   "DX   RT   *3P  #+0   J'   ,M   "B\
XM   RT   +)@  #+0   LI   ,M   "KX   RT   *]0  #+0   M)   ,M  
XM "U@   RT   +7!C90!E8P!D90!F &5F &YO:G5S=&EF>0!E: !H90!J &9I
XM &YA &-L &EG &1B;P!P80!A< !E; !E8F\ 8G  ;F4 <&, 8G( ;F5E9 !N
XM9@!O90!N;V%U=&]P87)A9W)A<&@ <&%G90!B<P!C8VAA<@!F;P!O9@!P9P!E
XM8VAA<@!I;@!O: !S &-U &YJ &)O;&0 8G)E86L :&5A9&5R &QM &1E9FEN
XM90!N87  <&P 9V5T '1I '9G &YP '!N &9I;&P :G4 ;', <&\ <FT ;G( 
XM;'0 =6P <W!C '-O '!S '-P &QE9G0 ='  ;W4 <F5Q &QX ')S &QE> !P
XM86=I;F< <W0 <V%V90!S970 <W8 =G, =W( <VMI< !I;F-L=61E &-E;G1E
XM<@!S<&%C:6YG &YO9FEL; !I9VYO<F4 <F5S970 ;V9F<V5T &QI=&5R86P 
XM96YA8FQE8F]L9&EN9P!N;W!A9VEN9P!F;V]T97( ;W5T96YD '=R:71E '!A
XM9V5S:7IE '-O=7)C90!M,0!D:7-A8FQE8F]L9&EN9P!M,@!M,P!C;VYT;&EN
XM90!E;F1L:71E<F%L &TT '1E<W1P86=E '!A9V5N=6UB97( ;&5F=&UA<F=I
XM;@!R97%U:7)E '-K:7!T;P!U;F1E<FQI;F4 <F5S=&]R90!R:6=H=&UA<F=I
XM;@!J=7-T:69Y &]U='!U= !A=71O<&%R86=R87!H '!R:6YT8V]N= !B9 !D
XM8@!C8P!E8@!O;@!O9F8 86QL '=O<F1S "5S('5N9&5F:6YE9"X* ')O;6%N
XM &%R86)I8P E8R5S(&1O97,@;F]T(&AA=F4@)7,@;W!T:6]N+@H :6QL96=A
XM;"!V87)I86)L92!N86UE("5S"@ E<SH@ "5C)7,@;F5E9',@82!V87)I86)L
XM92!N86UE+@H :6QL96=A;"!V87)I86)L92!N86UE("5S"@ E<P E8R5S(&YE
XM961S(&$@=F%R:6%B;&4@;F%M92X*  H /R!33R!C;VUM86YD<R!N97-T960@
XM=&]O(&1E97!L>2X <@!S;W5R8V4@)7,* "5S.B!C86YN;W0@;W!E;BX* &EN
XM=F%L:60@;G5M8F5R(')E9VES=&5R(%LE8UTN #\@0F]T8V@@:6X@8V]M;6%N
XM9"X )6,E<R!I<R!N;W0@82!R=6YO9F8@8V]M;6%N9"X* '5N:VYO=VX@8V]M
XM;6%N9" E8R5S"@  ;6ES<VEN9R!N86UE(&EN(&-O;6UA;F0@9&5F+@!D969I
XM;FET:6]N('1O;R!L;VYG+@H ;F\@<F]O;2!F;W(@;F5W(&1E9FEN:71I;VXN
XM"@!M:7-S:6YG(")](B!I;B E<PH )35D"@              >L   'K7<V%V
XM93H@<W1A8VL@;W9E<F9L;W<N"@!R97-T;W)E.B!S=&%C:R!U;F1E<F9L;W<N
XM"@   'L:  ![&P  >QT  'L@  ![)   >R<  'LI  ![+   >S   'LU $D 
XM24D 24E) $E6 %8 5DD 5DE) %9)24D 25@ 25983$-$30!83$-$32HJ #H@
XM=6YM871C:&5D('%U;W1E $-A;FYO="!O<&5N( !#86YN;W0@87!P96YD( !#
XM86YN;W0@8W)E871E(  Z($YO(&UA=&-H %-T86-K($]V97)F;&]W   -"B0 
XM     0               0 *               "  H               , 
XM                !                  %                  8     
XM            !P                 (                  D         
XM        "@                 +                  P             
XM    #0                 .                  \                 
XM % *  !.I@  4"8  %!,  !0<   4)0  %"4  !0E   4)0  %"4  !0E   
XM4)0  $]0  !0E   4)0  %"4  !/^   4)0  $[\  !0E   4)0  $^D  !0
XME   4)0  %"4  !0E   4)0  %"4  !0E   4)0  %"4  !0E   4 H  $ZJ
XM  !0)@  4$P  %!P  !0E   4)0  %"4  !0E   4)0  %"4  !0E   3U0 
XM %"4  !0E   4)0  $_X  !0E   3P   %"4  !0E   3Z@  'U<  #__P  
XM?5P     #0   %X$  !>3@  7<H  %WJ  !>(@  7DX  %Y.  !=J      !
XM 0$! 0$! 0$A(0$A(0$! 0$! 0$! 0$! 0$! 0$! 2(" @(" @(" @(" @("
XM @($! 0$! 0$! 0$ @(" @(" @@(" @(" @(" @(" @(" @(" @(" @(" @(
XM @(" @("$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! " @(" 0    !#4"]-
XM+38X2RAT;2DL(%9E<G-I;VX@,2XR+"!#;W!Y<FEG:'0@*&,I(#$Y.#,L($1I
XM9VET86P@4F5S96%R8V@@6%A86"TP,# P+38U-#,R,0      !%(.& 88& R"
XM+ P,,@P4!@X*!@H&!A((* H:!AH&""0&%AX&!@P<"@@,!@8," 0&!@0B$A8&
XM" 8(!@@&"@8&! @*!@@(#A8&"@@(!@8&" 8&!@@&!@8(!@8&" 8&"M00" 8,
XM!@P*!@88!B 0!A(0% 8*'@@*"@H*!@@&!@@((AX6# H! ;@("@8&" I^" 8,
XM#$ T"@@4!@8.!@8." H(!@@*$ 0&!@@&"@@&"@@*!@@,$@8&#@8&# H&"!X&
XM!@H&!@8B" 8.% H(# H*# H*"A 4!@0&" 8*"@8,!@8&&@@(!@8&%"P,&!P<
XM(BHX"AP*$ P20AH0& H0" H0%)H,"@@>!@@,"!(($ 8&2 8!/A08&"0('@8(
XM'@8(&" 86*)J<@IB 3X&!@P!@EX&!@I@0@QD, P,#C(,FE1 " 8(" 8&!@@(
XM" @(!@@((A(4!@@(" @(" 8&!@8(!@@&" 8(!@8$!@0&! 8$!@0&! 8$!@0&
XM!@8(" 8&!@8($A0&!@8&" 82#@8*!@H:#@P&%@8*" H&!A ,!@H&# H*!B9&
XM*K82!MI*&! &&D &" HB0!0:'#H*(A(&' 8B# @*!@H<!A .#@88!A@2!AP&
XM#!X&#@80!@X&#! .!A@&$ 8*" 8*# 8*" 8*# H&# X.!@P$(A *!A(&# 0.
XM$@80!A &$ XB#!X2!@8,#@X(#@P8"@8&&AX&!B06!@80#!82"@8&%AX&!A 2
XM#@8&!A ,%A(*!@88"!X>,@@*!@P(# 8(!A(&! H,!@@*!@8&"@H6% 8(!A(,
XM# H*!@H&"@8$" 8&!@8*" 8&! H&"@@&!@8("@8*&!(0& X&" @4!@P&!@8*
XM$@80!@@(%@80!@@(%@80!@@(%@8,!@8&"@8("!8&# 8&!@H&"@P&"@P&"@P&
XM"@X&"@H(!@@&"@8,!@H*# 8(!@H&&@82"A .!@8."@P*"! &!A(&!A86!A *
XM#BH&'"@(& X:$ @("@P(" @&%!@*0@H.& H&!C8*!@8P(!(&%"PJ&"80!@86
XM# 8&*KH*8"!N'@A"!@9><&P4IJHH+#@@& P&!A0&"@8*"@P,# P,# P,# P,
XM# P,# P*$ H&!@@&" 8(!@@&" 8(!@@&" 8(!@@&" 8(!@@&" 8(!@@&# 8(
XM" @(!@8T9@8H&@X8)'@R)!84'K@&-@@&# 8,!B L(@8@-% F"@H(!AY<)@8$
XM(!I$ 1Q.!@8&!B L#D0H#! 4%A@2%!(6$@X6$A P"A(8/ 8&# 8,!@8*(!0(
XM#A0,%@@&/A8.$ H6"AX.!@1H"AP(,!(>'@X&!!P0"!(&!$A.)A8.&@H>"AX.
XM" 8$'!1J#@8$&FH.8 %>" 8&&"H(!@86*@@&!A8J" 8&%F F)!P@#D0>(AI6
XM."I2)%I&(%Q *$(T+DHB&AJ&+C@V#$IP 1Z,K @(#@8$$B D!@0<%B((%@8$
XM(D R&"8&!!00!@2((@8$'A)F& 8$2%(B'!P>' &&$B@6/$ 2*A(,") :$A88
XM%A@4&!P.%E0P$A9>&A(6&!88$A@<#A8<,!(6BB > 3H<( $!E@$<! 0$! 0$
XM! 0$! 0$ 0%B! 0$! 0$! 0$! 0$! 0$0@P(! P,# @$# @$# P(! @$# P(
XM! @$" 0," 0," 0," 0(! @$" 0," 0(! @$" 0," 0(! @$" 0," 0," 0(
XM! @$# @$# @$# @$# @$# @$" 0(! @$# @$# P(! P(! @$# @$" 0(! P(
XM! P," 0,# @$" 0,# P(! P(! P(! P,# P(! @$# P,# @$# @$" 0," 0,
XM# @$# @$# P,# P,# @$" 0,! 0$" 0$! 0$! 0$" 0$" 0$! 0$! 0$! 0$
XM! 0$& 0$# P(! 00! 0$! 0$! P$&" (' @(% 0&! 0$! 0$! 0$! 0$! 0$
XM! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$
XM! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$
XM! 0$! 0$ 0$! 2X$-@0$! 0$! 0$! %P! 0$! 0$! 0$! 0$! 0$! 0$! 0$
XM! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$! 0$" H$! 0$! 0$ &$ 
X< Q8J;@ (8  "3F "4HU*%6<4$!5(@$C T+P   0$
X 
Xend
SHAR_EOF
if test 46940 -ne "`wc -c 'proff.uud'`"
then
	echo shar: error transmitting "'proff.uud'" '(should have been 46940 characters)'
fi
#	End of shell archive
exit 0
-- 
 __________ ______ ____ _____ ___
/_________//___   ||__|/____|/__/   Richard E. Sansom
   ___    ____/  / ____________	    TRW Electronics & Defense Sector
  /  /   /  /\  <  |    /|    /     One Space Park Drive, R3/1028
 /  /   /  /  \  \ |   / |   /	    Redondo Beach, CA 90278
/__/   /__/    \__\|__/  |__/	    {...decvax,ucbvax,ihnp4}!trwrb!sansom