#include #include typedef struct { int id; char title[256]; char og_title[256]; char directors[1024]; char actors[1024]; char prod_year[32]; char release_date[32]; char duration[32]; char main_genres[256]; char nationality[256]; char pitch[2048]; char poster[256]; char times[4096]; } Movie; Movie movies[64] = {0}; static void print_style(void) { puts(""); puts(""); } static void print_times(Movie *movie) { printf("\n"); } static void print_movie(Movie *movie) { if (movie->og_title[0] != '\0') printf("

%s

\n", movie->og_title); else printf("

%s

\n", movie->title); printf("\"affiche\"\n", movie->poster, movie->poster); printf("\n"); printf("\n"); } static void xfree(const void *ptr) { if (ptr != NULL) xmlFree((void *)ptr); } static int get_id(const xmlNode *node) { const xmlChar *id = xmlGetProp(node, "id"); if (id == NULL) return 0; const int v = atoi(id); xfree(id); return v; } static const xmlNode *get_movie_node(const xmlNode *node) { while (node != NULL && strcmp((const char *)node->name, "film") != 0) node = node->children; return node; } static Movie *get_movie(int id) { Movie *movie = movies; while (movie->id != id && movie->id != 0) movie += 1; return movie; } static int set_movie_base_fields(Movie *movie, const xmlNode *node) { const xmlNode *times_node = node->children; if (times_node == NULL || times_node->next == NULL) return 1; int err = 0; const xmlChar *title = xmlGetProp(node, "titre"); const xmlChar *og_title = xmlGetProp(node, "titreoriginal"); const xmlChar *directors = xmlGetProp(node, "realisateurs"); const xmlChar *actors = xmlGetProp(node, "acteurs"); const xmlChar *prod_year = xmlGetProp(node, "anneeproduction"); const xmlChar *release_date = xmlGetProp(node, "datesortie"); const xmlChar *duration = xmlGetProp(node, "duree"); const xmlChar *main_genres = xmlGetProp(node, "genreprincipal"); const xmlChar *nationality = xmlGetProp(node, "nationalite"); const xmlChar *pitch = xmlGetProp(node, "synopsis"); const xmlChar *poster = xmlGetProp(node, "affichette"); const xmlChar *times = xmlNodeGetContent(times_node->next); if (title == NULL || og_title == NULL || directors == NULL || actors == NULL || prod_year == NULL || release_date == NULL || duration == NULL || main_genres == NULL || nationality == NULL || pitch == NULL || poster == NULL || times == NULL) { err = 1; goto set_fields_panic; } strncpy(movie->title, title, sizeof(movie->title) - 1); strncpy(movie->og_title, og_title, sizeof(movie->title) - 1); strncpy(movie->directors, directors, sizeof(movie->directors) - 1); strncpy(movie->actors, actors, sizeof(movie->actors) - 1); strncpy(movie->prod_year, prod_year, sizeof(movie->prod_year) - 1); strncpy(movie->release_date, release_date, sizeof(movie->release_date) - 1); strncpy(movie->duration, duration, sizeof(movie->duration) - 1); strncpy(movie->main_genres, main_genres, sizeof(movie->main_genres) - 1); strncpy(movie->nationality, nationality, sizeof(movie->nationality) - 1); strncpy(movie->pitch, pitch, sizeof(movie->pitch) - 1); strncpy(movie->poster, poster, sizeof(movie->poster) - 1); strncpy(movie->times, times, sizeof(movie->times) - 1); set_fields_panic: xfree(title); xfree(og_title); xfree(directors); xfree(actors); xfree(prod_year); xfree(release_date); xfree(duration); xfree(main_genres); xfree(nationality); xfree(pitch); xfree(poster); return err; } static int append_movie_times(Movie *movie, const xmlNode *node) { const xmlNode *times_node = node->children; if (times_node == NULL || times_node->next == NULL) return 1; const xmlChar *times = xmlNodeGetContent(times_node->next); if (times == NULL) return 1; strncat(movie->times, ";", sizeof(movie->times) - 1); strncat(movie->times, times, sizeof(movie->times) - 1); xfree(times); return 0; } int main(int argc, char **argv) { if (argc != 2) return 1; xmlDoc *const document = xmlReadFile(argv[1], NULL, 0); if (document == NULL) { xmlCleanupParser(); return 1; } xmlNode *const root = xmlDocGetRootElement(document); if (root == NULL) { xmlCleanupParser(); xmlFreeDoc(document); return 1; } for (const xmlNode *week = root->children; week != NULL; week = week->next) { for (const xmlNode *mov = get_movie_node(week); mov != NULL; mov = mov->next) { const int id = get_id(mov); if (id == 0) continue; Movie *movie = get_movie(id); if (movie->id == 0) { movie->id = id; set_movie_base_fields(movie, mov); } else append_movie_times(movie, mov); } } print_style(); printf("

cinéma de la cité

\n"); for (Movie *movie = movies; movie->id != 0; movie++) print_movie(movie); xmlFreeDoc(document); xmlCleanupParser(); return 0; }