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 f08fdedc 2003-11-23 devnull int pfmtnest=0;
6 f08fdedc 2003-11-23 devnull void pfmt(io *f, char *fmt, ...){
7 f08fdedc 2003-11-23 devnull va_list ap;
8 f08fdedc 2003-11-23 devnull char err[ERRMAX];
9 f08fdedc 2003-11-23 devnull va_start(ap, fmt);
10 f08fdedc 2003-11-23 devnull pfmtnest++;
11 f08fdedc 2003-11-23 devnull for(;*fmt;fmt++)
12 f08fdedc 2003-11-23 devnull if(*fmt!='%') pchr(f, *fmt);
13 f08fdedc 2003-11-23 devnull else switch(*++fmt){
14 f08fdedc 2003-11-23 devnull case '\0': va_end(ap); return;
15 f08fdedc 2003-11-23 devnull case 'c': pchr(f, va_arg(ap, int)); break;
16 f08fdedc 2003-11-23 devnull case 'd': pdec(f, va_arg(ap, int)); break;
17 f08fdedc 2003-11-23 devnull case 'o': poct(f, va_arg(ap, unsigned)); break;
18 f08fdedc 2003-11-23 devnull case 'p': phex(f, (long)va_arg(ap, char *)); break; /*unportable*/
19 f08fdedc 2003-11-23 devnull case 'Q': pquo(f, va_arg(ap, char *)); break;
20 f08fdedc 2003-11-23 devnull case 'q': pwrd(f, va_arg(ap, char *)); break;
21 f08fdedc 2003-11-23 devnull case 'r': errstr(err, sizeof err); pstr(f, err); break;
22 f08fdedc 2003-11-23 devnull case 's': pstr(f, va_arg(ap, char *)); break;
23 f08fdedc 2003-11-23 devnull case 't': pcmd(f, va_arg(ap, struct tree *)); break;
24 f08fdedc 2003-11-23 devnull case 'v': pval(f, va_arg(ap, struct word *)); break;
25 f08fdedc 2003-11-23 devnull default: pchr(f, *fmt); break;
26 f08fdedc 2003-11-23 devnull }
27 f08fdedc 2003-11-23 devnull va_end(ap);
28 f08fdedc 2003-11-23 devnull if(--pfmtnest==0) flush(f);
29 f08fdedc 2003-11-23 devnull }
30 f08fdedc 2003-11-23 devnull void pchr(io *b, int c)
31 f08fdedc 2003-11-23 devnull {
32 f08fdedc 2003-11-23 devnull if(b->bufp==b->ebuf) fullbuf(b, c);
33 f08fdedc 2003-11-23 devnull else *b->bufp++=c;
34 f08fdedc 2003-11-23 devnull }
35 f08fdedc 2003-11-23 devnull int rchr(io *b)
36 f08fdedc 2003-11-23 devnull {
37 f08fdedc 2003-11-23 devnull if(b->bufp==b->ebuf) return emptybuf(b);
38 f08fdedc 2003-11-23 devnull return *b->bufp++ & 0xFF;
39 f08fdedc 2003-11-23 devnull }
40 f08fdedc 2003-11-23 devnull
41 f08fdedc 2003-11-23 devnull void pquo(io *f, char *s)
42 f08fdedc 2003-11-23 devnull {
43 f08fdedc 2003-11-23 devnull pchr(f, '\'');
44 f08fdedc 2003-11-23 devnull for(;*s;s++)
45 f08fdedc 2003-11-23 devnull if(*s=='\'') pfmt(f, "''");
46 f08fdedc 2003-11-23 devnull else pchr(f, *s);
47 f08fdedc 2003-11-23 devnull pchr(f, '\'');
48 f08fdedc 2003-11-23 devnull }
49 f08fdedc 2003-11-23 devnull void pwrd(io *f, char *s)
50 f08fdedc 2003-11-23 devnull {
51 f08fdedc 2003-11-23 devnull char *t;
52 f08fdedc 2003-11-23 devnull for(t=s;*t;t++) if(!wordchr(*t)) break;
53 f08fdedc 2003-11-23 devnull if(t==s || *t) pquo(f, s);
54 f08fdedc 2003-11-23 devnull else pstr(f, s);
55 f08fdedc 2003-11-23 devnull }
56 f08fdedc 2003-11-23 devnull void phex(io *f, long p)
57 f08fdedc 2003-11-23 devnull {
58 f08fdedc 2003-11-23 devnull int n;
59 f08fdedc 2003-11-23 devnull for(n=28;n>=0;n-=4) pchr(f, "0123456789ABCDEF"[(p>>n)&0xF]);
60 f08fdedc 2003-11-23 devnull }
61 f08fdedc 2003-11-23 devnull void pstr(io *f, char *s)
62 f08fdedc 2003-11-23 devnull {
63 f08fdedc 2003-11-23 devnull if(s==0) s="(null)";
64 f08fdedc 2003-11-23 devnull while(*s) pchr(f, *s++);
65 f08fdedc 2003-11-23 devnull }
66 f08fdedc 2003-11-23 devnull void pdec(io *f, long n)
67 f08fdedc 2003-11-23 devnull {
68 f08fdedc 2003-11-23 devnull if(n<0){
69 f08fdedc 2003-11-23 devnull n=-n;
70 f08fdedc 2003-11-23 devnull if(n>=0){
71 f08fdedc 2003-11-23 devnull pchr(f, '-');
72 f08fdedc 2003-11-23 devnull pdec(f, n);
73 f08fdedc 2003-11-23 devnull return;
74 f08fdedc 2003-11-23 devnull }
75 f08fdedc 2003-11-23 devnull /* n is two's complement minimum integer */
76 f08fdedc 2003-11-23 devnull n=1-n;
77 f08fdedc 2003-11-23 devnull pchr(f, '-');
78 f08fdedc 2003-11-23 devnull pdec(f, n/10);
79 f08fdedc 2003-11-23 devnull pchr(f, n%10+'1');
80 f08fdedc 2003-11-23 devnull return;
81 f08fdedc 2003-11-23 devnull }
82 f08fdedc 2003-11-23 devnull if(n>9) pdec(f, n/10);
83 f08fdedc 2003-11-23 devnull pchr(f, n%10+'0');
84 f08fdedc 2003-11-23 devnull }
85 f08fdedc 2003-11-23 devnull void poct(io *f, ulong n)
86 f08fdedc 2003-11-23 devnull {
87 f08fdedc 2003-11-23 devnull if(n>7) poct(f, n>>3);
88 f08fdedc 2003-11-23 devnull pchr(f, (n&7)+'0');
89 f08fdedc 2003-11-23 devnull }
90 f08fdedc 2003-11-23 devnull void pval(io *f, word *a)
91 f08fdedc 2003-11-23 devnull {
92 f08fdedc 2003-11-23 devnull if(a){
93 f08fdedc 2003-11-23 devnull while(a->next && a->next->word){
94 f08fdedc 2003-11-23 devnull pwrd(f, a->word);
95 f08fdedc 2003-11-23 devnull pchr(f, ' ');
96 f08fdedc 2003-11-23 devnull a=a->next;
97 f08fdedc 2003-11-23 devnull }
98 f08fdedc 2003-11-23 devnull pwrd(f, a->word);
99 f08fdedc 2003-11-23 devnull }
100 f08fdedc 2003-11-23 devnull }
101 f08fdedc 2003-11-23 devnull int fullbuf(io *f, int c)
102 f08fdedc 2003-11-23 devnull {
103 f08fdedc 2003-11-23 devnull flush(f);
104 f08fdedc 2003-11-23 devnull return *f->bufp++=c;
105 f08fdedc 2003-11-23 devnull }
106 f08fdedc 2003-11-23 devnull void flush(io *f)
107 f08fdedc 2003-11-23 devnull {
108 f08fdedc 2003-11-23 devnull int n;
109 f08fdedc 2003-11-23 devnull char *s;
110 f08fdedc 2003-11-23 devnull if(f->strp){
111 f08fdedc 2003-11-23 devnull n=f->ebuf-f->strp;
112 f08fdedc 2003-11-23 devnull f->strp=realloc(f->strp, n+101);
113 f08fdedc 2003-11-23 devnull if(f->strp==0) panic("Can't realloc %d bytes in flush!", n+101);
114 f08fdedc 2003-11-23 devnull f->bufp=f->strp+n;
115 f08fdedc 2003-11-23 devnull f->ebuf=f->bufp+100;
116 f08fdedc 2003-11-23 devnull for(s=f->bufp;s<=f->ebuf;s++) *s='\0';
117 f08fdedc 2003-11-23 devnull }
118 f08fdedc 2003-11-23 devnull else{
119 f08fdedc 2003-11-23 devnull n=f->bufp-f->buf;
120 f08fdedc 2003-11-23 devnull if(n && Write(f->fd, f->buf, n) < 0){
121 f08fdedc 2003-11-23 devnull Write(3, "Write error\n", 12);
122 f08fdedc 2003-11-23 devnull if(ntrap) dotrap();
123 f08fdedc 2003-11-23 devnull }
124 f08fdedc 2003-11-23 devnull f->bufp=f->buf;
125 f08fdedc 2003-11-23 devnull f->ebuf=f->buf+NBUF;
126 f08fdedc 2003-11-23 devnull }
127 f08fdedc 2003-11-23 devnull }
128 f08fdedc 2003-11-23 devnull io *openfd(int fd){
129 0b917997 2004-03-04 devnull io *f;
130 0b917997 2004-03-04 devnull f=new(struct io);
131 f08fdedc 2003-11-23 devnull f->fd=fd;
132 f08fdedc 2003-11-23 devnull f->bufp=f->ebuf=f->buf;
133 f08fdedc 2003-11-23 devnull f->strp=0;
134 f08fdedc 2003-11-23 devnull return f;
135 f08fdedc 2003-11-23 devnull }
136 f08fdedc 2003-11-23 devnull io *openstr(void){
137 f08fdedc 2003-11-23 devnull io *f=new(struct io);
138 f08fdedc 2003-11-23 devnull char *s;
139 f08fdedc 2003-11-23 devnull f->fd=-1;
140 f08fdedc 2003-11-23 devnull f->bufp=f->strp=emalloc(101);
141 f08fdedc 2003-11-23 devnull f->ebuf=f->bufp+100;
142 f08fdedc 2003-11-23 devnull for(s=f->bufp;s<=f->ebuf;s++) *s='\0';
143 f08fdedc 2003-11-23 devnull return f;
144 f08fdedc 2003-11-23 devnull }
145 f08fdedc 2003-11-23 devnull /*
146 f08fdedc 2003-11-23 devnull * Open a corebuffer to read. EOF occurs after reading len
147 f08fdedc 2003-11-23 devnull * characters from buf.
148 f08fdedc 2003-11-23 devnull */
149 f08fdedc 2003-11-23 devnull io *opencore(char *s, int len)
150 f08fdedc 2003-11-23 devnull {
151 f08fdedc 2003-11-23 devnull io *f=new(struct io);
152 f08fdedc 2003-11-23 devnull char *buf=emalloc(len);
153 f08fdedc 2003-11-23 devnull f->fd= -1 /*open("/dev/null", 0)*/;
154 f08fdedc 2003-11-23 devnull f->bufp=f->strp=buf;
155 f08fdedc 2003-11-23 devnull f->ebuf=buf+len;
156 f08fdedc 2003-11-23 devnull Memcpy(buf, s, len);
157 f08fdedc 2003-11-23 devnull return f;
158 f08fdedc 2003-11-23 devnull }
159 0b917997 2004-03-04 devnull /*
160 f08fdedc 2003-11-23 devnull void rewind(io *io)
161 f08fdedc 2003-11-23 devnull {
162 f08fdedc 2003-11-23 devnull if(io->fd==-1) io->bufp=io->strp;
163 f08fdedc 2003-11-23 devnull else{
164 f08fdedc 2003-11-23 devnull io->bufp=io->ebuf=io->buf;
165 f08fdedc 2003-11-23 devnull Seek(io->fd, 0L, 0);
166 f08fdedc 2003-11-23 devnull }
167 f08fdedc 2003-11-23 devnull }
168 0b917997 2004-03-04 devnull */
169 f08fdedc 2003-11-23 devnull void closeio(io *io)
170 f08fdedc 2003-11-23 devnull {
171 f08fdedc 2003-11-23 devnull if(io->fd>=0) close(io->fd);
172 f08fdedc 2003-11-23 devnull if(io->strp) efree(io->strp);
173 f08fdedc 2003-11-23 devnull efree((char *)io);
174 f08fdedc 2003-11-23 devnull }
175 f08fdedc 2003-11-23 devnull int emptybuf(io *f)
176 f08fdedc 2003-11-23 devnull {
177 f08fdedc 2003-11-23 devnull int n;
178 f08fdedc 2003-11-23 devnull if(f->fd==-1 || (n=Read(f->fd, f->buf, NBUF))<=0) return EOF;
179 f08fdedc 2003-11-23 devnull f->bufp=f->buf;
180 f08fdedc 2003-11-23 devnull f->ebuf=f->buf+n;
181 f08fdedc 2003-11-23 devnull return *f->bufp++&0xff;
182 f08fdedc 2003-11-23 devnull }