Subversion Repositories Kolibri OS

Rev

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