comparison mc09/stdio2.txt @ 160:1a30cd6e5973

move mc09 to top
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 05 Feb 2019 09:03:07 +0900
parents os9/mc09/stdio2.txt@92ed427b7f7d
children
comparison
equal deleted inserted replaced
159:1d574c5b3383 160:1a30cd6e5973
1
2
3 #define FBSIZE sizeof(FILE)
4 #define NFILES 16
5
6 #define NULL 0
7 #define EOF (-1)
8
9 #define stdin _fptbl[0]
10 #define stdout _fptbl[1]
11 #define stderr _fptbl[2]
12
13 #define STDIN 0xffff
14 #define STDOUT 0xfffe
15 #define STDERR 0xfffd
16
17 typedef struct {
18 int _fcb[FCBSIZE];
19 int _fbp;
20 char _fbuf[1024];
21 } FILE;
22
23 FILE *_fptbl[NFILES];
24
25 char _ch;
26 int _fch = 0;
27
28 _main(argc,argv)
29 int argc;
30 char **argv;
31 {int i;
32 initheap();
33 stdin = STDIN;
34 stdout = STDOUT;
35 stderr = STDERR;
36 for (i = 3; i < NFILES; ++i) _fptbl[i] = NULL;
37 main(argc,argv);
38 for (i = 0; i < NFILES; ++i) fflush(_fptbl[i]);
39 }
40
41 ungetc(c,fp)
42 char c;
43 FILE *fp;
44 { if (fp == STDIN)
45 { _fch = 1;
46 return _ch = c;
47 }
48 fp->_fcb[62] = 1;
49 return fp->_fcb[61] = c;
50 }
51
52 getc(fp)
53 FILE *fp;
54 {
55 switch ( fp ) {
56 case STDIN:
57 if (_fch) { _fch = 0; return _ch; }
58 return GETCH();
59 case STDOUT:
60 case STDERR:
61 return EOF;
62 default:
63 if (fp->_fcb[2] != 1) return EOF;
64 if (fp->_fcb[62]) { fp->_fcb[62] = 0; return fp->_fcb[61]; }
65 return FMS(fp->_fcb,0);
66 }
67 }
68
69 putc(c,fp)
70 char c;
71 FILE *fp;
72 { switch ( fp ) {
73 case STDIN:
74 return EOF;
75 case STDOUT:
76 return PUTCH(c);
77 case STDERR:
78 return PUTCH2(c);
79 default:
80 if (fp->_fcb[2] != 2) return EOF;
81 if (FMS(fp->_fcb,0,c) < 0) return EOF;
82 return c;
83 }
84 }
85
86 ugetch(c)
87 char c;
88 { return ungetc(c,stdin);
89 }
90
91 getchar()
92 { return getc(stdin);
93 }
94
95 putchar(c)
96 char c;
97 { return putc(c,stdout);
98 }
99
100 printf(s)
101 char *s;
102 { _fprintf(stdout,s,(int *)&s+1);
103 }
104
105 fprintf(fp,s)
106 FILE *fp;
107 char *s;
108 { _fprintf(fp,s,(int *)&s+1);
109 }
110
111 _fprintf(fp,s,p)
112 FILE *fp;
113 char *s;
114 int *p;
115 {int l,m,n;
116 char c,buf[8];
117 while(c = *s++)
118 if (c != '%') putc(c,fp);
119 else
120 { if (l=(*s == '-')) ++s;
121 if (isdigit(*s)) s += _getint(&m,s);
122 else m = 0;
123 if (*s == '.') ++s;
124 if (isdigit(*s)) s += _getint(&n,s);
125 else n = 32767;
126 switch(c = *s++)
127 {case 'd':
128 itoa(*p++,buf);
129 break;
130 case 'o':
131 itooa(*p++,buf);
132 break;
133 case 'x':
134 itoxa(*p++,buf);
135 break;
136 case 'u':
137 itoua(*p++,buf);
138 break;
139 case 'c':
140 ctos(*p++,buf);
141 break;
142 case 's':
143 _putstr(fp,*p++,l,m,n);
144 continue;
145 case '\0':
146 return;
147 default:
148 ctos(c,buf);
149 break;
150 }
151 _putstr(fp,buf,l,m,n);
152 }
153 }
154
155 _getint(p,s)
156 int *p;
157 char *s;
158 {int i;
159 for(*p = i = 0; isdigit(*s); ++i) *p = *p * 10 + *s++ - '0';
160 return i;
161 }
162
163 _putstr(fp,s,l,m,n)
164 FILE fp;
165 char *s;
166 int l,m,n;
167 {int k;
168 k = (strlen(s) < n ? strlen(s) : n);
169 m = (k < m ? m - k : 0);
170 if (l)
171 { _putsn(fp,s,n);
172 _putspc(fp,m);
173 }
174 else
175 { _putspc(fp,m);
176 _putsn(fp,s,n);
177 }
178 }
179
180 _putsn(fp,s,n)
181 FILE fp;
182 char *s;
183 int n;
184 { while(*s)
185 if (--n >= 0) putc(*s++,fp);
186 else break;
187 }
188
189 _putspc(fp,n)
190 FILE *fp;
191 int n;
192 { while(--n >= 0) putc(' ',fp);
193 }
194
195 itoa(n,s)
196 int n;
197 char *s;
198 { if (n < 0)
199 { *s++ = '-';
200 return (itoua(-n,s) + 1);
201 }
202 return itoua(n,s);
203 }
204
205 itoua(n,s)
206 int n;
207 char *s;
208 { return _itoda(n,s,10);
209 }
210
211 ctos(c,s)
212 char c,*s;
213 { s[0] = c;
214 s[1] = '\0';
215 return s;
216 }
217
218 itooa(n,s)
219 int n;
220 char *s;
221 { return _itoda(n,s,8);
222 }
223
224 itoxa(n,s)
225 int n;
226 char *s;
227 { return _itoda(n,s,16);
228 }
229
230 _itoac(n);
231 int n;
232 { return (n + ((n < 10) ? '0' : ('A'-10)));
233 }
234
235 _itoda(n,s,r)
236 unsigned n;
237 int r;
238 char *s;
239 {int i;
240 char t[8],*u;
241 u = t;
242 *u++ = '\0';
243 do *u++ = _itoac(n % r); while(n /= r);
244 for (i=0; *s++ = *--u; ++i);
245 return i;
246 }
247
248 isdigit(c)
249 char c;
250 { return ('0' <= c && c <= '9');
251 }
252
253 isspace(c)
254 char c;
255 { return (c == ' ' || c == '\t' || c == '\n');
256 }
257
258 isalpha(c)
259 char c;
260 { return (isupper(c) || islower(c) || c == '_');
261 }
262
263 isupper(c)
264 char c;
265 { return ('A' <= c && c <= 'Z');
266 }
267
268 islower(c)
269 char c;
270 { return ('a' <= c && c <= 'z');
271 }
272
273 toupper(c)
274 char c;
275 { return (islower(c) ? c + ('A'-'a') : c);
276 }
277
278 tolower(c)
279 char c;
280 { return (isupper(c) ? c + ('a'-'A') : c);
281 }
282
283 atoi(s)
284 char *s;
285 {int i,m;
286 while (isspace(*s)) ++s;
287 if (m = (*s == '-')) ++s;
288 for (i = 0; isdigit(*s);) i = i * 10 + *s++ - '0';
289 return (m ? -i : i);
290 }
291 strlen(s)
292 char *s;
293 {int i;
294 for (i = 0; *s++; ++i);
295 return i;
296 }