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