home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / eqn / paren.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  2.3 KB  |  106 lines

  1. # include "e.h"
  2.  
  3. paren(leftc, p1, rightc) int p1, leftc, rightc; {
  4.     int n, m, h1, j, b1, v;
  5.     h1 = eht[p1]; b1 = ebase[p1];
  6.     yyval = p1;
  7.     lfont[yyval] = rfont[yyval] = 0;
  8.     n = (h1+(6*EFFPS(ps)-1))/(6*EFFPS(ps));
  9.     if( n<2 ) n = 1;
  10.     m = n-2;
  11.     if (leftc=='{' || rightc == '}') {
  12.         n = n%2 ? n : ++n;
  13.         if( n<3 ) n=3;
  14.         m = n-3;
  15.     }
  16.     eht[yyval] = VERT(6 * ps * n);
  17.     ebase[yyval] = b1 + (eht[yyval]-h1)/2;
  18.     v = b1 - h1/2 + VERT( (ps*6*4)/10 );
  19.     printf(".ds %d \\|\\v'%du'", yyval, v);
  20.     switch( leftc ) {
  21.         case 'n':    /* nothing */
  22.         case '\0':
  23.             break;
  24.         case 'f':    /* floor */
  25.             if (n <= 1)
  26.                 printf("\\(lf");
  27.             else
  28.                 brack(m, "\\(bv", "\\(bv", "\\(lf");
  29.             break;
  30.         case 'c':    /* ceiling */
  31.             if (n <= 1)
  32.                 printf("\\(lc");
  33.             else
  34.                 brack(m, "\\(lc", "\\(bv", "\\(bv");
  35.             break;
  36.         case '{':
  37.             printf("\\b'\\(lt");
  38.             for(j = 0; j < m; j += 2) printf("\\(bv");
  39.             printf("\\(lk");
  40.             for(j = 0; j < m; j += 2) printf("\\(bv");
  41.             printf("\\(lb'");
  42.             break;
  43.         case '(':
  44.             brack(m, "\\(lt", "\\(bv", "\\(lb");
  45.             break;
  46.         case '[':
  47.             brack(m, "\\(lc", "\\(bv", "\\(lf");
  48.             break;
  49.         case '|':
  50.             brack(m, "|", "|", "|");
  51.             break;
  52.         default:
  53.             brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc);
  54.             break;
  55.         }
  56.     printf("\\v'%du'\\*(%d", -v, p1);
  57.     if( rightc ) {
  58.         printf("\\|\\v'%du'", v);
  59.         switch( rightc ) {
  60.             case 'f':    /* floor */
  61.                 if (n <= 1)
  62.                     printf("\\(rf");
  63.                 else
  64.                     brack(m, "\\(bv", "\\(bv", "\\(rf");
  65.                 break;
  66.             case 'c':    /* ceiling */
  67.                 if (n <= 1)
  68.                     printf("\\(rc");
  69.                 else
  70.                     brack(m, "\\(rc", "\\(bv", "\\(bv");
  71.                 break;
  72.             case '}':
  73.                 printf("\\b'\\(rt");
  74.                 for(j = 0; j< m; j += 2)printf("\\(bv");
  75.                 printf("\\(rk");
  76.                 for(j = 0; j< m; j += 2) printf("\\(bv");
  77.                 printf("\\(rb'");
  78.                 break;
  79.             case ']':
  80.                 brack(m, "\\(rc", "\\(bv", "\\(rf");
  81.                 break;
  82.             case ')':
  83.                 brack(m, "\\(rt", "\\(bv", "\\(rb");
  84.                 break;
  85.             case '|':
  86.                 brack(m, "|", "|", "|");
  87.                 break;
  88.             default:
  89.                 brack(m, (char *) &rightc, (char *) &rightc, (char *) &rightc);
  90.                 break;
  91.         }
  92.         printf("\\v'%du'", -v);
  93.     }
  94.     printf("\n");
  95.     if(dbg)printf(".\tcurly: h=%d b=%d n=%d v=%d l=%c, r=%c\n", 
  96.         eht[yyval], ebase[yyval], n, v, leftc, rightc);
  97. }
  98.  
  99. brack(m, t, c, b) int m; char *t, *c, *b; {
  100.     int j;
  101.     printf("\\b'%s", t);
  102.     for( j=0; j<m; j++)
  103.         printf("%s", c);
  104.     printf("%s'", b);
  105. }
  106.