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