#ifndef lint
static char sccsid[] = "@(#)paren.c	2.4 (CWI) 87/12/22";
#endif lint
# include "e.h"
# include "paren.h"

paren(leftc, p1, rightc)
	int p1, leftc, rightc;
{
	int n, m, j;
	float h1, b1;
	extern float Parenbase;

	h1 = eht[p1];
	b1 = ebase[p1];
	yyval = p1;
	lfont[yyval] = rfont[yyval] = 0;
	n = REL(h1,ps) + 0.99;	/* ceiling */
	if (n < 2)
		n = 1;
	m = n - 2;
	if (leftc == '{' || rightc == '}') {
		n = n%2 ? n : ++n;
		if (n < 3)
			n = 3;
		m = n-3;
	}
	eht[yyval] = EM((float) n, ps);
	ebase[yyval] = eht[yyval]/2 - EM(Parenbase, ps);
	printf(".ds %d \\|", yyval);
	switch( leftc ) {
		case 'n':	/* nothing */
		case '\0':
			break;
		case 'f':	/* floor */
			brack2(B_LFLOOR, n); break;
		case 'c':	/* ceiling */
			brack2(B_LCEILING, n); break;
		case '{':
			brack2(B_LCURLY, n); break;
		case '[':
			brack2(B_LSQUARE, n); break;
		case '(':
			brack2(B_LROUND, n); break;
		case '|':
			brack2(B_BAR, n); break;
		default:
			brack(m, (char *) &leftc, (char *) &leftc, (char *) &leftc);
			break;
		}
	printf("\\*(%d", p1);
	if( rightc ) {
		switch( rightc ) {
			case 'f':	/* floor */
				brack2(B_RFLOOR, n); break;
			case 'c':	/* ceiling */
				brack2(B_RCEILING, n); break;
			case '}':
				brack2(B_RCURLY, n); break;
			case ']':
				brack2(B_RSQUARE, n); break;
			case ')':
				brack2(B_RROUND, n); break;
			case '|':
				brack2(B_BAR, n); break;
			default:
				brack(m, (char *) &rightc, (char *) &rightc, (char *) &rightc);
				break;
		}
	}
	putchar('\n');
	if(dbg)printf(".\tcurly: h=%d b=%d n=%d l=%c, r=%c\n", 
		eht[yyval], ebase[yyval], n, leftc, rightc);
}

brack(m, t, c, b)
	int m;
	char *t, *c, *b;
{
	int j;
	printf("\\b'%s", t);
	for( j=0; j < m; j++)
		printf("%s", c);
	printf("%s'", b);
}

/*
 *	brack2: better bracket building function, implemented for the
 *	benefit of the sanders whose bracket parts are only 0.7 ems high.
 *	type	one of the B_* defines
 *	height	of the bracket in ems
 *	If type is B_LCURLY or B_RCURLY, height must be an odd number.
 */

brack2(type, height)
int type, height;
{
	register int i;

	if (height <= 1) {
		switch (type) {
		case B_LCEILING:
		case B_RCEILING:
			fputs(b_top[type], stdout);
			return;

		case B_LFLOOR:
		case B_RFLOOR:
			fputs(b_bottom[type], stdout);
			return;
		}
	}
	printf("\\b'%s",b_top[type]);
	if (hascentre(type)) {
		register int i;

		for (i=(height-3)/2; i>0; i--)
			fputs(b_riser[type], stdout);
		fputs(b_centre[type], stdout);
		for (i=(height-3)/2; i>0; i--)
			fputs(b_riser[type], stdout);
	} else
		for (i=height-2; i>0; i--) fputs(b_riser[type], stdout);

	printf("%s'", b_bottom[type]);
}
