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