xref: /plan9/sys/src/cmd/htmlroff/t19.c (revision 426d2b71458df9b491ba6c167f699b3f1f7b0428)
1*426d2b71SDavid du Colombier #include "a.h"
2*426d2b71SDavid du Colombier 
3*426d2b71SDavid du Colombier /*
4*426d2b71SDavid du Colombier  * 19. Input/output file switching.
5*426d2b71SDavid du Colombier  */
6*426d2b71SDavid du Colombier 
7*426d2b71SDavid du Colombier /* .so - push new source file */
8*426d2b71SDavid du Colombier void
r_so(int argc,Rune ** argv)9*426d2b71SDavid du Colombier r_so(int argc, Rune **argv)
10*426d2b71SDavid du Colombier {
11*426d2b71SDavid du Colombier 	USED(argc);
12*426d2b71SDavid du Colombier 	pushinputfile(argv[1]);
13*426d2b71SDavid du Colombier }
14*426d2b71SDavid du Colombier 
15*426d2b71SDavid du Colombier /* .nx - end this file, switch to arg */
16*426d2b71SDavid du Colombier void
r_nx(int argc,Rune ** argv)17*426d2b71SDavid du Colombier r_nx(int argc, Rune **argv)
18*426d2b71SDavid du Colombier {
19*426d2b71SDavid du Colombier 	int n;
20*426d2b71SDavid du Colombier 
21*426d2b71SDavid du Colombier 	if(argc == 1){
22*426d2b71SDavid du Colombier 		while(popinput())
23*426d2b71SDavid du Colombier 			;
24*426d2b71SDavid du Colombier 	}else{
25*426d2b71SDavid du Colombier 		if(argc > 2)
26*426d2b71SDavid du Colombier 			warn("too many arguments for .nx");
27*426d2b71SDavid du Colombier 		while((n=popinput()) && n != 2)
28*426d2b71SDavid du Colombier 			;
29*426d2b71SDavid du Colombier 		pushinputfile(argv[1]);
30*426d2b71SDavid du Colombier 	}
31*426d2b71SDavid du Colombier }
32*426d2b71SDavid du Colombier 
33*426d2b71SDavid du Colombier /* .sy - system: run string */
34*426d2b71SDavid du Colombier void
r_sy(Rune * name)35*426d2b71SDavid du Colombier r_sy(Rune *name)
36*426d2b71SDavid du Colombier {
37*426d2b71SDavid du Colombier 	USED(name);
38*426d2b71SDavid du Colombier 	warn(".sy not implemented");
39*426d2b71SDavid du Colombier }
40*426d2b71SDavid du Colombier 
41*426d2b71SDavid du Colombier /* .pi - pipe output to string */
42*426d2b71SDavid du Colombier void
r_pi(Rune * name)43*426d2b71SDavid du Colombier r_pi(Rune *name)
44*426d2b71SDavid du Colombier {
45*426d2b71SDavid du Colombier 	USED(name);
46*426d2b71SDavid du Colombier 	warn(".pi not implemented");
47*426d2b71SDavid du Colombier }
48*426d2b71SDavid du Colombier 
49*426d2b71SDavid du Colombier /* .cf - copy contents of filename to output */
50*426d2b71SDavid du Colombier void
r_cf(int argc,Rune ** argv)51*426d2b71SDavid du Colombier r_cf(int argc, Rune **argv)
52*426d2b71SDavid du Colombier {
53*426d2b71SDavid du Colombier 	int c;
54*426d2b71SDavid du Colombier 	char *p;
55*426d2b71SDavid du Colombier 	Biobuf *b;
56*426d2b71SDavid du Colombier 
57*426d2b71SDavid du Colombier 	USED(argc);
58*426d2b71SDavid du Colombier 	p = esmprint("%S", argv[1]);
59*426d2b71SDavid du Colombier 	if((b = Bopen(p, OREAD)) == nil){
60*426d2b71SDavid du Colombier 		fprint(2, "%L: open %s: %r\n", p);
61*426d2b71SDavid du Colombier 		free(p);
62*426d2b71SDavid du Colombier 		return;
63*426d2b71SDavid du Colombier 	}
64*426d2b71SDavid du Colombier 	free(p);
65*426d2b71SDavid du Colombier 
66*426d2b71SDavid du Colombier 	while((c = Bgetrune(b)) >= 0)
67*426d2b71SDavid du Colombier 		outrune(c);
68*426d2b71SDavid du Colombier 	Bterm(b);
69*426d2b71SDavid du Colombier }
70*426d2b71SDavid du Colombier 
71*426d2b71SDavid du Colombier void
r_inputpipe(Rune * name)72*426d2b71SDavid du Colombier r_inputpipe(Rune *name)
73*426d2b71SDavid du Colombier {
74*426d2b71SDavid du Colombier 	Rune *cmd, *stop, *line;
75*426d2b71SDavid du Colombier 	int n, pid, p[2], len;
76*426d2b71SDavid du Colombier 	Waitmsg *w;
77*426d2b71SDavid du Colombier 
78*426d2b71SDavid du Colombier 	USED(name);
79*426d2b71SDavid du Colombier 	if(pipe(p) < 0){
80*426d2b71SDavid du Colombier 		warn("pipe: %r");
81*426d2b71SDavid du Colombier 		return;
82*426d2b71SDavid du Colombier 	}
83*426d2b71SDavid du Colombier 	stop = copyarg();
84*426d2b71SDavid du Colombier 	cmd = readline(CopyMode);
85*426d2b71SDavid du Colombier 	pid = fork();
86*426d2b71SDavid du Colombier 	switch(pid){
87*426d2b71SDavid du Colombier 	case 0:
88*426d2b71SDavid du Colombier 		if(p[0] != 0){
89*426d2b71SDavid du Colombier 			dup(p[0], 0);
90*426d2b71SDavid du Colombier 			close(p[0]);
91*426d2b71SDavid du Colombier 		}
92*426d2b71SDavid du Colombier 		close(p[1]);
93*426d2b71SDavid du Colombier 		execl("/bin/rc", "rc", "-c", esmprint("%S", cmd), nil);
94*426d2b71SDavid du Colombier 		warn("%Cdp %S: %r", dot, cmd);
95*426d2b71SDavid du Colombier 		_exits(nil);
96*426d2b71SDavid du Colombier 	case -1:
97*426d2b71SDavid du Colombier 		warn("fork: %r");
98*426d2b71SDavid du Colombier 	default:
99*426d2b71SDavid du Colombier 		close(p[0]);
100*426d2b71SDavid du Colombier 		len = runestrlen(stop);
101*426d2b71SDavid du Colombier 		fprint(p[1], ".ps %d\n", getnr(L(".s")));
102*426d2b71SDavid du Colombier 		fprint(p[1], ".vs %du\n", getnr(L(".v")));
103*426d2b71SDavid du Colombier 		fprint(p[1], ".ft %d\n", getnr(L(".f")));
104*426d2b71SDavid du Colombier 		fprint(p[1], ".ll 8i\n");
105*426d2b71SDavid du Colombier 		fprint(p[1], ".pl 30i\n");
106*426d2b71SDavid du Colombier 		while((line = readline(~0)) != nil){
107*426d2b71SDavid du Colombier 			if(runestrncmp(line, stop, len) == 0
108*426d2b71SDavid du Colombier 			&& (line[len]==' ' || line[len]==0 || line[len]=='\t'
109*426d2b71SDavid du Colombier 				|| (line[len]=='\\' && line[len+1]=='}')))
110*426d2b71SDavid du Colombier 				break;
111*426d2b71SDavid du Colombier 			n = runestrlen(line);
112*426d2b71SDavid du Colombier 			line[n] = '\n';
113*426d2b71SDavid du Colombier 			fprint(p[1], "%.*S", n+1, line);
114*426d2b71SDavid du Colombier 			free(line);
115*426d2b71SDavid du Colombier 		}
116*426d2b71SDavid du Colombier 		free(stop);
117*426d2b71SDavid du Colombier 		close(p[1]);
118*426d2b71SDavid du Colombier 		w = wait();
119*426d2b71SDavid du Colombier 		if(w == nil){
120*426d2b71SDavid du Colombier 			warn("wait: %r");
121*426d2b71SDavid du Colombier 			return;
122*426d2b71SDavid du Colombier 		}
123*426d2b71SDavid du Colombier 		if(w->msg[0])
124*426d2b71SDavid du Colombier 			sysfatal("%C%S %S: %s", dot, name, cmd, w->msg);
125*426d2b71SDavid du Colombier 		free(cmd);
126*426d2b71SDavid du Colombier 		free(w);
127*426d2b71SDavid du Colombier 	}
128*426d2b71SDavid du Colombier }
129*426d2b71SDavid du Colombier 
130*426d2b71SDavid du Colombier void
t19init(void)131*426d2b71SDavid du Colombier t19init(void)
132*426d2b71SDavid du Colombier {
133*426d2b71SDavid du Colombier 	addreq(L("so"), r_so, 1);
134*426d2b71SDavid du Colombier 	addreq(L("nx"), r_nx, -1);
135*426d2b71SDavid du Colombier 	addraw(L("sy"), r_sy);
136*426d2b71SDavid du Colombier 	addraw(L("inputpipe"), r_inputpipe);
137*426d2b71SDavid du Colombier 	addraw(L("pi"), r_pi);
138*426d2b71SDavid du Colombier 	addreq(L("cf"), r_cf, 1);
139*426d2b71SDavid du Colombier 
140*426d2b71SDavid du Colombier 	nr(L("$$"), getpid());
141*426d2b71SDavid du Colombier }
142*426d2b71SDavid du Colombier 
143