Annotation of 41BSD/cmd/eqn/text.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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