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 }