Blame


1 5cedca1b 2004-05-15 devnull /*
2 5cedca1b 2004-05-15 devnull * troff3.c
3 fa325e9b 2020-01-10 cross *
4 5cedca1b 2004-05-15 devnull * macro and string routines, storage allocation
5 5cedca1b 2004-05-15 devnull */
6 5cedca1b 2004-05-15 devnull
7 5cedca1b 2004-05-15 devnull #include "tdef.h"
8 5cedca1b 2004-05-15 devnull #include "fns.h"
9 5cedca1b 2004-05-15 devnull #include "ext.h"
10 5cedca1b 2004-05-15 devnull
11 5cedca1b 2004-05-15 devnull Tchar *argtop;
12 5cedca1b 2004-05-15 devnull int pagech = '%';
13 5cedca1b 2004-05-15 devnull int strflg;
14 5cedca1b 2004-05-15 devnull
15 5cedca1b 2004-05-15 devnull #define MHASHSIZE 128 /* must be 2**n */
16 5cedca1b 2004-05-15 devnull #define MHASH(x) ((x>>6)^x) & (MHASHSIZE-1)
17 5cedca1b 2004-05-15 devnull Contab *mhash[MHASHSIZE];
18 5cedca1b 2004-05-15 devnull
19 5cedca1b 2004-05-15 devnull
20 5cedca1b 2004-05-15 devnull Blockp *blist; /* allocated blocks for macros and strings */
21 5cedca1b 2004-05-15 devnull int nblist; /* how many there are */
22 5cedca1b 2004-05-15 devnull int bfree = -1; /* first (possible) free block in the list */
23 5cedca1b 2004-05-15 devnull
24 5cedca1b 2004-05-15 devnull Contab *contabp = NULL;
25 5cedca1b 2004-05-15 devnull #define MDELTA 500
26 5cedca1b 2004-05-15 devnull int nm = 0;
27 5cedca1b 2004-05-15 devnull
28 5cedca1b 2004-05-15 devnull int savname; /* name of macro/string being defined */
29 5cedca1b 2004-05-15 devnull int savslot; /* place in Contab of savname */
30 5cedca1b 2004-05-15 devnull int freeslot = -1; /* first (possible) free slot in contab */
31 5cedca1b 2004-05-15 devnull
32 5cedca1b 2004-05-15 devnull void prcontab(Contab *p)
33 5cedca1b 2004-05-15 devnull {
34 5cedca1b 2004-05-15 devnull int i;
35 5cedca1b 2004-05-15 devnull for (i = 0; i < nm; i++)
36 5cedca1b 2004-05-15 devnull if (p)
37 5cedca1b 2004-05-15 devnull if (p[i].rq != 0)
38 5cedca1b 2004-05-15 devnull fprintf(stderr, "slot %d, %-2.2s\n", i, unpair(p[i].rq));
39 5cedca1b 2004-05-15 devnull else
40 5cedca1b 2004-05-15 devnull fprintf(stderr, "slot %d empty\n", i);
41 5cedca1b 2004-05-15 devnull else
42 5cedca1b 2004-05-15 devnull fprintf(stderr, "slot %d empty\n", i);
43 5cedca1b 2004-05-15 devnull }
44 5cedca1b 2004-05-15 devnull
45 5cedca1b 2004-05-15 devnull
46 5cedca1b 2004-05-15 devnull void blockinit(void)
47 5cedca1b 2004-05-15 devnull {
48 5cedca1b 2004-05-15 devnull blist = (Blockp *) calloc(NBLIST, sizeof(Blockp));
49 5cedca1b 2004-05-15 devnull if (blist == NULL) {
50 5cedca1b 2004-05-15 devnull ERROR "not enough room for %d blocks", NBLIST WARN;
51 5cedca1b 2004-05-15 devnull done2(1);
52 5cedca1b 2004-05-15 devnull }
53 5cedca1b 2004-05-15 devnull nblist = NBLIST;
54 5cedca1b 2004-05-15 devnull blist[0].nextoff = blist[1].nextoff = -1;
55 5cedca1b 2004-05-15 devnull blist[0].bp = (Tchar *) calloc(BLK, sizeof(Tchar));
56 5cedca1b 2004-05-15 devnull blist[1].bp = (Tchar *) calloc(BLK, sizeof(Tchar));
57 5cedca1b 2004-05-15 devnull /* -1 prevents blist[0] from being used; temporary fix */
58 5cedca1b 2004-05-15 devnull /* for a design botch: offset==0 is overloaded. */
59 5cedca1b 2004-05-15 devnull /* blist[1] reserved for .rd indicator -- also unused. */
60 5cedca1b 2004-05-15 devnull /* but someone unwittingly looks at these, so allocate something */
61 5cedca1b 2004-05-15 devnull bfree = 2;
62 5cedca1b 2004-05-15 devnull }
63 5cedca1b 2004-05-15 devnull
64 5cedca1b 2004-05-15 devnull
65 5cedca1b 2004-05-15 devnull char *grow(char *ptr, int num, int size) /* make array bigger */
66 5cedca1b 2004-05-15 devnull {
67 c5561c23 2004-05-16 devnull char *p;
68 5cedca1b 2004-05-15 devnull
69 5cedca1b 2004-05-15 devnull if (ptr == NULL)
70 5cedca1b 2004-05-15 devnull p = (char *) calloc(num, size);
71 5cedca1b 2004-05-15 devnull else
72 5cedca1b 2004-05-15 devnull p = (char *) realloc(ptr, num * size);
73 5cedca1b 2004-05-15 devnull return p;
74 5cedca1b 2004-05-15 devnull }
75 5cedca1b 2004-05-15 devnull
76 5cedca1b 2004-05-15 devnull void mnspace(void)
77 5cedca1b 2004-05-15 devnull {
78 5cedca1b 2004-05-15 devnull nm = sizeof(contab)/sizeof(Contab) + MDELTA;
79 5cedca1b 2004-05-15 devnull freeslot = sizeof(contab)/sizeof(Contab) + 1;
80 5cedca1b 2004-05-15 devnull contabp = (Contab *) grow((char *) contabp, nm, sizeof(Contab));
81 5cedca1b 2004-05-15 devnull if (contabp == NULL) {
82 5cedca1b 2004-05-15 devnull ERROR "not enough memory for namespace of %d marcos", nm WARN;
83 5cedca1b 2004-05-15 devnull exit(1);
84 5cedca1b 2004-05-15 devnull }
85 5cedca1b 2004-05-15 devnull contabp = (Contab *) memcpy((char *) contabp, (char *)contab,
86 5cedca1b 2004-05-15 devnull sizeof(contab));
87 5cedca1b 2004-05-15 devnull if (contabp == NULL) {
88 5cedca1b 2004-05-15 devnull ERROR "Cannot reinitialize macro/request name list" WARN;
89 5cedca1b 2004-05-15 devnull exit(1);
90 5cedca1b 2004-05-15 devnull }
91 5cedca1b 2004-05-15 devnull
92 5cedca1b 2004-05-15 devnull }
93 5cedca1b 2004-05-15 devnull
94 5cedca1b 2004-05-15 devnull void caseig(void)
95 5cedca1b 2004-05-15 devnull {
96 5cedca1b 2004-05-15 devnull int i;
97 5cedca1b 2004-05-15 devnull Offset oldoff = offset;
98 5cedca1b 2004-05-15 devnull
99 5cedca1b 2004-05-15 devnull offset = 0;
100 5cedca1b 2004-05-15 devnull i = copyb();
101 5cedca1b 2004-05-15 devnull offset = oldoff;
102 5cedca1b 2004-05-15 devnull if (i != '.')
103 5cedca1b 2004-05-15 devnull control(i, 1);
104 5cedca1b 2004-05-15 devnull }
105 5cedca1b 2004-05-15 devnull
106 5cedca1b 2004-05-15 devnull
107 5cedca1b 2004-05-15 devnull void casern(void)
108 5cedca1b 2004-05-15 devnull {
109 5cedca1b 2004-05-15 devnull int i, j, k;
110 5cedca1b 2004-05-15 devnull
111 5cedca1b 2004-05-15 devnull lgf++;
112 5cedca1b 2004-05-15 devnull skip();
113 5cedca1b 2004-05-15 devnull if ((i = getrq()) == 0 || (oldmn = findmn(i)) < 0)
114 5cedca1b 2004-05-15 devnull return;
115 5cedca1b 2004-05-15 devnull skip();
116 5cedca1b 2004-05-15 devnull clrmn(findmn(j = getrq()));
117 5cedca1b 2004-05-15 devnull if (j) {
118 5cedca1b 2004-05-15 devnull munhash(&contabp[oldmn]);
119 5cedca1b 2004-05-15 devnull contabp[oldmn].rq = j;
120 5cedca1b 2004-05-15 devnull maddhash(&contabp[oldmn]);
121 5cedca1b 2004-05-15 devnull if (dip != d )
122 5cedca1b 2004-05-15 devnull for (k = dilev; k; k--)
123 5cedca1b 2004-05-15 devnull if (d[k].curd == i)
124 5cedca1b 2004-05-15 devnull d[k].curd = j;
125 5cedca1b 2004-05-15 devnull }
126 5cedca1b 2004-05-15 devnull }
127 5cedca1b 2004-05-15 devnull
128 5cedca1b 2004-05-15 devnull void maddhash(Contab *rp)
129 5cedca1b 2004-05-15 devnull {
130 5cedca1b 2004-05-15 devnull Contab **hp;
131 5cedca1b 2004-05-15 devnull
132 5cedca1b 2004-05-15 devnull if (rp->rq == 0)
133 5cedca1b 2004-05-15 devnull return;
134 5cedca1b 2004-05-15 devnull hp = &mhash[MHASH(rp->rq)];
135 5cedca1b 2004-05-15 devnull rp->link = *hp;
136 5cedca1b 2004-05-15 devnull *hp = rp;
137 5cedca1b 2004-05-15 devnull }
138 5cedca1b 2004-05-15 devnull
139 5cedca1b 2004-05-15 devnull void munhash(Contab *mp)
140 fa325e9b 2020-01-10 cross {
141 5cedca1b 2004-05-15 devnull Contab *p;
142 5cedca1b 2004-05-15 devnull Contab **lp;
143 5cedca1b 2004-05-15 devnull
144 5cedca1b 2004-05-15 devnull if (mp->rq == 0)
145 5cedca1b 2004-05-15 devnull return;
146 5cedca1b 2004-05-15 devnull lp = &mhash[MHASH(mp->rq)];
147 5cedca1b 2004-05-15 devnull p = *lp;
148 5cedca1b 2004-05-15 devnull while (p) {
149 5cedca1b 2004-05-15 devnull if (p == mp) {
150 5cedca1b 2004-05-15 devnull *lp = p->link;
151 5cedca1b 2004-05-15 devnull p->link = 0;
152 5cedca1b 2004-05-15 devnull return;
153 5cedca1b 2004-05-15 devnull }
154 5cedca1b 2004-05-15 devnull lp = &p->link;
155 5cedca1b 2004-05-15 devnull p = p->link;
156 5cedca1b 2004-05-15 devnull }
157 5cedca1b 2004-05-15 devnull }
158 5cedca1b 2004-05-15 devnull
159 5cedca1b 2004-05-15 devnull void mrehash(void)
160 5cedca1b 2004-05-15 devnull {
161 5cedca1b 2004-05-15 devnull Contab *p;
162 5cedca1b 2004-05-15 devnull int i;
163 5cedca1b 2004-05-15 devnull
164 5cedca1b 2004-05-15 devnull for (i=0; i < MHASHSIZE; i++)
165 5cedca1b 2004-05-15 devnull mhash[i] = 0;
166 5cedca1b 2004-05-15 devnull for (p=contabp; p < &contabp[nm]; p++)
167 5cedca1b 2004-05-15 devnull p->link = 0;
168 5cedca1b 2004-05-15 devnull for (p=contabp; p < &contabp[nm]; p++) {
169 5cedca1b 2004-05-15 devnull if (p->rq == 0)
170 5cedca1b 2004-05-15 devnull continue;
171 5cedca1b 2004-05-15 devnull i = MHASH(p->rq);
172 5cedca1b 2004-05-15 devnull p->link = mhash[i];
173 5cedca1b 2004-05-15 devnull mhash[i] = p;
174 5cedca1b 2004-05-15 devnull }
175 5cedca1b 2004-05-15 devnull }
176 5cedca1b 2004-05-15 devnull
177 5cedca1b 2004-05-15 devnull void caserm(void)
178 5cedca1b 2004-05-15 devnull {
179 5cedca1b 2004-05-15 devnull int j;
180 5cedca1b 2004-05-15 devnull int k = 0;
181 5cedca1b 2004-05-15 devnull
182 5cedca1b 2004-05-15 devnull lgf++;
183 5cedca1b 2004-05-15 devnull g0:
184 5cedca1b 2004-05-15 devnull while (!skip() && (j = getrq()) != 0) {
185 5cedca1b 2004-05-15 devnull if (dip != d)
186 5cedca1b 2004-05-15 devnull for (k = dilev; k; k--)
187 5cedca1b 2004-05-15 devnull if (d[k].curd == j) {
188 5cedca1b 2004-05-15 devnull ERROR "cannot remove diversion %s during definition",
189 5cedca1b 2004-05-15 devnull unpair(j) WARN;
190 5cedca1b 2004-05-15 devnull goto g0;
191 5cedca1b 2004-05-15 devnull }
192 5cedca1b 2004-05-15 devnull clrmn(findmn(j));
193 5cedca1b 2004-05-15 devnull }
194 5cedca1b 2004-05-15 devnull lgf--;
195 5cedca1b 2004-05-15 devnull }
196 5cedca1b 2004-05-15 devnull
197 5cedca1b 2004-05-15 devnull
198 5cedca1b 2004-05-15 devnull void caseas(void)
199 5cedca1b 2004-05-15 devnull {
200 5cedca1b 2004-05-15 devnull app++;
201 5cedca1b 2004-05-15 devnull caseds();
202 5cedca1b 2004-05-15 devnull }
203 5cedca1b 2004-05-15 devnull
204 5cedca1b 2004-05-15 devnull
205 5cedca1b 2004-05-15 devnull void caseds(void)
206 5cedca1b 2004-05-15 devnull {
207 5cedca1b 2004-05-15 devnull ds++;
208 5cedca1b 2004-05-15 devnull casede();
209 5cedca1b 2004-05-15 devnull }
210 5cedca1b 2004-05-15 devnull
211 5cedca1b 2004-05-15 devnull
212 5cedca1b 2004-05-15 devnull void caseam(void)
213 5cedca1b 2004-05-15 devnull {
214 5cedca1b 2004-05-15 devnull app++;
215 5cedca1b 2004-05-15 devnull casede();
216 5cedca1b 2004-05-15 devnull }
217 5cedca1b 2004-05-15 devnull
218 5cedca1b 2004-05-15 devnull
219 5cedca1b 2004-05-15 devnull void casede(void)
220 5cedca1b 2004-05-15 devnull {
221 5cedca1b 2004-05-15 devnull int i, req;
222 5cedca1b 2004-05-15 devnull Offset savoff;
223 5cedca1b 2004-05-15 devnull
224 5cedca1b 2004-05-15 devnull req = '.';
225 5cedca1b 2004-05-15 devnull lgf++;
226 5cedca1b 2004-05-15 devnull skip();
227 5cedca1b 2004-05-15 devnull if ((i = getrq()) == 0)
228 5cedca1b 2004-05-15 devnull goto de1;
229 5cedca1b 2004-05-15 devnull if ((offset = finds(i)) == 0)
230 5cedca1b 2004-05-15 devnull goto de1;
231 5cedca1b 2004-05-15 devnull if (newmn)
232 5cedca1b 2004-05-15 devnull savslot = newmn;
233 5cedca1b 2004-05-15 devnull else
234 5cedca1b 2004-05-15 devnull savslot = findmn(i);
235 5cedca1b 2004-05-15 devnull savname = i;
236 5cedca1b 2004-05-15 devnull if (ds)
237 5cedca1b 2004-05-15 devnull copys();
238 5cedca1b 2004-05-15 devnull else
239 5cedca1b 2004-05-15 devnull req = copyb();
240 5cedca1b 2004-05-15 devnull clrmn(oldmn);
241 5cedca1b 2004-05-15 devnull if (newmn) {
242 5cedca1b 2004-05-15 devnull if (contabp[newmn].rq)
243 5cedca1b 2004-05-15 devnull munhash(&contabp[newmn]);
244 5cedca1b 2004-05-15 devnull contabp[newmn].rq = i;
245 5cedca1b 2004-05-15 devnull maddhash(&contabp[newmn]);
246 5cedca1b 2004-05-15 devnull
247 5cedca1b 2004-05-15 devnull }
248 5cedca1b 2004-05-15 devnull if (apptr) {
249 5cedca1b 2004-05-15 devnull savoff = offset;
250 5cedca1b 2004-05-15 devnull offset = apptr;
251 5cedca1b 2004-05-15 devnull wbf((Tchar) IMP);
252 5cedca1b 2004-05-15 devnull offset = savoff;
253 5cedca1b 2004-05-15 devnull }
254 5cedca1b 2004-05-15 devnull offset = dip->op;
255 5cedca1b 2004-05-15 devnull if (req != '.')
256 5cedca1b 2004-05-15 devnull control(req, 1);
257 5cedca1b 2004-05-15 devnull de1:
258 5cedca1b 2004-05-15 devnull ds = app = 0;
259 5cedca1b 2004-05-15 devnull }
260 5cedca1b 2004-05-15 devnull
261 5cedca1b 2004-05-15 devnull
262 5cedca1b 2004-05-15 devnull int findmn(int i)
263 5cedca1b 2004-05-15 devnull {
264 5cedca1b 2004-05-15 devnull Contab *p;
265 5cedca1b 2004-05-15 devnull
266 5cedca1b 2004-05-15 devnull for (p = mhash[MHASH(i)]; p; p = p->link)
267 5cedca1b 2004-05-15 devnull if (i == p->rq)
268 5cedca1b 2004-05-15 devnull return(p - contabp);
269 5cedca1b 2004-05-15 devnull return(-1);
270 5cedca1b 2004-05-15 devnull }
271 5cedca1b 2004-05-15 devnull
272 5cedca1b 2004-05-15 devnull
273 5cedca1b 2004-05-15 devnull void clrmn(int i)
274 5cedca1b 2004-05-15 devnull {
275 5cedca1b 2004-05-15 devnull if (i >= 0) {
276 5cedca1b 2004-05-15 devnull if (contabp[i].mx)
277 5cedca1b 2004-05-15 devnull ffree(contabp[i].mx);
278 5cedca1b 2004-05-15 devnull munhash(&contabp[i]);
279 5cedca1b 2004-05-15 devnull contabp[i].rq = 0;
280 5cedca1b 2004-05-15 devnull contabp[i].mx = 0;
281 5cedca1b 2004-05-15 devnull contabp[i].emx = 0;
282 5cedca1b 2004-05-15 devnull contabp[i].f = 0;
283 5cedca1b 2004-05-15 devnull if (contabp[i].divsiz != NULL) {
284 5cedca1b 2004-05-15 devnull free(contabp[i].divsiz);
285 5cedca1b 2004-05-15 devnull contabp[i].divsiz = NULL;
286 5cedca1b 2004-05-15 devnull }
287 5cedca1b 2004-05-15 devnull if (freeslot > i)
288 5cedca1b 2004-05-15 devnull freeslot = i;
289 5cedca1b 2004-05-15 devnull }
290 5cedca1b 2004-05-15 devnull }
291 5cedca1b 2004-05-15 devnull
292 5cedca1b 2004-05-15 devnull void growcontab(void)
293 5cedca1b 2004-05-15 devnull {
294 5cedca1b 2004-05-15 devnull nm += MDELTA;
295 5cedca1b 2004-05-15 devnull contabp = (Contab *) grow((char *) contabp , nm, sizeof(Contab));
296 5cedca1b 2004-05-15 devnull if (contabp == NULL) {
297 5cedca1b 2004-05-15 devnull ERROR "Too many (%d) string/macro names", nm WARN;
298 5cedca1b 2004-05-15 devnull done2(02);
299 5cedca1b 2004-05-15 devnull } else {
300 5cedca1b 2004-05-15 devnull memset((char *)(contabp) + (nm - MDELTA) * sizeof(Contab),
301 5cedca1b 2004-05-15 devnull 0, MDELTA * sizeof(Contab));
302 5cedca1b 2004-05-15 devnull mrehash();
303 5cedca1b 2004-05-15 devnull }
304 5cedca1b 2004-05-15 devnull }
305 5cedca1b 2004-05-15 devnull
306 5cedca1b 2004-05-15 devnull
307 5cedca1b 2004-05-15 devnull Offset finds(int mn)
308 5cedca1b 2004-05-15 devnull {
309 5cedca1b 2004-05-15 devnull int i;
310 5cedca1b 2004-05-15 devnull Offset savip;
311 5cedca1b 2004-05-15 devnull
312 5cedca1b 2004-05-15 devnull oldmn = findmn(mn);
313 5cedca1b 2004-05-15 devnull newmn = 0;
314 5cedca1b 2004-05-15 devnull apptr = 0;
315 5cedca1b 2004-05-15 devnull if (app && oldmn >= 0 && contabp[oldmn].mx) {
316 5cedca1b 2004-05-15 devnull savip = ip;
317 5cedca1b 2004-05-15 devnull ip = contabp[oldmn].emx;
318 5cedca1b 2004-05-15 devnull oldmn = -1;
319 5cedca1b 2004-05-15 devnull apptr = ip;
320 5cedca1b 2004-05-15 devnull if (!diflg)
321 5cedca1b 2004-05-15 devnull ip = incoff(ip);
322 5cedca1b 2004-05-15 devnull nextb = ip;
323 5cedca1b 2004-05-15 devnull ip = savip;
324 5cedca1b 2004-05-15 devnull } else {
325 5cedca1b 2004-05-15 devnull for (i = freeslot; i < nm; i++) {
326 5cedca1b 2004-05-15 devnull if (contabp[i].rq == 0)
327 5cedca1b 2004-05-15 devnull break;
328 5cedca1b 2004-05-15 devnull }
329 fa325e9b 2020-01-10 cross if (i == nm)
330 5cedca1b 2004-05-15 devnull growcontab();
331 5cedca1b 2004-05-15 devnull freeslot = i + 1;
332 5cedca1b 2004-05-15 devnull if ((nextb = alloc()) == -1) {
333 5cedca1b 2004-05-15 devnull app = 0;
334 5cedca1b 2004-05-15 devnull if (macerr++ > 1)
335 5cedca1b 2004-05-15 devnull done2(02);
336 5cedca1b 2004-05-15 devnull if (nextb == 0)
337 5cedca1b 2004-05-15 devnull ERROR "Not enough space for string/macro names" WARN;
338 5cedca1b 2004-05-15 devnull edone(04);
339 5cedca1b 2004-05-15 devnull return(offset = 0);
340 5cedca1b 2004-05-15 devnull }
341 5cedca1b 2004-05-15 devnull contabp[i].mx = nextb;
342 5cedca1b 2004-05-15 devnull if (!diflg) {
343 5cedca1b 2004-05-15 devnull newmn = i;
344 5cedca1b 2004-05-15 devnull if (oldmn == -1)
345 5cedca1b 2004-05-15 devnull contabp[i].rq = -1;
346 5cedca1b 2004-05-15 devnull } else {
347 5cedca1b 2004-05-15 devnull contabp[i].rq = mn;
348 5cedca1b 2004-05-15 devnull maddhash(&contabp[i]);
349 5cedca1b 2004-05-15 devnull }
350 5cedca1b 2004-05-15 devnull }
351 5cedca1b 2004-05-15 devnull app = 0;
352 5cedca1b 2004-05-15 devnull return(offset = nextb);
353 5cedca1b 2004-05-15 devnull }
354 5cedca1b 2004-05-15 devnull
355 5cedca1b 2004-05-15 devnull int skip(void)
356 5cedca1b 2004-05-15 devnull {
357 5cedca1b 2004-05-15 devnull Tchar i;
358 5cedca1b 2004-05-15 devnull
359 5cedca1b 2004-05-15 devnull while (cbits(i = getch()) == ' ' || ismot(i))
360 5cedca1b 2004-05-15 devnull ;
361 5cedca1b 2004-05-15 devnull ch = i;
362 5cedca1b 2004-05-15 devnull return(nlflg);
363 5cedca1b 2004-05-15 devnull }
364 5cedca1b 2004-05-15 devnull
365 5cedca1b 2004-05-15 devnull
366 5cedca1b 2004-05-15 devnull int copyb(void)
367 5cedca1b 2004-05-15 devnull {
368 5cedca1b 2004-05-15 devnull int i, j, state;
369 5cedca1b 2004-05-15 devnull Tchar ii;
370 5cedca1b 2004-05-15 devnull int req, k;
371 5cedca1b 2004-05-15 devnull Offset savoff;
372 5cedca1b 2004-05-15 devnull Uchar *p;
373 5cedca1b 2004-05-15 devnull
374 c5561c23 2004-05-16 devnull savoff = 0;
375 5cedca1b 2004-05-15 devnull if (skip() || !(j = getrq()))
376 5cedca1b 2004-05-15 devnull j = '.';
377 5cedca1b 2004-05-15 devnull req = j;
378 5cedca1b 2004-05-15 devnull p = unpair(j);
379 5cedca1b 2004-05-15 devnull /* was: k = j >> BYTE; j &= BYTEMASK; */
380 5cedca1b 2004-05-15 devnull j = p[0];
381 5cedca1b 2004-05-15 devnull k = p[1];
382 5cedca1b 2004-05-15 devnull copyf++;
383 5cedca1b 2004-05-15 devnull flushi();
384 5cedca1b 2004-05-15 devnull nlflg = 0;
385 5cedca1b 2004-05-15 devnull state = 1;
386 5cedca1b 2004-05-15 devnull
387 5cedca1b 2004-05-15 devnull /* state 0 eat up
388 5cedca1b 2004-05-15 devnull * state 1 look for .
389 5cedca1b 2004-05-15 devnull * state 2 look for first char of end macro
390 5cedca1b 2004-05-15 devnull * state 3 look for second char of end macro
391 5cedca1b 2004-05-15 devnull */
392 5cedca1b 2004-05-15 devnull
393 5cedca1b 2004-05-15 devnull while (1) {
394 5cedca1b 2004-05-15 devnull i = cbits(ii = getch());
395 5cedca1b 2004-05-15 devnull if (state == 3) {
396 5cedca1b 2004-05-15 devnull if (i == k)
397 5cedca1b 2004-05-15 devnull break;
398 5cedca1b 2004-05-15 devnull if (!k) {
399 5cedca1b 2004-05-15 devnull ch = ii;
400 5cedca1b 2004-05-15 devnull i = getach();
401 5cedca1b 2004-05-15 devnull ch = ii;
402 5cedca1b 2004-05-15 devnull if (!i)
403 5cedca1b 2004-05-15 devnull break;
404 5cedca1b 2004-05-15 devnull }
405 5cedca1b 2004-05-15 devnull state = 0;
406 5cedca1b 2004-05-15 devnull goto c0;
407 5cedca1b 2004-05-15 devnull }
408 5cedca1b 2004-05-15 devnull if (i == '\n') {
409 5cedca1b 2004-05-15 devnull state = 1;
410 5cedca1b 2004-05-15 devnull nlflg = 0;
411 5cedca1b 2004-05-15 devnull goto c0;
412 5cedca1b 2004-05-15 devnull }
413 5cedca1b 2004-05-15 devnull if (state == 1 && i == '.') {
414 5cedca1b 2004-05-15 devnull state++;
415 5cedca1b 2004-05-15 devnull savoff = offset;
416 5cedca1b 2004-05-15 devnull goto c0;
417 5cedca1b 2004-05-15 devnull }
418 5cedca1b 2004-05-15 devnull if (state == 2 && i == j) {
419 5cedca1b 2004-05-15 devnull state++;
420 5cedca1b 2004-05-15 devnull goto c0;
421 5cedca1b 2004-05-15 devnull }
422 5cedca1b 2004-05-15 devnull state = 0;
423 5cedca1b 2004-05-15 devnull c0:
424 5cedca1b 2004-05-15 devnull if (offset)
425 5cedca1b 2004-05-15 devnull wbf(ii);
426 5cedca1b 2004-05-15 devnull }
427 5cedca1b 2004-05-15 devnull if (offset) {
428 5cedca1b 2004-05-15 devnull offset = savoff;
429 5cedca1b 2004-05-15 devnull wbf((Tchar)0);
430 5cedca1b 2004-05-15 devnull }
431 5cedca1b 2004-05-15 devnull copyf--;
432 5cedca1b 2004-05-15 devnull return(req);
433 5cedca1b 2004-05-15 devnull }
434 5cedca1b 2004-05-15 devnull
435 5cedca1b 2004-05-15 devnull
436 5cedca1b 2004-05-15 devnull void copys(void)
437 5cedca1b 2004-05-15 devnull {
438 5cedca1b 2004-05-15 devnull Tchar i;
439 5cedca1b 2004-05-15 devnull
440 5cedca1b 2004-05-15 devnull copyf++;
441 5cedca1b 2004-05-15 devnull if (skip())
442 5cedca1b 2004-05-15 devnull goto c0;
443 5cedca1b 2004-05-15 devnull if (cbits(i = getch()) != '"')
444 5cedca1b 2004-05-15 devnull wbf(i);
445 5cedca1b 2004-05-15 devnull while (cbits(i = getch()) != '\n')
446 5cedca1b 2004-05-15 devnull wbf(i);
447 5cedca1b 2004-05-15 devnull c0:
448 5cedca1b 2004-05-15 devnull wbf((Tchar)0);
449 5cedca1b 2004-05-15 devnull copyf--;
450 5cedca1b 2004-05-15 devnull }
451 5cedca1b 2004-05-15 devnull
452 5cedca1b 2004-05-15 devnull
453 5cedca1b 2004-05-15 devnull Offset alloc(void) /* return free Offset in nextb */
454 5cedca1b 2004-05-15 devnull {
455 5cedca1b 2004-05-15 devnull int i, j;
456 5cedca1b 2004-05-15 devnull
457 5cedca1b 2004-05-15 devnull for (i = bfree; i < nblist; i++)
458 5cedca1b 2004-05-15 devnull if (blist[i].nextoff == 0)
459 5cedca1b 2004-05-15 devnull break;
460 5cedca1b 2004-05-15 devnull if (i == nblist) {
461 5cedca1b 2004-05-15 devnull blist = (Blockp *) realloc((char *) blist, 2 * nblist * sizeof(Blockp));
462 5cedca1b 2004-05-15 devnull if (blist == NULL) {
463 5cedca1b 2004-05-15 devnull ERROR "can't grow blist for string/macro defns" WARN;
464 5cedca1b 2004-05-15 devnull done2(2);
465 5cedca1b 2004-05-15 devnull }
466 5cedca1b 2004-05-15 devnull nblist *= 2;
467 5cedca1b 2004-05-15 devnull for (j = i; j < nblist; j++) {
468 5cedca1b 2004-05-15 devnull blist[j].nextoff = 0;
469 5cedca1b 2004-05-15 devnull blist[j].bp = 0;
470 5cedca1b 2004-05-15 devnull }
471 5cedca1b 2004-05-15 devnull }
472 5cedca1b 2004-05-15 devnull blist[i].nextoff = -1; /* this block is the end */
473 5cedca1b 2004-05-15 devnull bfree = i + 1;
474 5cedca1b 2004-05-15 devnull if (blist[i].bp == 0)
475 5cedca1b 2004-05-15 devnull blist[i].bp = (Tchar *) calloc(BLK, sizeof(Tchar));
476 5cedca1b 2004-05-15 devnull if (blist[i].bp == NULL) {
477 5cedca1b 2004-05-15 devnull ERROR "can't allocate memory for string/macro definitions" WARN;
478 5cedca1b 2004-05-15 devnull done2(2);
479 5cedca1b 2004-05-15 devnull }
480 5cedca1b 2004-05-15 devnull nextb = (Offset) i * BLK;
481 5cedca1b 2004-05-15 devnull return nextb;
482 5cedca1b 2004-05-15 devnull }
483 5cedca1b 2004-05-15 devnull
484 5cedca1b 2004-05-15 devnull
485 5cedca1b 2004-05-15 devnull void ffree(Offset i) /* free list of blocks starting at blist(o) */
486 5cedca1b 2004-05-15 devnull { /* (doesn't actually free the blocks, just the pointers) */
487 5cedca1b 2004-05-15 devnull int j;
488 5cedca1b 2004-05-15 devnull
489 5cedca1b 2004-05-15 devnull for ( ; blist[j = bindex(i)].nextoff != -1; ) {
490 5cedca1b 2004-05-15 devnull if (bfree > j)
491 5cedca1b 2004-05-15 devnull bfree = j;
492 5cedca1b 2004-05-15 devnull i = blist[j].nextoff;
493 5cedca1b 2004-05-15 devnull blist[j].nextoff = 0;
494 5cedca1b 2004-05-15 devnull }
495 5cedca1b 2004-05-15 devnull blist[j].nextoff = 0;
496 5cedca1b 2004-05-15 devnull }
497 5cedca1b 2004-05-15 devnull
498 5cedca1b 2004-05-15 devnull
499 5cedca1b 2004-05-15 devnull void wbf(Tchar i) /* store i into offset, get ready for next one */
500 5cedca1b 2004-05-15 devnull {
501 5cedca1b 2004-05-15 devnull int j, off;
502 5cedca1b 2004-05-15 devnull
503 5cedca1b 2004-05-15 devnull if (!offset)
504 5cedca1b 2004-05-15 devnull return;
505 5cedca1b 2004-05-15 devnull j = bindex(offset);
506 5cedca1b 2004-05-15 devnull if (i == 0)
507 5cedca1b 2004-05-15 devnull contabp[savslot].emx = offset;
508 5cedca1b 2004-05-15 devnull off = boffset(offset);
509 5cedca1b 2004-05-15 devnull blist[j].bp[off++] = i;
510 5cedca1b 2004-05-15 devnull offset++;
511 5cedca1b 2004-05-15 devnull if (pastend(offset)) { /* off the end of this block */
512 5cedca1b 2004-05-15 devnull if (blist[j].nextoff == -1) {
513 5cedca1b 2004-05-15 devnull if ((nextb = alloc()) == -1) {
514 5cedca1b 2004-05-15 devnull ERROR "Out of temp file space" WARN;
515 5cedca1b 2004-05-15 devnull done2(01);
516 5cedca1b 2004-05-15 devnull }
517 5cedca1b 2004-05-15 devnull blist[j].nextoff = nextb;
518 5cedca1b 2004-05-15 devnull }
519 5cedca1b 2004-05-15 devnull offset = blist[j].nextoff;
520 5cedca1b 2004-05-15 devnull }
521 5cedca1b 2004-05-15 devnull }
522 5cedca1b 2004-05-15 devnull
523 5cedca1b 2004-05-15 devnull
524 5cedca1b 2004-05-15 devnull Tchar rbf(void) /* return next char from blist[] block */
525 5cedca1b 2004-05-15 devnull {
526 5cedca1b 2004-05-15 devnull Tchar i, j;
527 5cedca1b 2004-05-15 devnull
528 5cedca1b 2004-05-15 devnull if (ip == RD_OFFSET) { /* for rdtty */
529 5cedca1b 2004-05-15 devnull if (j = rdtty())
530 5cedca1b 2004-05-15 devnull return(j);
531 5cedca1b 2004-05-15 devnull else
532 5cedca1b 2004-05-15 devnull return(popi());
533 5cedca1b 2004-05-15 devnull }
534 fa325e9b 2020-01-10 cross
535 5cedca1b 2004-05-15 devnull i = rbf0(ip);
536 5cedca1b 2004-05-15 devnull if (i == 0) {
537 5cedca1b 2004-05-15 devnull if (!app)
538 5cedca1b 2004-05-15 devnull i = popi();
539 5cedca1b 2004-05-15 devnull return(i);
540 5cedca1b 2004-05-15 devnull }
541 5cedca1b 2004-05-15 devnull ip = incoff(ip);
542 5cedca1b 2004-05-15 devnull return(i);
543 5cedca1b 2004-05-15 devnull }
544 5cedca1b 2004-05-15 devnull
545 5cedca1b 2004-05-15 devnull
546 5cedca1b 2004-05-15 devnull Offset xxxincoff(Offset p) /* get next blist[] block */
547 5cedca1b 2004-05-15 devnull {
548 5cedca1b 2004-05-15 devnull p++;
549 5cedca1b 2004-05-15 devnull if (pastend(p)) { /* off the end of this block */
550 5cedca1b 2004-05-15 devnull if ((p = blist[bindex(p-1)].nextoff) == -1) { /* and nothing was allocated after it */
551 5cedca1b 2004-05-15 devnull ERROR "Bad storage allocation" WARN;
552 5cedca1b 2004-05-15 devnull done2(-5);
553 5cedca1b 2004-05-15 devnull }
554 5cedca1b 2004-05-15 devnull }
555 5cedca1b 2004-05-15 devnull return(p);
556 5cedca1b 2004-05-15 devnull }
557 5cedca1b 2004-05-15 devnull
558 5cedca1b 2004-05-15 devnull
559 5cedca1b 2004-05-15 devnull Tchar popi(void)
560 5cedca1b 2004-05-15 devnull {
561 5cedca1b 2004-05-15 devnull Stack *p;
562 5cedca1b 2004-05-15 devnull
563 5cedca1b 2004-05-15 devnull if (frame == stk)
564 5cedca1b 2004-05-15 devnull return(0);
565 5cedca1b 2004-05-15 devnull if (strflg)
566 5cedca1b 2004-05-15 devnull strflg--;
567 5cedca1b 2004-05-15 devnull p = nxf = frame;
568 5cedca1b 2004-05-15 devnull p->nargs = 0;
569 5cedca1b 2004-05-15 devnull frame = p->pframe;
570 5cedca1b 2004-05-15 devnull ip = p->pip;
571 5cedca1b 2004-05-15 devnull pendt = p->ppendt;
572 5cedca1b 2004-05-15 devnull lastpbp = p->lastpbp;
573 5cedca1b 2004-05-15 devnull return(p->pch);
574 5cedca1b 2004-05-15 devnull }
575 5cedca1b 2004-05-15 devnull
576 5cedca1b 2004-05-15 devnull /*
577 5cedca1b 2004-05-15 devnull * test that the end of the allocation is above a certain location
578 5cedca1b 2004-05-15 devnull * in memory
579 5cedca1b 2004-05-15 devnull */
580 5cedca1b 2004-05-15 devnull #define SPACETEST(base, size) \
581 5cedca1b 2004-05-15 devnull if ((char*)base + size >= (char*)stk+STACKSIZE) \
582 5cedca1b 2004-05-15 devnull ERROR "Stacksize overflow in n3" WARN
583 5cedca1b 2004-05-15 devnull
584 5cedca1b 2004-05-15 devnull Offset pushi(Offset newip, int mname)
585 5cedca1b 2004-05-15 devnull {
586 5cedca1b 2004-05-15 devnull Stack *p;
587 5cedca1b 2004-05-15 devnull
588 5cedca1b 2004-05-15 devnull SPACETEST(nxf, sizeof(Stack));
589 5cedca1b 2004-05-15 devnull p = nxf;
590 5cedca1b 2004-05-15 devnull p->pframe = frame;
591 5cedca1b 2004-05-15 devnull p->pip = ip;
592 5cedca1b 2004-05-15 devnull p->ppendt = pendt;
593 5cedca1b 2004-05-15 devnull p->pch = ch;
594 5cedca1b 2004-05-15 devnull p->lastpbp = lastpbp;
595 5cedca1b 2004-05-15 devnull p->mname = mname;
596 5cedca1b 2004-05-15 devnull lastpbp = pbp;
597 5cedca1b 2004-05-15 devnull pendt = ch = 0;
598 5cedca1b 2004-05-15 devnull frame = nxf;
599 fa325e9b 2020-01-10 cross if (nxf->nargs == 0)
600 5cedca1b 2004-05-15 devnull nxf += 1;
601 fa325e9b 2020-01-10 cross else
602 5cedca1b 2004-05-15 devnull nxf = (Stack *)argtop;
603 5cedca1b 2004-05-15 devnull return(ip = newip);
604 5cedca1b 2004-05-15 devnull }
605 5cedca1b 2004-05-15 devnull
606 5cedca1b 2004-05-15 devnull
607 5cedca1b 2004-05-15 devnull void *setbrk(int x)
608 5cedca1b 2004-05-15 devnull {
609 5cedca1b 2004-05-15 devnull char *i;
610 5cedca1b 2004-05-15 devnull
611 5cedca1b 2004-05-15 devnull if ((i = (char *) calloc(x, 1)) == 0) {
612 5cedca1b 2004-05-15 devnull ERROR "Core limit reached" WARN;
613 5cedca1b 2004-05-15 devnull edone(0100);
614 5cedca1b 2004-05-15 devnull }
615 5cedca1b 2004-05-15 devnull return(i);
616 5cedca1b 2004-05-15 devnull }
617 5cedca1b 2004-05-15 devnull
618 5cedca1b 2004-05-15 devnull
619 5cedca1b 2004-05-15 devnull int getsn(void)
620 5cedca1b 2004-05-15 devnull {
621 5cedca1b 2004-05-15 devnull int i;
622 5cedca1b 2004-05-15 devnull
623 5cedca1b 2004-05-15 devnull if ((i = getach()) == 0)
624 5cedca1b 2004-05-15 devnull return(0);
625 5cedca1b 2004-05-15 devnull if (i == '(')
626 5cedca1b 2004-05-15 devnull return(getrq());
627 fa325e9b 2020-01-10 cross else
628 5cedca1b 2004-05-15 devnull return(i);
629 5cedca1b 2004-05-15 devnull }
630 5cedca1b 2004-05-15 devnull
631 5cedca1b 2004-05-15 devnull
632 5cedca1b 2004-05-15 devnull Offset setstr(void)
633 5cedca1b 2004-05-15 devnull {
634 5cedca1b 2004-05-15 devnull int i, j;
635 5cedca1b 2004-05-15 devnull
636 5cedca1b 2004-05-15 devnull lgf++;
637 5cedca1b 2004-05-15 devnull if ((i = getsn()) == 0 || (j = findmn(i)) == -1 || !contabp[j].mx) {
638 5cedca1b 2004-05-15 devnull lgf--;
639 5cedca1b 2004-05-15 devnull return(0);
640 5cedca1b 2004-05-15 devnull } else {
641 5cedca1b 2004-05-15 devnull SPACETEST(nxf, sizeof(Stack));
642 5cedca1b 2004-05-15 devnull nxf->nargs = 0;
643 5cedca1b 2004-05-15 devnull strflg++;
644 5cedca1b 2004-05-15 devnull lgf--;
645 5cedca1b 2004-05-15 devnull return pushi(contabp[j].mx, i);
646 5cedca1b 2004-05-15 devnull }
647 5cedca1b 2004-05-15 devnull }
648 5cedca1b 2004-05-15 devnull
649 5cedca1b 2004-05-15 devnull
650 5cedca1b 2004-05-15 devnull
651 5cedca1b 2004-05-15 devnull void collect(void)
652 5cedca1b 2004-05-15 devnull {
653 5cedca1b 2004-05-15 devnull int j;
654 5cedca1b 2004-05-15 devnull Tchar i, *strp, *lim, **argpp, **argppend;
655 5cedca1b 2004-05-15 devnull int quote;
656 5cedca1b 2004-05-15 devnull Stack *savnxf;
657 5cedca1b 2004-05-15 devnull
658 5cedca1b 2004-05-15 devnull copyf++;
659 5cedca1b 2004-05-15 devnull nxf->nargs = 0;
660 5cedca1b 2004-05-15 devnull savnxf = nxf;
661 5cedca1b 2004-05-15 devnull if (skip())
662 5cedca1b 2004-05-15 devnull goto rtn;
663 5cedca1b 2004-05-15 devnull
664 5cedca1b 2004-05-15 devnull {
665 5cedca1b 2004-05-15 devnull char *memp;
666 5cedca1b 2004-05-15 devnull memp = (char *)savnxf;
667 5cedca1b 2004-05-15 devnull /*
668 5cedca1b 2004-05-15 devnull * 1 s structure for the macro descriptor
669 5cedca1b 2004-05-15 devnull * APERMAC Tchar *'s for pointers into the strings
670 5cedca1b 2004-05-15 devnull * space for the Tchar's themselves
671 5cedca1b 2004-05-15 devnull */
672 5cedca1b 2004-05-15 devnull memp += sizeof(Stack);
673 5cedca1b 2004-05-15 devnull /*
674 5cedca1b 2004-05-15 devnull * CPERMAC = the total # of characters for ALL arguments
675 5cedca1b 2004-05-15 devnull */
676 5cedca1b 2004-05-15 devnull #define CPERMAC 200
677 5cedca1b 2004-05-15 devnull #define APERMAC 9
678 5cedca1b 2004-05-15 devnull memp += APERMAC * sizeof(Tchar *);
679 5cedca1b 2004-05-15 devnull memp += CPERMAC * sizeof(Tchar);
680 5cedca1b 2004-05-15 devnull nxf = (Stack *)memp;
681 5cedca1b 2004-05-15 devnull }
682 5cedca1b 2004-05-15 devnull lim = (Tchar *)nxf;
683 5cedca1b 2004-05-15 devnull argpp = (Tchar **)(savnxf + 1);
684 5cedca1b 2004-05-15 devnull argppend = &argpp[APERMAC];
685 5cedca1b 2004-05-15 devnull SPACETEST(argppend, sizeof(Tchar *));
686 5cedca1b 2004-05-15 devnull strp = (Tchar *)argppend;
687 5cedca1b 2004-05-15 devnull /*
688 5cedca1b 2004-05-15 devnull * Zero out all the string pointers before filling them in.
689 5cedca1b 2004-05-15 devnull */
690 5cedca1b 2004-05-15 devnull for (j = 0; j < APERMAC; j++)
691 5cedca1b 2004-05-15 devnull argpp[j] = 0;
692 5cedca1b 2004-05-15 devnull /* ERROR "savnxf=0x%x,nxf=0x%x,argpp=0x%x,strp=argppend=0x%x, lim=0x%x",
693 5cedca1b 2004-05-15 devnull * savnxf, nxf, argpp, strp, lim WARN;
694 5cedca1b 2004-05-15 devnull */
695 5cedca1b 2004-05-15 devnull strflg = 0;
696 5cedca1b 2004-05-15 devnull while (argpp != argppend && !skip()) {
697 5cedca1b 2004-05-15 devnull *argpp++ = strp;
698 5cedca1b 2004-05-15 devnull quote = 0;
699 5cedca1b 2004-05-15 devnull if (cbits(i = getch()) == '"')
700 5cedca1b 2004-05-15 devnull quote++;
701 fa325e9b 2020-01-10 cross else
702 5cedca1b 2004-05-15 devnull ch = i;
703 5cedca1b 2004-05-15 devnull while (1) {
704 5cedca1b 2004-05-15 devnull i = getch();
705 5cedca1b 2004-05-15 devnull /* fprintf(stderr, "collect %c %d\n", cbits(i), cbits(i)); */
706 5cedca1b 2004-05-15 devnull if (nlflg || (!quote && argpp != argppend && cbits(i) == ' '))
707 5cedca1b 2004-05-15 devnull break; /* collects rest into $9 */
708 5cedca1b 2004-05-15 devnull if ( quote
709 5cedca1b 2004-05-15 devnull && cbits(i) == '"'
710 5cedca1b 2004-05-15 devnull && cbits(i = getch()) != '"') {
711 5cedca1b 2004-05-15 devnull ch = i;
712 5cedca1b 2004-05-15 devnull break;
713 5cedca1b 2004-05-15 devnull }
714 5cedca1b 2004-05-15 devnull *strp++ = i;
715 5cedca1b 2004-05-15 devnull if (strflg && strp >= lim) {
716 5cedca1b 2004-05-15 devnull /* ERROR "strp=0x%x, lim = 0x%x", strp, lim WARN; */
717 5cedca1b 2004-05-15 devnull ERROR "Macro argument too long" WARN;
718 5cedca1b 2004-05-15 devnull copyf--;
719 5cedca1b 2004-05-15 devnull edone(004);
720 5cedca1b 2004-05-15 devnull }
721 5cedca1b 2004-05-15 devnull SPACETEST(strp, 3 * sizeof(Tchar));
722 5cedca1b 2004-05-15 devnull }
723 5cedca1b 2004-05-15 devnull *strp++ = 0;
724 5cedca1b 2004-05-15 devnull }
725 5cedca1b 2004-05-15 devnull nxf = savnxf;
726 5cedca1b 2004-05-15 devnull nxf->nargs = argpp - (Tchar **)(savnxf + 1);
727 5cedca1b 2004-05-15 devnull argtop = strp;
728 5cedca1b 2004-05-15 devnull rtn:
729 5cedca1b 2004-05-15 devnull copyf--;
730 5cedca1b 2004-05-15 devnull }
731 5cedca1b 2004-05-15 devnull
732 5cedca1b 2004-05-15 devnull
733 5cedca1b 2004-05-15 devnull void seta(void)
734 5cedca1b 2004-05-15 devnull {
735 5cedca1b 2004-05-15 devnull int i;
736 5cedca1b 2004-05-15 devnull
737 5cedca1b 2004-05-15 devnull i = cbits(getch()) - '0';
738 5cedca1b 2004-05-15 devnull if (i > 0 && i <= APERMAC && i <= frame->nargs)
739 5cedca1b 2004-05-15 devnull pushback(*(((Tchar **)(frame + 1)) + i - 1));
740 5cedca1b 2004-05-15 devnull }
741 5cedca1b 2004-05-15 devnull
742 5cedca1b 2004-05-15 devnull
743 5cedca1b 2004-05-15 devnull void caseda(void)
744 5cedca1b 2004-05-15 devnull {
745 5cedca1b 2004-05-15 devnull app++;
746 5cedca1b 2004-05-15 devnull casedi();
747 5cedca1b 2004-05-15 devnull }
748 5cedca1b 2004-05-15 devnull
749 5cedca1b 2004-05-15 devnull void casegd(void)
750 5cedca1b 2004-05-15 devnull {
751 5cedca1b 2004-05-15 devnull int i, j;
752 5cedca1b 2004-05-15 devnull
753 5cedca1b 2004-05-15 devnull skip();
754 5cedca1b 2004-05-15 devnull if ((i = getrq()) == 0)
755 5cedca1b 2004-05-15 devnull return;
756 5cedca1b 2004-05-15 devnull if ((j = findmn(i)) >= 0) {
757 5cedca1b 2004-05-15 devnull if (contabp[j].divsiz != NULL) {
758 5cedca1b 2004-05-15 devnull numtabp[DN].val = contabp[j].divsiz->dix;
759 5cedca1b 2004-05-15 devnull numtabp[DL].val = contabp[j].divsiz->diy;
760 5cedca1b 2004-05-15 devnull }
761 5cedca1b 2004-05-15 devnull }
762 5cedca1b 2004-05-15 devnull }
763 5cedca1b 2004-05-15 devnull
764 5cedca1b 2004-05-15 devnull #define FINDDIV(o) if ((o = findmn(dip->curd)) < 0) \
765 5cedca1b 2004-05-15 devnull ERROR "lost diversion %s", unpair(dip->curd) WARN
766 5cedca1b 2004-05-15 devnull
767 5cedca1b 2004-05-15 devnull void casedi(void)
768 5cedca1b 2004-05-15 devnull {
769 5cedca1b 2004-05-15 devnull int i, j, *k;
770 5cedca1b 2004-05-15 devnull
771 5cedca1b 2004-05-15 devnull lgf++;
772 5cedca1b 2004-05-15 devnull if (skip() || (i = getrq()) == 0) {
773 5cedca1b 2004-05-15 devnull if (dip != d) {
774 5cedca1b 2004-05-15 devnull FINDDIV(savslot);
775 5cedca1b 2004-05-15 devnull wbf((Tchar)0);
776 5cedca1b 2004-05-15 devnull }
777 5cedca1b 2004-05-15 devnull if (dilev > 0) {
778 5cedca1b 2004-05-15 devnull numtabp[DN].val = dip->dnl;
779 5cedca1b 2004-05-15 devnull numtabp[DL].val = dip->maxl;
780 5cedca1b 2004-05-15 devnull FINDDIV(j);
781 5cedca1b 2004-05-15 devnull if ((contabp[j].divsiz = (Divsiz *) malloc(sizeof(Divsiz))) == NULL) {
782 5cedca1b 2004-05-15 devnull ERROR "Cannot alloc diversion size" WARN;
783 5cedca1b 2004-05-15 devnull done2(1);
784 5cedca1b 2004-05-15 devnull } else {
785 5cedca1b 2004-05-15 devnull contabp[j].divsiz->dix = numtabp[DN].val;
786 5cedca1b 2004-05-15 devnull contabp[j].divsiz->diy = numtabp[DL].val;
787 5cedca1b 2004-05-15 devnull }
788 5cedca1b 2004-05-15 devnull dip = &d[--dilev];
789 5cedca1b 2004-05-15 devnull offset = dip->op;
790 5cedca1b 2004-05-15 devnull }
791 5cedca1b 2004-05-15 devnull goto rtn;
792 5cedca1b 2004-05-15 devnull }
793 5cedca1b 2004-05-15 devnull if (++dilev == NDI) {
794 5cedca1b 2004-05-15 devnull --dilev;
795 5cedca1b 2004-05-15 devnull ERROR "Diversions nested too deep" WARN;
796 5cedca1b 2004-05-15 devnull edone(02);
797 5cedca1b 2004-05-15 devnull }
798 5cedca1b 2004-05-15 devnull if (dip != d) {
799 5cedca1b 2004-05-15 devnull FINDDIV(j);
800 5cedca1b 2004-05-15 devnull savslot = j;
801 5cedca1b 2004-05-15 devnull wbf((Tchar)0);
802 5cedca1b 2004-05-15 devnull }
803 5cedca1b 2004-05-15 devnull diflg++;
804 5cedca1b 2004-05-15 devnull dip = &d[dilev];
805 5cedca1b 2004-05-15 devnull dip->op = finds(i);
806 5cedca1b 2004-05-15 devnull dip->curd = i;
807 5cedca1b 2004-05-15 devnull clrmn(oldmn);
808 5cedca1b 2004-05-15 devnull k = (int *) & dip->dnl;
809 5cedca1b 2004-05-15 devnull for (j = 0; j < 10; j++)
810 5cedca1b 2004-05-15 devnull k[j] = 0; /*not op and curd*/
811 5cedca1b 2004-05-15 devnull rtn:
812 5cedca1b 2004-05-15 devnull app = 0;
813 5cedca1b 2004-05-15 devnull diflg = 0;
814 5cedca1b 2004-05-15 devnull }
815 5cedca1b 2004-05-15 devnull
816 5cedca1b 2004-05-15 devnull
817 5cedca1b 2004-05-15 devnull void casedt(void)
818 5cedca1b 2004-05-15 devnull {
819 5cedca1b 2004-05-15 devnull lgf++;
820 5cedca1b 2004-05-15 devnull dip->dimac = dip->ditrap = dip->ditf = 0;
821 5cedca1b 2004-05-15 devnull skip();
822 5cedca1b 2004-05-15 devnull dip->ditrap = vnumb((int *)0);
823 5cedca1b 2004-05-15 devnull if (nonumb)
824 5cedca1b 2004-05-15 devnull return;
825 5cedca1b 2004-05-15 devnull skip();
826 5cedca1b 2004-05-15 devnull dip->dimac = getrq();
827 5cedca1b 2004-05-15 devnull }
828 5cedca1b 2004-05-15 devnull
829 5cedca1b 2004-05-15 devnull #define LNSIZE 4000
830 5cedca1b 2004-05-15 devnull void casetl(void)
831 5cedca1b 2004-05-15 devnull {
832 5cedca1b 2004-05-15 devnull int j;
833 5cedca1b 2004-05-15 devnull int w[3];
834 5cedca1b 2004-05-15 devnull Tchar buf[LNSIZE];
835 5cedca1b 2004-05-15 devnull Tchar *tp;
836 5cedca1b 2004-05-15 devnull Tchar i, delim;
837 5cedca1b 2004-05-15 devnull
838 5cedca1b 2004-05-15 devnull /*
839 5cedca1b 2004-05-15 devnull * bug fix
840 5cedca1b 2004-05-15 devnull *
841 5cedca1b 2004-05-15 devnull * if .tl is the first thing in the file, the p1
842 5cedca1b 2004-05-15 devnull * doesn't come out, also the pagenumber will be 0
843 5cedca1b 2004-05-15 devnull *
844 5cedca1b 2004-05-15 devnull * tends too confuse the device filter (and the user as well)
845 5cedca1b 2004-05-15 devnull */
846 5cedca1b 2004-05-15 devnull if (dip == d && numtabp[NL].val == -1)
847 5cedca1b 2004-05-15 devnull newline(1);
848 5cedca1b 2004-05-15 devnull dip->nls = 0;
849 5cedca1b 2004-05-15 devnull skip();
850 5cedca1b 2004-05-15 devnull if (ismot(delim = getch())) {
851 5cedca1b 2004-05-15 devnull ch = delim;
852 5cedca1b 2004-05-15 devnull delim = '\'';
853 fa325e9b 2020-01-10 cross } else
854 5cedca1b 2004-05-15 devnull delim = cbits(delim);
855 5cedca1b 2004-05-15 devnull tp = buf;
856 5cedca1b 2004-05-15 devnull numtabp[HP].val = 0;
857 5cedca1b 2004-05-15 devnull w[0] = w[1] = w[2] = 0;
858 5cedca1b 2004-05-15 devnull j = 0;
859 5cedca1b 2004-05-15 devnull while (cbits(i = getch()) != '\n') {
860 5cedca1b 2004-05-15 devnull if (cbits(i) == cbits(delim)) {
861 5cedca1b 2004-05-15 devnull if (j < 3)
862 5cedca1b 2004-05-15 devnull w[j] = numtabp[HP].val;
863 5cedca1b 2004-05-15 devnull numtabp[HP].val = 0;
864 5cedca1b 2004-05-15 devnull if (w[j] != 0)
865 5cedca1b 2004-05-15 devnull *tp++ = WORDSP;
866 5cedca1b 2004-05-15 devnull j++;
867 5cedca1b 2004-05-15 devnull *tp++ = 0;
868 5cedca1b 2004-05-15 devnull } else {
869 5cedca1b 2004-05-15 devnull if (cbits(i) == pagech) {
870 5cedca1b 2004-05-15 devnull setn1(numtabp[PN].val, numtabp[findr('%')].fmt,
871 5cedca1b 2004-05-15 devnull i&SFMASK);
872 5cedca1b 2004-05-15 devnull continue;
873 5cedca1b 2004-05-15 devnull }
874 5cedca1b 2004-05-15 devnull numtabp[HP].val += width(i);
875 5cedca1b 2004-05-15 devnull if (tp < &buf[LNSIZE-10]) {
876 5cedca1b 2004-05-15 devnull if (cbits(i) == ' ' && *tp != WORDSP)
877 5cedca1b 2004-05-15 devnull *tp++ = WORDSP;
878 5cedca1b 2004-05-15 devnull *tp++ = i;
879 5cedca1b 2004-05-15 devnull } else {
880 5cedca1b 2004-05-15 devnull ERROR "Overflow in casetl" WARN;
881 5cedca1b 2004-05-15 devnull }
882 5cedca1b 2004-05-15 devnull }
883 5cedca1b 2004-05-15 devnull }
884 5cedca1b 2004-05-15 devnull if (j<3)
885 5cedca1b 2004-05-15 devnull w[j] = numtabp[HP].val;
886 5cedca1b 2004-05-15 devnull *tp++ = 0;
887 5cedca1b 2004-05-15 devnull *tp++ = 0;
888 5cedca1b 2004-05-15 devnull *tp = 0;
889 5cedca1b 2004-05-15 devnull tp = buf;
890 5cedca1b 2004-05-15 devnull if (NROFF)
891 5cedca1b 2004-05-15 devnull horiz(po);
892 5cedca1b 2004-05-15 devnull while (i = *tp++)
893 5cedca1b 2004-05-15 devnull pchar(i);
894 5cedca1b 2004-05-15 devnull if (w[1] || w[2])
895 5cedca1b 2004-05-15 devnull horiz(j = quant((lt - w[1]) / 2 - w[0], HOR));
896 5cedca1b 2004-05-15 devnull while (i = *tp++)
897 5cedca1b 2004-05-15 devnull pchar(i);
898 5cedca1b 2004-05-15 devnull if (w[2]) {
899 5cedca1b 2004-05-15 devnull horiz(lt - w[0] - w[1] - w[2] - j);
900 5cedca1b 2004-05-15 devnull while (i = *tp++)
901 5cedca1b 2004-05-15 devnull pchar(i);
902 5cedca1b 2004-05-15 devnull }
903 5cedca1b 2004-05-15 devnull newline(0);
904 5cedca1b 2004-05-15 devnull if (dip != d) {
905 5cedca1b 2004-05-15 devnull if (dip->dnl > dip->hnl)
906 5cedca1b 2004-05-15 devnull dip->hnl = dip->dnl;
907 5cedca1b 2004-05-15 devnull } else {
908 5cedca1b 2004-05-15 devnull if (numtabp[NL].val > dip->hnl)
909 5cedca1b 2004-05-15 devnull dip->hnl = numtabp[NL].val;
910 5cedca1b 2004-05-15 devnull }
911 5cedca1b 2004-05-15 devnull }
912 5cedca1b 2004-05-15 devnull
913 5cedca1b 2004-05-15 devnull
914 5cedca1b 2004-05-15 devnull void casepc(void)
915 5cedca1b 2004-05-15 devnull {
916 5cedca1b 2004-05-15 devnull pagech = chget(IMP);
917 5cedca1b 2004-05-15 devnull }
918 5cedca1b 2004-05-15 devnull
919 5cedca1b 2004-05-15 devnull
920 5cedca1b 2004-05-15 devnull void casepm(void)
921 5cedca1b 2004-05-15 devnull {
922 5cedca1b 2004-05-15 devnull int i, k;
923 5cedca1b 2004-05-15 devnull int xx, cnt, tcnt, kk, tot;
924 5cedca1b 2004-05-15 devnull Offset j;
925 5cedca1b 2004-05-15 devnull
926 5cedca1b 2004-05-15 devnull kk = cnt = tcnt = 0;
927 5cedca1b 2004-05-15 devnull tot = !skip();
928 5cedca1b 2004-05-15 devnull stackdump();
929 5cedca1b 2004-05-15 devnull for (i = 0; i < nm; i++) {
930 5cedca1b 2004-05-15 devnull if ((xx = contabp[i].rq) == 0 || contabp[i].mx == 0)
931 5cedca1b 2004-05-15 devnull continue;
932 5cedca1b 2004-05-15 devnull tcnt++;
933 5cedca1b 2004-05-15 devnull j = contabp[i].mx;
934 5cedca1b 2004-05-15 devnull for (k = 1; (j = blist[bindex(j)].nextoff) != -1; )
935 fa325e9b 2020-01-10 cross k++;
936 5cedca1b 2004-05-15 devnull cnt++;
937 5cedca1b 2004-05-15 devnull kk += k;
938 5cedca1b 2004-05-15 devnull if (!tot)
939 5cedca1b 2004-05-15 devnull fprintf(stderr, "%-2.2s %d\n", unpair(xx), k);
940 5cedca1b 2004-05-15 devnull }
941 5cedca1b 2004-05-15 devnull fprintf(stderr, "pm: total %d, macros %d, space %d\n", tcnt, cnt, kk);
942 5cedca1b 2004-05-15 devnull }
943 5cedca1b 2004-05-15 devnull
944 5cedca1b 2004-05-15 devnull void stackdump(void) /* dumps stack of macros in process */
945 5cedca1b 2004-05-15 devnull {
946 5cedca1b 2004-05-15 devnull Stack *p;
947 5cedca1b 2004-05-15 devnull
948 5cedca1b 2004-05-15 devnull if (frame != stk) {
949 5cedca1b 2004-05-15 devnull fprintf(stderr, "stack: ");
950 5cedca1b 2004-05-15 devnull for (p = frame; p != stk; p = p->pframe)
951 5cedca1b 2004-05-15 devnull fprintf(stderr, "%s ", unpair(p->mname));
952 5cedca1b 2004-05-15 devnull fprintf(stderr, "\n");
953 5cedca1b 2004-05-15 devnull }
954 5cedca1b 2004-05-15 devnull }