|
|
1.1 root 1: /* t5.c: read data for table */
2: # include "t..c"
3: gettbl()
4: {
5: extern char *chspace();
6: extern char *maknew();
7: int icol, ch;
8: cstore=cspace= chspace();
9: textflg=0;
10: for (nlin=nslin=0; gets1(cstore); nlin++)
11: {
12: stynum[nlin]=nslin;
13: if (prefix(".TE", cstore))
14: {
15: leftover=0;
16: break;
17: }
18: if (prefix(".TC", cstore) || prefix(".T&", cstore))
19: {
20: readspec();
21: nslin++;
22: }
23: if (nlin>=MAXLIN)
24: {
25: leftover=(int)cstore;
26: break;
27: }
28: fullbot[nlin]=0;
29: if (cstore[0] == '.' && !isdigit(cstore[1]))
30: {
31: instead[nlin] = cstore;
32: while (*cstore++);
33: continue;
34: }
35: else instead[nlin] = 0;
36: if (nodata(nlin))
37: {
38: if (ch = oneh(nlin))
39: fullbot[nlin]= ch;
40: nlin++;
41: nslin++;
42: fullbot[nlin] = 0;
43: instead[nlin] = (char *) 0;
44: }
45: table[nlin] = (struct colstr *) alocv((ncol+2)*sizeof(table[0][0]));
46: if (cstore[1]==0)
47: switch(cstore[0])
48: {
49: case '_': fullbot[nlin]= '-'; continue;
50: case '=': fullbot[nlin]= '='; continue;
51: }
52: stynum[nlin] = nslin;
53: nslin = min(nslin+1, nclin-1);
54: for (icol = 0; icol <ncol; icol++)
55: {
56: table[nlin][icol].col = cstore;
57: table[nlin][icol].rcol=0;
58: ch=1;
59: if (match(cstore, "T{")) /* text follows */
60: table[nlin][icol].col =
61: (char *)gettext(cstore, nlin, icol,
62: font[icol][stynum[nlin]],
63: csize[icol][stynum[nlin]]);
64: else
65: {
66: for(; (ch= *cstore) != '\0' && ch != tab; cstore++)
67: ;
68: *cstore++ = '\0';
69: switch(ctype(nlin,icol)) /* numerical or alpha, subcol */
70: {
71: case 'n':
72: table[nlin][icol].rcol = maknew(table[nlin][icol].col);
73: break;
74: case 'a':
75: table[nlin][icol].rcol = table[nlin][icol].col;
76: table[nlin][icol].col = "";
77: break;
78: }
79: }
80: while (ctype(nlin,icol+1)== 's') /* spanning */
81: table[nlin][++icol].col = "";
82: if (ch == '\0') break;
83: }
84: while (++icol <ncol+2)
85: {
86: table[nlin][icol].col = "";
87: table [nlin][icol].rcol=0;
88: }
89: while (*cstore != '\0')
90: cstore++;
91: if (cstore-cspace > MAXCHS)
92: cstore = cspace = chspace();
93: }
94: last = cstore;
95: permute();
96: if (textflg) untext();
97: return;
98: }
99: nodata(il)
100: {
101: int c;
102: for (c=0; c<ncol;c++)
103: {
104: switch(ctype(il,c))
105: {
106: case 'c': case 'n': case 'r': case 'l': case 's': case 'a':
107: return(0);
108: }
109: }
110: return(1);
111: }
112: oneh(lin)
113: {
114: int k, icol;
115: k = ctype(lin,0);
116: for(icol=1; icol<ncol; icol++)
117: {
118: if (k != ctype(lin,icol))
119: return(0);
120: }
121: return(k);
122: }
123: # define SPAN "\\^"
124: permute()
125: {
126: int irow, jcol, is;
127: char *start, *strig;
128: for(jcol=0; jcol<ncol; jcol++)
129: {
130: for(irow=1; irow<nlin; irow++)
131: {
132: if (vspand(irow,jcol,0))
133: {
134: is = prev(irow);
135: if (is<0)
136: error("Vertical spanning in first row not allowed");
137: start = table[is][jcol].col;
138: strig = table[is][jcol].rcol;
139: while (irow<nlin &&vspand(irow,jcol,0))
140: irow++;
141: table[--irow][jcol].col = start;
142: table[irow][jcol].rcol = strig;
143: while (is<irow)
144: {
145: table[is][jcol].rcol =0;
146: table[is][jcol].col= SPAN;
147: is = next(is);
148: }
149: }
150: }
151: }
152: }
153: vspand(ir,ij,ifform)
154: {
155: if (ir<0) return(0);
156: if (ir>=nlin)return(0);
157: if (instead[ir]) return(0);
158: if (ifform==0 && ctype(ir,ij)=='^') return(1);
159: if (table[ir][ij].rcol!=0) return(0);
160: if (fullbot[ir]) return(0);
161: return(vspen(table[ir][ij].col));
162: }
163: vspen(s)
164: char *s;
165: {
166: if (s==0) return(0);
167: if (!point(s)) return(0);
168: return(match(s, SPAN));
169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.