Subversion Repositories Kolibri OS

Rev

Rev 647 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
647 andrew_pro 1
#include 
2
void skipspaces(FILE* file)
3
{
4
	int c;
5
	while(1)
6
	{
6412 siemargl 7
		c=fgetc(file);
647 andrew_pro 8
		if (c!=' ' && c!='\r' && c!='\n')
9
		{
10
			ungetc(c,file);
11
			return;
12
		}
13
	}
14
}
6412 siemargl 15
 
647 andrew_pro 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;
30
	arg+=sizeof(const char*);
31
	while (*format!='\0')
32
	{
33
		if (*format!='%')
34
		{
35
			c=fgetc(file);
36
			if (c!=*format)
37
			{
6412 siemargl 38
				ungetc(c,file);
647 andrew_pro 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=='-')
105
			{
106
				sign=-1;
107
			}else if (c!='+')
108
				ungetc(c,file);
109
			contflag=0;
110
			while(1)
111
			{
112
				c=fgetc(file);
113
				if (c>='0' && c<='9')
114
				{
115
					contflag++;
116
					number=number*10+(c-'0');
117
				}else
118
					break;
119
			}
120
			ungetc(c,file);
121
			if (!contflag)
122
				return res;
123
			if (longflag<=1)
124
			{
125
				*((int*)arg)=number;
126
				arg+=sizeof(int);
127
			}else
128
			{
129
				*((long long*)arg)=number;
130
				arg+=sizeof(long long);
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);
139
			break;
140
		case 's':
141
			skipspaces(file);
142
			contflag=0;
143
			str=*((char**)arg);
144
			arg+=sizeof(char*);
145
			while(1)
146
			{
147
				c=fgetc(file);
148
				if (c==EOF || c==' ' || c=='\n' || c=='\r')
149
				{
150
					ungetc(c,file);
151
					break;
152
				}
153
				*str=c;
154
				str++;
155
				contflag++;
156
			}
157
			if (!contflag)
158
				return res;
159
			break;
160
		case 'f':
161
			skipspaces(file);
162
			// TODO: read real numbers
163
			rnumber=0;
164
			switch (longflag)
165
			{
166
			case 0:
167
				*((float*)arg)=rnumber;
168
				arg+=sizeof(float);
169
				break;
170
			case 1:
171
				*((double*)arg)=rnumber;
172
				arg+=sizeof(double);
173
				break;
174
			case 2:
175
				*((long double*)arg)=rnumber;
176
				arg+=sizeof(long double);
177
				break;
178
			default:
179
				return res;
180
			}
181
			break;
182
		default:
183
			break;
184
		}
185
		format++;
186
		res++;
187
	}
188
	return res;
189
}