comparison mc09/scanf.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/scanf.txt@92ed427b7f7d
children
comparison
equal deleted inserted replaced
159:1d574c5b3383 160:1a30cd6e5973
1
2 _fskipspc(fp)
3 FILE *fp;
4 {char c;
5 while (_isspace(c = getc(fp)));
6 return c;
7 }
8
9 _isspace(c)
10 char c;
11 { return ((c == ' ') || (c == '\t'));
12 }
13
14 scanf(s)
15 char *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
22 fscanf(fp,s)
23 FILE *fp;
24 char *s;
25 { return _fscanf(fp,s,(int *)&s+1);
26 }
27
28 _fscanf(fp,s,p)
29 FILE *fp;
30 char *s;
31 int *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)
76 FILE *fp;
77 int *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)
92 FILE *fp;
93 int *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
106 isoct(c)
107 char c;
108 { return ('0' <= c && c <= '7');
109 }
110
111 _xtoin(fp,p,m,x)
112 FILE *fp;
113 int *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
128 ishex(c)
129 char c;
130 { return (isdigit(c) || ('A' <= (c = toupper(c)) && c <= 'F'));
131 }
132
133 _fgetc(fp,p,x)
134 FILE *fp;
135 char *p;
136 int 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)
144 FILE *fp;
145 char *p;
146 int 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 }