json_parser.c 17.7 KB
Newer Older
Tilman Steinweg's avatar
Tilman Steinweg committed
1
/*------------------------------------------------------------------------
2
 * Copyright (C) 2016 For the list of authors, see file AUTHORS.
Tilman Steinweg's avatar
Tilman Steinweg committed
3
4
 *
 * This file is part of SOFI2D.
5
 *
Tilman Steinweg's avatar
Tilman Steinweg committed
6
7
8
 * SOFI2D is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 2.0 of the License only.
9
 *
Tilman Steinweg's avatar
Tilman Steinweg committed
10
11
12
13
 * SOFI2D is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
14
 *
Tilman Steinweg's avatar
Tilman Steinweg committed
15
 * You should have received a copy of the GNU General Public License
16
 * along with SOFI2D. See file COPYING and/or
Tilman Steinweg's avatar
Tilman Steinweg committed
17
18
19
20
21
22
23
24
25
26
27
  * <http://www.gnu.org/licenses/gpl-2.0.html>.
--------------------------------------------------------------------------*/
/* -------------------------------------------------------------
 * function json_parser
 * reads input parameters from input file fomatted according to the json standard
 * also see www.json.org
 *
 *------------------------------------------------------------- */

#include "fd.h"

28
int read_objects_from_intputfile(FILE *fp, char *input_file,char **varname_list,char **value_list) {
Tilman Steinweg's avatar
Tilman Steinweg committed
29
30
31
32
33
34
35
36
37
38

	char errormessage[STRING_SIZE];
	char varname_tmp1[STRING_SIZE], varname_tmp2[STRING_SIZE], varname_tmp3[STRING_SIZE];
	char varname_tmp4[STRING_SIZE], varname_tmp5[STRING_SIZE];
	char value_tmp1[STRING_SIZE], value_tmp2[STRING_SIZE], value_tmp3[STRING_SIZE];
	char value_tmp4[STRING_SIZE], value_tmp5[STRING_SIZE];
	char cline[STRING_SIZE];
	int occurence_doublequotes = 0, occurence_commas = 0;
	int lineno=0;
	int number_readobject=0;
39
	FILE *fp_in = NULL;
Tilman Steinweg's avatar
Tilman Steinweg committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53

	//Open parameter input file
	fp_in=fopen(input_file,"r");


	if (fp_in==NULL) {
		fprintf(fp, "\n==================================================================\n");
		fprintf(fp, "  ERROR: Could not open input file '%s'!", input_file);
		fprintf(fp, "\n==================================================================\n");
		sprintf(errormessage, "\n  in: <read_par_json.c> \n");
		err(errormessage);
	}

	//read line by line into a string covering the whole line
54
	while (fgets(cline,STRING_SIZE,fp_in)) { /* leaves via break */
Tilman Steinweg's avatar
Tilman Steinweg committed
55
56
57
		/* If there are more than 255 characters in one line, this does not work. */
		//count of line numbers
		lineno++;
58

Tilman Steinweg's avatar
Tilman Steinweg committed
59
		/* tests if line is NOT a comment line*/
60
61
		/* tests if line contains at least a colon, double quote per line*/
		if (((strstr(cline,":"))&&((strstr(cline,"\"")))) && (!(strstr(cline,"comment")) && !(strstr(cline,"Comment"))))  {
Tilman Steinweg's avatar
Tilman Steinweg committed
62
63
64
65
66
67

			//count number of double quoates and colon signs
			occurence_doublequotes=count_occure_charinstring(cline,"\"");
			occurence_commas=count_occure_charinstring(cline,",");

			//only two pais of double quotes are allowed per line
68
69
70
71
72
			switch (occurence_doublequotes) {
				case 4:

					//up to 5 objects can be defined per line, more can be implemented here
					switch (occurence_commas) {
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
						case 0: //only a single object (name+value) in line
							//remove old data from strings
							memset(value_tmp1, '\0', sizeof(value_tmp1));
							memset(varname_tmp1, '\0', sizeof(varname_tmp1));

							//extract object name + object value from the line-string
							if (sscanf(cline," \"%[^\"]\" : \"%[^\"]\"",varname_tmp1,value_tmp1) != 2) {
								sprintf(errormessage,"Error in Input file, line %i, cannot read object name and object value !",lineno);
								err(errormessage);
							}

							//add extracted strings to object list
							add_object_tolist(varname_tmp1, value_tmp1,&number_readobject, varname_list, value_list);
							break;

88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
						case 1: //only a single object (name+value) in line

							//remove old data from strings
							memset(value_tmp1, '\0', sizeof(value_tmp1));
							memset(varname_tmp1, '\0', sizeof(varname_tmp1));

							//extract object name + object value from the line-string
							if (sscanf(cline," \"%[^\"]\" : \"%[^\"]\"",varname_tmp1,value_tmp1) != 2) {
								sprintf(errormessage,"Error in Input file, line %i, cannot read object name and object value !",lineno);
								err(errormessage);
							}

							//add extracted strings to object list
							add_object_tolist(varname_tmp1, value_tmp1,&number_readobject, varname_list, value_list);
							break;

						case 3://two objects (name+value) in line
							//remove old data from strings
							memset(value_tmp1, '\0', sizeof(value_tmp1));
							memset(varname_tmp1, '\0', sizeof(varname_tmp1));
							memset(value_tmp2, '\0', sizeof(value_tmp2));
							memset(varname_tmp2, '\0', sizeof(varname_tmp2));

							//extract object name + object value from the line-string
							if (sscanf(cline," \"%[^,],%[^\"]\" : \"%[^,],%[^\"]\"",
							           varname_tmp1,varname_tmp2,value_tmp1,value_tmp2) != 4) {
								sprintf(errormessage,"Error in Input file, line %i, cannot read two object names and values !",lineno);
								err(errormessage);
							}

							//add extracted strings to object list
							add_object_tolist(varname_tmp1, value_tmp1,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp2, value_tmp2,&number_readobject, varname_list, value_list);

							break;

						case 5://three objects (name+value) in line
							//remove old data from strings
							memset(value_tmp1, '\0', sizeof(value_tmp1));
							memset(value_tmp2, '\0', sizeof(value_tmp2));
							memset(value_tmp3, '\0', sizeof(value_tmp3));
							memset(varname_tmp1, '\0', sizeof(varname_tmp1));
							memset(varname_tmp2, '\0', sizeof(varname_tmp2));
							memset(varname_tmp3, '\0', sizeof(varname_tmp3));

							if (sscanf(cline," \"%[^,],%[^,],%[^\"]\" : \"%[^,],%[^,],%[^\"]\"",
							           varname_tmp1,varname_tmp2,varname_tmp3,value_tmp1,value_tmp2,value_tmp3) != 6) {
								sprintf(errormessage,"Error in Input file, line %i, cannot read three object names and values !",lineno);
								err(errormessage);
							}

							add_object_tolist(varname_tmp1, value_tmp1,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp2, value_tmp2,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp3, value_tmp3,&number_readobject, varname_list, value_list);

							break;

						case 7://four objects (name+value) in line
							//remove old data from strings
							memset(value_tmp1, '\0', sizeof(value_tmp1));
							memset(value_tmp2, '\0', sizeof(value_tmp2));
							memset(value_tmp3, '\0', sizeof(value_tmp3));
							memset(value_tmp4, '\0', sizeof(value_tmp4));
							memset(varname_tmp1, '\0', sizeof(varname_tmp1));
							memset(varname_tmp2, '\0', sizeof(varname_tmp2));
							memset(varname_tmp3, '\0', sizeof(varname_tmp3));
							memset(varname_tmp4, '\0', sizeof(varname_tmp4));

							if (sscanf(cline," \"%[^,],%[^,],%[^,],%[^\"]\" : \"%[^,],%[^,],%[^,],%[^\"]\"",
							           varname_tmp1,varname_tmp2,varname_tmp3,varname_tmp4,
							           value_tmp1,value_tmp2,value_tmp3,value_tmp4) != 8) {
								sprintf(errormessage,"Error in Input file, line %i, cannot read three object names and values !",lineno);
								err(errormessage);
							}

							add_object_tolist(varname_tmp1, value_tmp1,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp2, value_tmp2,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp3, value_tmp3,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp4, value_tmp4,&number_readobject, varname_list, value_list);

							break;

						case 9://five objects (name+value) in line
							//remove old data from strings
							memset(value_tmp1, '\0', sizeof(value_tmp1));
							memset(value_tmp2, '\0', sizeof(value_tmp2));
							memset(value_tmp3, '\0', sizeof(value_tmp3));
							memset(value_tmp4, '\0', sizeof(value_tmp4));
							memset(value_tmp5, '\0', sizeof(value_tmp5));
							memset(varname_tmp1, '\0', sizeof(varname_tmp1));
							memset(varname_tmp2, '\0', sizeof(varname_tmp2));
							memset(varname_tmp3, '\0', sizeof(varname_tmp3));
							memset(varname_tmp4, '\0', sizeof(varname_tmp4));
							memset(varname_tmp5, '\0', sizeof(varname_tmp5));

							if (sscanf(cline," \"%[^,],%[^,],%[^,],%[^,],%[^\"]\" : \"%[^,],%[^,],%[^,],%[^,],%[^\"]\"",
							           varname_tmp1,varname_tmp2,varname_tmp3,varname_tmp4,varname_tmp5,
							           value_tmp1,value_tmp2,value_tmp3,value_tmp4,value_tmp5) != 10) {
								sprintf(errormessage,"Error in Input file, line %i, cannot read three object names and values !",lineno);
								err(errormessage);
							}

							add_object_tolist(varname_tmp1, value_tmp1,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp2, value_tmp2,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp3, value_tmp3,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp4, value_tmp4,&number_readobject, varname_list, value_list);
							add_object_tolist(varname_tmp5, value_tmp5,&number_readobject, varname_list, value_list);

							//very strange: code crashes if both lines are commented here!
							//this only effects the last case of the switch!
							//should though not affect anything as long as number_readobject keeps its value
							//in this case a new object is allocated which is already there...

							//varname_list = malloc(sizeof(*varname_list));
							//value_list = malloc(sizeof(*value_list));
							varname_list[number_readobject] = malloc(STRING_SIZE*sizeof(char *));

							//varname_list[number_readobject] = (char**)malloc(STRING_SIZE*sizeof(char*));
							//value_list[number_readobject] = (char**)malloc(STRING_SIZE*sizeof(char*));

							break;

						default:
211
							sprintf(errormessage,"Error in Input file, line %i, only 0, 1, 3, 5, 7 or 9 commas are allowed per line, but found %i !",lineno,occurence_commas);
212
213
							err(errormessage);
							break;
Tilman Steinweg's avatar
Tilman Steinweg committed
214
215
216
217
218
					}

					break;

				default:
219
					sprintf(errormessage,"Error in Input file, line %i, only 4 (two pairs) of double quotes are allowed per line, but found %i !",lineno,occurence_doublequotes);
Tilman Steinweg's avatar
Tilman Steinweg committed
220
221
222
223
224
225
226
227
228
					err(errormessage);
					break;

			}

			//printf("line %i contains objectno %i varnamme %s with value %s \n",lineno,number_readobject, varname_list[number_readobject-1],value_list[number_readobject-1]);

		}
	}
229

Tilman Steinweg's avatar
Tilman Steinweg committed
230
231
232
233
	fclose(fp_in);
	return number_readobject;
}

234
void print_objectlist_screen(FILE *fp, int number_readobject,char **varname_list,char **value_list) {
Tilman Steinweg's avatar
Tilman Steinweg committed
235
236
237
238
239

	int ii;
	fprintf(fp, "\n===========================================================\n");
	fprintf(fp, "||  Object # | object name \t| object value           ||");
	fprintf(fp, "\n===========================================================\n");
240
241

	for (ii=0; ii<number_readobject; ii++) {
Tilman Steinweg's avatar
Tilman Steinweg committed
242
243
		fprintf(fp, "      %2.0i     | %18s | %s \n",ii+1, varname_list[ii],value_list[ii]);
	}
244

Tilman Steinweg's avatar
Tilman Steinweg committed
245
246
247
	printf("========================================================\n\n");
}

248
int count_occure_charinstring(char stringline[STRING_SIZE], char teststring[]) {
Tilman Steinweg's avatar
Tilman Steinweg committed
249
250
251

	int ii=0, number_occurence=0;

252
	for (ii=0; stringline[ii] != '\0'; ii++) {
Tilman Steinweg's avatar
Tilman Steinweg committed
253
254
255
256
257
258
259
		//printf("lineno = %i ii= %i cline[ii]= %c  ",lineno, ii,cline[ii]);
		//printf("teststring= %s ",teststring);
		if (strchr(teststring,stringline[ii])) {
			//printf("hello");
			number_occurence++;
		}
	}
260

Tilman Steinweg's avatar
Tilman Steinweg committed
261
262
263
	return number_occurence;
}

264
void copy_str2str_uptochar(char string_in[STRING_SIZE], char string_out[STRING_SIZE], char teststring[]) {
Tilman Steinweg's avatar
Tilman Steinweg committed
265
266
267

	int ii=0;

268
	for (ii=0; string_in[ii] != '\0'; ii++) {
Tilman Steinweg's avatar
Tilman Steinweg committed
269
270
271
272
		if (strchr(teststring,string_in[ii])) {
			strncpy(string_out,string_in,ii);
		}
	}
273

Tilman Steinweg's avatar
Tilman Steinweg committed
274
275
276
	//return EXIT_SUCCESS;
}

277
278
int get_int_from_objectlist(char string_in[STRING_SIZE], int number_readobject, int *int_buffer,
                            char **varname_list,char **value_list) {
Tilman Steinweg's avatar
Tilman Steinweg committed
279
280
281
282

	int ii=0, checkifstringfound=1;
	double double_buffer;
	double intpart;
283
	char *string_buffer;
Tilman Steinweg's avatar
Tilman Steinweg committed
284
285
286
	char errormessage[STRING_SIZE];


287
	while ((strcmp(varname_list[ii],string_in)!=0) && ((ii+1)<number_readobject)) {
Tilman Steinweg's avatar
Tilman Steinweg committed
288
289
		ii++;
	}
290

Tilman Steinweg's avatar
Tilman Steinweg committed
291
292
	if (strcmp(varname_list[ii],string_in)==0) {
		//printf("String %s found with value -%s- \n",string_in,value_list[ii]);
293
		if (strlen(value_list[ii])==0) {
Tilman Steinweg's avatar
Tilman Steinweg committed
294
295
296
			sprintf(errormessage,"Error in Input file, value of object %s is empty!",string_in);
			err(errormessage);
		}
297

298
		memset(&string_buffer, '\0', sizeof(*string_buffer));
Tilman Steinweg's avatar
Tilman Steinweg committed
299
		double_buffer = strtod(value_list[ii],&string_buffer);
300

Tilman Steinweg's avatar
Tilman Steinweg committed
301
302
		//printf("From string: -%s- double %f exctracted \n",value_list[ii],double_buffer);
		//printf("RemString found: -%s- with length %i \n",string_buffer,strlen(string_buffer));
303
		if (strlen(string_buffer)>0) {
Tilman Steinweg's avatar
Tilman Steinweg committed
304
305
306
307
308
309
310
311
			/* string empty or 'garbage after double' */
			sprintf(errormessage,"Error in Input file, value of object %s contains more than one float: '%s'!",string_in,string_buffer);
			err(errormessage);
		}

		//printf("string %s found with value %f \n",string_in,double_buffer);
		//printf ("%lf = %lf + %lf \n", double_buffer, intpart, fractpart);

312
		if ((modf(double_buffer, &intpart))==0) {
Tilman Steinweg's avatar
Tilman Steinweg committed
313
314
315
			*int_buffer = atoi(value_list[ii]);
			//printf("\nfunc: string %s found with value %i \n",string_in,*int_buffer);
			checkifstringfound=0;
316
317

		} else {
Tilman Steinweg's avatar
Tilman Steinweg committed
318
319
320
321
322
323
324
			//double read, not an int (there are decimal places)
			sprintf(errormessage,"Error in Input file, value of object %s is not an int : %f !",string_in,double_buffer);
			err(errormessage);
			*int_buffer=-1;
			checkifstringfound=2;
		}

325
	} else {
Tilman Steinweg's avatar
Tilman Steinweg committed
326
327
		checkifstringfound=1;
	}
328

Tilman Steinweg's avatar
Tilman Steinweg committed
329
330
331
	return checkifstringfound;
}

332
333
int get_float_from_objectlist(char string_in[STRING_SIZE], int number_readobject, float *double_buffer,
                              char **varname_list,char **value_list) {
Tilman Steinweg's avatar
Tilman Steinweg committed
334
335
336

	int ii=0, checkifstringfound=1;
	double double_dummy;
337
	char *string_buffer;
Tilman Steinweg's avatar
Tilman Steinweg committed
338
339
	char errormessage[STRING_SIZE];

340
	while ((strcmp(varname_list[ii],string_in)!=0) && ((ii+1)<number_readobject)) {
Tilman Steinweg's avatar
Tilman Steinweg committed
341
342
		ii++;
	}
343

Tilman Steinweg's avatar
Tilman Steinweg committed
344
345
346
347
	//note: strstr compares if string_in is within varname_list[ii]
	// strcmp compares characterwise if string_in is equal to varname_list[ii]
	if (strcmp(varname_list[ii],string_in)==0) {
		//printf("func1: String %s found with value -%s- \n",string_in,value_list[ii]);
348
		if (strlen(value_list[ii])==0) {
Tilman Steinweg's avatar
Tilman Steinweg committed
349
350
351
			sprintf(errormessage,"Error in Input file, value of object %s is empty!",string_in);
			err(errormessage);
		}
352

353
		memset(&string_buffer, '\0', sizeof(*string_buffer));
Tilman Steinweg's avatar
Tilman Steinweg committed
354
		double_dummy = strtod(value_list[ii],&string_buffer);
355

Tilman Steinweg's avatar
Tilman Steinweg committed
356
357
		//printf("From string: -%s- double %f exctracted \n",value_list[ii],double_dummy);
		//printf("RemString found: -%s- with length %i \n",string_buffer,strlen(string_buffer));
358
		if ((strlen(string_buffer)==0) || ((strlen(string_buffer)>0) && ((is_string_blankspace(string_buffer))==1))) {
Tilman Steinweg's avatar
Tilman Steinweg committed
359
360
361
			//printf("\nfunc: string %s found with value %5.5f \n",string_in,double_dummy);
			*double_buffer=double_dummy;
			checkifstringfound=0;
362
363

		} else {
Tilman Steinweg's avatar
Tilman Steinweg committed
364
365
366
367
368
369
			/* string empty or 'garbage after double' */
			sprintf(errormessage,"Error in Input file, value of object %s contains more than one float: '%s'!",string_in,string_buffer);
			err(errormessage);
			checkifstringfound=2;
		}

370
	} else {
Tilman Steinweg's avatar
Tilman Steinweg committed
371
372
		checkifstringfound=1;
	}
373

Tilman Steinweg's avatar
Tilman Steinweg committed
374
375
376
377
	return checkifstringfound;
}

int get_string_from_objectlist(char string_in[STRING_SIZE], int number_readobject, char string_buffer[STRING_SIZE],
378
                               char **varname_list,char **value_list) {
Tilman Steinweg's avatar
Tilman Steinweg committed
379
380
381
382

	int ii=0, checkifstringfound=1;
	char errormessage[STRING_SIZE];

383
	while ((strcmp(varname_list[ii],string_in)!=0) && ((ii+1)<number_readobject)) {
Tilman Steinweg's avatar
Tilman Steinweg committed
384
385
386
		ii++;
		//printf("ii= %i, number_readobject= %i",ii,number_readobject);
	}
387

Tilman Steinweg's avatar
Tilman Steinweg committed
388
389
	if (strcmp(varname_list[ii],string_in)==0) {
		//printf("String %s found with value -%s- \n",string_in,value_list[ii]);
390
		if (strlen(value_list[ii])==0) {
Tilman Steinweg's avatar
Tilman Steinweg committed
391
392
			sprintf(errormessage,"Error in Input file, value of object %s is empty!",string_in);
			err(errormessage);
393
394

		} else {
395
			memset(string_buffer, '\0', sizeof(&string_buffer));
Tilman Steinweg's avatar
Tilman Steinweg committed
396
397
398
399
			strcpy(string_buffer,value_list[ii]);
			checkifstringfound=0;
			//printf("\nfunc: string %s found with value -%s- \n",string_in,string_buffer);
		}
400
401

	} else {
Tilman Steinweg's avatar
Tilman Steinweg committed
402
403
404
405
406
407
		checkifstringfound=1;
	}

	return checkifstringfound;
}

408
int is_string_blankspace(char string_in[STRING_SIZE]) {
Tilman Steinweg's avatar
Tilman Steinweg committed
409
410
411
412

	int ii=0, blank_num=0, string_length=0;

	string_length=strlen(string_in);
413
414
415

	while (ii < string_length)  {
		if (string_in[ii++] == ' ')
Tilman Steinweg's avatar
Tilman Steinweg committed
416
417
			blank_num++;
	}
418

Tilman Steinweg's avatar
Tilman Steinweg committed
419
420
	//printf("\nString has length %i and contains %i black spaces \n",string_length, blank_num);
	if (blank_num==string_length) return 1;
421

Tilman Steinweg's avatar
Tilman Steinweg committed
422
423
424
425
	else return 0;

}

426
void remove_blankspaces_around_string(char string_in[STRING_SIZE]) {
Tilman Steinweg's avatar
Tilman Steinweg committed
427
428
429
430
431
432
433
434

	char string_dummy[STRING_SIZE];

	//erase dummy string content
	memset(string_dummy, '\0', sizeof(string_dummy));
	//copy string content from input string (ignoring blank spaces before and afer string)
	sscanf(string_in,"%s",string_dummy);
	//erase string content
435
	memset(string_in, '\0', sizeof(&string_in));
Tilman Steinweg's avatar
Tilman Steinweg committed
436
437
438
439
440
	//copy dummy information withou blank spaces in original string
	strcpy(string_in,string_dummy);

}

441
442
void add_object_tolist(char string_name[STRING_SIZE],char string_value[STRING_SIZE], int *number_readobject
                       , char **varname_list,char **value_list) {
Tilman Steinweg's avatar
Tilman Steinweg committed
443
444
445
446
447
448
449
450
451

	//problem: the sscanf line reads between double quotes, including blank space
	//therefore another sscanf is performed in function remove_blankspace_around_string
	//to remove blank spaces in front and after object name (and value resp.)
	remove_blankspaces_around_string(string_name);
	remove_blankspaces_around_string(string_value);

	//allocate memory for a new object

452
453
	varname_list[*number_readobject] = malloc(STRING_SIZE*sizeof(char *));
	value_list[*number_readobject] = malloc(STRING_SIZE*sizeof(char *));
Tilman Steinweg's avatar
Tilman Steinweg committed
454
455
456
457
458
459
460
461
462
463
464
	//	varname_list[*number_readobject] = (char**)malloc(STRING_SIZE*sizeof(char*));
	//	value_list[*number_readobject] = (char**)malloc(STRING_SIZE*sizeof(char*));

	//copy temp strings into object list
	strcpy(varname_list[*number_readobject],string_name);
	strcpy(value_list[*number_readobject],string_value);

	//count number of read objects
	*number_readobject=*number_readobject+1;
	//printf("func after number_readobject : %i \n",number_readobject);
}
465
466
467
468
469