Blame


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