Mercurial > remote-gamepad-server
comparison XML.c @ 0:e70ea46d6073
Initial import from http://wouhanegaine.free.fr/dev/DSPad02b_neo07.zip
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 22 Feb 2015 01:38:06 +0100 |
parents | |
children | f362b20de51e |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e70ea46d6073 |
---|---|
1 /* XML.c */ | |
2 /* ROUSSEL Cedric - TOINON Veran */ | |
3 | |
4 #include "XML.h" | |
5 | |
6 /*Lit un fichier et retourne son contenu dans une chaine de caractère*/ | |
7 char* LoadFile(char* location){ | |
8 int n=0; | |
9 int i=0; | |
10 char* m; | |
11 FILE* f=fopen(location,"r"); | |
12 if(f==NULL){ | |
13 fprintf(stderr, "Could not open \"%s\"\n", location); | |
14 return NULL; | |
15 } | |
16 while (fgetc(f) != EOF) {n++;} | |
17 m=(char*)malloc(n*sizeof(char)); | |
18 if (m==NULL) {return NULL;}; | |
19 rewind(f); | |
20 for(i=0;i<(n-1);i++){ | |
21 *(m+i)=(char)fgetc(f); | |
22 } | |
23 *(m+n-1)='\0'; | |
24 fclose(f); | |
25 return m; | |
26 } | |
27 | |
28 /*begin et end pointent dans une chaine de caracteres. | |
29 MakeString retourne une nouvelle chaine */ | |
30 char* MakeString(char* begin, char* end){ | |
31 char* r; | |
32 char* a; | |
33 int n=0; | |
34 a=begin; | |
35 while (a != end) {n++;a++;} | |
36 r=(char*)malloc((n+1)*sizeof(char)); | |
37 if (r==NULL) {return NULL;} | |
38 strncpy(r,begin,n); | |
39 *(r+n)='\0'; | |
40 return r; | |
41 } | |
42 | |
43 | |
44 /*Retourne le premier tag trouvé(sans les < >) | |
45 Retourne NULL si aucun tag trouvé*/ | |
46 char* FindTag(char* text){ | |
47 char* a; | |
48 char* b; | |
49 a=strchr(text,'<'); | |
50 if (a==NULL) {return NULL;} | |
51 b=strchr(text,'>'); | |
52 if (b==NULL) {return NULL;} | |
53 return MakeString(a+1,b); | |
54 } | |
55 | |
56 /*Retourne le contenu du tag (sans < >)de la chaine pointée par mark. | |
57 Repositione mark à la fin du tag de fermeture. | |
58 Penser à supprimer avec free la chaine retournée. | |
59 */ | |
60 char* TagContent(char* tag,char** mark){ | |
61 char* a; | |
62 char* b; | |
63 char* tagd; | |
64 char* tagf; | |
65 | |
66 tagd=(char*)malloc((strlen(tag)+3)*sizeof(char)); | |
67 tagf=(char*)malloc((strlen(tag)+4)*sizeof(char)); | |
68 if (tagd==NULL || tagf==NULL) {return NULL;} | |
69 | |
70 strcpy(tagd,"<"); strcat(tagd,tag); strcat(tagd,">"); | |
71 strcpy(tagf,"</"); strcat(tagf,tag); strcat(tagf,">"); | |
72 | |
73 a=strstr(*mark,tagd)+strlen(tagd); | |
74 *mark=a; | |
75 b=strstr(*mark,tagf); | |
76 if (b == NULL){ | |
77 free(tagd); | |
78 free(tagf); | |
79 return NULL; | |
80 } //Si il n'y a pas de tag de fermeture | |
81 *mark=b+strlen(tagf); | |
82 | |
83 free(tagd); | |
84 free(tagf); | |
85 | |
86 return MakeString(a,b); | |
87 } | |
88 | |
89 /* Lit la chaine XML pour initialiser l'élément pointé par pt grace à la | |
90 fonction TreatTag */ | |
91 int ReadXML(void* pt,int(*TreatTag)(void*,char*,char*),char* mark){ | |
92 int ok; | |
93 char* content; | |
94 char* tag; | |
95 tag=FindTag(mark); | |
96 while(tag!=NULL){ | |
97 content = TagContent(tag,&mark); | |
98 if (content != NULL){ | |
99 ok = TreatTag(pt,tag,content); | |
100 if(ok==0){ | |
101 printf("Probleme dans le traitement de <%s>\n",tag); | |
102 return 0; | |
103 } | |
104 free(content); | |
105 } | |
106 free(tag); | |
107 tag=FindTag(mark); | |
108 } | |
109 return 1; | |
110 } |