Commit | Line | Data |
---|---|---|
2791ff57 KB |
1 | /*- |
2 | * Copyright (c) 1991 The Regents of the University of California. | |
3 | * All rights reserved. | |
4 | * | |
5 | * %sccs.include.proprietary.c% | |
6 | */ | |
7 | ||
f6227721 | 8 | #ifndef lint |
2791ff57 KB |
9 | static char sccsid[] = "@(#)paren.c 4.4 (Berkeley) %G%"; |
10 | #endif /* not lint */ | |
f9b0a841 BS |
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; | |
6f1a2a65 | 18 | #ifndef NEQN |
f9b0a841 BS |
19 | lfont[yyval] = rfont[yyval] = 0; |
20 | n = (h1+(6*EFFPS(ps)-1))/(6*EFFPS(ps)); | |
6f1a2a65 BS |
21 | #else NEQN |
22 | n = max(b1+VERT(1), h1-b1-VERT(1)) / VERT(1); | |
23 | #endif NEQN | |
f9b0a841 BS |
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 | } | |
6f1a2a65 | 31 | #ifndef NEQN |
f9b0a841 BS |
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 ); | |
6f1a2a65 BS |
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 | |
f9b0a841 BS |
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 | } |