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