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 }