home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / neqn / text.c < prev   
Encoding:
C/C++ Source or Header  |  1979-01-10  |  3.2 KB  |  171 lines

  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(2);    /* 2 half-spaces */
  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. }
  171.