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