xref: /csrg-svn/old/eqn/common_source/paren.c (revision 11014)
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