Annotation of researchv10no/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  1000
        !             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: int    pclass;         /* class of previous character */
        !            15: int    nclass;         /* class of next character */
        !            16: 
        !            17: int class[LAST][LAST] ={       /* guesswork, tuned to times roman postscript */
        !            18: 
        !            19:        /*OT OL IL DG LP RP SL PL IF IJ VB */
        !            20: /*OT*/ { 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 0 },            /* OTHER */
        !            21: /*OL*/ { 1, 0, 1, 1, 1, 1, 1, 2, 2, 2, 0 },            /* OLET */
        !            22: /*IL*/ { 1, 1, 0, 1, 1, 1, 1, 3, 2, 1, 0 },            /* ILET */
        !            23: /*DG*/ { 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 0 },            /* DIG */
        !            24: /*LP*/ { 1, 1, 1, 1, 1, 2, 1, 2, 3, 3, 0 },            /* LPAR */
        !            25: /*RP*/ { 2, 2, 2, 1, 1, 1, 1, 2, 3, 3, 0 },            /* RPAR */
        !            26: /*SL*/ { 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 0 },            /* SLASH */
        !            27: /*PL*/ { 2, 2, 2, 2, 2, 2, 3, 2, 3, 2, 0 },            /* PLUS */
        !            28: /*IF*/ { 3, 3, 1, 2, 2, 3, 2, 3, 0, 1, 1 },            /* ILETF */
        !            29: /*IJ*/ { 1, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0 },            /* ILETJ */
        !            30: /*VB*/ { 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 1 },            /* VBAR */
        !            31: 
        !            32: };
        !            33: 
        !            34: extern void shim(int, int);
        !            35: extern void roman(int);
        !            36: extern void sadd(char *);
        !            37: extern void cadd(int);
        !            38: extern int trans(int, char *);
        !            39: 
        !            40: void text(int t, char *p1)     /* convert text string p1 of type t */
        !            41: {
        !            42:        int c;
        !            43:        char *p;
        !            44:        tbl *tp;
        !            45: 
        !            46:        yyval = salloc();
        !            47:        ebase[yyval] = 0;
        !            48:        eht[yyval] = EM(1.0, ps);       /* ht in ems of orig size */
        !            49:        lfont[yyval] = rfont[yyval] = ROM;
        !            50:        lclass[yyval] = rclass[yyval] = OTHER;
        !            51:        if (t == QTEXT) {
        !            52:                for (p = p1; *p; p++)   /* scan for embedded \f's */
        !            53:                        if (*p == '\\' && *(p+1) == 'f')
        !            54:                                break;
        !            55:                if (*p)         /* if found \f, leave it alone and hope */
        !            56:                        p = p1;
        !            57:                else {
        !            58:                        sprintf(cs, "\\f%s%s\\fP", ftp->name, p1);
        !            59:                        p = cs;
        !            60:                }
        !            61:        } else if (t == SPACE)
        !            62:                p = "\\ ";
        !            63:        else if (t == THIN)
        !            64:                p = "\\|";
        !            65:        else if (t == TAB)
        !            66:                p = "\\t";
        !            67:        else if ((tp = lookup(restbl, p1)) != NULL) {
        !            68:                p = tp->cval;
        !            69:        } else {
        !            70:                lf = rf = 0;
        !            71:                lastft = 0;
        !            72:                nclass = NONE;  /* get started with no class == no pad */
        !            73:                csp = cs;
        !            74:                for (psp = p1; (c = *psp++) != '\0'; ) {
        !            75:                        nextft = ft;
        !            76:                        pclass = nclass;
        !            77:                        rf = trans(c, p1);
        !            78:                        if (lf == 0) {
        !            79:                                lf = rf;        /* left stuff is first found */
        !            80:                                lclass[yyval] = nclass;
        !            81:                        }
        !            82:                        if (csp-cs > CSSIZE)
        !            83:                                ERROR "converted token %.25s... too long", p1 FATAL ;
        !            84:                }
        !            85:                sadd("\\fP");
        !            86:                *csp = '\0';
        !            87:                p = cs;
        !            88:                lfont[yyval] = lf;
        !            89:                rfont[yyval] = rf;
        !            90:                rclass[yyval] = nclass;
        !            91:        }
        !            92:        dprintf(".\t%dtext: S%d <- %s; b=%g,h=%g,lf=%c,rf=%c,ps=%d\n",
        !            93:                t, yyval, p, ebase[yyval], eht[yyval], lfont[yyval], rfont[yyval], ps);
        !            94:        printf(".ds %d \"%s\n", yyval, p);
        !            95: }
        !            96: 
        !            97: trans(int c, char *p1)
        !            98: {
        !            99:        int f;
        !           100: 
        !           101:        if (isalpha(c) && ft == ITAL && c != 'f' && c != 'j') { /* italic letter */
        !           102:                shim(pclass, nclass = ILET);
        !           103:                cadd(c);
        !           104:                return ITAL;
        !           105:        }
        !           106:        if (isalpha(c) && ft != ITAL) {         /* other letter */
        !           107:                shim(pclass, nclass = OLET);
        !           108:                cadd(c);
        !           109:                return ROM;
        !           110:        }
        !           111:        if (isdigit(c)) {
        !           112:                shim(pclass, nclass = DIG);
        !           113:                roman(c);
        !           114:                return ROM;     /* this is the right side font of this object */
        !           115:        }
        !           116:        f = ROM;
        !           117:        nclass = OTHER;
        !           118:        switch (c) {
        !           119:        case ':': case ';': case '!': case '%': case '?':
        !           120:                shim(pclass, nclass);
        !           121:                roman(c);
        !           122:                return f;
        !           123:        case '(': case '[':
        !           124:                shim(pclass, nclass = LPAR);
        !           125:                roman(c);
        !           126:                return f;
        !           127:        case ')': case ']':
        !           128:                shim(pclass, nclass = RPAR);
        !           129:                roman(c);
        !           130:                return f;
        !           131:        case ',':
        !           132:                shim(pclass, nclass = OTHER);
        !           133:                roman(c);
        !           134:                return f;
        !           135:        case '.':
        !           136:                if (rf == ROM)
        !           137:                        roman(c);
        !           138:                else
        !           139:                        cadd(c);
        !           140:                return f;
        !           141:        case '|':               /* postscript needs help with default width! */
        !           142:                shim(pclass, nclass = VBAR);
        !           143:                sadd("\\v'.17m'\\z|\\v'-.17m'\\|");     /* and height */
        !           144:                return f;
        !           145:        case '=':
        !           146:                shim(pclass, nclass = PLUS);
        !           147:                sadd("\\(eq");
        !           148:                return f;
        !           149:        case '+':
        !           150:                shim(pclass, nclass = PLUS);
        !           151:                sadd("\\(pl");
        !           152:                return f;
        !           153:        case '>':
        !           154:        case '<':               /* >, >=, >>, <, <-, <=, << */
        !           155:                shim(pclass, nclass = PLUS);
        !           156:                if (*psp == '=') {
        !           157:                        sadd(c == '<' ? "\\(<=" : "\\(>=");
        !           158:                        psp++;
        !           159:                } else if (c == '<' && *psp == '-') {   /* <- only */
        !           160:                        sadd("\\(<-");
        !           161:                        psp++;
        !           162:                } else if (*psp == c) {         /* << or >> */
        !           163:                        cadd(c);
        !           164:                        cadd(c);
        !           165:                        *psp++;
        !           166:                } else {
        !           167:                        cadd(c);  
        !           168:                }
        !           169:                return f;
        !           170:        case '-':
        !           171:                shim(pclass, nclass = PLUS);    /* probably too big for ->'s */
        !           172:                if (*psp == '>') {
        !           173:                        sadd("\\(->");
        !           174:                        psp++;
        !           175:                } else {
        !           176:                        sadd("\\(mi");
        !           177:                }
        !           178:                return f;
        !           179:        case '/':
        !           180:                shim(pclass, nclass = SLASH);
        !           181:                cadd('/');
        !           182:                return f;
        !           183:        case '~':
        !           184:        case ' ':
        !           185:                sadd("\\|\\|");
        !           186:                return f;
        !           187:        case '^':
        !           188:                sadd("\\|");
        !           189:                return f;
        !           190:        case '\\':      /* troff - pass only \(xx without comment */
        !           191:                shim(pclass, nclass);
        !           192:                cadd('\\');
        !           193:                cadd(c = *psp++);
        !           194:                if (c == '(' && *psp && *(psp+1)) {
        !           195:                        cadd(*psp++);
        !           196:                        cadd(*psp++);
        !           197:                } else
        !           198:                        fprintf(stderr, "eqn warning: unquoted troff command \\%c, line %d, file %s\n",
        !           199:                                c, curfile->lineno, curfile->fname);
        !           200:                return f;
        !           201:        case '\'':
        !           202:                shim(pclass, nclass);
        !           203:                sadd("\\(fm");
        !           204:                return f;
        !           205: 
        !           206:        case 'f':
        !           207:                if (ft == ITAL) {
        !           208:                        shim(pclass, nclass = ILETF);
        !           209:                        cadd('f');
        !           210:                        f = ITAL;
        !           211:                } else
        !           212:                        cadd('f');
        !           213:                return f;
        !           214:        case 'j':
        !           215:                if (ft == ITAL) {
        !           216:                        shim(pclass, nclass = ILETJ);
        !           217:                        cadd('j');
        !           218:                        f = ITAL;
        !           219:                } else
        !           220:                        cadd('j');
        !           221:                return f;
        !           222:        default:
        !           223:                shim(pclass, nclass);
        !           224:                cadd(c);
        !           225:                return ft==ITAL ? ITAL : ROM;
        !           226:        }
        !           227: }
        !           228: 
        !           229: char *pad(int n)       /* return the padding as a string */
        !           230: {
        !           231:        static char buf[20];
        !           232: 
        !           233:        buf[0] = 0;
        !           234:        if (n < 0) {
        !           235:                sprintf(buf, "\\h'-%du*\\w'\\^'u'", -n);
        !           236:                return buf;
        !           237:        }       
        !           238:        for ( ; n > 1; n -= 2)
        !           239:                strcat(buf, "\\|");
        !           240:        if (n > 0)
        !           241:                strcat(buf, "\\^");
        !           242:        return buf;
        !           243: }
        !           244: 
        !           245: void shim(int lc, int rc)      /* add padding space suitable to left and right classes */
        !           246: {
        !           247:        sadd(pad(class[lc][rc]));
        !           248: }
        !           249: 
        !           250: void roman(int c)      /* add char c in "roman" font */
        !           251: {
        !           252:        nextft = ROM;
        !           253:        cadd(c);
        !           254: }
        !           255: 
        !           256: void sadd(char *s)             /* add string s to cs */
        !           257: {
        !           258:        while (*s)
        !           259:                cadd(*s++);
        !           260: }
        !           261: 
        !           262: void cadd(int c)               /* add char c to end of cs */
        !           263: {
        !           264:        char *p;
        !           265: 
        !           266:        if (lastft != nextft) {
        !           267:                if (lastft != 0) {
        !           268:                        *csp++ = '\\';
        !           269:                        *csp++ = 'f';
        !           270:                        *csp++ = 'P';
        !           271:                }
        !           272:                *csp++ = '\\';
        !           273:                *csp++ = 'f';
        !           274:                if (ftp == ftstack) {   /* bottom level */
        !           275:                        if (ftp->ft == ITAL)    /* usual case */
        !           276:                                *csp++ = nextft;
        !           277:                        else            /* gfont set, use it */
        !           278:                                for (p = ftp->name; *csp = *p++; )
        !           279:                                        csp++;
        !           280:                } else {        /* inside some kind of font ... */
        !           281:                        for (p = ftp->name; *csp = *p++; )
        !           282:                                csp++;
        !           283:                }
        !           284:                lastft = nextft;
        !           285:        }
        !           286:        *csp++ = c;
        !           287: }

unix.superglobalmegacorp.com

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