Mercurial > hg > Members > kono > os9 > sbc09
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 } |