Blame


1 1bfec89b 2013-03-19 rsc #include <limits.h>
2 c3ae85a0 2021-01-14 rsc #include <errno.h>
3 f08fdedc 2003-11-23 devnull #include "rc.h"
4 f08fdedc 2003-11-23 devnull #include "exec.h"
5 f08fdedc 2003-11-23 devnull #include "io.h"
6 f08fdedc 2003-11-23 devnull #include "fns.h"
7 c8f53842 2007-03-26 devnull int pfmtnest = 0;
8 c8f53842 2007-03-26 devnull
9 c8f53842 2007-03-26 devnull void
10 c8f53842 2007-03-26 devnull pfmt(io *f, char *fmt, ...)
11 c8f53842 2007-03-26 devnull {
12 f08fdedc 2003-11-23 devnull va_list ap;
13 f08fdedc 2003-11-23 devnull char err[ERRMAX];
14 f08fdedc 2003-11-23 devnull va_start(ap, fmt);
15 f08fdedc 2003-11-23 devnull pfmtnest++;
16 f08fdedc 2003-11-23 devnull for(;*fmt;fmt++)
17 c8f53842 2007-03-26 devnull if(*fmt!='%')
18 c8f53842 2007-03-26 devnull pchr(f, *fmt);
19 f08fdedc 2003-11-23 devnull else switch(*++fmt){
20 c8f53842 2007-03-26 devnull case '\0':
21 c8f53842 2007-03-26 devnull va_end(ap);
22 c8f53842 2007-03-26 devnull return;
23 c8f53842 2007-03-26 devnull case 'c':
24 c8f53842 2007-03-26 devnull pchr(f, va_arg(ap, int));
25 c8f53842 2007-03-26 devnull break;
26 c8f53842 2007-03-26 devnull case 'd':
27 c8f53842 2007-03-26 devnull pdec(f, va_arg(ap, int));
28 c8f53842 2007-03-26 devnull break;
29 c8f53842 2007-03-26 devnull case 'o':
30 c8f53842 2007-03-26 devnull poct(f, va_arg(ap, unsigned));
31 c8f53842 2007-03-26 devnull break;
32 c8f53842 2007-03-26 devnull case 'p':
33 c8f53842 2007-03-26 devnull pptr(f, va_arg(ap, void*));
34 c8f53842 2007-03-26 devnull break;
35 c8f53842 2007-03-26 devnull case 'Q':
36 c8f53842 2007-03-26 devnull pquo(f, va_arg(ap, char *));
37 c8f53842 2007-03-26 devnull break;
38 c8f53842 2007-03-26 devnull case 'q':
39 c8f53842 2007-03-26 devnull pwrd(f, va_arg(ap, char *));
40 c8f53842 2007-03-26 devnull break;
41 c8f53842 2007-03-26 devnull case 'r':
42 40402738 2007-03-26 devnull rerrstr(err, sizeof err); pstr(f, err);
43 c8f53842 2007-03-26 devnull break;
44 c8f53842 2007-03-26 devnull case 's':
45 c8f53842 2007-03-26 devnull pstr(f, va_arg(ap, char *));
46 c8f53842 2007-03-26 devnull break;
47 c8f53842 2007-03-26 devnull case 't':
48 47d4646e 2020-05-05 rsc pcmd(f, va_arg(ap, tree *));
49 c8f53842 2007-03-26 devnull break;
50 47d4646e 2020-05-05 rsc case 'u':
51 47d4646e 2020-05-05 rsc pcmdu(f, va_arg(ap, tree *));
52 47d4646e 2020-05-05 rsc break;
53 c8f53842 2007-03-26 devnull case 'v':
54 c8f53842 2007-03-26 devnull pval(f, va_arg(ap, struct word *));
55 c8f53842 2007-03-26 devnull break;
56 c8f53842 2007-03-26 devnull default:
57 c8f53842 2007-03-26 devnull pchr(f, *fmt);
58 c8f53842 2007-03-26 devnull break;
59 f08fdedc 2003-11-23 devnull }
60 f08fdedc 2003-11-23 devnull va_end(ap);
61 c8f53842 2007-03-26 devnull if(--pfmtnest==0)
62 c8f53842 2007-03-26 devnull flush(f);
63 f08fdedc 2003-11-23 devnull }
64 c8f53842 2007-03-26 devnull
65 c8f53842 2007-03-26 devnull void
66 c8f53842 2007-03-26 devnull pchr(io *b, int c)
67 f08fdedc 2003-11-23 devnull {
68 c8f53842 2007-03-26 devnull if(b->bufp==b->ebuf)
69 c8f53842 2007-03-26 devnull fullbuf(b, c);
70 f08fdedc 2003-11-23 devnull else *b->bufp++=c;
71 f08fdedc 2003-11-23 devnull }
72 c8f53842 2007-03-26 devnull
73 c8f53842 2007-03-26 devnull int
74 c8f53842 2007-03-26 devnull rchr(io *b)
75 f08fdedc 2003-11-23 devnull {
76 c8f53842 2007-03-26 devnull if(b->bufp==b->ebuf)
77 c8f53842 2007-03-26 devnull return emptybuf(b);
78 f08fdedc 2003-11-23 devnull return *b->bufp++ & 0xFF;
79 f08fdedc 2003-11-23 devnull }
80 f08fdedc 2003-11-23 devnull
81 c8f53842 2007-03-26 devnull void
82 c8f53842 2007-03-26 devnull pquo(io *f, char *s)
83 f08fdedc 2003-11-23 devnull {
84 f08fdedc 2003-11-23 devnull pchr(f, '\'');
85 f08fdedc 2003-11-23 devnull for(;*s;s++)
86 c8f53842 2007-03-26 devnull if(*s=='\'')
87 c8f53842 2007-03-26 devnull pfmt(f, "''");
88 f08fdedc 2003-11-23 devnull else pchr(f, *s);
89 f08fdedc 2003-11-23 devnull pchr(f, '\'');
90 f08fdedc 2003-11-23 devnull }
91 c8f53842 2007-03-26 devnull
92 c8f53842 2007-03-26 devnull void
93 c8f53842 2007-03-26 devnull pwrd(io *f, char *s)
94 f08fdedc 2003-11-23 devnull {
95 f08fdedc 2003-11-23 devnull char *t;
96 c8f53842 2007-03-26 devnull for(t = s;*t;t++) if(!wordchr(*t)) break;
97 c8f53842 2007-03-26 devnull if(t==s || *t)
98 c8f53842 2007-03-26 devnull pquo(f, s);
99 f08fdedc 2003-11-23 devnull else pstr(f, s);
100 f08fdedc 2003-11-23 devnull }
101 c8f53842 2007-03-26 devnull
102 c8f53842 2007-03-26 devnull void
103 c8f53842 2007-03-26 devnull pptr(io *f, void *v)
104 f08fdedc 2003-11-23 devnull {
105 f08fdedc 2003-11-23 devnull int n;
106 c8f53842 2007-03-26 devnull uintptr p;
107 c8f53842 2007-03-26 devnull
108 c8f53842 2007-03-26 devnull p = (uintptr)v;
109 c8f53842 2007-03-26 devnull if(sizeof(uintptr) == sizeof(uvlong) && p>>32)
110 c8f53842 2007-03-26 devnull for(n = 60;n>=32;n-=4) pchr(f, "0123456789ABCDEF"[(p>>n)&0xF]);
111 c8f53842 2007-03-26 devnull
112 c8f53842 2007-03-26 devnull for(n = 28;n>=0;n-=4) pchr(f, "0123456789ABCDEF"[(p>>n)&0xF]);
113 f08fdedc 2003-11-23 devnull }
114 c8f53842 2007-03-26 devnull
115 c8f53842 2007-03-26 devnull void
116 c8f53842 2007-03-26 devnull pstr(io *f, char *s)
117 f08fdedc 2003-11-23 devnull {
118 c8f53842 2007-03-26 devnull if(s==0)
119 c8f53842 2007-03-26 devnull s="(null)";
120 f08fdedc 2003-11-23 devnull while(*s) pchr(f, *s++);
121 f08fdedc 2003-11-23 devnull }
122 c8f53842 2007-03-26 devnull
123 c8f53842 2007-03-26 devnull void
124 c8f53842 2007-03-26 devnull pdec(io *f, int n)
125 f08fdedc 2003-11-23 devnull {
126 f08fdedc 2003-11-23 devnull if(n<0){
127 1bfec89b 2013-03-19 rsc if(n!=INT_MIN){
128 f08fdedc 2003-11-23 devnull pchr(f, '-');
129 1bfec89b 2013-03-19 rsc pdec(f, -n);
130 f08fdedc 2003-11-23 devnull return;
131 f08fdedc 2003-11-23 devnull }
132 f08fdedc 2003-11-23 devnull /* n is two's complement minimum integer */
133 1bfec89b 2013-03-19 rsc n = -(INT_MIN+1);
134 f08fdedc 2003-11-23 devnull pchr(f, '-');
135 f08fdedc 2003-11-23 devnull pdec(f, n/10);
136 f08fdedc 2003-11-23 devnull pchr(f, n%10+'1');
137 f08fdedc 2003-11-23 devnull return;
138 f08fdedc 2003-11-23 devnull }
139 c8f53842 2007-03-26 devnull if(n>9)
140 c8f53842 2007-03-26 devnull pdec(f, n/10);
141 f08fdedc 2003-11-23 devnull pchr(f, n%10+'0');
142 f08fdedc 2003-11-23 devnull }
143 c8f53842 2007-03-26 devnull
144 c8f53842 2007-03-26 devnull void
145 c8f53842 2007-03-26 devnull poct(io *f, unsigned n)
146 f08fdedc 2003-11-23 devnull {
147 c8f53842 2007-03-26 devnull if(n>7)
148 c8f53842 2007-03-26 devnull poct(f, n>>3);
149 f08fdedc 2003-11-23 devnull pchr(f, (n&7)+'0');
150 f08fdedc 2003-11-23 devnull }
151 c8f53842 2007-03-26 devnull
152 c8f53842 2007-03-26 devnull void
153 c8f53842 2007-03-26 devnull pval(io *f, word *a)
154 f08fdedc 2003-11-23 devnull {
155 f08fdedc 2003-11-23 devnull if(a){
156 f08fdedc 2003-11-23 devnull while(a->next && a->next->word){
157 f08fdedc 2003-11-23 devnull pwrd(f, a->word);
158 f08fdedc 2003-11-23 devnull pchr(f, ' ');
159 c8f53842 2007-03-26 devnull a = a->next;
160 f08fdedc 2003-11-23 devnull }
161 f08fdedc 2003-11-23 devnull pwrd(f, a->word);
162 f08fdedc 2003-11-23 devnull }
163 f08fdedc 2003-11-23 devnull }
164 c8f53842 2007-03-26 devnull
165 c8f53842 2007-03-26 devnull int
166 c8f53842 2007-03-26 devnull fullbuf(io *f, int c)
167 f08fdedc 2003-11-23 devnull {
168 f08fdedc 2003-11-23 devnull flush(f);
169 f08fdedc 2003-11-23 devnull return *f->bufp++=c;
170 f08fdedc 2003-11-23 devnull }
171 c8f53842 2007-03-26 devnull
172 c8f53842 2007-03-26 devnull void
173 c8f53842 2007-03-26 devnull flush(io *f)
174 f08fdedc 2003-11-23 devnull {
175 f08fdedc 2003-11-23 devnull int n;
176 f08fdedc 2003-11-23 devnull char *s;
177 f08fdedc 2003-11-23 devnull if(f->strp){
178 c8f53842 2007-03-26 devnull n = f->ebuf-f->strp;
179 c8f53842 2007-03-26 devnull f->strp = realloc(f->strp, n+101);
180 c8f53842 2007-03-26 devnull if(f->strp==0)
181 c8f53842 2007-03-26 devnull panic("Can't realloc %d bytes in flush!", n+101);
182 c8f53842 2007-03-26 devnull f->bufp = f->strp+n;
183 c8f53842 2007-03-26 devnull f->ebuf = f->bufp+100;
184 c8f53842 2007-03-26 devnull for(s = f->bufp;s<=f->ebuf;s++) *s='\0';
185 f08fdedc 2003-11-23 devnull }
186 f08fdedc 2003-11-23 devnull else{
187 c8f53842 2007-03-26 devnull n = f->bufp-f->buf;
188 f08fdedc 2003-11-23 devnull if(n && Write(f->fd, f->buf, n) < 0){
189 f08fdedc 2003-11-23 devnull Write(3, "Write error\n", 12);
190 c8f53842 2007-03-26 devnull if(ntrap)
191 c8f53842 2007-03-26 devnull dotrap();
192 f08fdedc 2003-11-23 devnull }
193 c8f53842 2007-03-26 devnull f->bufp = f->buf;
194 c8f53842 2007-03-26 devnull f->ebuf = f->buf+NBUF;
195 f08fdedc 2003-11-23 devnull }
196 f08fdedc 2003-11-23 devnull }
197 c8f53842 2007-03-26 devnull
198 c8f53842 2007-03-26 devnull io*
199 c8f53842 2007-03-26 devnull openfd(int fd)
200 c8f53842 2007-03-26 devnull {
201 c8f53842 2007-03-26 devnull io *f = new(struct io);
202 c8f53842 2007-03-26 devnull f->fd = fd;
203 c8f53842 2007-03-26 devnull f->bufp = f->ebuf = f->buf;
204 c8f53842 2007-03-26 devnull f->strp = 0;
205 f08fdedc 2003-11-23 devnull return f;
206 f08fdedc 2003-11-23 devnull }
207 c8f53842 2007-03-26 devnull
208 c8f53842 2007-03-26 devnull io*
209 c8f53842 2007-03-26 devnull openstr(void)
210 c8f53842 2007-03-26 devnull {
211 c8f53842 2007-03-26 devnull io *f = new(struct io);
212 f08fdedc 2003-11-23 devnull char *s;
213 f08fdedc 2003-11-23 devnull f->fd=-1;
214 c8f53842 2007-03-26 devnull f->bufp = f->strp = emalloc(101);
215 c8f53842 2007-03-26 devnull f->ebuf = f->bufp+100;
216 c8f53842 2007-03-26 devnull for(s = f->bufp;s<=f->ebuf;s++) *s='\0';
217 f08fdedc 2003-11-23 devnull return f;
218 f08fdedc 2003-11-23 devnull }
219 f08fdedc 2003-11-23 devnull /*
220 f08fdedc 2003-11-23 devnull * Open a corebuffer to read. EOF occurs after reading len
221 f08fdedc 2003-11-23 devnull * characters from buf.
222 f08fdedc 2003-11-23 devnull */
223 c8f53842 2007-03-26 devnull
224 c8f53842 2007-03-26 devnull io*
225 c8f53842 2007-03-26 devnull opencore(char *s, int len)
226 f08fdedc 2003-11-23 devnull {
227 c8f53842 2007-03-26 devnull io *f = new(struct io);
228 c8f53842 2007-03-26 devnull char *buf = emalloc(len);
229 f08fdedc 2003-11-23 devnull f->fd= -1 /*open("/dev/null", 0)*/;
230 c8f53842 2007-03-26 devnull f->bufp = f->strp = buf;
231 c8f53842 2007-03-26 devnull f->ebuf = buf+len;
232 f08fdedc 2003-11-23 devnull Memcpy(buf, s, len);
233 f08fdedc 2003-11-23 devnull return f;
234 f08fdedc 2003-11-23 devnull }
235 c8f53842 2007-03-26 devnull
236 c8f53842 2007-03-26 devnull void
237 2894c70c 2007-03-26 devnull iorewind(io *io)
238 f08fdedc 2003-11-23 devnull {
239 c8f53842 2007-03-26 devnull if(io->fd==-1)
240 c8f53842 2007-03-26 devnull io->bufp = io->strp;
241 f08fdedc 2003-11-23 devnull else{
242 c8f53842 2007-03-26 devnull io->bufp = io->ebuf = io->buf;
243 f08fdedc 2003-11-23 devnull Seek(io->fd, 0L, 0);
244 f08fdedc 2003-11-23 devnull }
245 f08fdedc 2003-11-23 devnull }
246 c8f53842 2007-03-26 devnull
247 c8f53842 2007-03-26 devnull void
248 c8f53842 2007-03-26 devnull closeio(io *io)
249 f08fdedc 2003-11-23 devnull {
250 c8f53842 2007-03-26 devnull if(io->fd>=0)
251 c8f53842 2007-03-26 devnull close(io->fd);
252 c8f53842 2007-03-26 devnull if(io->strp)
253 c8f53842 2007-03-26 devnull efree(io->strp);
254 f08fdedc 2003-11-23 devnull efree((char *)io);
255 f08fdedc 2003-11-23 devnull }
256 c8f53842 2007-03-26 devnull
257 c8f53842 2007-03-26 devnull int
258 c8f53842 2007-03-26 devnull emptybuf(io *f)
259 f08fdedc 2003-11-23 devnull {
260 f08fdedc 2003-11-23 devnull int n;
261 c3ae85a0 2021-01-14 rsc if(f->fd==-1)
262 c3ae85a0 2021-01-14 rsc return EOF;
263 c3ae85a0 2021-01-14 rsc Loop:
264 c3ae85a0 2021-01-14 rsc errno = 0;
265 c3ae85a0 2021-01-14 rsc n = Read(f->fd, f->buf, NBUF);
266 c3ae85a0 2021-01-14 rsc if(n < 0 && errno == EINTR)
267 c3ae85a0 2021-01-14 rsc goto Loop;
268 c3ae85a0 2021-01-14 rsc if(n <= 0)
269 c3ae85a0 2021-01-14 rsc return EOF;
270 c8f53842 2007-03-26 devnull f->bufp = f->buf;
271 c8f53842 2007-03-26 devnull f->ebuf = f->buf+n;
272 f08fdedc 2003-11-23 devnull return *f->bufp++&0xff;
273 f08fdedc 2003-11-23 devnull }