xref: /plan9/sys/src/cmd/tbl/t4.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier /* t4.c: read table specification */
23e12c5d1SDavid du Colombier # include "t.h"
33e12c5d1SDavid du Colombier int	oncol;
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier void
getspec(void)63e12c5d1SDavid du Colombier getspec(void)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	int	icol, i;
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier 	qcol = findcol() + 1;/* must allow one extra for line at right */
113e12c5d1SDavid du Colombier 	garray(qcol);
123e12c5d1SDavid du Colombier 	sep[-1] = -1;
133e12c5d1SDavid du Colombier 	for (icol = 0; icol < qcol; icol++) {
143e12c5d1SDavid du Colombier 		sep[icol] = -1;
153e12c5d1SDavid du Colombier 		evenup[icol] = 0;
163e12c5d1SDavid du Colombier 		cll[icol][0] = 0;
173e12c5d1SDavid du Colombier 		for (i = 0; i < MAXHEAD; i++) {
183e12c5d1SDavid du Colombier 			csize[icol][i][0] = 0;
193e12c5d1SDavid du Colombier 			vsize[icol][i][0] = 0;
203e12c5d1SDavid du Colombier 			font[icol][i][0] = lefline[icol][i] = 0;
213e12c5d1SDavid du Colombier 			flags[icol][i] = 0;
223e12c5d1SDavid du Colombier 			style[icol][i] = 'l';
233e12c5d1SDavid du Colombier 		}
243e12c5d1SDavid du Colombier 	}
253e12c5d1SDavid du Colombier 	for (i = 0; i < MAXHEAD; i++)
263e12c5d1SDavid du Colombier 		lefline[qcol][i] = 0;	/* fixes sample55 looping */
273e12c5d1SDavid du Colombier 	nclin = ncol = 0;
283e12c5d1SDavid du Colombier 	oncol = 0;
293e12c5d1SDavid du Colombier 	left1flg = rightl = 0;
303e12c5d1SDavid du Colombier 	readspec();
31219b2ee8SDavid du Colombier 	Bprint(&tabout, ".rm");
323e12c5d1SDavid du Colombier 	for (i = 0; i < ncol; i++)
33219b2ee8SDavid du Colombier 		Bprint(&tabout, " %2s", reg(i, CRIGHT));
34219b2ee8SDavid du Colombier 	Bprint(&tabout, "\n");
353e12c5d1SDavid du Colombier }
363e12c5d1SDavid du Colombier 
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier void
readspec(void)393e12c5d1SDavid du Colombier readspec(void)
403e12c5d1SDavid du Colombier {
413e12c5d1SDavid du Colombier 	int	icol, c, sawchar, stopc, i;
423e12c5d1SDavid du Colombier 	char	sn[10], *snp, *temp;
433e12c5d1SDavid du Colombier 
443e12c5d1SDavid du Colombier 	sawchar = icol = 0;
453e12c5d1SDavid du Colombier 	while (c = get1char()) {
463e12c5d1SDavid du Colombier 		switch (c) {
473e12c5d1SDavid du Colombier 		default:
48*7dd7cddfSDavid du Colombier 			if (c != tab) {
49*7dd7cddfSDavid du Colombier 				char buf[64];
50*7dd7cddfSDavid du Colombier 				sprint(buf, "bad table specification character %c", c);
51*7dd7cddfSDavid du Colombier 				error(buf);
52*7dd7cddfSDavid du Colombier 			}
533e12c5d1SDavid du Colombier 		case ' ': /* note this is also case tab */
543e12c5d1SDavid du Colombier 			continue;
553e12c5d1SDavid du Colombier 		case '\n':
563e12c5d1SDavid du Colombier 			if (sawchar == 0)
573e12c5d1SDavid du Colombier 				continue;
583e12c5d1SDavid du Colombier 		case ',':
593e12c5d1SDavid du Colombier 		case '.': /* end of table specification */
603e12c5d1SDavid du Colombier 			ncol = max(ncol, icol);
613e12c5d1SDavid du Colombier 			if (lefline[ncol][nclin] > 0) {
623e12c5d1SDavid du Colombier 				ncol++;
633e12c5d1SDavid du Colombier 				rightl++;
643e12c5d1SDavid du Colombier 			};
653e12c5d1SDavid du Colombier 			if (sawchar)
663e12c5d1SDavid du Colombier 				nclin++;
673e12c5d1SDavid du Colombier 			if (nclin >= MAXHEAD)
683e12c5d1SDavid du Colombier 				error("too many lines in specification");
693e12c5d1SDavid du Colombier 			icol = 0;
703e12c5d1SDavid du Colombier 			if (ncol == 0 || nclin == 0)
713e12c5d1SDavid du Colombier 				error("no specification");
723e12c5d1SDavid du Colombier 			if (c == '.') {
733e12c5d1SDavid du Colombier 				while ((c = get1char()) && c != '\n')
743e12c5d1SDavid du Colombier 					if (c != ' ' && c != '\t')
753e12c5d1SDavid du Colombier 						error("dot not last character on format line");
763e12c5d1SDavid du Colombier 				/* fix up sep - default is 3 except at edge */
773e12c5d1SDavid du Colombier 				for (icol = 0; icol < ncol; icol++)
783e12c5d1SDavid du Colombier 					if (sep[icol] < 0)
793e12c5d1SDavid du Colombier 						sep[icol] =  icol + 1 < ncol ? 3 : 2;
803e12c5d1SDavid du Colombier 				if (oncol == 0)
813e12c5d1SDavid du Colombier 					oncol = ncol;
823e12c5d1SDavid du Colombier 				else if (oncol + 2 < ncol)
833e12c5d1SDavid du Colombier 					error("tried to widen table in T&, not allowed");
843e12c5d1SDavid du Colombier 				return;
853e12c5d1SDavid du Colombier 			}
863e12c5d1SDavid du Colombier 			sawchar = 0;
873e12c5d1SDavid du Colombier 			continue;
883e12c5d1SDavid du Colombier 		case 'C':
893e12c5d1SDavid du Colombier 		case 'S':
903e12c5d1SDavid du Colombier 		case 'R':
913e12c5d1SDavid du Colombier 		case 'N':
923e12c5d1SDavid du Colombier 		case 'L':
933e12c5d1SDavid du Colombier 		case 'A':
943e12c5d1SDavid du Colombier 			c += ('a' - 'A');
953e12c5d1SDavid du Colombier 		case '_':
963e12c5d1SDavid du Colombier 			if (c == '_')
973e12c5d1SDavid du Colombier 				c = '-';
983e12c5d1SDavid du Colombier 		case '=':
993e12c5d1SDavid du Colombier 		case '-':
1003e12c5d1SDavid du Colombier 		case '^':
1013e12c5d1SDavid du Colombier 		case 'c':
1023e12c5d1SDavid du Colombier 		case 's':
1033e12c5d1SDavid du Colombier 		case 'n':
1043e12c5d1SDavid du Colombier 		case 'r':
1053e12c5d1SDavid du Colombier 		case 'l':
1063e12c5d1SDavid du Colombier 		case 'a':
1073e12c5d1SDavid du Colombier 			style[icol][nclin] = c;
1083e12c5d1SDavid du Colombier 			if (c == 's' && icol <= 0)
1093e12c5d1SDavid du Colombier 				error("first column can not be S-type");
1103e12c5d1SDavid du Colombier 			if (c == 's' && style[icol-1][nclin] == 'a') {
111219b2ee8SDavid du Colombier 				Bprint(&tabout, ".tm warning: can't span a-type cols, changed to l\n");
1123e12c5d1SDavid du Colombier 				style[icol-1][nclin] = 'l';
1133e12c5d1SDavid du Colombier 			}
1143e12c5d1SDavid du Colombier 			if (c == 's' && style[icol-1][nclin] == 'n') {
115219b2ee8SDavid du Colombier 				Bprint(&tabout, ".tm warning: can't span n-type cols, changed to c\n");
1163e12c5d1SDavid du Colombier 				style[icol-1][nclin] = 'c';
1173e12c5d1SDavid du Colombier 			}
1183e12c5d1SDavid du Colombier 			icol++;
1193e12c5d1SDavid du Colombier 			if (c == '^' && nclin <= 0)
1203e12c5d1SDavid du Colombier 				error("first row can not contain vertical span");
1213e12c5d1SDavid du Colombier 			if (icol > qcol)
1223e12c5d1SDavid du Colombier 				error("too many columns in table");
1233e12c5d1SDavid du Colombier 			sawchar = 1;
1243e12c5d1SDavid du Colombier 			continue;
1253e12c5d1SDavid du Colombier 		case 'b':
1263e12c5d1SDavid du Colombier 		case 'i':
1273e12c5d1SDavid du Colombier 			c += 'A' - 'a';
1283e12c5d1SDavid du Colombier 		case 'B':
1293e12c5d1SDavid du Colombier 		case 'I':
1303e12c5d1SDavid du Colombier 			if (icol == 0)
1313e12c5d1SDavid du Colombier 				continue;
1323e12c5d1SDavid du Colombier 			snp = font[icol-1][nclin];
1333e12c5d1SDavid du Colombier 			snp[0] = (c == 'I' ? '2' : '3');
1343e12c5d1SDavid du Colombier 			snp[1] = 0;
1353e12c5d1SDavid du Colombier 			continue;
1363e12c5d1SDavid du Colombier 		case 't':
1373e12c5d1SDavid du Colombier 		case 'T':
1383e12c5d1SDavid du Colombier 			if (icol > 0)
1393e12c5d1SDavid du Colombier 				flags[icol-1][nclin] |= CTOP;
1403e12c5d1SDavid du Colombier 			continue;
1413e12c5d1SDavid du Colombier 		case 'd':
1423e12c5d1SDavid du Colombier 		case 'D':
1433e12c5d1SDavid du Colombier 			if (icol > 0)
1443e12c5d1SDavid du Colombier 				flags[icol-1][nclin] |= CDOWN;
1453e12c5d1SDavid du Colombier 			continue;
1463e12c5d1SDavid du Colombier 		case 'f':
1473e12c5d1SDavid du Colombier 		case 'F':
1483e12c5d1SDavid du Colombier 			if (icol == 0)
1493e12c5d1SDavid du Colombier 				continue;
1503e12c5d1SDavid du Colombier 			snp = font[icol-1][nclin];
1513e12c5d1SDavid du Colombier 			snp[0] = snp[1] = stopc = 0;
1523e12c5d1SDavid du Colombier 			for (i = 0; i < 2; i++) {
1533e12c5d1SDavid du Colombier 				c = get1char();
1543e12c5d1SDavid du Colombier 				if (i == 0 && c == '(') {
1553e12c5d1SDavid du Colombier 					stopc = ')';
1563e12c5d1SDavid du Colombier 					c = get1char();
1573e12c5d1SDavid du Colombier 				}
1583e12c5d1SDavid du Colombier 				if (c == 0)
1593e12c5d1SDavid du Colombier 					break;
1603e12c5d1SDavid du Colombier 				if (c == stopc) {
1613e12c5d1SDavid du Colombier 					stopc = 0;
1623e12c5d1SDavid du Colombier 					break;
1633e12c5d1SDavid du Colombier 				}
1643e12c5d1SDavid du Colombier 				if (stopc == 0)
1653e12c5d1SDavid du Colombier 					if (c == ' ' || c == tab )
1663e12c5d1SDavid du Colombier 						break;
1673e12c5d1SDavid du Colombier 				if (c == '\n' || c == '|') {
1683e12c5d1SDavid du Colombier 					un1getc(c);
1693e12c5d1SDavid du Colombier 					break;
1703e12c5d1SDavid du Colombier 				}
1713e12c5d1SDavid du Colombier 				snp[i] = c;
1723e12c5d1SDavid du Colombier 				if (c >= '0' && c <= '9')
1733e12c5d1SDavid du Colombier 					break;
1743e12c5d1SDavid du Colombier 			}
1753e12c5d1SDavid du Colombier 			if (stopc)
1763e12c5d1SDavid du Colombier 				if (get1char() != stopc)
1773e12c5d1SDavid du Colombier 					error("Nonterminated font name");
1783e12c5d1SDavid du Colombier 			continue;
1793e12c5d1SDavid du Colombier 		case 'P':
1803e12c5d1SDavid du Colombier 		case 'p':
1813e12c5d1SDavid du Colombier 			if (icol <= 0)
1823e12c5d1SDavid du Colombier 				continue;
1833e12c5d1SDavid du Colombier 			temp = snp = csize[icol-1][nclin];
1843e12c5d1SDavid du Colombier 			while (c = get1char()) {
1853e12c5d1SDavid du Colombier 				if (c == ' ' || c == tab || c == '\n')
1863e12c5d1SDavid du Colombier 					break;
1873e12c5d1SDavid du Colombier 				if (c == '-' || c == '+')
1883e12c5d1SDavid du Colombier 					if (snp > temp)
1893e12c5d1SDavid du Colombier 						break;
1903e12c5d1SDavid du Colombier 					else
1913e12c5d1SDavid du Colombier 						*snp++ = c;
1923e12c5d1SDavid du Colombier 				else if (digit(c))
1933e12c5d1SDavid du Colombier 					*snp++ = c;
1943e12c5d1SDavid du Colombier 				else
1953e12c5d1SDavid du Colombier 					break;
1963e12c5d1SDavid du Colombier 				if (snp - temp > 4)
1973e12c5d1SDavid du Colombier 					error("point size too large");
1983e12c5d1SDavid du Colombier 			}
1993e12c5d1SDavid du Colombier 			*snp = 0;
2003e12c5d1SDavid du Colombier 			if (atoi(temp) > 36)
2013e12c5d1SDavid du Colombier 				error("point size unreasonable");
2023e12c5d1SDavid du Colombier 			un1getc (c);
2033e12c5d1SDavid du Colombier 			continue;
2043e12c5d1SDavid du Colombier 		case 'V':
2053e12c5d1SDavid du Colombier 		case 'v':
2063e12c5d1SDavid du Colombier 			if (icol <= 0)
2073e12c5d1SDavid du Colombier 				continue;
2083e12c5d1SDavid du Colombier 			temp = snp = vsize[icol-1][nclin];
2093e12c5d1SDavid du Colombier 			while (c = get1char()) {
2103e12c5d1SDavid du Colombier 				if (c == ' ' || c == tab || c == '\n')
2113e12c5d1SDavid du Colombier 					break;
2123e12c5d1SDavid du Colombier 				if (c == '-' || c == '+')
2133e12c5d1SDavid du Colombier 					if (snp > temp)
2143e12c5d1SDavid du Colombier 						break;
2153e12c5d1SDavid du Colombier 					else
2163e12c5d1SDavid du Colombier 						*snp++ = c;
2173e12c5d1SDavid du Colombier 				else if (digit(c))
2183e12c5d1SDavid du Colombier 					*snp++ = c;
2193e12c5d1SDavid du Colombier 				else
2203e12c5d1SDavid du Colombier 					break;
2213e12c5d1SDavid du Colombier 				if (snp - temp > 4)
2223e12c5d1SDavid du Colombier 					error("vertical spacing value too large");
2233e12c5d1SDavid du Colombier 			}
2243e12c5d1SDavid du Colombier 			*snp = 0;
2253e12c5d1SDavid du Colombier 			un1getc(c);
2263e12c5d1SDavid du Colombier 			continue;
2273e12c5d1SDavid du Colombier 		case 'w':
2283e12c5d1SDavid du Colombier 		case 'W':
2293e12c5d1SDavid du Colombier 			snp = cll [icol-1];
2303e12c5d1SDavid du Colombier 			/* Dale Smith didn't like this check - possible to have two text blocks
2313e12c5d1SDavid du Colombier 		   of different widths now ....
2323e12c5d1SDavid du Colombier 			if (*snp)
2333e12c5d1SDavid du Colombier 				{
234219b2ee8SDavid du Colombier 				Bprint(&tabout, "Ignored second width specification");
2353e12c5d1SDavid du Colombier 				continue;
2363e12c5d1SDavid du Colombier 				}
2373e12c5d1SDavid du Colombier 		/* end commented out code ... */
2383e12c5d1SDavid du Colombier 			stopc = 0;
2393e12c5d1SDavid du Colombier 			while (c = get1char()) {
2403e12c5d1SDavid du Colombier 				if (snp == cll[icol-1] && c == '(') {
2413e12c5d1SDavid du Colombier 					stopc = ')';
2423e12c5d1SDavid du Colombier 					continue;
2433e12c5d1SDavid du Colombier 				}
2443e12c5d1SDavid du Colombier 				if ( !stopc && (c > '9' || c < '0'))
2453e12c5d1SDavid du Colombier 					break;
2463e12c5d1SDavid du Colombier 				if (stopc && c == stopc)
2473e12c5d1SDavid du Colombier 					break;
2483e12c5d1SDavid du Colombier 				*snp++ = c;
2493e12c5d1SDavid du Colombier 			}
2503e12c5d1SDavid du Colombier 			*snp = 0;
2513e12c5d1SDavid du Colombier 			if (snp - cll[icol-1] > CLLEN)
2523e12c5d1SDavid du Colombier 				error ("column width too long");
2533e12c5d1SDavid du Colombier 			if (!stopc)
2543e12c5d1SDavid du Colombier 				un1getc(c);
2553e12c5d1SDavid du Colombier 			continue;
2563e12c5d1SDavid du Colombier 		case 'e':
2573e12c5d1SDavid du Colombier 		case 'E':
2583e12c5d1SDavid du Colombier 			if (icol < 1)
2593e12c5d1SDavid du Colombier 				continue;
2603e12c5d1SDavid du Colombier 			evenup[icol-1] = 1;
2613e12c5d1SDavid du Colombier 			evenflg = 1;
2623e12c5d1SDavid du Colombier 			continue;
2633e12c5d1SDavid du Colombier 		case 'z':
2643e12c5d1SDavid du Colombier 		case 'Z': /* zero width-ignre width this item */
2653e12c5d1SDavid du Colombier 			if (icol < 1)
2663e12c5d1SDavid du Colombier 				continue;
2673e12c5d1SDavid du Colombier 			flags[icol-1][nclin] |= ZEROW;
2683e12c5d1SDavid du Colombier 			continue;
2693e12c5d1SDavid du Colombier 		case 'u':
2703e12c5d1SDavid du Colombier 		case 'U': /* half line up */
2713e12c5d1SDavid du Colombier 			if (icol < 1)
2723e12c5d1SDavid du Colombier 				continue;
2733e12c5d1SDavid du Colombier 			flags[icol-1][nclin] |= HALFUP;
2743e12c5d1SDavid du Colombier 			continue;
2753e12c5d1SDavid du Colombier 		case '0':
2763e12c5d1SDavid du Colombier 		case '1':
2773e12c5d1SDavid du Colombier 		case '2':
2783e12c5d1SDavid du Colombier 		case '3':
2793e12c5d1SDavid du Colombier 		case '4':
2803e12c5d1SDavid du Colombier 		case '5':
2813e12c5d1SDavid du Colombier 		case '6':
2823e12c5d1SDavid du Colombier 		case '7':
2833e12c5d1SDavid du Colombier 		case '8':
2843e12c5d1SDavid du Colombier 		case '9':
2853e12c5d1SDavid du Colombier 			sn[0] = c;
2863e12c5d1SDavid du Colombier 			snp = sn + 1;
2873e12c5d1SDavid du Colombier 			while (digit(*snp++ = c = get1char()))
2883e12c5d1SDavid du Colombier 				;
2893e12c5d1SDavid du Colombier 			un1getc(c);
2903e12c5d1SDavid du Colombier 			sep[icol-1] = max(sep[icol-1], numb(sn));
2913e12c5d1SDavid du Colombier 			continue;
2923e12c5d1SDavid du Colombier 		case '|':
2933e12c5d1SDavid du Colombier 			lefline[icol][nclin]++;
2943e12c5d1SDavid du Colombier 			if (icol == 0)
2953e12c5d1SDavid du Colombier 				left1flg = 1;
2963e12c5d1SDavid du Colombier 			continue;
2973e12c5d1SDavid du Colombier 		}
2983e12c5d1SDavid du Colombier 	}
2993e12c5d1SDavid du Colombier 	error("EOF reading table specification");
3003e12c5d1SDavid du Colombier }
3013e12c5d1SDavid du Colombier 
3023e12c5d1SDavid du Colombier 
3033e12c5d1SDavid du Colombier int
findcol(void)3043e12c5d1SDavid du Colombier findcol(void)
3053e12c5d1SDavid du Colombier {
3063e12c5d1SDavid du Colombier # define FLNLIM 200
3073e12c5d1SDavid du Colombier 	/* this counts the number of columns and then puts the line back*/
3083e12c5d1SDavid du Colombier 	char	*s, line[FLNLIM+2], *p;
3093e12c5d1SDavid du Colombier 	int	c, n = 0, inpar = 0;
3103e12c5d1SDavid du Colombier 
311219b2ee8SDavid du Colombier 	while ((c = get1char()) != 0 && c == ' ')
3123e12c5d1SDavid du Colombier 		;
3133e12c5d1SDavid du Colombier 	if (c != '\n')
3143e12c5d1SDavid du Colombier 		un1getc(c);
3153e12c5d1SDavid du Colombier 	for (s = line; *s = c = get1char(); s++) {
3163e12c5d1SDavid du Colombier 		if (c == ')')
3173e12c5d1SDavid du Colombier 			inpar = 0;
3183e12c5d1SDavid du Colombier 		if (inpar)
3193e12c5d1SDavid du Colombier 			continue;
320219b2ee8SDavid du Colombier 		if (c == '\n' || c == 0 || c == '.' || c == ',')
3213e12c5d1SDavid du Colombier 			break;
3223e12c5d1SDavid du Colombier 		else if (c == '(')
3233e12c5d1SDavid du Colombier 			inpar = 1;
3243e12c5d1SDavid du Colombier 		else if (s >= line + FLNLIM)
3253e12c5d1SDavid du Colombier 			error("too long spec line");
3263e12c5d1SDavid du Colombier 	}
3273e12c5d1SDavid du Colombier 	for (p = line; p < s; p++)
3283e12c5d1SDavid du Colombier 		switch (*p) {
3293e12c5d1SDavid du Colombier 		case 'l':
3303e12c5d1SDavid du Colombier 		case 'r':
3313e12c5d1SDavid du Colombier 		case 'c':
3323e12c5d1SDavid du Colombier 		case 'n':
3333e12c5d1SDavid du Colombier 		case 'a':
3343e12c5d1SDavid du Colombier 		case 's':
3353e12c5d1SDavid du Colombier 		case 'L':
3363e12c5d1SDavid du Colombier 		case 'R':
3373e12c5d1SDavid du Colombier 		case 'C':
3383e12c5d1SDavid du Colombier 		case 'N':
3393e12c5d1SDavid du Colombier 		case 'A':
3403e12c5d1SDavid du Colombier 		case 'S':
3413e12c5d1SDavid du Colombier 		case '-':
3423e12c5d1SDavid du Colombier 		case '=':
3433e12c5d1SDavid du Colombier 		case '_':
3443e12c5d1SDavid du Colombier 			n++;
3453e12c5d1SDavid du Colombier 		}
3463e12c5d1SDavid du Colombier 	while (p >= line)
3473e12c5d1SDavid du Colombier 		un1getc(*p--);
3483e12c5d1SDavid du Colombier 	return(n);
3493e12c5d1SDavid du Colombier }
3503e12c5d1SDavid du Colombier 
3513e12c5d1SDavid du Colombier 
3523e12c5d1SDavid du Colombier void
garray(int qcol)3533e12c5d1SDavid du Colombier garray(int qcol)
3543e12c5d1SDavid du Colombier {
3553e12c5d1SDavid du Colombier 	style =  (int (*)[]) getcore(MAXHEAD * qcol, sizeof(int));
3563e12c5d1SDavid du Colombier 	evenup = (int *) getcore(qcol, sizeof(int));
3573e12c5d1SDavid du Colombier 	lefline = (int (*)[]) getcore(MAXHEAD * (qcol + 1), sizeof (int)); /*+1 for sample55 loop - others may need it too*/
3583e12c5d1SDavid du Colombier 	font = (char (*)[][2]) getcore(MAXHEAD * qcol, 2);
3593e12c5d1SDavid du Colombier 	csize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD * qcol, 4);
3603e12c5d1SDavid du Colombier 	vsize = (char (*)[MAXHEAD][4]) getcore(MAXHEAD * qcol, 4);
3613e12c5d1SDavid du Colombier 	flags =  (int (*)[]) getcore(MAXHEAD * qcol, sizeof(int));
3623e12c5d1SDavid du Colombier 	cll = (char (*)[])getcore(qcol, CLLEN);
3633e12c5d1SDavid du Colombier 	sep = (int *) getcore(qcol + 1, sizeof(int));
3643e12c5d1SDavid du Colombier 	sep++; /* sep[-1] must be legal */
3653e12c5d1SDavid du Colombier 	used = (int *) getcore(qcol + 1, sizeof(int));
3663e12c5d1SDavid du Colombier 	lused = (int *) getcore(qcol + 1, sizeof(int));
3673e12c5d1SDavid du Colombier 	rused = (int *) getcore(qcol + 1, sizeof(int));
3683e12c5d1SDavid du Colombier 	doubled = (int *) getcore(qcol + 1, sizeof(int));
3693e12c5d1SDavid du Colombier 	acase = (int *) getcore(qcol + 1, sizeof(int));
3703e12c5d1SDavid du Colombier 	topat = (int *) getcore(qcol + 1, sizeof(int));
3713e12c5d1SDavid du Colombier }
3723e12c5d1SDavid du Colombier 
3733e12c5d1SDavid du Colombier 
3743e12c5d1SDavid du Colombier char	*
getcore(int a,int b)3753e12c5d1SDavid du Colombier getcore(int a, int b)
3763e12c5d1SDavid du Colombier {
3773e12c5d1SDavid du Colombier 	char	*x;
3783e12c5d1SDavid du Colombier 	x = calloc(a, b);
3793e12c5d1SDavid du Colombier 	if (x == 0)
3803e12c5d1SDavid du Colombier 		error("Couldn't get memory");
3813e12c5d1SDavid du Colombier 	return(x);
3823e12c5d1SDavid du Colombier }
3833e12c5d1SDavid du Colombier 
3843e12c5d1SDavid du Colombier 
3853e12c5d1SDavid du Colombier void
freearr(void)3863e12c5d1SDavid du Colombier freearr(void)
3873e12c5d1SDavid du Colombier {
3883e12c5d1SDavid du Colombier 	free(style);
3893e12c5d1SDavid du Colombier 	free(evenup);
3903e12c5d1SDavid du Colombier 	free(lefline);
3913e12c5d1SDavid du Colombier 	free(flags);
3923e12c5d1SDavid du Colombier 	free(font);
3933e12c5d1SDavid du Colombier 	free(csize);
3943e12c5d1SDavid du Colombier 	free(vsize);
3953e12c5d1SDavid du Colombier 	free(cll);
3963e12c5d1SDavid du Colombier 	free(--sep);	/* netnews says this should be --sep because incremented earlier! */
3973e12c5d1SDavid du Colombier 	free(used);
3983e12c5d1SDavid du Colombier 	free(lused);
3993e12c5d1SDavid du Colombier 	free(rused);
4003e12c5d1SDavid du Colombier 	free(doubled);
4013e12c5d1SDavid du Colombier 	free(acase);
4023e12c5d1SDavid du Colombier 	free(topat);
4033e12c5d1SDavid du Colombier }
4043e12c5d1SDavid du Colombier 
4053e12c5d1SDavid du Colombier 
406