xref: /csrg-svn/old/tbl/t4.c (revision 34023)
114508Ssam #ifndef lint
2*34023Sbostic static char sccsid[] = "@(#)t4.c	4.3 04/19/88";
314508Ssam #endif
411031Sshannon 
511031Sshannon  /* t4.c: read table specification */
611031Sshannon # include "t..c"
711031Sshannon int oncol;
811031Sshannon getspec()
911031Sshannon {
1011031Sshannon int icol, i;
1111031Sshannon for(icol=0; icol<MAXCOL; icol++)
1211031Sshannon 	{
1311031Sshannon 	sep[icol]= -1;
1411031Sshannon 	evenup[icol]=0;
1511031Sshannon 	cll[icol][0]=0;
1611031Sshannon 	for(i=0; i<MAXHEAD; i++)
1711031Sshannon 		{
1811031Sshannon 		csize[i][icol][0]=0;
1911031Sshannon 		vsize[i][icol][0]=0;
2011031Sshannon 		font[i][icol][0] = lefline[i][icol] = 0;
2111031Sshannon 		ctop[i][icol]=0;
2211031Sshannon 		style[i][icol]= 'l';
2311031Sshannon 		}
2411031Sshannon 	}
2511031Sshannon nclin=ncol=0;
2611031Sshannon oncol =0;
2711031Sshannon left1flg=rightl=0;
2811031Sshannon readspec();
2911031Sshannon fprintf(tabout, ".rm");
3011031Sshannon for(i=0; i<ncol; i++)
3111031Sshannon 	fprintf(tabout, " %02d", 80+i);
3211031Sshannon fprintf(tabout, "\n");
3311031Sshannon }
3411031Sshannon readspec()
3511031Sshannon {
3611031Sshannon int icol, c, sawchar, stopc, i;
3711031Sshannon char sn[10], *snp, *temp;
3811031Sshannon sawchar=icol=0;
3911031Sshannon while (c=get1char())
4011031Sshannon 	{
4111031Sshannon 	switch(c)
4211031Sshannon 		{
4311031Sshannon 		default:
4411031Sshannon 			if (c != tab)
4511031Sshannon 			error("bad table specification character");
4611031Sshannon 		case ' ': /* note this is also case tab */
4711031Sshannon 			continue;
4811031Sshannon 		case '\n':
4911031Sshannon 			if(sawchar==0) continue;
5011031Sshannon 		case ',':
5111031Sshannon 		case '.': /* end of table specification */
5211031Sshannon 			ncol = max(ncol, icol);
5311031Sshannon 			if (lefline[nclin][ncol]>0) {ncol++; rightl++;};
5411031Sshannon 			if(sawchar)
5511031Sshannon 				nclin++;
5611031Sshannon 			if (nclin>=MAXHEAD)
5711031Sshannon 				error("too many lines in specification");
5811031Sshannon 			icol=0;
5911031Sshannon 			if (ncol==0 || nclin==0)
6011031Sshannon 				error("no specification");
6111031Sshannon 			if (c== '.')
6211031Sshannon 				{
6311031Sshannon 				while ((c=get1char()) && c != '\n')
6411031Sshannon 					if (c != ' ' && c != '\t')
6511031Sshannon 						error("dot not last character on format line");
6611031Sshannon 				/* fix up sep - default is 3 except at edge */
6711031Sshannon 				for(icol=0; icol<ncol; icol++)
6811031Sshannon 					if (sep[icol]<0)
6911031Sshannon 						sep[icol] =  icol+1<ncol ? 3 : 1;
7011031Sshannon 				if (oncol == 0)
7111031Sshannon 					oncol = ncol;
7211031Sshannon 				else if (oncol +2 <ncol)
7311031Sshannon 					error("tried to widen table in T&, not allowed");
7411031Sshannon 				return;
7511031Sshannon 				}
7611031Sshannon 			sawchar=0;
7711031Sshannon 			continue;
7811031Sshannon 		case 'C': case 'S': case 'R': case 'N': case 'L':  case 'A':
7911031Sshannon 			c += ('a'-'A');
8011031Sshannon 		case '_': if (c=='_') c= '-';
8111031Sshannon 		case '=': case '-':
8211031Sshannon 		case '^':
8311031Sshannon 		case 'c': case 's': case 'n': case 'r': case 'l':  case 'a':
84*34023Sbostic 			if (icol>=MAXCOL)
85*34023Sbostic 				error("too many columns in table");
8611031Sshannon 			style[nclin][icol]=c;
8711031Sshannon 			if (c== 's' && icol<=0)
8811031Sshannon 				error("first column can not be S-type");
8911031Sshannon 			if (c=='s' && style[nclin][icol-1] == 'a')
9011031Sshannon 				{
9111031Sshannon 				fprintf(tabout, ".tm warning: can't span a-type cols, changed to l\n");
9211031Sshannon 				style[nclin][icol-1] = 'l';
9311031Sshannon 				}
9411031Sshannon 			if (c=='s' && style[nclin][icol-1] == 'n')
9511031Sshannon 				{
9611031Sshannon 				fprintf(tabout, ".tm warning: can't span n-type cols, changed to c\n");
9711031Sshannon 				style[nclin][icol-1] = 'c';
9811031Sshannon 				}
9911031Sshannon 			icol++;
10011031Sshannon 			if (c=='^' && nclin<=0)
10111031Sshannon 				error("first row can not contain vertical span");
10211031Sshannon 			sawchar=1;
10311031Sshannon 			continue;
10411031Sshannon 		case 'b': case 'i':
10511031Sshannon 			c += 'A'-'a';
10611031Sshannon 		case 'B': case 'I':
10711031Sshannon 			if (icol==0) continue;
10811031Sshannon 			snp=font[nclin][icol-1];
10911031Sshannon 			snp[0]= (c=='I' ? '2' : '3');
11011031Sshannon 			snp[1]=0;
11111031Sshannon 			continue;
11211031Sshannon 		case 't': case 'T':
11311031Sshannon 			if (icol>0)
11411031Sshannon 			ctop[nclin][icol-1] = 1;
11511031Sshannon 			continue;
11611031Sshannon 		case 'd': case 'D':
11711031Sshannon 			if (icol>0)
11811031Sshannon 			ctop[nclin][icol-1] = -1;
11911031Sshannon 			continue;
12011031Sshannon 		case 'f': case 'F':
12111031Sshannon 			if (icol==0) continue;
12211031Sshannon 			snp=font[nclin][icol-1];
12311031Sshannon 			snp[0]=snp[1]=stopc=0;
12411031Sshannon 			for(i=0; i<2; i++)
12511031Sshannon 				{
12611031Sshannon 				c = get1char();
12711031Sshannon 				if (i==0 && c=='(')
12811031Sshannon 					{
12911031Sshannon 					stopc=')';
13011031Sshannon 					c = get1char();
13111031Sshannon 					}
13211031Sshannon 				if (c==0) break;
13311031Sshannon 				if (c==stopc) {stopc=0; break;}
13411031Sshannon 				if (stopc==0)  if (c==' ' || c== tab ) break;
13511031Sshannon 				if (c=='\n'){un1getc(c); break;}
13611031Sshannon 				snp[i] = c;
13711031Sshannon 				if (c>= '0' && c<= '9') break;
13811031Sshannon 				}
13911031Sshannon 			if (stopc) if (get1char()!=stopc)
14011031Sshannon 				error("Nonterminated font name");
14111031Sshannon 			continue;
14211031Sshannon 		case 'P': case 'p':
14311031Sshannon 			if (icol<=0) continue;
14411031Sshannon 			temp = snp = csize[nclin][icol-1];
14511031Sshannon 			while (c = get1char())
14611031Sshannon 				{
14711031Sshannon 				if (c== ' ' || c== tab || c=='\n') break;
14811031Sshannon 				if (c=='-' || c == '+')
14911031Sshannon 					if (snp>temp)
15011031Sshannon 						break;
15111031Sshannon 					else
15211031Sshannon 						*snp++=c;
15311031Sshannon 				else
15411031Sshannon 				if (digit(c))
15511031Sshannon 					*snp++ = c;
15611031Sshannon 				else break;
15711031Sshannon 				if (snp-temp>4)
15811031Sshannon 					error("point size too large");
15911031Sshannon 				}
16011031Sshannon 			*snp = 0;
16111031Sshannon 			if (atoi(temp)>36)
16211031Sshannon 				error("point size unreasonable");
16311031Sshannon 			un1getc (c);
16411031Sshannon 			continue;
16511031Sshannon 		case 'V': case 'v':
16611031Sshannon 			if (icol<=0) continue;
16711031Sshannon 			temp = snp = vsize[nclin][icol-1];
16811031Sshannon 			while (c = get1char())
16911031Sshannon 				{
17011031Sshannon 				if (c== ' ' || c== tab || c=='\n') break;
17111031Sshannon 				if (c=='-' || c == '+')
17211031Sshannon 					if (snp>temp)
17311031Sshannon 						break;
17411031Sshannon 					else
17511031Sshannon 						*snp++=c;
17611031Sshannon 				else
17711031Sshannon 				if (digit(c))
17811031Sshannon 					*snp++ = c;
17911031Sshannon 				else break;
18011031Sshannon 				if (snp-temp>4)
18111031Sshannon 					error("vertical spacing value too large");
18211031Sshannon 				}
18311031Sshannon 			*snp=0;
18411031Sshannon 			un1getc(c);
18511031Sshannon 			continue;
18611031Sshannon 		case 'w': case 'W':
18711031Sshannon 			snp = cll [icol-1];
18811031Sshannon 		/* Dale Smith didn't like this check - possible to have two text blocks
18911031Sshannon 		   of different widths now ....
19011031Sshannon 			if (*snp)
19111031Sshannon 				{
19211031Sshannon 				fprintf(tabout, "Ignored second width specification");
19311031Sshannon 				continue;
19411031Sshannon 				}
19511031Sshannon 		/* end commented out code ... */
19611031Sshannon 			stopc=0;
19711031Sshannon 			while (c = get1char())
19811031Sshannon 				{
19911031Sshannon 				if (snp==cll[icol-1] && c=='(')
20011031Sshannon 					{
20111031Sshannon 					stopc = ')';
20211031Sshannon 					continue;
20311031Sshannon 					}
20411031Sshannon 				if ( !stopc && (c>'9' || c< '0'))
20511031Sshannon 					break;
20611031Sshannon 				if (stopc && c== stopc)
20711031Sshannon 					break;
20811031Sshannon 				*snp++ =c;
20911031Sshannon 				}
21011031Sshannon 			*snp=0;
21111031Sshannon 			if (snp-cll[icol-1]>CLLEN)
21211031Sshannon 				error ("column width too long");
21311031Sshannon 			if (!stopc)
21411031Sshannon 				un1getc(c);
21511031Sshannon 			continue;
21611031Sshannon 		case 'e': case 'E':
21711031Sshannon 			if (icol<1) continue;
21811031Sshannon 			evenup[icol-1]=1;
21911031Sshannon 			evenflg=1;
22011031Sshannon 			continue;
22111031Sshannon 		case '0': case '1': case '2': case '3': case '4':
22211031Sshannon 		case '5': case '6': case '7': case '8': case '9':
22311031Sshannon 			sn[0] = c;
22411031Sshannon 			snp=sn+1;
22511031Sshannon 			while (digit(*snp++ = c = get1char()))
22611031Sshannon 				;
22711031Sshannon 			un1getc(c);
22811031Sshannon 			sep[icol-1] = max(sep[icol-1], numb(sn));
22911031Sshannon 			continue;
23011031Sshannon 		case '|':
23111031Sshannon 			lefline[nclin][icol]++;
23211031Sshannon 			if (icol==0) left1flg=1;
23311031Sshannon 			continue;
23411031Sshannon 		}
23511031Sshannon 	}
23611031Sshannon error("EOF reading table specification");
23711031Sshannon }
238