home *** CD-ROM | disk | FTP | other *** search
- # include "e.h"
- # include "e.def"
-
- int csp;
- int psp;
- #define CSSIZE 400
- char cs[420];
-
- int lf, rf; /* temporary spots for left and right fonts */
-
- text(t,p1) int t; char *p1; {
- int c;
- char *p;
- tbl *tp, *lookup();
- extern tbl *restbl;
-
- yyval = oalloc();
- ebase[yyval] = 0;
- eht[yyval] = VERT(2); /* 2 half-spaces */
- lfont[yyval] = rfont[yyval] = ROM;
- if (t == QTEXT)
- p = p1;
- else if ( t == SPACE )
- p = "\\ ";
- else if ( t == THIN )
- p = "\\|";
- else if ( t == TAB )
- p = "\\t";
- else if ((tp = lookup(&restbl, p1, NULL)) != NULL)
- p = tp->defn;
- else {
- lf = rf = 0;
- for (csp=psp=0; (c=p1[psp++])!='\0';) {
- rf = trans(c, p1);
- if (lf == 0)
- lf = rf; /* save first */
- if (csp>CSSIZE)
- error(FATAL,"converted token %.25s... too long",p1);
- }
- cs[csp] = '\0';
- p = cs;
- lfont[yyval] = lf;
- rfont[yyval] = rf;
- }
- if(dbg)printf(".\t%dtext: S%d <- %s; b=%d,h=%d,lf=%c,rf=%c\n",
- t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval]);
- printf(".ds %d \"%s\n", yyval, p);
- }
-
- trans(c,p1) int c; char *p1; {
- int f;
- f = ROM;
- switch( c) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case ':': case ';': case '!': case '%':
- case '(': case '[': case ')': case ']':
- case ',':
- if (rf == ITAL)
- shim();
- roman(c); break;
- case '.':
- if (rf == ROM)
- roman(c);
- else
- cs[csp++] = c;
- f = rf;
- break;
- case '|':
- if (rf == ITAL)
- shim();
- shim(); roman(c); shim(); break;
- case '=':
- if (rf == ITAL)
- shim();
- name4('e','q');
- break;
- case '+':
- if (rf == ITAL)
- shim();
- name4('p', 'l');
- break;
- case '>': case '<':
- if (rf == ITAL)
- shim();
- if (p1[psp]=='=') { /* look ahead for == <= >= */
- name4(c,'=');
- psp++;
- } else {
- cs[csp++] = c;
- }
- break;
- case '-':
- if (rf == ITAL)
- shim();
- if (p1[psp]=='>') {
- name4('-','>'); psp++;
- } else {
- name4('m','i');
- }
- break;
- case '/':
- if (rf == ITAL)
- shim();
- name4('s','l');
- break;
- case '~': case ' ':
- shim(); shim(); break;
- case '^':
- shim(); break;
- case '\\': /* troff - pass 2 or 3 more chars */
- if (rf == ITAL)
- shim();
- cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
- if (c=='(') cs[csp++] = p1[psp++];
- if (c=='*' && cs[csp-1] == '(') {
- cs[csp++] = p1[psp++];
- cs[csp++] = p1[psp++];
- }
- break;
- case '\'':
- cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM;
- name4('f','m');
- cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
- f = rf==ITAL ? ITAL : ROM;
- break;
-
- case 'f':
- if (ft == ITAL) {
- cs[csp++] = '\\'; cs[csp++] = '^';
- cs[csp++] = 'f';
- cs[csp++] = '\\'; cs[csp++] = '|'; /* trying | instead of ^ */
- f = ITAL;
- }
- else
- cs[csp++] = 'f';
- break;
- case 'j':
- if (ft == ITAL) {
- cs[csp++] = '\\'; cs[csp++] = '^';
- cs[csp++] = 'j';
- f = ITAL;
- }
- else
- cs[csp++] = 'j';
- break;
- default:
- cs[csp++] = c;
- f = ft==ITAL ? ITAL : ROM;
- break;
- }
- return(f);
- }
-
- shim() {
- cs[csp++] = '\\'; cs[csp++] = '|';
- }
-
- roman(c) int c; {
- cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = ROM;
- cs[csp++] = c;
- cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
- }
-
- name4(c1,c2) int c1,c2; {
- cs[csp++] = '\\';
- cs[csp++] = '(';
- cs[csp++] = c1;
- cs[csp++] = c2;
- }
-