1*48252Sbostic /*-
2*48252Sbostic * Copyright (c) 1991 The Regents of the University of California.
3*48252Sbostic * All rights reserved.
4*48252Sbostic *
5*48252Sbostic * %sccs.include.proprietary.c%
6*48252Sbostic */
7*48252Sbostic
814486Ssam #ifndef lint
9*48252Sbostic static char sccsid[] = "@(#)paren.c 4.4 (Berkeley) 04/17/91";
10*48252Sbostic #endif /* not lint */
1111014Sshannon
1211014Sshannon # include "e.h"
1311014Sshannon
paren(leftc,p1,rightc)1411014Sshannon paren(leftc, p1, rightc) int p1, leftc, rightc; {
1511014Sshannon int n, m, h1, j, b1, v;
1611014Sshannon h1 = eht[p1]; b1 = ebase[p1];
1711014Sshannon yyval = p1;
1811023Sshannon #ifndef NEQN
1911014Sshannon lfont[yyval] = rfont[yyval] = 0;
2011014Sshannon n = (h1+(6*EFFPS(ps)-1))/(6*EFFPS(ps));
2111023Sshannon #else NEQN
2211023Sshannon n = max(b1+VERT(1), h1-b1-VERT(1)) / VERT(1);
2311023Sshannon #endif NEQN
2411014Sshannon if( n<2 ) n = 1;
2511014Sshannon m = n-2;
2611014Sshannon if (leftc=='{' || rightc == '}') {
2711014Sshannon n = n%2 ? n : ++n;
2811014Sshannon if( n<3 ) n=3;
2911014Sshannon m = n-3;
3011014Sshannon }
3111023Sshannon #ifndef NEQN
3211014Sshannon eht[yyval] = VERT(6 * ps * n);
3311014Sshannon ebase[yyval] = b1 + (eht[yyval]-h1)/2;
3411014Sshannon v = b1 - h1/2 + VERT( (ps*6*4)/10 );
3511023Sshannon #else NEQN
3611023Sshannon eht[yyval] = VERT(2 * n);
3711023Sshannon ebase[yyval] = (n)/2 * VERT(2);
3811023Sshannon if (n%2 == 0)
3911023Sshannon ebase[yyval] -= VERT(1);
4011023Sshannon v = b1 - h1/2 + VERT(1);
4111023Sshannon #endif NEQN
4211014Sshannon printf(".ds %d \\|\\v'%du'", yyval, v);
4311014Sshannon switch( leftc ) {
4411014Sshannon case 'n': /* nothing */
4511014Sshannon case '\0':
4611014Sshannon break;
4711014Sshannon case 'f': /* floor */
4811014Sshannon if (n <= 1)
4911014Sshannon printf("\\(lf");
5011014Sshannon else
5111014Sshannon brack(m, "\\(bv", "\\(bv", "\\(lf");
5211014Sshannon break;
5311014Sshannon case 'c': /* ceiling */
5411014Sshannon if (n <= 1)
5511014Sshannon printf("\\(lc");
5611014Sshannon else
5711014Sshannon brack(m, "\\(lc", "\\(bv", "\\(bv");
5811014Sshannon break;
5911014Sshannon case '{':
6011014Sshannon printf("\\b'\\(lt");
6111014Sshannon for(j = 0; j < m; j += 2) printf("\\(bv");
6211014Sshannon printf("\\(lk");
6311014Sshannon for(j = 0; j < m; j += 2) printf("\\(bv");
6411014Sshannon printf("\\(lb'");
6511014Sshannon break;
6611014Sshannon case '(':
6711014Sshannon brack(m, "\\(lt", "\\(bv", "\\(lb");
6811014Sshannon break;
6911014Sshannon case '[':
7011014Sshannon brack(m, "\\(lc", "\\(bv", "\\(lf");
7111014Sshannon break;
7211014Sshannon case '|':
7311014Sshannon brack(m, "|", "|", "|");
7411014Sshannon break;
7511014Sshannon default:
7611014Sshannon brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc);
7711014Sshannon break;
7811014Sshannon }
7911014Sshannon printf("\\v'%du'\\*(%d", -v, p1);
8011014Sshannon if( rightc ) {
8111014Sshannon printf("\\|\\v'%du'", v);
8211014Sshannon switch( rightc ) {
8311014Sshannon case 'f': /* floor */
8411014Sshannon if (n <= 1)
8511014Sshannon printf("\\(rf");
8611014Sshannon else
8711014Sshannon brack(m, "\\(bv", "\\(bv", "\\(rf");
8811014Sshannon break;
8911014Sshannon case 'c': /* ceiling */
9011014Sshannon if (n <= 1)
9111014Sshannon printf("\\(rc");
9211014Sshannon else
9311014Sshannon brack(m, "\\(rc", "\\(bv", "\\(bv");
9411014Sshannon break;
9511014Sshannon case '}':
9611014Sshannon printf("\\b'\\(rt");
9711014Sshannon for(j = 0; j< m; j += 2)printf("\\(bv");
9811014Sshannon printf("\\(rk");
9911014Sshannon for(j = 0; j< m; j += 2) printf("\\(bv");
10011014Sshannon printf("\\(rb'");
10111014Sshannon break;
10211014Sshannon case ']':
10311014Sshannon brack(m, "\\(rc", "\\(bv", "\\(rf");
10411014Sshannon break;
10511014Sshannon case ')':
10611014Sshannon brack(m, "\\(rt", "\\(bv", "\\(rb");
10711014Sshannon break;
10811014Sshannon case '|':
10911014Sshannon brack(m, "|", "|", "|");
11011014Sshannon break;
11111014Sshannon default:
11211014Sshannon brack(m, (char *) &rightc, (char *) &rightc, (char *) &rightc);
11311014Sshannon break;
11411014Sshannon }
11511014Sshannon printf("\\v'%du'", -v);
11611014Sshannon }
11711014Sshannon printf("\n");
11811014Sshannon if(dbg)printf(".\tcurly: h=%d b=%d n=%d v=%d l=%c, r=%c\n",
11911014Sshannon eht[yyval], ebase[yyval], n, v, leftc, rightc);
12011014Sshannon }
12111014Sshannon
brack(m,t,c,b)12211014Sshannon brack(m, t, c, b) int m; char *t, *c, *b; {
12311014Sshannon int j;
12411014Sshannon printf("\\b'%s", t);
12511014Sshannon for( j=0; j<m; j++)
12611014Sshannon printf("%s", c);
12711014Sshannon printf("%s'", b);
12811014Sshannon }
129