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