diff --git a/src/TerrainsXML.c b/src/TerrainsXML.c new file mode 100644 index 0000000000000000000000000000000000000000..af220db7e7389c39e95ebde2e05c5533e88aa8e9 --- /dev/null +++ b/src/TerrainsXML.c @@ -0,0 +1,120 @@ +#include <stdio.h> +#include <stdlib.h> +#include "TerrainsXML.h" + +Case* Remplir_Terrains(FILE* Terrains_XML_log, const char *filename) /* Remplit le tableau de cases à partir du fichier XML */ +{ + fprintf(Terrains_XML_log,"I) Chargement du fichier Terrains XML - Definition des noeuds\n"); + node_t *rootXML, *TerrainsXML; + unsigned int i=0, nb_terrains=0; + + rootXML = roxml_load_doc(filename); /* Ouvre le doc XML et créé le noeud de base */ + TerrainsXML = roxml_get_chld(rootXML, NULL, 0); /* Descend d'un niveau dans l'arborescence */ + nb_terrains = roxml_get_chld_nb(TerrainsXML); /* Récupère le nombre de cases entrées dans le fichier XML */ + + fprintf(Terrains_XML_log,"Le fichier contient %d terrains\n", nb_terrains); + + /*---------------------------------------------------------------------------------------------------*/ + + fprintf(Terrains_XML_log,"II) Chargement des terrains\n"); + + Terrain* ListeTerrains = NULL; + ListeTerrains = malloc(nb_terrains * sizeof(Terrain)); /* Allocation de la mémoire nécéssaire et test*/ + if (ListeTerrains == NULL) + { + fprintf(Terrains_XML_log,"Allocation impossible \n"); + exit(EXIT_FAILURE); + } + fprintf(Terrains_XML_log,"1) Memoire allouee avec succes \n"); + fprintf(Terrains_XML_log,"La memoire allouee fait %d octets\n",nb_terrains * sizeof(Terrain)); + + /*--------------------------------------------------------------------------------------------------*/ + + for(i=0; i<nb_terrains; i++) /* Boucle de remplissage des cases */ + { + fprintf(Terrains_XML_log,"\nChargement du terrain numero %d\n", i+1); + + Terrain Terrain_en_cours; + + node_t *TerrainXML; + char *id_text, *name_text, *FR_text, *FRS_text, *PDR_text, *DESC_text; + int FR_int=0, FRS_int=0, PDR_int=0; + + TerrainXML = roxml_get_chld(TerrainsXML, NULL, i); + + node_t *ID, *NAME, *FR, *FRS, *PDR, *DESC; + + ID = roxml_get_attr(TerrainXML, "id", 0); + NAME = roxml_get_attr(TerrainXML, "name", 0); + FR = roxml_get_attr(TerrainXML, "FR", 0); + FRS = roxml_get_attr(TerrainXML, "FRS", 0); + PDR = roxml_get_attr(TerrainXML, "PDR", 0); + DESC = roxml_get_attr(TerrainXML, "Desc", 0); + + id_text = roxml_get_content(ID, NULL, 0, NULL); + name_text = roxml_get_content(NAME, NULL, 0, NULL); + FR_text = roxml_get_content(FR, NULL, 0, NULL); + FRS_text = roxml_get_content(FRS, NULL, 0, NULL); + PDR_text = roxml_get_content(PDR, NULL, 0, NULL); + DESC_text = roxml_get_content(DESC, NULL, 0, NULL); + + fprintf(Terrains_XML_log,"Id : %s\n", id_text); + fprintf(Terrains_XML_log,"Nom : %s\n", name_text); + fprintf(Terrains_XML_log,"FR : %s\n", FR_text); + fprintf(Terrains_XML_log,"FRS : %s\n", FRS_text); + fprintf(Terrains_XML_log,"PDR : %s\n", PDR_text); + fprintf(Terrains_XML_log,"DESC : %s\n", DESC_text); + + /* Convertion des caractéristiques lues vers les types de la struct Case */ + FR_int = atoi(FR_text); + FRS_int = atoi(FRS_text); + PDR_int = atoi(PDR_text); + + /* Remplissage des caractéristiques de la classe en cours */ + switch(FR_int){ + case 0 : + Terrain_en_cours.franchissable=0; + break; + case 1 : + Terrain_en_cours.franchissable=1; + break; + default : + fprintf(Terrains_XML_log,"ERREUR : FR doit prendre la valeur 0 ou 1 !\n"); + Terrain_en_cours.franchissable=0; + } + + switch(FRS_int){ + case 0 : + Terrain_en_cours.franchissable_sorts=0; + break; + case 1 : + Terrain_en_cours.franchissable_sorts=1; + break; + default : + fprintf(Terrains_XML_log,"ERREUR : FRS doit prendre la valeur 0 ou 1 !\n"); + Terrain_en_cours.franchissable_sorts=0; + } + + Terrain_en_cours.PD_requis=PDR_int; + strcpy(Terrain_en_cours.nomTerrain, name_text); + + /* Ajout du terrain rempli au tableau */ + fprintf(Terrains_XML_log,"Insertion du terrain %d dans le tableau\n", i+1); + ListeTerrains[i] = Terrain_en_cours; + + /* Libération des noeuds */ + roxml_free_node(ID); + roxml_free_node(NAME); + roxml_free_node(FR); + roxml_free_node(FRS); + roxml_free_node(PDR); + } + + roxml_free_node(rootXML); + roxml_free_node(TerrainsXML); + + return ListeTerrains; +} + + +