xref: /csrg-svn/old/eqn/common_source/text.c (revision 14486)
1*14486Ssam #ifndef lint
2*14486Ssam static char sccsid[] = "@(#)text.c	4.3 08/11/83";
3*14486Ssam #endif
411019Sshannon 
511019Sshannon # include "e.h"
611019Sshannon # include "e.def"
711019Sshannon 
811019Sshannon int	csp;
911019Sshannon int	psp;
1011019Sshannon #define	CSSIZE	400
1111019Sshannon char	cs[420];
1211019Sshannon 
1311019Sshannon int	lf, rf;	/* temporary spots for left and right fonts */
1411019Sshannon 
1511019Sshannon text(t,p1) int t; char *p1; {
1611019Sshannon 	int c;
1711019Sshannon 	char *p;
1811019Sshannon 	tbl *tp, *lookup();
1911019Sshannon 	extern tbl *restbl;
2011019Sshannon 
2111019Sshannon 	yyval = oalloc();
2211019Sshannon 	ebase[yyval] = 0;
2311023Sshannon #ifndef NEQN
2411019Sshannon 	eht[yyval] = VERT(6 * ((ps>6)?ps:6));	/* ht in machine units */
2511023Sshannon #else NEQN
2611023Sshannon 	eht[yyval] = VERT(2);	/* 2 half-spaces */
2711023Sshannon #endif NEQN
2811019Sshannon 	lfont[yyval] = rfont[yyval] = ROM;
2911019Sshannon 	if (t == QTEXT)
3011019Sshannon 		p = p1;
3111019Sshannon 	else if ( t == SPACE )
3211019Sshannon 		p = "\\ ";
3311019Sshannon 	else if ( t == THIN )
3411019Sshannon 		p = "\\|";
3511019Sshannon 	else if ( t == TAB )
3611019Sshannon 		p = "\\t";
3711019Sshannon 	else if ((tp = lookup(&restbl, p1, NULL)) != NULL)
3811019Sshannon 		p = tp->defn;
3911019Sshannon 	else {
4011019Sshannon 		lf = rf = 0;
4111019Sshannon 		for (csp=psp=0; (c=p1[psp++])!='\0';) {
4211019Sshannon 			rf = trans(c, p1);
4311019Sshannon 			if (lf == 0)
4411019Sshannon 				lf = rf;	/* save first */
4511019Sshannon 			if (csp>CSSIZE)
4611019Sshannon 				error(FATAL,"converted token %.25s... too long",p1);
4711019Sshannon 		}
4811019Sshannon 		cs[csp] = '\0';
4911019Sshannon 		p = cs;
5011019Sshannon 		lfont[yyval] = lf;
5111019Sshannon 		rfont[yyval] = rf;
5211019Sshannon 	}
5311019Sshannon 	if(dbg)printf(".\t%dtext: S%d <- %s; b=%d,h=%d,lf=%c,rf=%c\n",
5411019Sshannon 		t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval]);
5511019Sshannon 	printf(".ds %d \"%s\n", yyval, p);
5611019Sshannon }
5711019Sshannon 
5811019Sshannon trans(c,p1) int c; char *p1; {
5911019Sshannon 	int f;
6011019Sshannon 	f = ROM;
6111019Sshannon 	switch( c) {
6211019Sshannon 	case '0': case '1': case '2': case '3': case '4':
6311019Sshannon 	case '5': case '6': case '7': case '8': case '9':
6411019Sshannon 	case ':': case ';': case '!': case '%':
6511019Sshannon 	case '(': case '[': case ')': case ']':
6611019Sshannon 	case ',':
6711019Sshannon 		if (rf == ITAL)
6811019Sshannon 			shim();
6911019Sshannon 		roman(c); break;
7011019Sshannon 	case '.':
7111019Sshannon 		if (rf == ROM)
7211019Sshannon 			roman(c);
7311019Sshannon 		else
7411019Sshannon 			cs[csp++] = c;
7511019Sshannon 		f = rf;
7611019Sshannon 		break;
7711019Sshannon 	case '|':
7811019Sshannon 		if (rf == ITAL)
7911019Sshannon 			shim();
8011019Sshannon 		shim(); roman(c); shim(); break;
8111019Sshannon 	case '=':
8211019Sshannon 		if (rf == ITAL)
8311019Sshannon 			shim();
8411019Sshannon 		name4('e','q');
8511019Sshannon 		break;
8611019Sshannon 	case '+':
8711019Sshannon 		if (rf == ITAL)
8811019Sshannon 			shim();
8911019Sshannon 		name4('p', 'l');
9011019Sshannon 		break;
9111019Sshannon 	case '>': case '<':
9211019Sshannon 		if (rf == ITAL)
9311019Sshannon 			shim();
9411019Sshannon 		if (p1[psp]=='=') {	/* look ahead for == <= >= */
9511019Sshannon 			name4(c,'=');
9611019Sshannon 			psp++;
9711019Sshannon 		} else {
9811019Sshannon 			cs[csp++] = c;
9911019Sshannon 		}
10011019Sshannon 		break;
10111019Sshannon 	case '-':
10211019Sshannon 		if (rf == ITAL)
10311019Sshannon 			shim();
10411019Sshannon 		if (p1[psp]=='>') {
10511019Sshannon 			name4('-','>'); psp++;
10611019Sshannon 		} else {
10711019Sshannon 			name4('m','i');
10811019Sshannon 		}
10911019Sshannon 		break;
11011019Sshannon 	case '/':
11111019Sshannon 		if (rf == ITAL)
11211019Sshannon 			shim();
11311019Sshannon 		name4('s','l');
11411019Sshannon 		break;
11511019Sshannon 	case '~': case ' ':
11611019Sshannon 		shim(); shim(); break;
11711019Sshannon 	case '^':
11811019Sshannon 		shim(); break;
11911019Sshannon 	case '\\':	/* troff - pass 2 or 3 more chars */
12011019Sshannon 		if (rf == ITAL)
12111019Sshannon 			shim();
12211019Sshannon 		cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
12311019Sshannon 		if (c=='(') cs[csp++] = p1[psp++];
12411019Sshannon 		if (c=='*' && cs[csp-1] == '(') {
12511019Sshannon 			cs[csp++] = p1[psp++];
12611019Sshannon 			cs[csp++] = p1[psp++];
12711019Sshannon 		}
12811019Sshannon 		break;
12911019Sshannon 	case '\'':
13011019Sshannon 		cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM;
13111019Sshannon 		name4('f','m');
13211019Sshannon 		cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
13311019Sshannon 		f = rf==ITAL ? ITAL : ROM;
13411019Sshannon 		break;
13511019Sshannon 
13611019Sshannon 	case 'f':
13711019Sshannon 		if (ft == ITAL) {
13811019Sshannon 			cs[csp++] = '\\'; cs[csp++] = '^';
13911019Sshannon 			cs[csp++] = 'f';
14011019Sshannon 			cs[csp++] = '\\'; cs[csp++] = '|';	/* trying | instead of ^ */
14111019Sshannon 			f = ITAL;
14211019Sshannon 		}
14311019Sshannon 		else
14411019Sshannon 			cs[csp++] = 'f';
14511019Sshannon 		break;
14611019Sshannon 	case 'j':
14711019Sshannon 		if (ft == ITAL) {
14811019Sshannon 			cs[csp++] = '\\'; cs[csp++] = '^';
14911019Sshannon 			cs[csp++] = 'j';
15011019Sshannon 			f = ITAL;
15111019Sshannon 		}
15211019Sshannon 		else
15311019Sshannon 			cs[csp++] = 'j';
15411019Sshannon 		break;
15511019Sshannon 	default:
15611019Sshannon 		cs[csp++] = c;
15711019Sshannon 		f = ft==ITAL ? ITAL : ROM;
15811019Sshannon 		break;
15911019Sshannon 	}
16011019Sshannon 	return(f);
16111019Sshannon }
16211019Sshannon 
16311019Sshannon shim() {
16411019Sshannon 	cs[csp++] = '\\'; cs[csp++] = '|';
16511019Sshannon }
16611019Sshannon 
16711019Sshannon roman(c) int c; {
16811019Sshannon 	cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = ROM;
16911019Sshannon 	cs[csp++] = c;
17011019Sshannon 	cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
17111019Sshannon }
17211019Sshannon 
17311019Sshannon name4(c1,c2) int c1,c2; {
17411019Sshannon 	cs[csp++] = '\\';
17511019Sshannon 	cs[csp++] = '(';
17611019Sshannon 	cs[csp++] = c1;
17711019Sshannon 	cs[csp++] = c2;
17811019Sshannon }
179