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