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