Blame


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