xref: /csrg-svn/old/roff/common_source/n5.c (revision 7069)
1*7069Srrh #ifndef lint
2*7069Srrh static char sccsid[] = "@(#)n5.c	4.1 06/07/82";
3*7069Srrh #endif lint
4*7069Srrh 
5*7069Srrh #include "tdef.h"
6*7069Srrh #include <sgtty.h>
7*7069Srrh extern
8*7069Srrh #include "d.h"
9*7069Srrh extern
10*7069Srrh #include "v.h"
11*7069Srrh #include "sdef.h"
12*7069Srrh 
13*7069Srrh /*
14*7069Srrh troff5.c
15*7069Srrh 
16*7069Srrh misc processing requests
17*7069Srrh */
18*7069Srrh 
19*7069Srrh extern	int	inchar[LNSIZE], *pinchar;	/* XXX */
20*7069Srrh extern struct s *frame;
21*7069Srrh extern struct s *litlev;
22*7069Srrh extern filep ip;
23*7069Srrh extern filep offset;
24*7069Srrh 
25*7069Srrh extern int ascii;
26*7069Srrh extern int nonumb;
27*7069Srrh extern int admod;
28*7069Srrh extern int ad;
29*7069Srrh extern int fi;
30*7069Srrh extern int cc;
31*7069Srrh extern int c2;
32*7069Srrh extern int ohc;
33*7069Srrh extern int tabc;
34*7069Srrh extern int dotc;
35*7069Srrh extern int pendnf;
36*7069Srrh extern int hyf;
37*7069Srrh extern int ce;
38*7069Srrh extern int po;
39*7069Srrh extern int po1;
40*7069Srrh extern int nc;
41*7069Srrh extern int in;
42*7069Srrh extern int un;
43*7069Srrh extern int un1;
44*7069Srrh extern int in1;
45*7069Srrh extern int ll;
46*7069Srrh extern int ll1;
47*7069Srrh extern int lt;
48*7069Srrh extern int lt1;
49*7069Srrh extern int nlist[NTRAP];
50*7069Srrh extern int mlist[NTRAP];
51*7069Srrh extern int lgf;
52*7069Srrh extern int pl;
53*7069Srrh extern int npn;
54*7069Srrh extern int npnflg;
55*7069Srrh extern int copyf;
56*7069Srrh extern char nextf[];
57*7069Srrh extern int trap;
58*7069Srrh extern int lss;
59*7069Srrh extern int em;
60*7069Srrh extern int evlist[EVLSZ];
61*7069Srrh extern int evi;
62*7069Srrh extern int ibf;
63*7069Srrh extern int ev;
64*7069Srrh extern int ch;
65*7069Srrh extern int nflush;
66*7069Srrh extern int tty;
67*7069Srrh extern struct sgttyb ttys;
68*7069Srrh extern int quiet;
69*7069Srrh extern int iflg;
70*7069Srrh extern int eschar;
71*7069Srrh extern int lit;
72*7069Srrh extern int ls;
73*7069Srrh extern int ls1;
74*7069Srrh extern int tabtab[];
75*7069Srrh extern char trtab[];
76*7069Srrh extern int ul;
77*7069Srrh extern int cu;
78*7069Srrh extern int sfont;
79*7069Srrh extern int font;
80*7069Srrh extern int fontlab[];
81*7069Srrh extern int it;
82*7069Srrh extern int itmac;
83*7069Srrh extern int noscale;
84*7069Srrh extern int ic;
85*7069Srrh extern int icf;
86*7069Srrh extern int ics;
87*7069Srrh extern int *vlist;
88*7069Srrh extern int sv;
89*7069Srrh extern int esc;
90*7069Srrh extern int nn;
91*7069Srrh extern int nms;
92*7069Srrh extern int ndf;
93*7069Srrh extern int lnmod;
94*7069Srrh extern int ni;
95*7069Srrh extern int lnsize;
96*7069Srrh extern int nb;
97*7069Srrh extern int nlflg;
98*7069Srrh extern int apts, apts1, pts, pts1, font, font1;
99*7069Srrh extern int ulfont;
100*7069Srrh extern int ulbit;
101*7069Srrh extern int error;
102*7069Srrh extern int nmbits;
103*7069Srrh extern int chbits;
104*7069Srrh extern int tdelim;
105*7069Srrh extern int xxx;
106*7069Srrh int iflist[NIF];
107*7069Srrh int ifx;
108*7069Srrh 
109*7069Srrh casead(){
110*7069Srrh 	register i;
111*7069Srrh 
112*7069Srrh 	ad = 1;
113*7069Srrh 	/*leave admod alone*/
114*7069Srrh 	if(skip())return;
115*7069Srrh 	switch(i = getch() & CMASK){
116*7069Srrh 		case 'r':	/*right adj, left ragged*/
117*7069Srrh 			admod = 2;
118*7069Srrh 			break;
119*7069Srrh 		case 'l':	/*left adj, right ragged*/
120*7069Srrh 			admod = ad = 0;	/*same as casena*/
121*7069Srrh 			break;
122*7069Srrh 		case 'c':	/*centered adj*/
123*7069Srrh 			admod = 1;
124*7069Srrh 			break;
125*7069Srrh 		case 'b': case 'n':
126*7069Srrh 			admod = 0;
127*7069Srrh 			break;
128*7069Srrh 		case '0': case '2': case '4':
129*7069Srrh 			ad = 0;
130*7069Srrh 		case '1': case '3': case '5':
131*7069Srrh 			admod = (i - '0')/2;
132*7069Srrh 	}
133*7069Srrh }
134*7069Srrh casena(){
135*7069Srrh 	ad = 0;
136*7069Srrh }
137*7069Srrh casefi(){
138*7069Srrh 	tbreak();
139*7069Srrh 	fi++;
140*7069Srrh 	pendnf = 0;
141*7069Srrh 	lnsize = LNSIZE;
142*7069Srrh }
143*7069Srrh casenf(){
144*7069Srrh 	tbreak();
145*7069Srrh 	fi = 0;
146*7069Srrh /* can't do while oline is only LNSIZE
147*7069Srrh 	lnsize = LNSIZE + WDSIZE;
148*7069Srrh */
149*7069Srrh }
150*7069Srrh casers(){
151*7069Srrh 	dip->nls = 0;
152*7069Srrh }
153*7069Srrh casens(){
154*7069Srrh 	dip->nls++;
155*7069Srrh }
156*7069Srrh chget(c)
157*7069Srrh int c;
158*7069Srrh {
159*7069Srrh 	register i;
160*7069Srrh 
161*7069Srrh 	if(skip() ||
162*7069Srrh 	  ((i = getch()) & MOT) ||
163*7069Srrh 	  ((i&CMASK) == ' ') ||
164*7069Srrh 	  ((i&CMASK) == '\n')){
165*7069Srrh 		ch = i;
166*7069Srrh 		return(c);
167*7069Srrh 	}else return(i & BMASK);
168*7069Srrh }
169*7069Srrh casecc(){
170*7069Srrh 	cc = chget('.');
171*7069Srrh }
172*7069Srrh casec2(){
173*7069Srrh 	c2 = chget('\'');
174*7069Srrh }
175*7069Srrh casehc(){
176*7069Srrh 	ohc = chget(OHC);
177*7069Srrh }
178*7069Srrh casetc(){
179*7069Srrh 	tabc = chget(0);
180*7069Srrh }
181*7069Srrh caselc(){
182*7069Srrh 	dotc = chget(0);
183*7069Srrh }
184*7069Srrh casehy(){
185*7069Srrh 	register i;
186*7069Srrh 
187*7069Srrh 	hyf = 1;
188*7069Srrh 	if(skip())return;
189*7069Srrh 	noscale++;
190*7069Srrh 	i = atoi();
191*7069Srrh 	noscale = 0;
192*7069Srrh 	if(nonumb)return;
193*7069Srrh 	hyf = max(i,0);
194*7069Srrh }
195*7069Srrh casenh(){
196*7069Srrh 	hyf = 0;
197*7069Srrh }
198*7069Srrh max(aa,bb)
199*7069Srrh int aa,bb;
200*7069Srrh {
201*7069Srrh 	if(aa>bb)return(aa);
202*7069Srrh 	else return(bb);
203*7069Srrh }
204*7069Srrh casece(){
205*7069Srrh 	register i;
206*7069Srrh 
207*7069Srrh 	noscale++;
208*7069Srrh 	skip();
209*7069Srrh 	i = max(atoi(),0);
210*7069Srrh 	if(nonumb)i = 1;
211*7069Srrh 	tbreak();
212*7069Srrh 	ce = i;
213*7069Srrh 	noscale = 0;
214*7069Srrh }
215*7069Srrh casein(){
216*7069Srrh 	register i;
217*7069Srrh 
218*7069Srrh 	if(skip())i = in1;
219*7069Srrh 	else i = max(hnumb(&in),0);
220*7069Srrh 	tbreak();
221*7069Srrh 	in1 = in;
222*7069Srrh 	in = i;
223*7069Srrh 	if(!nc){
224*7069Srrh 		un = in;
225*7069Srrh 		setnel();
226*7069Srrh 	}
227*7069Srrh }
228*7069Srrh casell(){
229*7069Srrh 	register i;
230*7069Srrh 
231*7069Srrh 	if(skip())i = ll1;
232*7069Srrh 	else i = max(hnumb(&ll),INCH/10);
233*7069Srrh 	ll1 = ll;
234*7069Srrh 	ll = i;
235*7069Srrh 	setnel();
236*7069Srrh }
237*7069Srrh caselt(){
238*7069Srrh 	register i;
239*7069Srrh 
240*7069Srrh 	if(skip())i = lt1;
241*7069Srrh 	else i = max(hnumb(&lt),0);
242*7069Srrh 	lt1 = lt;
243*7069Srrh 	lt = i;
244*7069Srrh }
245*7069Srrh caseti(){
246*7069Srrh 	register i;
247*7069Srrh 
248*7069Srrh 	if(skip())return;
249*7069Srrh 	i = max(hnumb(&in),0);
250*7069Srrh 	tbreak();
251*7069Srrh 	un1 = i;
252*7069Srrh 	setnel();
253*7069Srrh }
254*7069Srrh casels(){
255*7069Srrh 	register i;
256*7069Srrh 
257*7069Srrh 	noscale++;
258*7069Srrh 	if(skip())i = ls1;
259*7069Srrh 	else i = max(inumb(&ls),1);
260*7069Srrh 	ls1 = ls;
261*7069Srrh 	ls = i;
262*7069Srrh 	noscale = 0;
263*7069Srrh }
264*7069Srrh casepo(){
265*7069Srrh 	register i;
266*7069Srrh 
267*7069Srrh 	if(skip())i = po1;
268*7069Srrh 	else i = max(hnumb(&po),0);
269*7069Srrh 	po1 = po;
270*7069Srrh 	po = i;
271*7069Srrh #ifndef NROFF
272*7069Srrh 	if(!ascii)esc += po - po1;
273*7069Srrh #endif
274*7069Srrh }
275*7069Srrh casepl(){
276*7069Srrh 	register i;
277*7069Srrh 
278*7069Srrh 	skip();
279*7069Srrh 	if((i = vnumb(&pl)) == 0)pl = 11 * INCH; /*11in*/
280*7069Srrh 		else pl = i;
281*7069Srrh 	if(v.nl > pl)v.nl = pl;
282*7069Srrh }
283*7069Srrh casewh(){
284*7069Srrh 	register i, j, k;
285*7069Srrh 
286*7069Srrh 	lgf++;
287*7069Srrh 	skip();
288*7069Srrh 	i = vnumb((int *)0);
289*7069Srrh 	if(nonumb)return;
290*7069Srrh 	skip();
291*7069Srrh 	j = getrq();
292*7069Srrh 	if((k=findn(i)) != NTRAP){
293*7069Srrh 		mlist[k] = j;
294*7069Srrh 		return;
295*7069Srrh 	}
296*7069Srrh 	for(k=0; k<NTRAP; k++)if(mlist[k] == 0)break;
297*7069Srrh 	if(k == NTRAP){
298*7069Srrh 		prstrfl("Cannot plant trap.\n");
299*7069Srrh 		return;
300*7069Srrh 	}
301*7069Srrh 	mlist[k] = j;
302*7069Srrh 	nlist[k] = i;
303*7069Srrh }
304*7069Srrh casech(){
305*7069Srrh 	register i, j, k;
306*7069Srrh 
307*7069Srrh 	lgf++;
308*7069Srrh 	skip();
309*7069Srrh 	if(!(j=getrq()))return;
310*7069Srrh 		else for(k=0; k<NTRAP; k++)if(mlist[k] == j)break;
311*7069Srrh 	if(k == NTRAP)return;
312*7069Srrh 	skip();
313*7069Srrh 	i = vnumb((int *)0);
314*7069Srrh 	if(nonumb)mlist[k] = 0;
315*7069Srrh 	nlist[k] = i;
316*7069Srrh }
317*7069Srrh findn(i)
318*7069Srrh int i;
319*7069Srrh {
320*7069Srrh 	register k;
321*7069Srrh 
322*7069Srrh 	for(k=0; k<NTRAP; k++)
323*7069Srrh 		if((nlist[k] == i) && (mlist[k] != 0))break;
324*7069Srrh 	return(k);
325*7069Srrh }
326*7069Srrh casepn(){
327*7069Srrh 	register i;
328*7069Srrh 
329*7069Srrh 	skip();
330*7069Srrh 	noscale++;
331*7069Srrh 	i = max(inumb(&v.pn),0);
332*7069Srrh 	noscale = 0;
333*7069Srrh 	if(!nonumb){
334*7069Srrh 		npn = i;
335*7069Srrh 		npnflg++;
336*7069Srrh 	}
337*7069Srrh }
338*7069Srrh casebp(){
339*7069Srrh 	register i;
340*7069Srrh 	register struct s *savframe;
341*7069Srrh 
342*7069Srrh 	if(dip != d)return;
343*7069Srrh 	savframe = frame;
344*7069Srrh 	skip();
345*7069Srrh 	if((i = inumb(&v.pn)) < 0)i = 0;
346*7069Srrh 	tbreak();
347*7069Srrh 	if(!nonumb){
348*7069Srrh 		npn = i;
349*7069Srrh 		npnflg++;
350*7069Srrh 	}else if(dip->nls)return;
351*7069Srrh 	eject(savframe);
352*7069Srrh }
353*7069Srrh casetm(x) int x;{
354*7069Srrh 	register i;
355*7069Srrh 	char tmbuf[NTM];
356*7069Srrh 
357*7069Srrh 	lgf++;
358*7069Srrh 	copyf++;
359*7069Srrh 	if(skip() && x)prstrfl("User Abort.");
360*7069Srrh 	for(i=0; i<NTM-2;)if((tmbuf[i++]=getch()) == '\n')break;
361*7069Srrh 	if(i == NTM-2)tmbuf[i++] = '\n';
362*7069Srrh 	tmbuf[i] = 0;
363*7069Srrh 	prstrfl(tmbuf);
364*7069Srrh 	copyf--;
365*7069Srrh }
366*7069Srrh casesp(a)
367*7069Srrh int a;
368*7069Srrh {
369*7069Srrh 	register i, j, savlss;
370*7069Srrh 
371*7069Srrh 	tbreak();
372*7069Srrh 	if(dip->nls || trap)return;
373*7069Srrh 	i = findt1();
374*7069Srrh 	if(!a){
375*7069Srrh 		skip();
376*7069Srrh 		j = vnumb((int *)0);
377*7069Srrh 		if(nonumb)j = lss;
378*7069Srrh 	}else j = a;
379*7069Srrh 	if(j == 0)return;
380*7069Srrh 	if(i < j)j = i;
381*7069Srrh 	savlss = lss;
382*7069Srrh 	if(dip != d)i = dip->dnl; else i = v.nl;
383*7069Srrh 	if((i + j) < 0)j = -i;
384*7069Srrh 	lss = j;
385*7069Srrh 	newline(0);
386*7069Srrh 	lss = savlss;
387*7069Srrh }
388*7069Srrh casert(){
389*7069Srrh 	register a, *p;
390*7069Srrh 
391*7069Srrh 	skip();
392*7069Srrh 	if(dip != d)p = &dip->dnl; else p = &v.nl;
393*7069Srrh 	a = vnumb(p);
394*7069Srrh 	if(nonumb)a = dip->mkline;
395*7069Srrh 	if((a < 0) || (a >= *p))return;
396*7069Srrh 	nb++;
397*7069Srrh 	casesp(a - *p);
398*7069Srrh }
399*7069Srrh caseem(){
400*7069Srrh 	lgf++;
401*7069Srrh 	skip();
402*7069Srrh 	em = getrq();
403*7069Srrh }
404*7069Srrh casefl(){
405*7069Srrh 	tbreak();
406*7069Srrh 	flusho();
407*7069Srrh }
408*7069Srrh caseev(){
409*7069Srrh 	register nxev;
410*7069Srrh 	extern int block;
411*7069Srrh 
412*7069Srrh 	if(skip()){
413*7069Srrh e0:
414*7069Srrh 		if(evi == 0)return;
415*7069Srrh 		nxev =  evlist[--evi];
416*7069Srrh 		goto e1;
417*7069Srrh 	}
418*7069Srrh 	noscale++;
419*7069Srrh 	nxev = atoi();
420*7069Srrh 	noscale = 0;
421*7069Srrh 	if(nonumb)goto e0;
422*7069Srrh 	flushi();
423*7069Srrh 	if((nxev >= NEV) || (nxev < 0) || (evi >= EVLSZ)){
424*7069Srrh 		prstrfl("Cannot do ev.\n");
425*7069Srrh 		if(error)done2(040);else edone(040);
426*7069Srrh 		return;
427*7069Srrh 	}
428*7069Srrh 	evlist[evi++] = ev;
429*7069Srrh e1:
430*7069Srrh 	if(ev == nxev)return;
431*7069Srrh 	lseek(ibf, (long)(ev*EVS*sizeof(int)), 0);
432*7069Srrh 	write(ibf,(char *)&block, EVS*sizeof(int));
433*7069Srrh 	lseek(ibf, (long)(nxev*EVS*sizeof(int)), 0);
434*7069Srrh 	read(ibf,(char *)&block, EVS*sizeof(int));
435*7069Srrh 	ev = nxev;
436*7069Srrh }
437*7069Srrh caseel(){
438*7069Srrh 	if(--ifx < 0){
439*7069Srrh 		ifx = 0;
440*7069Srrh 		iflist[0] = 0;
441*7069Srrh 	}
442*7069Srrh 	caseif(2);
443*7069Srrh }
444*7069Srrh caseie(){
445*7069Srrh 	if(ifx >= NIF){
446*7069Srrh 		prstr("if-else overflow.\n");
447*7069Srrh 		ifx = 0;
448*7069Srrh 		edone(040);
449*7069Srrh 	}
450*7069Srrh 	caseif(1);
451*7069Srrh 	ifx++;
452*7069Srrh }
453*7069Srrh caseif(x)
454*7069Srrh int x;
455*7069Srrh {
456*7069Srrh 	register i, notflag, true;
457*7069Srrh 
458*7069Srrh 	if(x == 2){
459*7069Srrh 		notflag = 0;
460*7069Srrh 		true = iflist[ifx];
461*7069Srrh 		goto i1;
462*7069Srrh 	}
463*7069Srrh 	true = 0;
464*7069Srrh 	skip();
465*7069Srrh 	if(((i = getch()) & CMASK) == '!'){
466*7069Srrh 		notflag = 1;
467*7069Srrh 	}else{
468*7069Srrh 		notflag = 0;
469*7069Srrh 		ch = i;
470*7069Srrh 	}
471*7069Srrh 	i = atoi();
472*7069Srrh 	if(!nonumb){
473*7069Srrh 		if(i > 0)true++;
474*7069Srrh 		goto i1;
475*7069Srrh 	}
476*7069Srrh 	switch((i = getch()) & CMASK){
477*7069Srrh 		case 'e':
478*7069Srrh 			if(!(v.pn & 01))true++;
479*7069Srrh 			break;
480*7069Srrh 		case 'o':
481*7069Srrh 			if(v.pn & 01)true++;
482*7069Srrh 			break;
483*7069Srrh #ifdef NROFF
484*7069Srrh 		case 'n':
485*7069Srrh 			true++;
486*7069Srrh 		case 't':
487*7069Srrh #endif
488*7069Srrh #ifndef NROFF
489*7069Srrh 		case 't':
490*7069Srrh 			true++;
491*7069Srrh 		case 'n':
492*7069Srrh #endif
493*7069Srrh 		case ' ':
494*7069Srrh 			break;
495*7069Srrh 		default:
496*7069Srrh 			true = cmpstr(i);
497*7069Srrh 	}
498*7069Srrh i1:
499*7069Srrh 	true ^= notflag;
500*7069Srrh 	if(x == 1)iflist[ifx] = !true;
501*7069Srrh 	if(true){
502*7069Srrh 	i2:
503*7069Srrh 		do{
504*7069Srrh 		v.hp = 0;
505*7069Srrh 		pinchar = inchar;	/* XXX */
506*7069Srrh 		}
507*7069Srrh 		while(((i = getch()) & CMASK) == ' ');
508*7069Srrh 		if((i & CMASK) == LEFT)goto i2;
509*7069Srrh 		ch = i;
510*7069Srrh 		nflush++;
511*7069Srrh 	}else{
512*7069Srrh 		copyf++;
513*7069Srrh 		if(eat(LEFT) == LEFT){
514*7069Srrh 			while(eatblk(RIGHT,LEFT) != RIGHT)nlflg = 0;
515*7069Srrh 		}
516*7069Srrh 		copyf--;
517*7069Srrh 	}
518*7069Srrh }
519*7069Srrh eatblk(right,left)
520*7069Srrh int right,left;
521*7069Srrh {
522*7069Srrh 	register i;
523*7069Srrh 
524*7069Srrh e0:
525*7069Srrh 	while(((i = getch() & CMASK) != right) &&
526*7069Srrh 		(i != left) &&
527*7069Srrh 		(i != '\n'));
528*7069Srrh 	if(i == left){
529*7069Srrh 		while((i=eatblk(right,left)) != right)nlflg = 0;
530*7069Srrh 		goto e0;
531*7069Srrh 	}
532*7069Srrh 	return(i);
533*7069Srrh }
534*7069Srrh cmpstr(delim)
535*7069Srrh int delim;
536*7069Srrh {
537*7069Srrh 	register i, j;
538*7069Srrh 	register filep p;
539*7069Srrh 	extern filep alloc();
540*7069Srrh 	extern filep incoff();
541*7069Srrh 	filep begin;
542*7069Srrh 	int cnt, k;
543*7069Srrh 	int savapts, savapts1, savfont, savfont1,
544*7069Srrh 		savpts, savpts1;
545*7069Srrh 
546*7069Srrh 	if(delim & MOT)return(0);
547*7069Srrh 	delim &= CMASK;
548*7069Srrh 	if(dip != d)wbfl();
549*7069Srrh 	if((offset = begin = alloc()) == (filep)0)return(0);
550*7069Srrh 	cnt = 0;
551*7069Srrh 	v.hp = 0;
552*7069Srrh 	pinchar = inchar;	/* XXX */
553*7069Srrh 	savapts = apts;
554*7069Srrh 	savapts1 = apts1;
555*7069Srrh 	savfont = font;
556*7069Srrh 	savfont1 = font1;
557*7069Srrh 	savpts = pts;
558*7069Srrh 	savpts1 = pts1;
559*7069Srrh 	while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
560*7069Srrh 		wbf(i);
561*7069Srrh 		cnt++;
562*7069Srrh 	}
563*7069Srrh 	wbt(0);
564*7069Srrh 	k = !cnt;
565*7069Srrh 	if(nlflg)goto rtn;
566*7069Srrh 	p = begin;
567*7069Srrh 	apts = savapts;
568*7069Srrh 	apts1 = savapts1;
569*7069Srrh 	font = savfont;
570*7069Srrh 	font1 = savfont1;
571*7069Srrh 	pts = savpts;
572*7069Srrh 	pts1 = savpts1;
573*7069Srrh 	mchbits();
574*7069Srrh 	v.hp = 0;
575*7069Srrh 	pinchar = inchar;	/* XXX */
576*7069Srrh 	while(((j = (i=getch()) & CMASK) != delim) && (j != '\n')){
577*7069Srrh 		if(rbf0(p) != i){
578*7069Srrh 			eat(delim);
579*7069Srrh 			k = 0;
580*7069Srrh 			break;
581*7069Srrh 		}
582*7069Srrh 		p = incoff(p);
583*7069Srrh 		k = !(--cnt);
584*7069Srrh 	}
585*7069Srrh rtn:
586*7069Srrh 	apts = savapts;
587*7069Srrh 	apts1 = savapts1;
588*7069Srrh 	font = savfont;
589*7069Srrh 	font1 = savfont1;
590*7069Srrh 	pts = savpts;
591*7069Srrh 	pts1 = savpts1;
592*7069Srrh 	mchbits();
593*7069Srrh 	offset = dip->op;
594*7069Srrh 	ffree(begin);
595*7069Srrh 	return(k);
596*7069Srrh }
597*7069Srrh caserd(){
598*7069Srrh 
599*7069Srrh 	lgf++;
600*7069Srrh 	skip();
601*7069Srrh 	getname();
602*7069Srrh 	if(!iflg){
603*7069Srrh 		if(quiet){
604*7069Srrh 			ttys.sg_flags &= ~ECHO;
605*7069Srrh 			stty(0, &ttys);
606*7069Srrh 			prstrfl(""); /*bell*/
607*7069Srrh 		}else{
608*7069Srrh 			if(nextf[0]){
609*7069Srrh 				prstr(nextf);
610*7069Srrh 				prstr(":");
611*7069Srrh 			}else{
612*7069Srrh 				prstr(""); /*bell*/
613*7069Srrh 			}
614*7069Srrh 		}
615*7069Srrh 	}
616*7069Srrh 	collect();
617*7069Srrh 	tty++;
618*7069Srrh 	pushi((filep)-1);
619*7069Srrh }
620*7069Srrh rdtty(){
621*7069Srrh 	char onechar;
622*7069Srrh 
623*7069Srrh 	onechar = 0;
624*7069Srrh 	if(read(0, &onechar, 1) == 1){
625*7069Srrh 		if(onechar == '\n')tty++;
626*7069Srrh 			else tty = 1;
627*7069Srrh 		if(tty != 3)return(onechar);
628*7069Srrh 	}
629*7069Srrh 	popi();
630*7069Srrh 	tty = 0;
631*7069Srrh 	if(quiet){
632*7069Srrh 		ttys.sg_flags |= ECHO;
633*7069Srrh 		stty(0, &ttys);
634*7069Srrh 	}
635*7069Srrh 	return(0);
636*7069Srrh }
637*7069Srrh caseec(){
638*7069Srrh 	eschar = chget('\\');
639*7069Srrh }
640*7069Srrh caseeo(){
641*7069Srrh 	eschar = 0;
642*7069Srrh }
643*7069Srrh caseli(){
644*7069Srrh 
645*7069Srrh 	skip();
646*7069Srrh 	lit = max(inumb((int *)0),1);
647*7069Srrh 	litlev = frame;
648*7069Srrh 	if((dip == d) && (v.nl == -1))newline(1);
649*7069Srrh }
650*7069Srrh caseta(){
651*7069Srrh 	register i;
652*7069Srrh 
653*7069Srrh 	tabtab[0] = nonumb = 0;
654*7069Srrh 	for(i=0; ((i < (NTAB-1)) && !nonumb); i++){
655*7069Srrh 		if(skip())break;
656*7069Srrh 		tabtab[i] = max(hnumb(&tabtab[max(i-1,0)]),0) & TMASK;
657*7069Srrh 		if(!nonumb) switch(ch & CMASK){
658*7069Srrh 			case 'C':
659*7069Srrh 				tabtab[i] |= CTAB;
660*7069Srrh 				break;
661*7069Srrh 			case 'R':
662*7069Srrh 				tabtab[i] |= RTAB;
663*7069Srrh 				break;
664*7069Srrh 			default: /*includes L*/
665*7069Srrh 				break;
666*7069Srrh 			}
667*7069Srrh 		nonumb = ch = 0;
668*7069Srrh 	}
669*7069Srrh 	tabtab[i] = 0;
670*7069Srrh }
671*7069Srrh casene(){
672*7069Srrh 	register i, j;
673*7069Srrh 
674*7069Srrh 	skip();
675*7069Srrh 	i = vnumb((int *)0);
676*7069Srrh 	if(nonumb)i = lss;
677*7069Srrh 	if(i > (j = findt1())){
678*7069Srrh 		i = lss;
679*7069Srrh 		lss = j;
680*7069Srrh 		dip->nls = 0;
681*7069Srrh 		newline(0);
682*7069Srrh 		lss = i;
683*7069Srrh 	}
684*7069Srrh }
685*7069Srrh casetr(){
686*7069Srrh 	register i, j;
687*7069Srrh 
688*7069Srrh 	lgf++;
689*7069Srrh 	skip();
690*7069Srrh 	while((i = getch() & CMASK) != '\n'){
691*7069Srrh 		if((i & MOT) || ((j = getch()) & MOT))return;
692*7069Srrh 		if((j &= CMASK) == '\n')j = ' ';
693*7069Srrh 		trtab[i] = j;
694*7069Srrh 	}
695*7069Srrh }
696*7069Srrh casecu(){
697*7069Srrh 	cu++;
698*7069Srrh 	caseul();
699*7069Srrh }
700*7069Srrh caseul(){
701*7069Srrh 	register i;
702*7069Srrh 
703*7069Srrh 	noscale++;
704*7069Srrh 	if(skip())i = 1;
705*7069Srrh 	else i = atoi();
706*7069Srrh 	if(ul && (i == 0)){
707*7069Srrh 		font = sfont;
708*7069Srrh 		ul = cu = 0;
709*7069Srrh 	}
710*7069Srrh 	if(i){
711*7069Srrh 		if(!ul){
712*7069Srrh 			sfont = font;
713*7069Srrh 			font = ulfont;
714*7069Srrh 		}
715*7069Srrh 		ul = i;
716*7069Srrh 	}
717*7069Srrh 	noscale = 0;
718*7069Srrh 	mchbits();
719*7069Srrh }
720*7069Srrh caseuf(){
721*7069Srrh 	register i, j;
722*7069Srrh 
723*7069Srrh 	if(skip() || !(i = getrq()) || (i == 'S') ||
724*7069Srrh 		((j = find(i,fontlab))  == -1))
725*7069Srrh 			ulfont = 1; /*default position 2*/
726*7069Srrh 	else ulfont = j;
727*7069Srrh #ifdef NROFF
728*7069Srrh 	if(ulfont == 0)ulfont = 1;
729*7069Srrh #endif
730*7069Srrh 	ulbit = ulfont<<9;
731*7069Srrh }
732*7069Srrh caseit(){
733*7069Srrh 	register i;
734*7069Srrh 
735*7069Srrh 	lgf++;
736*7069Srrh 	it = itmac = 0;
737*7069Srrh 	noscale++;
738*7069Srrh 	skip();
739*7069Srrh 	i = atoi();
740*7069Srrh 	skip();
741*7069Srrh 	if(!nonumb && (itmac = getrq()))it = i;
742*7069Srrh 	noscale = 0;
743*7069Srrh }
744*7069Srrh casemc(){
745*7069Srrh 	register i;
746*7069Srrh 
747*7069Srrh 	if(icf > 1)ic = 0;
748*7069Srrh 	icf = 0;
749*7069Srrh 	if(skip())return;
750*7069Srrh 	ic = getch();
751*7069Srrh 	icf = 1;
752*7069Srrh 	skip();
753*7069Srrh 	i = max(hnumb((int *)0),0);
754*7069Srrh 	if(!nonumb)ics = i;
755*7069Srrh }
756*7069Srrh casemk(){
757*7069Srrh 	register i, j;
758*7069Srrh 
759*7069Srrh 	if(dip != d)j = dip->dnl; else j = v.nl;
760*7069Srrh 	if(skip()){
761*7069Srrh 		dip->mkline = j;
762*7069Srrh 		return;
763*7069Srrh 	}
764*7069Srrh 	if((i = getrq()) == 0)return;
765*7069Srrh 	vlist[findr(i)] = j;
766*7069Srrh }
767*7069Srrh casesv(){
768*7069Srrh 	register i;
769*7069Srrh 
770*7069Srrh 	skip();
771*7069Srrh 	if((i = vnumb((int *)0)) < 0)return;
772*7069Srrh 	if(nonumb)i = 1;
773*7069Srrh 	sv += i;
774*7069Srrh 	caseos();
775*7069Srrh }
776*7069Srrh caseos(){
777*7069Srrh 	register savlss;
778*7069Srrh 
779*7069Srrh 	if(sv <= findt1()){
780*7069Srrh 		savlss = lss;
781*7069Srrh 		lss = sv;
782*7069Srrh 		newline(0);
783*7069Srrh 		lss = savlss;
784*7069Srrh 		sv = 0;
785*7069Srrh 	}
786*7069Srrh }
787*7069Srrh casenm(){
788*7069Srrh 	register i;
789*7069Srrh 
790*7069Srrh 	lnmod = nn = 0;
791*7069Srrh 	if(skip())return;
792*7069Srrh 	lnmod++;
793*7069Srrh 	noscale++;
794*7069Srrh 	i = inumb(&v.ln);
795*7069Srrh 	if(!nonumb)v.ln = max(i,0);
796*7069Srrh 	getnm(&ndf,1);
797*7069Srrh 	getnm(&nms,0);
798*7069Srrh 	getnm(&ni,0);
799*7069Srrh 	noscale = 0;
800*7069Srrh 	nmbits = chbits;
801*7069Srrh }
802*7069Srrh getnm(p,min)
803*7069Srrh int *p, min;
804*7069Srrh {
805*7069Srrh 	register i;
806*7069Srrh 
807*7069Srrh 	eat(' ');
808*7069Srrh 	if(skip())return;
809*7069Srrh 	i = atoi();
810*7069Srrh 	if(nonumb)return;
811*7069Srrh 	*p = max(i,min);
812*7069Srrh }
813*7069Srrh casenn(){
814*7069Srrh 	noscale++;
815*7069Srrh 	skip();
816*7069Srrh 	nn = max(atoi(),1);
817*7069Srrh 	noscale = 0;
818*7069Srrh }
819*7069Srrh caseab(){
820*7069Srrh 	dummy();
821*7069Srrh 	casetm(1);
822*7069Srrh 	done2(0);
823*7069Srrh }
824