Annotation of 43BSD/usr.bin/eqn/text.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)text.c     4.3 8/11/83";
                      3: #endif
                      4: 
                      5: # include "e.h"
                      6: # include "e.def"
                      7: 
                      8: int    csp;
                      9: int    psp;
                     10: #define        CSSIZE  400
                     11: char   cs[420];
                     12: 
                     13: int    lf, rf; /* temporary spots for left and right fonts */
                     14: 
                     15: text(t,p1) int t; char *p1; {
                     16:        int c;
                     17:        char *p;
                     18:        tbl *tp, *lookup();
                     19:        extern tbl *restbl;
                     20: 
                     21:        yyval = oalloc();
                     22:        ebase[yyval] = 0;
                     23: #ifndef NEQN
                     24:        eht[yyval] = VERT(6 * ((ps>6)?ps:6));   /* ht in machine units */
                     25: #else NEQN
                     26:        eht[yyval] = VERT(2);   /* 2 half-spaces */
                     27: #endif NEQN
                     28:        lfont[yyval] = rfont[yyval] = ROM;
                     29:        if (t == QTEXT)
                     30:                p = p1;
                     31:        else if ( t == SPACE )
                     32:                p = "\\ ";
                     33:        else if ( t == THIN )
                     34:                p = "\\|";
                     35:        else if ( t == TAB )
                     36:                p = "\\t";
                     37:        else if ((tp = lookup(&restbl, p1, NULL)) != NULL)
                     38:                p = tp->defn;
                     39:        else {
                     40:                lf = rf = 0;
                     41:                for (csp=psp=0; (c=p1[psp++])!='\0';) {
                     42:                        rf = trans(c, p1);
                     43:                        if (lf == 0)
                     44:                                lf = rf;        /* save first */
                     45:                        if (csp>CSSIZE)
                     46:                                error(FATAL,"converted token %.25s... too long",p1);
                     47:                }
                     48:                cs[csp] = '\0';
                     49:                p = cs;
                     50:                lfont[yyval] = lf;
                     51:                rfont[yyval] = rf;
                     52:        }
                     53:        if(dbg)printf(".\t%dtext: S%d <- %s; b=%d,h=%d,lf=%c,rf=%c\n",
                     54:                t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval]);
                     55:        printf(".ds %d \"%s\n", yyval, p);
                     56: }
                     57: 
                     58: trans(c,p1) int c; char *p1; {
                     59:        int f;
                     60:        f = ROM;
                     61:        switch( c) {
                     62:        case '0': case '1': case '2': case '3': case '4':
                     63:        case '5': case '6': case '7': case '8': case '9':
                     64:        case ':': case ';': case '!': case '%':
                     65:        case '(': case '[': case ')': case ']':
                     66:        case ',':
                     67:                if (rf == ITAL)
                     68:                        shim();
                     69:                roman(c); break;
                     70:        case '.':
                     71:                if (rf == ROM)
                     72:                        roman(c);
                     73:                else
                     74:                        cs[csp++] = c;
                     75:                f = rf;
                     76:                break;
                     77:        case '|':
                     78:                if (rf == ITAL)
                     79:                        shim();
                     80:                shim(); roman(c); shim(); break;
                     81:        case '=':
                     82:                if (rf == ITAL)
                     83:                        shim();
                     84:                name4('e','q');
                     85:                break;
                     86:        case '+':
                     87:                if (rf == ITAL)
                     88:                        shim();
                     89:                name4('p', 'l');
                     90:                break;
                     91:        case '>': case '<':
                     92:                if (rf == ITAL)
                     93:                        shim();
                     94:                if (p1[psp]=='=') {     /* look ahead for == <= >= */
                     95:                        name4(c,'=');
                     96:                        psp++;
                     97:                } else {
                     98:                        cs[csp++] = c;  
                     99:                }
                    100:                break;
                    101:        case '-':
                    102:                if (rf == ITAL)
                    103:                        shim();
                    104:                if (p1[psp]=='>') {
                    105:                        name4('-','>'); psp++;
                    106:                } else {
                    107:                        name4('m','i');
                    108:                }
                    109:                break;
                    110:        case '/':
                    111:                if (rf == ITAL)
                    112:                        shim();
                    113:                name4('s','l');
                    114:                break;
                    115:        case '~': case ' ':
                    116:                shim(); shim(); break;
                    117:        case '^':
                    118:                shim(); break;
                    119:        case '\\':      /* troff - pass 2 or 3 more chars */
                    120:                if (rf == ITAL)
                    121:                        shim();
                    122:                cs[csp++] = c; cs[csp++] = c = p1[psp++]; cs[csp++] = p1[psp++];
                    123:                if (c=='(') cs[csp++] = p1[psp++];
                    124:                if (c=='*' && cs[csp-1] == '(') {
                    125:                        cs[csp++] = p1[psp++];
                    126:                        cs[csp++] = p1[psp++];
                    127:                }
                    128:                break;
                    129:        case '\'':
                    130:                cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = rf==ITAL ? ITAL : ROM;
                    131:                name4('f','m');
                    132:                cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
                    133:                f = rf==ITAL ? ITAL : ROM;
                    134:                break;
                    135: 
                    136:        case 'f':
                    137:                if (ft == ITAL) {
                    138:                        cs[csp++] = '\\'; cs[csp++] = '^';
                    139:                        cs[csp++] = 'f';
                    140:                        cs[csp++] = '\\'; cs[csp++] = '|';      /* trying | instead of ^ */
                    141:                        f = ITAL;
                    142:                }
                    143:                else
                    144:                        cs[csp++] = 'f';
                    145:                break;
                    146:        case 'j':
                    147:                if (ft == ITAL) {
                    148:                        cs[csp++] = '\\'; cs[csp++] = '^';
                    149:                        cs[csp++] = 'j';
                    150:                        f = ITAL;
                    151:                }
                    152:                else
                    153:                        cs[csp++] = 'j';
                    154:                break;
                    155:        default:
                    156:                cs[csp++] = c;
                    157:                f = ft==ITAL ? ITAL : ROM;
                    158:                break;
                    159:        }
                    160:        return(f);
                    161: }
                    162: 
                    163: shim() {
                    164:        cs[csp++] = '\\'; cs[csp++] = '|';
                    165: }
                    166: 
                    167: roman(c) int c; {
                    168:        cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = ROM;
                    169:        cs[csp++] = c;
                    170:        cs[csp++] = '\\'; cs[csp++] = 'f'; cs[csp++] = 'P';
                    171: }
                    172: 
                    173: name4(c1,c2) int c1,c2; {
                    174:        cs[csp++] = '\\';
                    175:        cs[csp++] = '(';
                    176:        cs[csp++] = c1;
                    177:        cs[csp++] = c2;
                    178: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.