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;
+}