Annotation of researchv9/cmd/eqn/text.c, revision 1.1

1.1     ! root        1: #include "e.h"
        !             2: #include "y.tab.h"
        !             3: #include <ctype.h>
        !             4: 
        !             5: #define        CSSIZE  400
        !             6: char   cs[CSSIZE+20];  /* text string converted into this */
        !             7: char   *csp;           /* next spot in cs[] */
        !             8: char   *psp;           /* next character in input token */
        !             9: 
        !            10: int    lf, rf;         /* temporary spots for left and right fonts */
        !            11: int    lastft;         /* last \f added */
        !            12: int    nextft;         /* next \f to be added */
        !            13: 
        !            14: text(t, p1)    /* convert text string p1 of type t */
        !            15:        int t;
        !            16:        char *p1;
        !            17: {
        !            18:        int c;
        !            19:        char *p;
        !            20:        tbl *tp;
        !            21: 
        !            22:        yyval = salloc();
        !            23:        ebase[yyval] = 0;
        !            24:        eht[yyval] = EM(1.0, ps);       /* ht in ems of orig size */
        !            25:        eps[yyval] = ps;
        !            26:        lfont[yyval] = rfont[yyval] = ROM;
        !            27:        if (t == QTEXT) {
        !            28:                for (p = p1; *p; p++)   /* scan for embedded \f's */
        !            29:                        if (*p == '\\' && *(p+1) == 'f')
        !            30:                                break;
        !            31:                if (*p)         /* if found \f, leave it alone and hope */
        !            32:                        p = p1;
        !            33:                else {
        !            34:                        sprintf(cs, "\\f%s%s\\fP", ftp->name, p1);
        !            35:                        p = cs;
        !            36:                }
        !            37:        } else if (t == SPACE)
        !            38:                p = "\\ ";
        !            39:        else if (t == THIN)
        !            40:                p = "\\|";
        !            41:        else if (t == TAB)
        !            42:                p = "\\t";
        !            43:        else if ((tp = lookup(restbl, p1, NULL)) != NULL) {
        !            44:                p = tp->defn;
        !            45:        } else {
        !            46:                lf = rf = 0;
        !            47:                /* sprintf(cs, "\\f%s", ftp->name); */
        !            48:                lastft = 0;
        !            49:                csp = cs;
        !            50:                for (psp = p1; (c = *psp++) != '\0'; ) {
        !            51:                        nextft = ft;
        !            52:                        rf = trans(c, p1);
        !            53:                        if (lf == 0)
        !            54:                                lf = rf;        /* save first */
        !            55:                        if (csp-cs > CSSIZE)
        !            56:                                error(FATAL,"converted token %.25s... too long",p1);
        !            57:                }
        !            58:                sadd("\\fP");
        !            59:                *csp = '\0';
        !            60:                p = cs;
        !            61:                lfont[yyval] = lf;
        !            62:                rfont[yyval] = rf;
        !            63:        }
        !            64:        dprintf(".\t%dtext: S%d <- %s; b=%g,h=%g,lf=%c,rf=%c,ps=%d\n",
        !            65:                t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval], ps);
        !            66:        printf(".ds %d \"%s\n", yyval, p);
        !            67: }
        !            68: 
        !            69: trans(c, p1)
        !            70:        int c;
        !            71:        char *p1;
        !            72: {
        !            73:        int f;
        !            74: 
        !            75:        f = ROM;
        !            76:        switch (c) {
        !            77:        case '0': case '1': case '2': case '3': case '4':
        !            78:        case '5': case '6': case '7': case '8': case '9':
        !            79:        case ':': case ';': case '!': case '%': case '?':
        !            80:        case '(': case '[': case ']':
        !            81:                if (rf == ITAL)
        !            82:                        shim();
        !            83:                roman(c);
        !            84:                break;
        !            85:        case ')':
        !            86:                if (rf == ITAL)
        !            87:                        halfshim();
        !            88:                roman(c);
        !            89:                break;
        !            90:        case ',':
        !            91:                roman(c);
        !            92:                halfshim();
        !            93:                f = rf;
        !            94:                break;
        !            95:        case '.':
        !            96:                if (rf == ROM)
        !            97:                        roman(c);
        !            98:                else
        !            99:                        cadd(c);
        !           100:                f = rf;
        !           101:                break;
        !           102:        case '|':
        !           103:                if (rf == ITAL && ttype != DEV202)
        !           104:                        shim();
        !           105:                shim(); roman(c); shim();
        !           106:                break;
        !           107:        case '=':
        !           108:                if (rf == ITAL)
        !           109:                        shim();
        !           110:                name4('e','q');
        !           111:                break;
        !           112:        case '+':
        !           113:                if (rf == ITAL)
        !           114:                        shim();
        !           115:                name4('p','l');
        !           116:                break;
        !           117:        case '>': case '<':
        !           118:                if (rf == ITAL)
        !           119:                        shim();
        !           120:                if (*psp == '=') {      /* look ahead for == <= >= */
        !           121:                        name4(c,'=');
        !           122:                        psp++;
        !           123:                } else {
        !           124:                        cadd(c);  
        !           125:                }
        !           126:                break;
        !           127:        case '-':
        !           128:                if (rf == ITAL)
        !           129:                        shim();
        !           130:                if (*psp == '>') {
        !           131:                        name4('-','>');
        !           132:                        halfshim();
        !           133:                        psp++;
        !           134:                } else {
        !           135:                        name4('m','i');
        !           136:                }
        !           137:                break;
        !           138:        case '/':
        !           139:                halfshim();
        !           140:                cadd('/');
        !           141:                halfshim();
        !           142:                break;
        !           143:        case '~': case ' ':
        !           144:                shim(); shim();
        !           145:                break;
        !           146:        case '^':
        !           147:                shim();
        !           148:                break;
        !           149:        case '\\':      /* troff - pass only \(xx without comment */
        !           150:                if (rf == ITAL)
        !           151:                        shim();
        !           152:                cadd('\\');
        !           153:                cadd(c = *psp++);
        !           154:                if (c == '(' && *psp && *(psp+1)) {
        !           155:                        cadd(*psp++);
        !           156:                        cadd(*psp++);
        !           157:                } else
        !           158:                        fprintf(stderr, "eqn warning: unquoted troff command \\%c, line %d, file %s\n",
        !           159:                                c, curfile->lineno, curfile->fname);
        !           160:                break;
        !           161:        case '\'':
        !           162:                name4('f','m');
        !           163:                break;
        !           164: 
        !           165:        case 'f':
        !           166:                if (ft == ITAL) {
        !           167:                        if (psp == p1+1 || !isalnum(*(psp-2)))
        !           168:                                halfshim();
        !           169:                        cadd('f');
        !           170:                        if (!isalpha(*psp) && *psp != '\0')     /* add \| except in text */
        !           171:                                shim();
        !           172:                        f = ITAL;
        !           173:                }
        !           174:                else
        !           175:                        cadd('f');
        !           176:                break;
        !           177:        case 'j':
        !           178:                if (ft == ITAL) {
        !           179:                        sadd("\\^j");
        !           180:                        f = ITAL;
        !           181:                }
        !           182:                else
        !           183:                        cadd('j');
        !           184:                break;
        !           185:        default:
        !           186:                cadd(c);
        !           187:                f = ft==ITAL ? ITAL : ROM;
        !           188:                break;
        !           189:        }
        !           190:        return(f);
        !           191: }
        !           192: 
        !           193: shim() /* add a \| space */
        !           194: {
        !           195:        sadd("\\|");
        !           196: }
        !           197: 
        !           198: halfshim()     /* add a \^ space */
        !           199: {
        !           200:        sadd("\\^");
        !           201: }
        !           202: 
        !           203: roman(c)       /* add char c in "roman" font */
        !           204:        int c;
        !           205: {
        !           206:        nextft = ROM;
        !           207:        cadd(c);
        !           208: }
        !           209: 
        !           210: name4(c1,c2)
        !           211:        int c1, c2;
        !           212: {
        !           213:        sadd("\\(");
        !           214:        cadd(c1);
        !           215:        cadd(c2);
        !           216: }
        !           217: 
        !           218: sadd(s)                /* add string s to cs */
        !           219:        char *s;
        !           220: {
        !           221:        while (*s)
        !           222:                cadd(*s++);
        !           223: }
        !           224: 
        !           225: cadd(c)                /* add char c to end of cs */
        !           226:        int c;
        !           227: {
        !           228:        char *p;
        !           229: 
        !           230:        if (lastft != nextft) {
        !           231:                if (lastft != 0) {
        !           232:                        *csp++ = '\\';
        !           233:                        *csp++ = 'f';
        !           234:                        *csp++ = 'P';
        !           235:                }
        !           236:                *csp++ = '\\';
        !           237:                *csp++ = 'f';
        !           238:                if (ftp == ftstack) {   /* bottom level */
        !           239:                        if (ftp->ft == ITAL)    /* usual case */
        !           240:                                *csp++ = nextft;
        !           241:                        else            /* gfont set, use it */
        !           242:                                for (p = ftp->name; *csp = *p++; )
        !           243:                                        csp++;
        !           244:                } else {        /* inside some kind of font ... */
        !           245:                        for (p = ftp->name; *csp = *p++; )
        !           246:                                csp++;
        !           247:                }
        !           248:                lastft = nextft;
        !           249:        }
        !           250:        *csp++ = c;
        !           251: }

unix.superglobalmegacorp.com

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