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