Mercurial > remote-gamepad-server
diff 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 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/XML.c @@ -0,0 +1,110 @@ +/* XML.c */ +/* ROUSSEL Cedric - TOINON Veran */ + +#include "XML.h" + +/*Lit un fichier et retourne son contenu dans une chaine de caractère*/ +char* LoadFile(char* location){ + int n=0; + int i=0; + char* m; + FILE* f=fopen(location,"r"); + if(f==NULL){ + fprintf(stderr, "Could not open \"%s\"\n", location); + return NULL; + } + while (fgetc(f) != EOF) {n++;} + m=(char*)malloc(n*sizeof(char)); + if (m==NULL) {return NULL;}; + rewind(f); + for(i=0;i<(n-1);i++){ + *(m+i)=(char)fgetc(f); + } + *(m+n-1)='\0'; + fclose(f); + return m; +} + +/*begin et end pointent dans une chaine de caracteres. +MakeString retourne une nouvelle chaine */ +char* MakeString(char* begin, char* end){ + char* r; + char* a; + int n=0; + a=begin; + while (a != end) {n++;a++;} + r=(char*)malloc((n+1)*sizeof(char)); + if (r==NULL) {return NULL;} + strncpy(r,begin,n); + *(r+n)='\0'; + return r; +} + + +/*Retourne le premier tag trouvé(sans les < >) +Retourne NULL si aucun tag trouvé*/ +char* FindTag(char* text){ + char* a; + char* b; + a=strchr(text,'<'); + if (a==NULL) {return NULL;} + b=strchr(text,'>'); + if (b==NULL) {return NULL;} + return MakeString(a+1,b); +} + +/*Retourne le contenu du tag (sans < >)de la chaine pointée par mark. +Repositione mark à la fin du tag de fermeture. +Penser à supprimer avec free la chaine retournée. +*/ +char* TagContent(char* tag,char** mark){ + char* a; + char* b; + char* tagd; + char* tagf; + + tagd=(char*)malloc((strlen(tag)+3)*sizeof(char)); + tagf=(char*)malloc((strlen(tag)+4)*sizeof(char)); + if (tagd==NULL || tagf==NULL) {return NULL;} + + strcpy(tagd,"<"); strcat(tagd,tag); strcat(tagd,">"); + strcpy(tagf,"</"); strcat(tagf,tag); strcat(tagf,">"); + + a=strstr(*mark,tagd)+strlen(tagd); + *mark=a; + b=strstr(*mark,tagf); + if (b == NULL){ + free(tagd); + free(tagf); + return NULL; + } //Si il n'y a pas de tag de fermeture + *mark=b+strlen(tagf); + + free(tagd); + free(tagf); + + return MakeString(a,b); +} + +/* Lit la chaine XML pour initialiser l'élément pointé par pt grace à la +fonction TreatTag */ +int ReadXML(void* pt,int(*TreatTag)(void*,char*,char*),char* mark){ + int ok; + char* content; + char* tag; + tag=FindTag(mark); + while(tag!=NULL){ + content = TagContent(tag,&mark); + if (content != NULL){ + ok = TreatTag(pt,tag,content); + if(ok==0){ + printf("Probleme dans le traitement de <%s>\n",tag); + return 0; + } + free(content); + } + free(tag); + tag=FindTag(mark); + } + return 1; +}