date and time created 83/02/11 18:28:52 by shannon
authorBill Shannon <shannon@ucbvax.Berkeley.EDU>
Sat, 12 Feb 1983 10:28:52 +0000 (02:28 -0800)
committerBill Shannon <shannon@ucbvax.Berkeley.EDU>
Sat, 12 Feb 1983 10:28:52 +0000 (02:28 -0800)
SCCS-vsn: old/eqn/common_source/text.c 4.1

usr/src/old/eqn/common_source/text.c [new file with mode: 0644]

diff --git a/usr/src/old/eqn/common_source/text.c b/usr/src/old/eqn/common_source/text.c
new file mode 100644 (file)
index 0000000..4e0bc71
--- /dev/null
@@ -0,0 +1,172 @@
+/*     text.c  4.1     83/02/11        */
+
+# 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(6 * ((ps>6)?ps:6));   /* ht in machine units */
+       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;
+}