PWB1/type/eqn/elex.c

Compare this file to the similar file:
Show the results in this format:

#include "e.h"
#include "y.tab.c"

#define	MAXDEFS	200	/* max number of definitions */
struct {
	char *nptr;	/* name pointer */
	char *sptr;	/* defining string */
} deftab[MAXDEFS];
int	defptr	0;	/* next free slot in deftab */

struct	{
	char	*key;
	int	keyval;
} keytab[] {
	"sub",	SUB,
	"sup",	SUP,
	".EN",	0,
	"from",	FROM,
	"to",	TO,
	"sum",	SUM,
	"hat",	HAT,
	"vec", VEC,
	"dyad", DYAD,
	"dot",	DOT,
	"dotdot",	DOTDOT,
	"bar",	BAR,
	"tilde",	TILDE,
	"under",	UNDER,
	"prod",	PROD,
	"int",	INT,
	"integral",	INT,
	"union",	UNION,
	"inter",	INTER,
	"pile",	PILE,
	"lpile",	LPILE,
	"cpile",	CPILE,
	"rpile",	RPILE,
	"over",	OVER,
	"sqrt",	SQRT,
	"above",	ABOVE,
	"size",	SIZE,
	"font",	FONT,
	"fat", FAT,
	"roman",	ROMAN,
	"italic",	ITALIC,
	"bold",	BOLD,
	"left",	LEFT,
	"right",	RIGHT,
	"delim",	DELIM,
	"define",	DEFINE,
	"tdefine",	DEFINE,
	"ndefine",	NDEFINE,
	"gsize",	GSIZE,
	".gsize",	GSIZE,
	"gfont",	GFONT,
	"include",	INCLUDE,
	"up",	UP,
	"down",	DOWN,
	"fwd",	FWD,
	"back",	BACK,
	"mark",	MARK,
	"lineup",	LINEUP,
	"matrix",	MATRIX,
	"col",	COL,
	"lcol",	LCOL,
	"ccol",	CCOL,
	"rcol",	RCOL,
	0,	0
};
#define	SSIZE	400
char	token[SSIZE];
int	sp;
#define	putbak(c)	*ip++ = c;
#define	PUSHBACK	300	/* maximum pushback characters */
char	ibuf[PUSHBACK+SSIZE];	/* pushback buffer for definitions, etc. */
char	*ip	ibuf;

gtc() {
  loop:
	if (ip > ibuf)
		return(*--ip);	/* already present */
	lastchar = getc(curfile);
	if (lastchar=='\n')
		linect++;
	if (lastchar != EOF)
		return(lastchar);
	if (++ifile > svargc) {
		return(EOF);
	}
	fclose(curfile);
	linect = 1;
	if ((curfile=fopen(svargv[ifile],"r")) != NULL)
		goto loop;
	error(FATAL,"can't open file %s\n", svargv[ifile]);
}

pbstr(str)
register char *str;
{
	register char *p;

	p = str;
	while (*p++);
	--p;
	if (ip >= &ibuf[PUSHBACK])
		error( FATAL, "eqn pushback overflow\n");
	while (p > str)
		putbak(*--p);
}

yylex() {
	int c, type;
  beg:
	while ((c=gtc())==' ' || c=='\n');
	yylval=c;
	switch(c) {

	case EOF:
		return('\0');
	case '~':
		return(SPACE);
	case '^':
		return(THIN);
	case '\t':
		return(TAB);
	case '{':
		return(MQ);
	case '}':
		return(MQ1);
	case '"':
		for (sp=0; (c=gtc())!='"'; ) {
			if(c !='\\')token[sp++]=c;
			else { if((c=gtc())!= '"')token[sp++]='\\';
				token[sp++] = c; }
			if (sp>=SSIZE)
				error(FATAL,"quoted string %.20s... too long", token);
		}
		token[sp]='\0';
		yylval= &token[0];
		return(QTEXT);
	}
	if (c==righteq)
		return('\0');

	getstr(token, c);
	if(dbg)printf(".\tlex token = |%s|\n", token);
	if((type = lookup(token,deftab)) >= 0) {
		putbak(' ');
		pbstr(deftab[type].sptr);
		putbak(' ');
		if(dbg)
			printf(".\tfound %s=|%s|\n", token, deftab[type].sptr);
		goto beg;
		}
	type = lookup(token,keytab);
	if (type < 0)
		return(CONTIG);
	switch (keytab[type].keyval) {

	case DEFINE: case NDEFINE:
		define(keytab[type].keyval);
		goto beg;
	case DELIM:
		delim();
		goto beg;
	case GSIZE:
		globsize();
		goto beg;
	case GFONT:
		globfont();
		goto beg;
	case INCLUDE:
		include();
		goto beg;
	default:
		return( keytab[type].keyval );
	}
}

getstr(s,c) char *s, c; {
	for (sp=0; c!=' ' && c!='\t' && c!='\n' && c!='{' && c!='}'
		&& c!='"' && c!='~' && c!='^' && c!=righteq; ) {
		if(c == '\\') if((c = gtc()) != '"')s[sp++] = '\\';
		s[sp++] = c;
		if (sp>=SSIZE)
			error(FATAL,"token %.20s... too long",s);
		c = gtc();
		}
	if (c=='{' || c=='}' || c=='"' || c=='~' || c=='^' || c=='\t' || c==righteq)
		putbak(c);
	s[sp]='\0';
	yylval = s;
}

lookup(str,tbl)
char *str;
struct { char *name; char *val; } tbl[];
{
	register i,j, r;
	for (i=0; tbl[i].name!=0; i++) { /* table of tbl wds */
		for ( j=0; (r=tbl[i].name[j])==str[j] && r!='\0'; j++);
		if (r == str[j])
			return(i);
	}
	return( -1 );
}

cstr(s,quote) char *s; int quote; {
	int del,c,i;
	while((del=gtc()) == ' ' || del == '\t' || del == '\n');
	if(quote)
		for (i=0; (c=gtc()) != del;)
			s[i++] = c;
	else {
		s[0] = del;
		for (i=1; (c=gtc())!=' ' && c!= '\t' && c!='\n';)
			s[i++]=c;
	}
	s[i] = '\0';
	return(s);
}

define(type) int type; {
	/*	char *calloc (); */
	int i, c, index;
	while ((c=gtc())==' ' || c=='\n');
	getstr(token,c);
	if (type == DEFINE) {
		if((index = lookup(token,deftab)) >= 0) {
			cfree(deftab[index].sptr);
		} else {
			index = defptr++;
			if (index >= MAXDEFS)
				error(FATAL, "Too many definitions at %s\n", token);
			for (i=0; token[i] != '\0'; i++);
			deftab[index].nptr = calloc(i+1,1);
			for (i=0; deftab[index].nptr[i]=token[i]; i++);
		}
		if(dbg)printf(".\tdefine %s\n",deftab[index].nptr);
	}
	cstr(token,1);
	if (type != DEFINE)
		return;
	for (i=0; token[i] != '\0'; i++);
	deftab[index].sptr = calloc(i+1,1);
	for (i=0; deftab[index].sptr[i] = token[i]; i++);
	if(dbg)printf(".\tname %s defined as %s\n",
		deftab[index].nptr, deftab[index].sptr);
}

include() {
	error(!FATAL, "Include not yet implemented\n");
}

delim() {
	char *s;
	yyval = eqnreg = 0;
	cstr(token,0);
	lefteq = token[0];
	righteq = token[1];
	if (lefteq == 'o' && righteq == 'f')
		lefteq = righteq = '\0';
}

globsize() {
	extern int gsize;
	int c;
	while ((c=gtc())==' ' || c=='\n');
	getstr(token,c);
	if (token[0] == '+')
		gsize =+ numb(token);
	else if (token[0] == '-')
		gsize =- numb(token);
	else
		gsize = numb(token);
	yyval = eqnreg = 0;
	setps(gsize);
	ps = gsize;
	if (gsize >= 12)	/* sub and sup size change */
		deltaps = gsize / 4;
	else
		deltaps = gsize / 3;
}

globfont() {
	extern int gfont;
	while ((gfont=gtc())==' ' || gfont=='\n');
	getstr(token, gfont);
	yyval = eqnreg = 0;
	switch (gfont) {
	case 'r': case 'R':
		gfont = '1';
		break;
	case 'i': case 'I':
		gfont = '2';
		break;
	case 'b': case 'B':
		gfont = '3';
		break;
	}
	printf(".ft %c\n", gfont);
	ft = gfont;
}