rsalz@uunet.uu.net (Rich Salz) (10/24/89)
Submitted-by: Edoardo Biagioni <biagioni@cs.unc.edu> Posting-number: Volume 20, Issue 51 Archive-name: fpc/part02 # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. -----cut here-----cut here-----cut here-----cut here----- #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # fp.c.part1 # lex.yy.c echo shar: extracting fp.c.part1 '(32154 characters)' sed 's/^XX//' << \SHAR_EOF > fp.c.part1 XX#include <stdio.h> XX#include <strings.h> XX#include <ctype.h> XX#include "fp.h" XX XXextern char * malloc (); XXextern char * sprintf (); XXextern exit (); XX/* for me, this should be void exit, but the man (3) page doesn't XX * think so. Some implementations have void exit, some don't, so XX * either way there is no way to tell lint to shut up about it. XX * Just ignore it if it comes up */ XX XXstruct fp_object nilobj = {NILOBJ}; XXstruct fp_object tobj = {TRUEOBJ}; XXstruct fp_object fobj = {FALSEOBJ}; XX XXstruct stackframe * stack = 0; XX XXint fpargc; XXchar ** fpargv; XX XXfp_data staticstore = 0; /* a vector of all the things that XX * are allocated statically, so we can XX * return them at the end. */ XX XX/* XX#define NORETURN 1 XX */ XX/* XX#ifdef DEBUG XX#define TSTRET /* used to test reference counting * / XX#define CHECKREF /* used to print reference count, pointer values * / XX#endif XX */ XX#ifdef NOCHECK XX#define NCOUNTVEC XX/* nocheck is the fast option, so if we have it we certainly don't want XX to count vectors */ XX#endif XX XX#ifdef NCOUNTVEC XX#ifdef TSTRET XX#undef NCOUNTVEC XX#endif XX#endif XX XX#define nonvector(x) ((x->fp_type != NILOBJ) && \ XX (x->fp_type != VECTOR)) XX#define nonboolean(x) ((x->fp_type != TRUEOBJ) && \ XX (x->fp_type != FALSEOBJ)) XX XX#ifndef NOCHECK XXvoid checkpair (data, fname) XXfp_data data; XXchar * fname; XX{ XX void parmbot (); XX XX if (data->fp_type != VECTOR) XX parmbot (fname, "input is not a vector", data); XX if ((data->fp_header.fp_next == 0) || XX (data->fp_header.fp_next->fp_header.fp_next != 0)) XX parmbot (fname, "input is not a 2-element vector", data); XX} XX#else XX#define checkpair(data, fname) /* no-op, don't waste code and time */ XX#endif XX XXint depthcount = 0; XX XXvoid indent (n, out) XXint n; XXFILE * out; XX{ XX register int icount; XX XX for (icount = 8; icount <= n; icount += 8) XX (void) putc ('\t', out); XX for (icount -= 8; icount < n; icount++) XX (void) putc (' ', out); XX} XX XXint numprsize (n) XXlong n; XX{ XX int res; XX XX for (res = 1; n > 9; res++) XX n /= 10; XX return (res); XX} XX XXint floatprsize (n) XXfloat n; XX{ XX char str [100]; XX XX (void) sprintf (str, "%f", n); XX return (strlen (str)); XX} XX XXint isstring (data) XXfp_data data; XX{ XX if (data->fp_type != VECTOR) XX return (0); XX while (data != 0) XX if (data->fp_entry->fp_type != CHARCONST) XX return (0); XX else XX data = data->fp_header.fp_next; XX return (1); XX} XX XXint printlen (data) XXfp_data data; XX{ XX register fp_data ptr; XX register int str; XX register int result; XX#ifndef NOCHECK XX void genbottom (); XX#endif XX XX switch (data->fp_type) XX { XX case NILOBJ: XX return (2); /* <> */ XX case TRUEOBJ: XX return (1); /* T */ XX case FALSEOBJ: XX return (1); /* F */ XX case INTCONST: XX return (numprsize (data->fp_header.fp_int)); XX case ATOMCONST: XX return (strlen (data->fp_header.fp_atom)); XX case FLOATCONST: XX return (floatprsize (data->fp_header.fp_float)); XX case CHARCONST: XX return (2); XX case VECTOR: XX str = isstring (data); XX if (str) XX result = 2; /* for the "" */ XX else XX result = 1; XX/* 2 for the brackets, -1 since blank not placed before first item */ XX ptr = data; XX while (ptr != 0) XX { XX if (str) XX result += 2; XX else XX result += 2 + printlen (ptr->fp_entry); XX /* 1 for the comma, 1 for the blank between elements */ XX ptr = ptr->fp_header.fp_next; XX } XX return (result); XX#ifndef NOCHECK XX default: XX genbottom ("print: unknown object type", data); XX return (0); XX#endif XX } XX} XX XXvoid printfpdata (out, data, ind) XXFILE * out; XXfp_data data; XXint ind; XX{ XX int chars, str; XX char c; XX fp_data track; XX#ifndef NOCHECK XX void genbottom (); XX#endif XX XX#ifndef NOCHECK XX if (data == 0) /* invalid argument, abort */ XX genbottom ("print: null pointer passed to printfpdata", fp_nil); XX#endif XX switch (data->fp_type) XX { XX case NILOBJ: XX (void) fprintf (out, "<>"); XX break; XX case TRUEOBJ: XX (void) putc ('T', out); XX break; XX case FALSEOBJ: XX (void) putc ('F', out); XX break; XX case INTCONST: XX (void) fprintf (out, "%d", data->fp_header.fp_int); XX break; XX case ATOMCONST: XX (void) fprintf (out, "%s", data->fp_header.fp_atom); XX break; XX case CHARCONST: XX c = data->fp_header.fp_char; XX if ((c > '~') || (c < ' ')) XX (void) fprintf (out, "'%3o", c); XX else XX (void) fprintf (out, "'%c", c); XX break; XX case FLOATCONST: XX (void) fprintf (out, "%f", data->fp_header.fp_float); XX break; XX case VECTOR: XX str = isstring (data); XX if (str) XX (void) putc ('"', out); XX else XX { XX chars = printlen (data); XX (void) putc ('<', out); XX } XX track = data; XX while (track != 0) XX { XX if (str) XX (void) putc (track->fp_entry->fp_header.fp_char, out); XX else XX printfpdata (out, track->fp_entry, ind + 1); XX track = track->fp_header.fp_next; XX if ((! str) && (track != 0)) XX { XX putc (',', out); XX if (chars > (80 - ind)) /* put on separate lines, indent */ XX { XX (void) putc ('\n', out); XX indent (ind + 1, out); XX } XX else XX (void) putc (' ', out); XX } XX } XX if (str) XX (void) putc ('"', out); XX else XX (void) putc ('>', out); XX break; XX#ifndef NOCHECK XX default: XX genbottom ("print: unknown object type", data); XX#endif XX } XX#ifdef CHECKREF XX (void) fprintf (out, ".%d/%d", data->fp_ref, data); XX#endif XX} XX XXlong unsigned currsize = 0; /* keep stats about allocation */ XXlong unsigned maxsize = 0; /* keep stats about allocation */ XX XXfp_data freelist = 0; /* pointer to list of free cells */ XX XXvoid makefree () XX{ XX register fp_data cells; XX#define BLOCKSIZE 512 XX XX cells = (fp_data) malloc ((unsigned) BLOCKSIZE * VECTSIZE); XX#ifndef NOCHECK XX if (cells == 0) XX genbottom ("memory allocator: out of space", fp_nil); XX#endif XX for (freelist = cells; (cells - freelist) < BLOCKSIZE; cells++) XX cells->fp_entry = cells + 1; XX cells = freelist + BLOCKSIZE - 1; XX cells->fp_entry = 0; XX} XX XX#ifndef NCOUNTVEC XXint nalloc = 0; XX#endif XX XXfp_data newconst (type) XXint type; XX{ XX register fp_data new; XX XX#ifdef TSTRET XX (void) fprintf (stderr, "entering newconst\n"); XX#endif XX if (freelist == 0) XX makefree (); XX new = freelist; XX freelist = new->fp_entry; XX new->fp_type = type; XX#ifndef NCOUNTVEC XX currsize += CONSTSIZE; XX if (currsize > maxsize) XX maxsize = currsize; XX#endif XX#ifdef TSTRET XX (void) fprintf (stderr, "allocated %d bytes, type is %d", XX CONSTSIZE, new->fp_type); XX (void) fprintf (stderr, ", max is %d, now exiting newconst\n", maxsize); XX#endif XX return (new); XX} XX XXfp_data newcell () XX{ XX register fp_data new; XX XX#ifdef TSTRET XX (void) fprintf (stderr, "entering newcell, size is %d\n", size); XX#endif XX if (freelist == 0) XX makefree (); XX new = freelist; XX freelist = new->fp_entry; XX new->fp_type = VECTOR; /* init type, ref count */ XX new->fp_ref = 1; XX new->fp_header.fp_next = 0; XX#ifndef NCOUNTVEC XX nalloc++; XX currsize += VECTSIZE; XX if (currsize > maxsize) XX maxsize = currsize; XX#endif XX#ifdef TSTRET XX (void) fprintf (stderr, "%d vectors allocated so far\n", nalloc); XX (void) fprintf (stderr, "allocated %d bytes, type is %d", VECTSIZE, VECTOR); XX (void) fprintf (stderr, ", max is %d, now exiting newcell\n", maxsize); XX#endif XX return (new); XX} XX XXfp_data newpair () XX{ XX register fp_data head, tail; XX XX#ifdef TSTRET XX (void) fprintf (stderr, "entering newpair, size is %d\n", size); XX#endif XX if (freelist == 0) XX makefree (); XX head = freelist; XX freelist = head->fp_entry; XX if (freelist == 0) XX makefree (); XX tail = freelist; XX freelist = tail->fp_entry; XX head->fp_type = VECTOR; /* init type, ref count */ XX head->fp_ref = 1; XX head->fp_header.fp_next = tail; XX tail->fp_type = VECTOR; XX tail->fp_ref = 1; XX tail->fp_header.fp_next = 0; XX#ifndef NCOUNTVEC XX nalloc += 2; XX currsize += (VECTSIZE + VECTSIZE); XX if (currsize > maxsize) XX maxsize = currsize; XX#endif XX#ifdef TSTRET XX (void) fprintf (stderr, "%d vectors allocated so far\n", nalloc); XX (void) fprintf (stderr, "allocated %d bytes, type is %d", XX 2 * VECTSIZE, VECTOR); XX (void) fprintf (stderr, ", max is %d, now exiting newpair\n", maxsize); XX#endif XX return (head); XX} XX XX/* the following is less efficient than newconst, newcell or newpair, XX so should only be used with vectors of length > 2 or of variable XX length */ XXfp_data newvect (size) XXlong size; XX{ XX register fp_data new, old; XX#ifdef TSTRET XX register int space; XX#endif XX XX#ifdef TSTRET XX (void) fprintf (stderr, "entering newvect, size is %d\n", size); XX space = size * VECTSIZE; XX#endif XX#ifndef NCOUNTVEC XX currsize += size * VECTSIZE; XX nalloc += size; XX if (currsize > maxsize) XX maxsize = currsize; XX#endif XX/* build the vector back-to-front */ XX old = (fp_data) 0; XX while (size-- > 0) XX { XX if (freelist == 0) makefree (); XX new = freelist; XX freelist = freelist->fp_entry; XX new->fp_type = VECTOR; /* init type, ref count */ XX new->fp_ref = 1; XX new->fp_header.fp_next = old; XX old = new; XX } XX#ifdef TSTRET XX (void) fprintf (stderr, "%d vectors allocated so far\n", nalloc); XX (void) fprintf (stderr, "allocated %d bytes, type is %d", XX space, new->fp_type); XX (void) fprintf (stderr, ", max is %d, now exiting newvect\n", maxsize); XX#endif XX return (new); XX} XX XX#ifndef NCOUNTVEC XXint dalloc = 0; XX#endif XX XX/* returnvect should only be called via dec_ref, which checks for reference XX count == 0 and type == vector */ XXvoid returnvect (data) XXfp_data data; XX{ XX register fp_data old; XX XX#ifdef TSTRET XX (void) fprintf (stderr, "entering returnvect, input is "); XX printfpdata (stderr, data, 0); XX (void) fprintf (stderr, "\nref count is %d\n", data->fp_ref); XX#endif XX while ((data != 0) && (data->fp_ref == 0)) XX { XX#ifdef TSTRET XX if (data->fp_ref < 0) XX { XX (void) fprintf (stderr, XX "reference counting error, negative count found\n"); XX (void) fprintf (stderr, "data is "); XX printfpdata (stderr, data, 0); XX (void) fprintf (stderr, "\nreference count is %d\n", data->fp_ref); XX (void) exit (1); XX } XX#endif XX#ifndef NCOUNTVEC XX currsize -= VECTSIZE; XX dalloc++; XX#endif XX dec_ref (data->fp_entry); /* return element */ XX old = data; XX data = data->fp_header.fp_next; XX if (data != 0) /* return tail, if it has other ref */ XX data->fp_ref--; XX#ifndef NORETURN XX old->fp_entry = freelist; /* return self */ XX freelist = old; XX#endif XX } XX#ifdef TSTRET XX (void) fprintf (stderr, "%d vectors deallocated\nexiting returnvect", XX dalloc); XX#endif XX} XX XXvoid checkstorage () XX{ XX#ifndef NCOUNTVEC XX if (staticstore != 0) XX dec_ref (staticstore); XX if (nalloc != dalloc) XX { XX fprintf (stderr, "WARNING: %d cells allocated, %d deallocated\n", XX nalloc, dalloc); XX fprintf (stderr, "(the two numbers should be the same)\n"); XX fprintf (stderr, "This is an implementation error. The above\n"); XX fprintf (stderr, "results may be incorrect.\n"); XX } XX#endif XX} XX XXvoid printstorage () XX{ XX checkstorage (); XX#ifndef NCOUNTVEC XX (void) fprintf (stdout, XX "%d cells allocated, %d cells deallocated\n", nalloc, dalloc); XX (void) fprintf (stdout, XX "maximum space needed was %d bytes\n", maxsize); XX#endif XX} XX XXvoid putfpdata (data) XXfp_data data; XX{ XX#ifdef DEBUG XX (void) fprintf (stderr, "entering putfpdata\n"); XX#endif XX printfpdata (stdout, data, 0); XX (void) putc ('\n', stdout); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting putfpdata\n"); XX#endif XX} XX XXvoid putfpstring (data, out) XXfp_data data; XXFILE * out; XX{ XX#ifndef NOCHECK XX if ((data->fp_type != NILOBJ) && ! isstring (data)) XX genbottom ("print string: input was not a string", data); XX#endif XX if (data->fp_type != NILOBJ) XX while (data != 0) XX { XX (void) putc (data->fp_entry->fp_header.fp_char, out); XX data = data->fp_header.fp_next; XX } XX} XX XXvoid putfpstrings (data) XXfp_data data; XX/* if the argument is a string it outputs it using putfpstring; XX * otherwise it must be a vector of pairs <filename string>, the XX * strings become the contents of the named files XX */ XX{ XX extern FILE * fopen (); XX extern int fclose (); XX static void toCstring (); XX register FILE * out; XX register fp_data fname; XX register fp_data string; XX register fp_data entry; XX register int closeres; XX char filename [FNAMELEN]; XX XX if ((data->fp_type == NILOBJ) || isstring (data)) XX putfpstring (data, stdout); XX else XX while (data != 0) XX { XX entry = data->fp_entry; XX data = data->fp_header.fp_next; XX#ifndef NOCHECK XX checkpair (entry, "output routine"); XX#endif XX fname = entry->fp_entry; XX string = entry->fp_header.fp_next->fp_entry; XX#ifndef NOCHECK XX if (! isstring (fname)) XX genbottom ("print: file name is not a string", entry); XX/* string-ness of the string is checked in putfpstring */ XX#endif XX toCstring (fname, filename); XX out = fopen (filename, "w"); XX#ifndef NOCHECK XX if (out == 0) XX genbottom ("print: unable to open the output file", fname); XX#endif XX putfpstring (string, out); XX closeres = fclose (out); XX#ifndef NOCHECK XX if (closeres == EOF) XX genbottom ("print: unable to close the output file", fname); XX#endif XX } XX} XX XXfp_data readfpdata (in, input_char, dryrun) XXFILE * in; XXchar * input_char; XXint dryrun; /* check file (1), or actually input it (0)? */ XX /* if it's a dry run, returns fp_true if correct, */ XX /* fp_false if the file is unreadable. */ XX{ XX char string [128]; XX fp_data res, next, last, numconst; XX unsigned int pos = 0; XX long num; XX float real; XX int isneg = 0; XX int negexp = 0; XX void genbottom (); XX XX while (isspace (*input_char)) XX *input_char = getc (in); XX if (*input_char == '<') /* opening vector */ XX { XX *input_char = getc (in); XX while (isspace (*input_char)) XX *input_char = getc (in); XX last = 0; XX if (dryrun) XX res = fp_true; XX else XX res = fp_nil; XX while (*input_char != '>') XX { XX if (dryrun) XX { XX if (readfpdata (in, input_char, 1) ->fp_type != TRUEOBJ) XX return (fp_false); XX } XX else XX { XX next = newcell (); XX next->fp_entry = readfpdata (in, input_char, 0); XX if (last == 0) XX res = next; XX else XX last->fp_header.fp_next = next; XX last = next; XX } XX while (isspace (*input_char)) XX *input_char = getc (in); XX if ((*input_char != ',') && (*input_char != '>')) XX if (dryrun) XX return (fp_false); XX else XX genbottom ("read: comma or > expected after vector element", res); XX if (*input_char == ',') XX *input_char = getc (in); XX while (isspace (*input_char)) XX *input_char = getc (in); XX } XX *input_char = getc (in); XX } /* end if vector */ XX else if (((*input_char >= '0') && (*input_char <= '9')) || XX (*input_char == '-') || (*input_char == '+') || XX (*input_char == '.')) /* number */ XX { XX isneg = *input_char == '-'; XX if (isneg || (*input_char == '+')) XX { XX *input_char = getc (in); XX while (isspace (*input_char)) XX *input_char = getc (in); XX } XX num = 0; XX while ((*input_char >= '0') && (*input_char <= '9')) XX { XX num = (num * 10) + (*input_char - '0'); XX *input_char = getc (in); XX } XX if ((*input_char != '.') && (*input_char != 'e') && (*input_char != 'E')) XX { /* means we have finished reading an integer */ XX if (dryrun) XX return (fp_true); XX res = newconst (INTCONST); XX res->fp_header.fp_int = (isneg) ? (-num) : num; XX } XX else /* floating point number */ XX { XX real = num; XX if (*input_char == '.') /* reading the fractional part */ XX { XX num = 10; /* num is now the divisor */ XX *input_char = getc (in); XX while ((*input_char >= '0') && (*input_char <= '9')) XX { XX real += ((float) (*input_char - '0')) / (float) (num); XX num *= 10; XX *input_char = getc (in); XX } XX } XX if ((*input_char == 'e') || (*input_char == 'E')) XX { /* time to read the exponent */ XX *input_char = getc (in); XX negexp = *input_char == '-'; XX if (negexp || (*input_char == '+')) XX { XX *input_char = getc (in); XX while (isspace (*input_char)) XX *input_char = getc (in); XX } XX num = 0; XX while ((*input_char >= '0') && (*input_char <= '9')) XX { XX num = (num * 10) + (*input_char - '0'); XX *input_char = getc (in); XX } XX while (num-- > 0) XX if (negexp) XX real /= 10; XX else XX real *= 10; XX } XX if (dryrun) XX return (fp_true); XX res = newconst (FLOATCONST); XX res->fp_header.fp_float = (isneg) ? (-real) : real; XX } XX } /* end if number */ XX else if (*input_char == '\'') /* single char */ XX { XX *input_char = getc (in); XX if (*input_char == '\\') XX *input_char = getc (in); XX if (! dryrun) XX { XX res = newconst (CHARCONST); XX res->fp_header.fp_char = *input_char; XX } XX *input_char = getc (in); XX } /* end if char */ XX else if (*input_char == '"') /* string, i.e., vector of chars */ XX { XX last = 0; XX if (! dryrun) XX res = fp_nil; XX while (1) XX { XX *input_char = getc (in); XX if (*input_char == '\\') XX *input_char = getc (in); XX else if (*input_char == '"') XX break; XX if (! dryrun) XX { XX numconst = newconst (CHARCONST); XX numconst->fp_header.fp_char = *input_char; XX next = newcell (); XX next->fp_entry = numconst; XX if (last == 0) XX res = next; XX else XX last->fp_header.fp_next = next; XX last = next; XX } XX } XX *input_char = getc (in); XX } /* end if string */ XX else if (isalpha (*input_char)) /* symbol */ XX { XX while (isalnum (*input_char) || (*input_char == '.')) XX { XX string [pos++] = *input_char; XX *input_char = getc (in); XX } XX string [pos] = '\0'; XX if (dryrun) XX return (fp_true); XX if ((pos == 1) && (string [0] == 'T')) XX res = fp_true; XX else if ((pos == 1) && (string [0] == 'F')) XX res = fp_false; XX else XX { XX res = newconst (ATOMCONST); XX res->fp_header.fp_atom = malloc (pos + 1); XX (void) strcpy (res->fp_header.fp_atom, string); XX } XX } /* end if symbol */ XX else if (((int) *input_char) == EOF) /* end of file */ XX { XX if (dryrun) XX return (fp_false); XX else XX genbottom ("read: end of file reached before end of FFP object\n", XX res); XX } XX else if (dryrun) XX return (fp_false); XX else XX { XX sprintf (string, XX "read: unknown token type\nchar was %c (%d decimal)\n", XX *input_char, *input_char); XX genbottom (string, fp_nil); XX } XX return (res); XX} XX XXfp_data readfpstring (in) XXFILE * in; XX{ XX fp_data res = 0; XX fp_data chase, cptr; XX int input_char; XX XX if ((in == 0) || ((input_char = getc (in)) == EOF)) XX res = fp_nil; XX else XX { XX chase = res = newcell (); XX cptr = newconst (CHARCONST); XX cptr->fp_header.fp_char = input_char; XX chase->fp_entry = cptr; XX while ((input_char = getc (in)) != EOF) XX { XX chase = chase->fp_header.fp_next = newcell (); XX cptr = newconst (CHARCONST); XX cptr->fp_header.fp_char = input_char; XX chase->fp_entry = cptr; XX } XX } XX return (res); XX} XX XXfp_data getfpdata () XX{ XX fp_data res; XX char input_char; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering getfpdata\n"); XX#endif XX input_char = getc (stdin); XX res = readfpdata (stdin, &input_char, 0); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting getfpdata, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data getfpchar () XX{ XX fp_data res; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering getfpchar\n"); XX#endif XX res = newconst (CHARCONST); XX res->fp_header.fp_char = getc (stdin); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting getfpchar, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data getfpstring () XX{ XX fp_data res; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering getfpstring\n"); XX#endif XX res = readfpstring (stdin); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting getfpstring, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XX#ifndef NOCHECK XXint getonec (f) XXFILE * f; XX{ XX int ch, ch1; XX XX ch1 = ch = getc (f); XX while ((ch1 != '\n') && (ch1 != EOF)) XX ch1 = getc (f); XX return (ch); XX} XX XXvoid stackdump (interfile, inter, outfile, baddata) XXFILE * interfile; XXint inter; XXFILE * outfile; XXint baddata; XX{ XX int ch; XX int levels = 0; XX XX while (stack != 0) XX { XX if ((! baddata) || (levels++ > 1)) XX { XX (void) fprintf (outfile, "called by routine %s, with input\n", XX stack->st_name); XX printfpdata (outfile, stack->st_data, 0); XX } XX else XX (void) fprintf (outfile, XX "called by routine %s, with probably bad data\n", XX stack->st_name); XX stack = stack->st_prev; XX (void) putc ('\n', outfile); XX if (inter) XX { XX (void) fprintf (outfile, "continue stack dump?\n", stack->st_name); XX ch = getonec (interfile); XX if ((ch == 'n') || (ch == 'N')) XX break; XX } XX } XX} XX#endif XX XX/* cannot be static because used by the main loop, sometimes */ XXvoid genbottom (message, data) XXchar * message; XXfp_data data; XX{ XX int ch; XX static int reentrant = 0; XX FILE * core; XX XX (void) fprintf (stderr, "error: bottom produced during execution\n"); XX (void) fprintf (stderr, "%s\n", message); XX if (reentrant) XX (void) fprintf (stderr, "an invalid pointer was input to the primitive\n"); XX else XX { XX reentrant = 1; /* might be called by printfpdata */ XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX reentrant = 0; XX } XX#ifndef NOCHECK XX (void) fprintf (stderr, "do you wish a stack dump (y/n)?\n"); XX ch = getonec (stdin); XX if (ch == EOF) XX { XX (void) fprintf (stderr, "dumping the stack to file 'core'\n"); XX core = fopen ("core", "w"); XX stackdump (stdin, 0, core, reentrant); XX reentrant = fclose (core); XX } XX else if ((ch != 'n') && (ch != 'N')) XX { XX (void) fprintf (stderr, "interactive stack dump (y/n)?\n"); XX ch = getonec (stdin); XX (void) fprintf (stderr, "dumping the relevant portions of the stack:\n"); XX stackdump (stdin, (ch == 'y') || (ch == 'Y'), stderr, reentrant); XX } XX#endif XX (void) fprintf (stderr, "aborting...\n"); XX (void) exit (1); XX} XX XXfp_data checkpoint (data) XXfp_data data; XX/* behaves the same as id, but outputs its data */ XX{ XX static int asked = 0; XX static int keepasking = 0; XX struct stackframe * savestack; XX static FILE * tty; XX int ch; XX XX#ifndef NOCHECK XX if (! asked) XX { XX asked = 1; XX tty = fopen ("/dev/tty", "r"); XX if (tty != 0) XX { XX (void) fprintf (stderr, XX "do you wish to interact with the checkpoints (y/n)?\n"); XX ch = getonec (tty); XX keepasking = ((ch == 'y') || (ch == 'Y')); XX } XX } XX#endif XX (void) fprintf (stderr, "checkpoint encountered, input is\n"); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#ifndef NOCHECK XX if (keepasking) XX { XX (void) fprintf (stderr, XX"type y for stack dump, a to abort, space or new-line to continue\n"); XX ch = getonec (tty); XX if ((ch == 'a') || (ch == 'A')) XX { XX (void) fprintf (stderr, "\naborting...\n"); XX (void) exit (1); XX } XX if ((ch == 'y') || (ch == 'Y')) XX { XX savestack = stack; XX (void) fprintf (stderr, "interactive stack dump (y/n)?\n"); XX ch = getonec (tty); XX (void) fprintf (stderr, "dumping the relevant portions of the stack:\n"); XX stackdump (tty, ((ch == 'y') || (ch == 'Y')), stderr, 0); XX stack = savestack; XX } XX } XX#endif XX return (data); XX} XX XXfp_data error (data) XXfp_data data; XX{ XX genbottom ("error: ", data); XX} XX XXfp_data tl (data) XXfp_data data; XX{ XX register fp_data res; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering tl, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (data->fp_type != VECTOR) XX genbottom ("tl: data is not a vector", data); XX#endif XX res = data->fp_header.fp_next; XX if (res == 0) XX res = & nilobj; XX else XX res->fp_ref += 1; XX dec_ref (data); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting tl, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data tlr (data) XXfp_data data; XX{ XX register fp_data res, vector, prev, next; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering tlr, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (data->fp_type != VECTOR) XX genbottom ("tlr: data is not a vector", data); XX#endif XX vector = data; XX if (vector->fp_header.fp_next == 0) XX res = fp_nil; XX else XX { XX prev = res = next = newcell (); XX next->fp_entry = vector->fp_entry; XX inc_ref (next->fp_entry); XX while ((vector = vector->fp_header.fp_next)->fp_header.fp_next != 0) XX { XX next = newcell (); XX next->fp_entry = vector->fp_entry; XX prev->fp_header.fp_next = next; XX prev = next; XX inc_ref (next->fp_entry); XX } XX } XX dec_ref (data); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting tlr, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data rotl (data) XXfp_data data; XX{ XX register fp_data res, from, to; XX register long size; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering rotl, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (nonvector (data)) XX genbottom ("rotl: data is not a vector or nil", data); XX#endif XX res = data; XX if (data->fp_type != NILOBJ) XX { XX for (size = 0; res != 0; res = res->fp_header.fp_next) XX size++; XX res = newvect (size); XX from = data->fp_header.fp_next; XX to = res; XX while (from != 0) XX { XX to->fp_entry = from->fp_entry; XX inc_ref (to->fp_entry); XX to = to->fp_header.fp_next; XX from = from->fp_header.fp_next; XX } XX to->fp_entry = data->fp_entry; XX inc_ref (to->fp_entry); XX dec_ref (data); XX } XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting rotl, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data rotr (data) XXfp_data data; XX{ XX register fp_data res, from, to; XX register long size; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering rotr, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (nonvector (data)) XX genbottom ("rotr: data is not a vector or nil", data); XX#endif XX res = data; XX if (data->fp_type != NILOBJ) XX { XX for (size = 0; res != 0; res = res->fp_header.fp_next) XX size++; XX res = newvect (size); XX from = data; XX to = res->fp_header.fp_next; XX while (to != 0) XX { XX to->fp_entry = from->fp_entry; XX inc_ref (to->fp_entry); XX to = to->fp_header.fp_next; XX from = from->fp_header.fp_next; XX } XX res->fp_entry = from->fp_entry; XX inc_ref (res->fp_entry); XX dec_ref (data); XX } XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting rotr, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data id (data) XXfp_data data; XX{ XX#ifdef DEBUG XX (void) fprintf (stderr, "entering id, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting id, result is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX return (data); XX} XX XXfp_data atom (data) XXfp_data data; XX{ XX register fp_data res; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering atom, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX if (data->fp_type != VECTOR) XX res = (fp_true); XX else XX res = (fp_false); XX dec_ref (data); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting atom, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data reverse (data) XXfp_data data; XX{ XX register fp_data res, saveres, vector; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering reverse, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (nonvector (data)) XX genbottom ("reverse: data is not a vector or nil", data); XX#endif XX if (data->fp_type == NILOBJ) XX res = data; XX else XX { XX vector = data; XX res = 0; XX while (vector != 0) XX { XX saveres = res; XX res = newcell (); XX res->fp_header.fp_next = saveres; XX res->fp_entry = vector->fp_entry; XX inc_ref (res->fp_entry); XX vector = vector->fp_header.fp_next; XX } XX dec_ref (data); XX } XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting reverse, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data distl (data) XXfp_data data; XX{ XX register fp_data obj, vector, res, newobjs, prev, next; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering distl, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (data->fp_type != VECTOR) XX genbottom ("distl: input is not a vector", data); XX if ((data->fp_header.fp_next == 0) || XX (data->fp_header.fp_next->fp_header.fp_next != 0)) XX genbottom ("distl: input is not a 2-element vector", data); XX#endif XX obj = data->fp_entry; XX vector = data->fp_header.fp_next->fp_entry; XX#ifndef NOCHECK XX if (nonvector (vector)) XX genbottom ("distl: 2nd element is not a vector or nil", data); XX#endif XX res = vector; XX if (vector->fp_type != NILOBJ) XX { XX res = next = newcell (); XX newobjs = newpair (); XX newobjs->fp_entry = obj; XX inc_ref (obj); XX newobjs->fp_header.fp_next->fp_entry = vector->fp_entry; XX inc_ref (vector->fp_entry); XX next->fp_entry = newobjs; XX while ((vector = vector->fp_header.fp_next) != 0) XX { XX prev = next; XX next = newcell (); XX newobjs = newpair (); XX newobjs->fp_entry = obj; XX inc_ref (obj); XX newobjs->fp_header.fp_next->fp_entry = vector->fp_entry; XX inc_ref (vector->fp_entry); XX next->fp_entry = newobjs; XX prev->fp_header.fp_next = next; XX } XX } XX dec_ref (data); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting distl, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data distr (data) XXfp_data data; XX{ XX register fp_data obj, vector, res, newobjs, prev, next; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering distr, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (data->fp_type != VECTOR) XX genbottom ("distr: input is not a vector", data); XX if ((data->fp_header.fp_next == 0) || XX (data->fp_header.fp_next->fp_header.fp_next != 0)) XX genbottom ("distr: input is not a 2-element vector", data); XX#endif XX vector = data->fp_entry; XX obj = data->fp_header.fp_next->fp_entry; XX#ifndef NOCHECK XX if (nonvector (vector)) XX genbottom ("distr: 1st element is not a vector or nil", data); XX#endif XX res = vector; /* so it's correct if vector == nil */ XX if (vector->fp_type != NILOBJ) XX { XX res = next = newcell (); XX newobjs = newpair (); XX newobjs->fp_header.fp_next->fp_entry = obj; XX inc_ref (obj); XX newobjs->fp_entry = vector->fp_entry; XX inc_ref (vector->fp_entry); XX next->fp_entry = newobjs; XX while ((vector = vector->fp_header.fp_next) != 0) XX { XX prev = next; XX next = newcell (); XX newobjs = newpair (); XX newobjs->fp_header.fp_next->fp_entry = obj; XX inc_ref (obj); XX newobjs->fp_entry = vector->fp_entry; XX inc_ref (vector->fp_entry); XX next->fp_entry = newobjs; XX prev->fp_header.fp_next = next; XX } XX } XX dec_ref (data); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting distr, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} XX XXfp_data apndl (data) XXfp_data data; XX{ XX register fp_data vector, el, res; XX XX#ifdef DEBUG XX (void) fprintf (stderr, "entering apndl, object is "); XX printfpdata (stderr, data, 0); XX (void) putc ('\n', stderr); XX#endif XX#ifndef NOCHECK XX if (data->fp_type != VECTOR) XX genbottom ("apndl: input is not a vector", data); XX if ((data->fp_header.fp_next == 0) || XX (data->fp_header.fp_next->fp_header.fp_next != 0)) XX genbottom ("apndl: input is not a 2-element vector", data); XX#endif XX el = data->fp_entry; XX vector = data->fp_header.fp_next->fp_entry; XX#ifndef NOCHECK XX if (nonvector (vector)) XX genbottom ("apndl: 2nd element is not a vector or nil", data); XX#endif XX if (vector->fp_type != VECTOR) /* nil? */ XX vector = 0; XX else XX inc_ref (vector); XX res = newcell (); XX res->fp_entry = el; XX inc_ref (el); XX res->fp_header.fp_next = vector; XX dec_ref (data); XX#ifdef DEBUG XX (void) fprintf (stderr, "exiting apndl, result is "); XX printfpdata (stderr, res, 0); XX (void) putc ('\n', stderr); XX#endif XX return (res); XX} SHAR_EOF if test 32154 -ne "`wc -c fp.c.part1`" then echo shar: error transmitting fp.c.part1 '(should have been 32154 characters)' fi echo shar: extracting lex.yy.c '(12642 characters)' sed 's/^XX//' << \SHAR_EOF > lex.yy.c XX# include "stdio.h" XX# define U(x) x XX# define NLSTATE yyprevious=YYNEWLINE XX# define BEGIN yybgin = yysvec + 1 + XX# define INITIAL 0 XX# define YYLERR yysvec XX# define YYSTATE (yyestate-yysvec-1) XX# define YYOPTIM 1 XX# define YYLMAX 200 XX# define output(c) (void) putc(c,yyout) XX# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar) XX# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;} XX# define yymore() (yymorfg=1) XX# define ECHO (void) fprintf(yyout, "%s",yytext) XX# define REJECT { nstr = yyreject(); goto yyfussy;} XXint yyleng; extern char yytext[]; XXint yymorfg; XXextern char *yysptr, yysbuf[]; XXint yytchar; XXFILE *yyin ={stdin}, *yyout ={stdout}; XXextern int yylineno; XXstruct yysvf { XX struct yywork *yystoff; XX struct yysvf *yyother; XX int *yystops;}; XXstruct yysvf *yyestate; XXextern struct yysvf yysvec[], *yybgin; XX# define YYNEWLINE 10 XXyylex(){ XXint nstr; extern int yyprevious; XXwhile((nstr = yylook()) >= 0) XXyyfussy: switch(nstr){ XXcase 0: XXif(yywrap()) return(0); break; XXcase 1: XX { return (Def); } XXbreak; XXcase 2: XX { return (Then); } XXbreak; XXcase 3: XX { return (Else); } XXbreak; XXcase 4: XX { return (Compose); } XXbreak; XXcase 5: XX { return (Alpha); } XXbreak; XXcase 6: XX { return (Tree); } XXbreak; XXcase 7: XX { return (Insert); } XXbreak; XXcase 8: XX { return (Rinsert); } XXbreak; XXcase 9: XX { return (','); } XXbreak; XXcase 10: XX { return ('['); } XXbreak; XXcase 11: XX { return (']'); } XXbreak; XXcase 12: XX { return ('('); } XXbreak; XXcase 13: XX { return (')'); } XXbreak; XXcase 14: XX { return ('<'); } XXbreak; XXcase 15: XX { return ('>'); } XXbreak; XXcase 16: XX { return ('_'); } XXbreak; XXcase 17: XX { return (Bu); } XXbreak; XXcase 18: XX { return (Bur); } XXbreak; XXcase 19: XX { return (While); } XXbreak; XXcase 20: XX { return ('+'); } XXbreak; XXcase 21: XX { return ('*'); } XXbreak; XXcase 22: XX { return (Div); } XXbreak; XXcase 23: XX { return ('='); } XXbreak; XXcase 24: XX { return (Leq); } XXbreak; XXcase 25: XX { return (Geq); } XXbreak; XXcase 26: XX { return (Noteq); } XXbreak; XXcase 27: XX { return (TrueConst); } XXbreak; XXcase 28: XX { return (FalseConst); } XXbreak; XXcase 29: XX{ return (Symbol); } XXbreak; XXcase 30: XX { return (Rsel); } XXbreak; XXcase 31: XX{ return (Float); } XXbreak; XXcase 32: XX{ return (Float); } XXbreak; XXcase 33: XX{ return (Sel); } XXbreak; XXcase 34: XX { return (Sel); } XXbreak; XXcase 35: XX { return ('-'); } XXbreak; XXcase 36: XX{ return (String); } XXbreak; XXcase 37: XX { return (CharConst); } XXbreak; XXcase 38: XX { return (CharConst); } XXbreak; XXcase 39: XX{ set_line (yytext); } XXbreak; XXcase 40: XX { inc_line (); } XXbreak; XXcase 41: XX { inc_line (); } XXbreak; XXcase 42: XX ; XXbreak; XXcase -1: XXbreak; XXdefault: XX(void) fprintf(yyout,"bad switch yylook %d",nstr); XX} return(0); } XX/* end of yylex */ XXint yyvstop[] ={ XX0, XX XX42, XX0, XX XX41, XX0, XX XX42, XX0, XX XX42, XX0, XX XX42, XX0, XX XX42, XX0, XX XX12, XX42, XX0, XX XX13, XX42, XX0, XX XX21, XX42, XX0, XX XX20, XX42, XX0, XX XX9, XX42, XX0, XX XX35, XX42, XX0, XX XX7, XX42, XX0, XX XX34, XX42, XX0, XX XX3, XX42, XX0, XX XX14, XX42, XX0, XX XX23, XX42, XX0, XX XX15, XX42, XX0, XX XX29, XX42, XX0, XX XX29, XX42, XX0, XX XX28, XX29, XX42, XX0, XX XX27, XX29, XX42, XX0, XX XX10, XX42, XX0, XX XX8, XX42, XX0, XX XX11, XX42, XX0, XX XX16, XX42, XX0, XX XX29, XX42, XX0, XX XX29, XX42, XX0, XX XX29, XX42, XX0, XX XX4, XX29, XX42, XX0, XX XX29, XX42, XX0, XX XX42, XX0, XX XX26, XX0, XX XX36, XX0, XX XX40, XX0, XX XX38, XX0, XX XX38, XX0, XX XX33, XX0, XX XX2, XX0, XX XX32, XX0, XX XX34, XX0, XX XX30, XX0, XX XX24, XX0, XX XX25, XX0, XX XX29, XX0, XX XX29, XX0, XX XX6, XX0, XX XX5, XX29, XX0, XX XX17, XX29, XX0, XX XX29, XX0, XX XX29, XX0, XX XX37, XX0, XX XX31, XX0, XX XX1, XX29, XX0, XX XX18, XX29, XX0, XX XX22, XX29, XX0, XX XX29, XX0, XX XX29, XX0, XX XX19, XX29, XX0, XX XX39, XX0, XX0}; XX# define YYTYPE char XXstruct yywork { YYTYPE verify, advance; } yycrank[] ={ XX0,0, 0,0, 1,3, 0,0, XX6,36, 0,0, 7,38, 0,0, XX0,0, 0,0, 0,0, 1,4, XX0,0, 6,36, 0,0, 7,39, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 34,56, 1,5, 1,6, XX1,7, 6,37, 63,65, 7,38, XX1,8, 1,9, 1,10, 1,11, XX1,12, 1,13, 1,14, 65,67, XX1,15, 1,16, 26,51, 6,36, XX56,63, 7,38, 63,63, 0,0, XX0,0, 0,0, 8,40, 0,0, XX1,17, 1,18, 1,19, 1,20, XX5,35, 18,47, 1,21, 8,0, XX6,36, 1,22, 7,38, 1,23, XX14,42, 14,42, 14,42, 14,42, XX14,42, 14,42, 14,42, 14,42, XX14,42, 14,42, 20,48, 0,0, XX0,0, 1,24, 14,43, 0,0, XX0,0, 0,0, 0,0, 8,40, XX1,25, 1,26, 1,27, 0,0, XX1,28, 0,0, 1,29, 1,30, XX29,52, 1,31, 22,50, 50,59, XX64,66, 8,40, 31,54, 2,5, XX33,55, 2,34, 55,62, 62,64, XX1,32, 2,8, 2,9, 2,10, XX2,11, 2,12, 2,13, 2,14, XX1,33, 2,15, 8,40, 30,53, XX53,60, 54,61, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 2,17, 2,18, 2,19, XX2,20, 0,0, 0,0, 0,0, XX0,0, 0,0, 2,22, 0,0, XX2,23, 0,0, 0,0, 0,0, XX0,0, 8,41, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 2,24, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 2,25, 2,26, 2,27, XX0,0, 2,28, 0,0, 2,29, XX2,30, 16,44, 2,31, 16,45, XX16,45, 16,45, 16,45, 16,45, XX16,45, 16,45, 16,45, 16,45, XX16,45, 2,32, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 2,33, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 0,0, 0,0, 0,0, XX0,0, 16,46, 0,0, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 21,49, 21,49, 21,49, XX21,49, 41,57, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 42,58, 41,0, 42,42, XX42,42, 42,42, 42,42, 42,42, XX42,42, 42,42, 42,42, 42,42, XX42,42, 44,44, 44,44, 44,44, XX44,44, 44,44, 44,44, 44,44, XX44,44, 44,44, 44,44, 67,67, XX0,0, 68,67, 41,57, 58,58, XX58,58, 58,58, 58,58, 58,58, XX58,58, 58,58, 58,58, 58,58, XX58,58, 0,0, 0,0, 0,0, XX41,57, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX67,68, 41,57, 68,68, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 67,67, 0,0, XX68,67, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 0,0, XX0,0, 0,0, 0,0, 67,67, XX0,0, 68,67, 0,0, 0,0, XX0,0}; XXstruct yysvf yysvec[] ={ XX0, 0, 0, XXyycrank+-1, 0, 0, XXyycrank+-74, yysvec+1, 0, XXyycrank+0, 0, yyvstop+1, XXyycrank+0, 0, yyvstop+3, XXyycrank+3, 0, yyvstop+5, XXyycrank+-3, 0, yyvstop+7, XXyycrank+-5, 0, yyvstop+9, XXyycrank+-57, 0, yyvstop+11, XXyycrank+0, 0, yyvstop+13, XXyycrank+0, 0, yyvstop+16, XXyycrank+0, 0, yyvstop+19, XXyycrank+0, 0, yyvstop+22, XXyycrank+0, 0, yyvstop+25, XXyycrank+24, 0, yyvstop+28, XXyycrank+0, 0, yyvstop+31, XXyycrank+127, 0, yyvstop+34, XXyycrank+0, 0, yyvstop+37, XXyycrank+4, 0, yyvstop+40, XXyycrank+0, 0, yyvstop+43, XXyycrank+21, 0, yyvstop+46, XXyycrank+146, 0, yyvstop+49, XXyycrank+1, yysvec+21, yyvstop+52, XXyycrank+0, yysvec+21, yyvstop+55, XXyycrank+0, yysvec+21, yyvstop+59, XXyycrank+0, 0, yyvstop+63, XXyycrank+3, 0, yyvstop+66, XXyycrank+0, 0, yyvstop+69, XXyycrank+0, 0, yyvstop+72, XXyycrank+3, yysvec+21, yyvstop+75, XXyycrank+6, yysvec+21, yyvstop+78, XXyycrank+1, yysvec+21, yyvstop+81, XXyycrank+0, yysvec+21, yyvstop+84, XXyycrank+4, yysvec+21, yyvstop+88, XXyycrank+-1, yysvec+7, yyvstop+91, XXyycrank+0, 0, yyvstop+93, XXyycrank+0, yysvec+6, 0, XXyycrank+0, 0, yyvstop+95, XXyycrank+0, yysvec+7, 0, XXyycrank+0, 0, yyvstop+97, XXyycrank+0, 0, yyvstop+99, XXyycrank+-268, 0, yyvstop+101, XXyycrank+231, 0, yyvstop+103, XXyycrank+0, 0, yyvstop+105, XXyycrank+241, 0, yyvstop+107, XXyycrank+0, yysvec+16, yyvstop+109, XXyycrank+0, 0, yyvstop+111, XXyycrank+0, 0, yyvstop+113, XXyycrank+0, 0, yyvstop+115, XXyycrank+0, yysvec+21, yyvstop+117, XXyycrank+1, yysvec+21, yyvstop+119, XXyycrank+0, 0, yyvstop+121, XXyycrank+0, yysvec+21, yyvstop+123, XXyycrank+10, yysvec+21, yyvstop+126, XXyycrank+7, yysvec+21, yyvstop+129, XXyycrank+5, yysvec+21, yyvstop+131, XXyycrank+-4, yysvec+7, 0, XXyycrank+0, 0, yyvstop+133, XXyycrank+255, 0, yyvstop+135, XXyycrank+0, yysvec+21, yyvstop+137, XXyycrank+0, yysvec+21, yyvstop+140, XXyycrank+0, yysvec+21, yyvstop+143, XXyycrank+3, yysvec+21, yyvstop+146, XXyycrank+-6, yysvec+7, 0, XXyycrank+3, yysvec+21, yyvstop+148, XXyycrank+-13, yysvec+7, 0, XXyycrank+0, yysvec+21, yyvstop+150, XXyycrank+-298, yysvec+7, 0, XXyycrank+-300, yysvec+7, yyvstop+153, XX0, 0, 0}; XXstruct yywork *yytop = yycrank+365; XXstruct yysvf *yybgin = yysvec+1; XXchar yymatch[] ={ XX00 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , XX01 ,01 ,012 ,01 ,01 ,01 ,01 ,01 , XX01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , XX01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , XX01 ,01 ,'"' ,01 ,01 ,01 ,01 ,01 , XX01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , XX'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' , XX'0' ,'0' ,01 ,01 ,01 ,01 ,01 ,01 , XX01 ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , XX'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , XX'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , XX'A' ,'A' ,'A' ,01 ,01 ,01 ,01 ,01 , XX01 ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , XX'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , XX'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' ,'A' , XX'A' ,'A' ,'A' ,01 ,01 ,01 ,01 ,01 , XX0}; XXchar yyextra[] ={ XX0,0,0,0,0,0,0,0, XX0,0,0,0,0,0,0,0, XX0,0,0,0,0,0,0,0, XX0,0,0,0,0,0,0,0, XX0,0,0,0,0,0,0,0, XX0,0,0,0,0,0,0,0, XX0}; XX/* ncform 4.1 83/08/11 */ XX XXint yylineno =1; XX# define YYU(x) x XX# define NLSTATE yyprevious=YYNEWLINE XXchar yytext[YYLMAX]; XXstruct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp; XXchar yysbuf[YYLMAX]; XXchar *yysptr = yysbuf; XXint *yyfnd; XXextern struct yysvf *yyestate; XXint yyprevious = YYNEWLINE; XXyylook(){ XX register struct yysvf *yystate, **lsp; XX register struct yywork *yyt; XX struct yysvf *yyz; XX int yych; XX struct yywork *yyr; XX# ifdef LEXDEBUG XX int debug; XX# endif XX char *yylastch; XX /* start off machines */ XX# ifdef LEXDEBUG XX debug = 0; XX# endif XX if (!yymorfg) XX yylastch = yytext; XX else { XX yymorfg=0; XX yylastch = yytext+yyleng; XX } XX for(;;){ XX lsp = yylstate; XX yyestate = yystate = yybgin; XX if (yyprevious==YYNEWLINE) yystate++; XX for (;;){ XX# ifdef LEXDEBUG XX if(debug)(void) fprintf(yyout,"state %d\n",yystate-yysvec-1); XX# endif XX yyt = yystate->yystoff; XX if(yyt == yycrank){ /* may not be any transitions */ XX yyz = yystate->yyother; XX if(yyz == 0)break; XX if(yyz->yystoff == yycrank)break; XX } XX *yylastch++ = yych = input(); XX tryagain: XX# ifdef LEXDEBUG XX if(debug){ XX (void) fprintf(yyout,"char "); XX allprint(yych); XX (void) putchar('\n'); XX } XX# endif XX yyr = yyt; XX if ( (int)yyt > (int)yycrank){ XX yyt = yyr + yych; XX if (yyt <= yytop && yyt->verify+yysvec == yystate){ XX if(yyt->advance+yysvec == YYLERR) /* error transitions */ XX {unput(*--yylastch);break;} XX *lsp++ = yystate = yyt->advance+yysvec; XX goto contin; XX } XX } XX# ifdef YYOPTIM XX else if((int)yyt < (int)yycrank) { /* r < yycrank */ XX yyt = yyr = yycrank+(yycrank-yyt); XX# ifdef LEXDEBUG XX if(debug)(void) fprintf(yyout,"compressed state\n"); XX# endif XX yyt = yyt + yych; XX if(yyt <= yytop && yyt->verify+yysvec == yystate){ XX if(yyt->advance+yysvec == YYLERR) /* error transitions */ XX {unput(*--yylastch);break;} XX *lsp++ = yystate = yyt->advance+yysvec; XX goto contin; XX } XX yyt = yyr + YYU(yymatch[yych]); XX# ifdef LEXDEBUG XX if(debug){ XX (void) fprintf(yyout,"try fall back character "); XX allprint(YYU(yymatch[yych])); XX (void) putchar('\n'); XX } XX# endif XX if(yyt <= yytop && yyt->verify+yysvec == yystate){ XX if(yyt->advance+yysvec == YYLERR) /* error transition */ XX {unput(*--yylastch);break;} XX *lsp++ = yystate = yyt->advance+yysvec; XX goto contin; XX } XX } XX if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){ XX# ifdef LEXDEBUG XX if(debug)(void) fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1); XX# endif XX goto tryagain; XX } XX# endif XX else XX {unput(*--yylastch);break;} XX contin: XX# ifdef LEXDEBUG XX if(debug){ XX (void) fprintf(yyout,"state %d char ",yystate-yysvec-1); XX allprint(yych); XX (void) putchar('\n'); XX } XX# endif XX ; XX } XX# ifdef LEXDEBUG XX if(debug){ XX (void) fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1); XX allprint(yych); XX (void) putchar('\n'); XX } XX# endif XX while (lsp-- > yylstate){ XX *yylastch-- = 0; XX if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){ XX yyolsp = lsp; XX if(yyextra[*yyfnd]){ /* must backup */ XX while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){ XX lsp--; XX unput(*yylastch--); XX } XX } XX yyprevious = YYU(*yylastch); XX yylsp = lsp; XX yyleng = yylastch-yytext+1; XX yytext[yyleng] = 0; XX# ifdef LEXDEBUG XX if(debug){ XX (void) fprintf(yyout,"\nmatch "); XX sprint(yytext); XX (void) fprintf(yyout," action %d\n",*yyfnd); XX } XX# endif XX return(*yyfnd++); XX } XX unput(*yylastch); XX } XX if (yytext[0] == 0 /* && feof(yyin) */) XX { XX yysptr=yysbuf; XX return(0); XX } XX yyprevious = yytext[0] = input(); XX if (yyprevious>0) XX output(yyprevious); XX yylastch=yytext; XX# ifdef LEXDEBUG XX if(debug)(void) putchar('\n'); XX# endif XX } XX } XXyyback(p, m) XX int *p; XX{ XXif (p==0) return(0); XXwhile (*p) XX { XX if (*p++ == m) XX return(1); XX } XXreturn(0); XX} XX /* the following are only used in the lex library */ XXyyinput(){ XX return(input()); XX } XXyyoutput(c) XX int c; { XX output(c); XX } XXyyunput(c) XX int c; { XX unput(c); XX } SHAR_EOF if test 12642 -ne "`wc -c lex.yy.c`" then echo shar: error transmitting lex.yy.c '(should have been 12642 characters)' fi # End of shell archive exit 0 -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net. Use a domain-based address or give alternate paths, or you may lose out.