Mercurial > hg > Members > kono > os9 > sbc09
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 } |