source: vital-to8-sdk/mc09/src/scanf.txt

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

Import initial

File size: 4.0 KB
RevLine 
[1]1
2_fskipspc(fp)
3FILE *fp;
4{char c;
5        while (_isspace(c = getc(fp)));
6        return c;
7}
8
9_isspace(c)
10char c;
11{       return ((c == ' ') || (c == '\t'));
12}
13
14scanf(s)
15char *s;
16{int i;
17        i = _fscanf(stdin,s,(int *)&s+1);
18        if (_fch && ((_ch == EOF) || (_ch == '\n'))) _fch = 0;
19        return i;
20}
21
22fscanf(fp,s)
23FILE *fp;
24char *s;
25{       return _fscanf(fp,s,(int *)&s+1);
26}
27
28_fscanf(fp,s,p)
29FILE *fp;
30char *s;
31int *p;
32{char c,ch;
33 int m,n,r,x;
34        n = 0;
35        while(c = *s++)
36                if (!_isspace(c))
37                if (c != '%')
38                {       if ((ch = _fskipspc(fp)) == EOF) return EOF;
39                        if (ch != c) return n;
40                }
41                else
42                {       if (x = (*s == '*')) ++s;
43                        if (isdigit(*s)) s += _getint(&m,s);
44                        else m = 32767;
45                        switch(c = *s++)
46                        {case 'd' :
47                                r = _atoin(fp,*p++,m,x);
48                                break;
49                        case 'o' :
50                                r = _otoin(fp,*p++,m,x);
51                                break;
52                        case 'x' :
53                                r = _xtoin(fp,*p++,m,x);
54                                break;
55                        case 'c' :
56                                r = _fgetc(fp,*p++,x);
57                                break;
58                        case 's' :
59                                r = _getstrn(fp,*p++,m,x);
60                                break;
61                        case '\0':
62                                return n;
63                        default:
64                                if ((ch = _fskipspc(fp)) == EOF) return EOF;
65                                if (ch != c) return n;
66                                continue;
67                        }
68                        if (!x) ++n;
69                        if (r == EOF) return EOF;
70                        if (r) return n;
71                }
72        return n;
73}
74
75_atoin(fp,p,m,x)
76FILE *fp;
77int *p,m,x;
78{int i,s;
79 char c;
80        if (isdigit(c = _fskipspc(fp)) || (c == '-'))
81        {       if (s = (c == '-')) c = getc(fp);
82                for (i = 0; isdigit(c) && --m >= 0; c = getc(fp))
83                                                i = i * 10 + c - '0';
84                ungetc(c,fp);
85                if (!x) *p = (s ? -i : i);
86                return 0;
87        }
88        return ((c == EOF) ? EOF : 1);
89}
90
91_otoin(fp,p,m,x)
92FILE *fp;
93int *p,m,x;
94{int i;
95 char c;
96        if (isoct(c = _fskipspc(fp)))
97        {       for (i = 0; isoct(c) && --m >= 0; c = getc(fp))
98                                                i = i * 8 + c -'0';
99                ungetc(c,fp);
100                if (!x) *p = i;
101                return 0;
102        }
103        return ((c == EOF) ? EOF : 1);
104}
105
106isoct(c)
107char c;
108{       return ('0' <= c && c <= '7');
109}
110
111_xtoin(fp,p,m,x)
112FILE *fp;
113int *p,m,x;
114{int i;
115 char c;
116        if (ishex(c = _fskipspc(fp)))
117        {       for (i = 0; ishex(c) && --m >= 0; c = getc(fp))
118                        if (isdigit(c)) i = i * 16 + c - '0';
119                        else if ('A' <= (c = toupper(c)) && c <= 'F')
120                                        i = i * 16 + c - ('A'-10);
121                ungetc(c,fp);
122                if (!x) *p = i;
123                return 0;
124        }
125        return ((c == EOF) ? EOF : 1);
126}
127
128ishex(c)
129char c;
130{       return (isdigit(c) || ('A' <= (c = toupper(c)) && c <= 'F'));
131}
132
133_fgetc(fp,p,x)
134FILE *fp;
135char *p;
136int x;
137{char c;
138        if ((c = getc(fp)) == EOF) return EOF;
139        if (!x) *p = c;
140        return 0;
141}
142
143_getstrn(fp,p,m,x)
144FILE *fp;
145char *p;
146int m,x;
147{char c,*q;
148        if (((c = _fskipspc(fp)) == EOF) || (c == '\n')) return EOF;
149        for (q = p; !_isspace(c) && --m >= 0; c = getc(fp))
150        {       if ((c == EOF) || (c == '\n')) break;
151                if ((c == '\b') && (q != p)) --q;
152                else if (!x) *q++ = c;
153        }
154        ungetc(c,fp);
155        if (!x) *q = '\0';
156        return 0;
157}
Note: See TracBrowser for help on using the repository browser.