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