Rev 6412 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6412 | Rev 6431 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #include |
1 | #include |
2 | void skipspaces(FILE* file) |
- | |
3 | { |
- | |
4 | int c; |
- | |
5 | while(1) |
- | |
6 | { |
- | |
7 | c=fgetc(file); |
2 | #include |
8 | if (c!=' ' && c!='\r' && c!='\n') |
- | |
9 | { |
- | |
10 | ungetc(c,file); |
3 | #include |
11 | return; |
- | |
12 | } |
- | |
13 | } |
- | |
14 | } |
- | |
Line 15... | Line 4... | ||
15 | 4 | ||
16 | int fscanf(FILE* file,const char* format, ...) |
- | |
17 | { |
- | |
18 | int res; |
- | |
19 | void* arg; |
- | |
20 | int i; |
- | |
21 | int c; |
- | |
22 | int contflag; |
- | |
23 | int longflag; |
- | |
24 | int sign; |
- | |
25 | long long number; |
- | |
26 | long double rnumber; |
- | |
27 | char* str; |
- | |
28 | res=0; |
- | |
29 | arg=&format; |
5 | int virtual_getc_file(void *sp, const void *obj) |
30 | arg+=sizeof(const char*); |
- | |
31 | while (*format!='\0') |
- | |
32 | { |
- | |
33 | if (*format!='%') |
- | |
34 | { |
- | |
35 | c=fgetc(file); |
- | |
36 | if (c!=*format) |
- | |
37 | { |
- | |
38 | ungetc(c,file); |
- | |
39 | return -1; |
- | |
40 | } |
- | |
41 | format++; |
- | |
42 | continue; |
- | |
43 | } |
- | |
44 | contflag=1; |
- | |
45 | longflag=0; |
- | |
46 | while (*format && contflag) |
- | |
47 | { |
- | |
48 | switch(*format) |
- | |
49 | { |
- | |
50 | case '.': |
- | |
51 | case '0': |
- | |
52 | case '1': |
- | |
53 | case '2': |
- | |
54 | case '3': |
- | |
55 | case '4': |
- | |
56 | case '5': |
- | |
57 | case '6': |
- | |
58 | case '7': |
- | |
59 | case '8': |
- | |
60 | case '9': |
- | |
61 | format++; |
- | |
62 | continue; |
- | |
63 | break; |
- | |
64 | case 'l': |
- | |
65 | if (longflag==0) |
- | |
66 | longflag=1; |
- | |
67 | else |
- | |
68 | longflag=2; |
- | |
69 | format++; |
- | |
70 | break; |
- | |
71 | case 'L': |
- | |
72 | longflag=2; |
- | |
73 | format++; |
- | |
74 | break; |
- | |
75 | case 'f': |
- | |
76 | case 'd': |
- | |
77 | case 'c': |
- | |
78 | case 's': |
- | |
79 | case '%': |
- | |
80 | contflag=0; |
- | |
81 | break; |
- | |
82 | default: |
- | |
83 | contflag=0; |
- | |
84 | } |
- | |
85 | } |
- | |
86 | if (contflag) |
- | |
87 | break; |
- | |
88 | switch(*format) |
- | |
89 | { |
- | |
90 | case '%': |
- | |
91 | c=fgetc(file); |
- | |
92 | if (c!='%') |
- | |
93 | { |
- | |
94 | ungetc(c,file); |
- | |
95 | return -1; |
- | |
96 | } |
- | |
97 | res--; |
- | |
98 | break; |
- | |
99 | case 'd': |
- | |
100 | number=0; |
- | |
101 | sign=1; |
- | |
102 | skipspaces(file); |
- | |
103 | c=fgetc(file); |
- | |
104 | if (c=='-') |
6 | // get next chat from file obj, save point is ptr to string char ptr |
105 | { |
- | |
106 | sign=-1; |
7 | { |
107 | }else if (c!='+') |
- | |
108 | ungetc(c,file); |
- | |
109 | contflag=0; |
- | |
110 | while(1) |
8 | FILE *f = (FILE *)obj; |
111 | { |
9 | |
112 | c=fgetc(file); |
- | |
113 | if (c>='0' && c<='9') |
- | |
114 | { |
- | |
115 | contflag++; |
- | |
116 | number=number*10+(c-'0'); |
- | |
117 | }else |
- | |
118 | break; |
10 | return fgetc(f); |
119 | } |
- | |
120 | ungetc(c,file); |
- | |
121 | if (!contflag) |
- | |
122 | return res; |
- | |
123 | if (longflag<=1) |
11 | } |
124 | { |
12 | |
125 | *((int*)arg)=number; |
13 | void virtual_ungetc_file(void *sp, int c, const void *obj) |
126 | arg+=sizeof(int); |
- | |
127 | }else |
14 | // if can, one step back savepoint in s |
128 | { |
15 | { |
- | 16 | FILE *f = (FILE *)obj; |
|
129 | *((long long*)arg)=number; |
17 | |
130 | arg+=sizeof(long long); |
18 | if (f) ungetc(c, f); |
131 | } |
- | |
132 | break; |
- | |
133 | case 'c': |
- | |
134 | c=fgetc(file); |
- | |
135 | if (c==EOF) |
- | |
136 | return res; |
- | |
137 | *((char*)arg)=c; |
- | |
138 | arg+=sizeof(char); |
19 | } |
139 | break; |
- | |
140 | case 's': |
- | |
141 | skipspaces(file); |
- | |
142 | contflag=0; |
- | |
143 | str=*((char**)arg); |
- | |
144 | arg+=sizeof(char*); |
- | |
145 | while(1) |
20 | |
146 | { |
- | |
147 | c=fgetc(file); |
21 | |
148 | if (c==EOF || c==' ' || c=='\n' || c=='\r') |
22 | int vfscanf ( FILE * stream, const char * format, va_list arg ) |
149 | { |
23 | { |
150 | ungetc(c,file); |
- | |
151 | break; |
24 | return format_scan(stream, format, arg, &virtual_getc_file, &virtual_ungetc_file); |
152 | } |
- | |
153 | *str=c; |
- | |
154 | str++; |
- | |
155 | contflag++; |
25 | }; |
156 | } |
- | |
157 | if (!contflag) |
- | |
158 | return res; |
- | |
159 | break; |
- | |
160 | case 'f': |
- | |
161 | skipspaces(file); |
26 | |
162 | // TODO: read real numbers |
- | |
163 | rnumber=0; |
- | |
164 | switch (longflag) |
27 | int fscanf ( FILE * stream, const char * format, ...) |
165 | { |
- | |
166 | case 0: |
- | |
167 | *((float*)arg)=rnumber; |
28 | { |
168 | arg+=sizeof(float); |
29 | va_list arg; |
169 | break; |
- | |
170 | case 1: |
- | |
171 | *((double*)arg)=rnumber; |
- | |
172 | arg+=sizeof(double); |
- | |
173 | break; |
- | |
174 | case 2: |
- | |
175 | *((long double*)arg)=rnumber; |
30 | int n; |
176 | arg+=sizeof(long double); |
- | |
177 | break; |
- | |
178 | default: |
- | |
179 | return res; |
31 | va_start(arg, format); |
180 | } |
- | |
181 | break; |
- | |
182 | default: |
32 | |
183 | break; |
33 | n = vfscanf(stream, format, arg); |
184 | } |
34 | |
185 | format++; |
- | |
186 | res++; |
- | |
187 | } |
35 | va_end(arg); |
188 | return res; |
36 | return n; |
- | 37 | } |
|
- | 38 |