99
|
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 }
|