source: vital-to8-sdk/mc09/src/stdio2.txt @ 1

Last change on this file since 1 was 1, checked in by svn, 6 years ago

Import initial

File size: 5.3 KB
Line 
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
17typedef struct {
18        int _fcb[FCBSIZE];
19        int _fbp;
20        char _fbuf[1024];
21        } FILE;
22
23FILE *_fptbl[NFILES];
24
25char _ch;
26int _fch = 0;
27
28_main(argc,argv)
29int argc;
30char **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
41ungetc(c,fp)
42char c;
43FILE *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
52getc(fp)
53FILE *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
69putc(c,fp)
70char c;
71FILE *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
86ugetch(c)
87char c;
88{       return ungetc(c,stdin);
89}
90
91getchar()
92{       return getc(stdin);
93}
94
95putchar(c)
96char c;
97{       return putc(c,stdout);
98}
99
100printf(s)
101char *s;
102{       _fprintf(stdout,s,(int *)&s+1);
103}
104
105fprintf(fp,s)
106FILE *fp;
107char *s;
108{       _fprintf(fp,s,(int *)&s+1);
109}
110
111_fprintf(fp,s,p)
112FILE *fp;
113char *s;
114int *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)
156int *p;
157char *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)
164FILE fp;
165char *s;
166int 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)
181FILE fp;
182char *s;
183int n;
184{       while(*s)
185                if (--n >= 0) putc(*s++,fp);
186                else break;
187}
188
189_putspc(fp,n)
190FILE *fp;
191int n;
192{       while(--n >= 0) putc(' ',fp);
193}
194
195itoa(n,s)
196int n;
197char *s;
198{       if (n < 0)
199        {       *s++ = '-';
200                return (itoua(-n,s) + 1);
201        }
202        return itoua(n,s);
203}
204
205itoua(n,s)
206int n;
207char *s;
208{       return _itoda(n,s,10);
209}
210
211ctos(c,s)
212char c,*s;
213{       s[0] = c;
214        s[1] = '\0';
215        return s;
216}
217
218itooa(n,s)
219int n;
220char *s;
221{       return _itoda(n,s,8);
222}
223
224itoxa(n,s)
225int n;
226char *s;
227{       return _itoda(n,s,16);
228}
229
230_itoac(n);
231int n;
232{       return (n + ((n < 10) ? '0' : ('A'-10)));
233}
234
235_itoda(n,s,r)
236unsigned n;
237int r;
238char *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
248isdigit(c)
249char c;
250{       return ('0' <= c && c <= '9');
251}
252
253isspace(c)
254char c;
255{       return (c == ' ' || c == '\t' || c == '\n');
256}
257
258isalpha(c)
259char c;
260{       return (isupper(c) || islower(c) || c == '_');
261}
262
263isupper(c)
264char c;
265{       return ('A' <= c && c <= 'Z');
266}
267
268islower(c)
269char c;
270{       return ('a' <= c && c <= 'z');
271}
272
273toupper(c)
274char c;
275{       return (islower(c) ? c + ('A'-'a') : c);
276}
277
278tolower(c)
279char c;
280{       return (isupper(c) ? c + ('a'-'A') : c);
281}
282
283atoi(s)
284char *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}
291strlen(s)
292char *s;
293{int i;
294        for (i = 0; *s++; ++i);
295        return i;
296}
Note: See TracBrowser for help on using the repository browser.