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