From 4945cedb57edd76f4a53d57437d486daa7c26662 Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Tue, 16 Mar 2021 17:30:21 -0400 Subject: db_games_find(): Parse game name and description --- diff --git a/configure.ac b/configure.ac index ecc933a..d98283d 100644 --- a/configure.ac +++ b/configure.ac @@ -36,8 +36,8 @@ test -d "${srcdir}/.git" || CFLAGS="${save_CFLAGS}" funcs_missing=false AC_CHECK_FUNCS( [\ - alphasort calloc dirname free malloc printf putchar realpath \ - scandir sscanf strcmp strdup vprintf + alphasort calloc dirname free isspace malloc printf putchar \ + realpath scandir sscanf strcmp strdup strndup vprintf ], [], [funcs_missing=true]) diff --git a/src/game.c b/src/game.c index f129766..3eea396 100644 --- a/src/game.c +++ b/src/game.c @@ -30,6 +30,10 @@ struct db_game { char *id; char *name; char *desc; + enum { + DB_GAME_XML_PARSING_NAME, + DB_GAME_XML_PARSING_DESCRIPTION, + } xml_parsing; }; static int @@ -65,6 +69,46 @@ _db_game_xml_invalid_start(void *pv, const char *name, } static void XMLCALL +_db_game_xml_cdata(void *pv, const char *s, int len) +{ + XML_Parser p; + struct db_game *game; + char **data; + char *s_z; + char *s_z_trimmed; + char *s_z_trimmed_end; + + db_dbg( "[CDATA]"); + + p = (XML_Parser) pv; + game = db_xml_node_peek(p); + if (game->xml_parsing == DB_GAME_XML_PARSING_NAME) { + data = &game->name; + } else { + data = &game->desc; + } + + s_z = s_z_trimmed = strndup(s, len); + + while(isspace(*s_z_trimmed)) { + ++s_z_trimmed; + --len; + } + if (*s_z_trimmed == '\0') { + return; + } + s_z_trimmed_end = s_z_trimmed + len - 1; + while (s_z_trimmed_end > s_z_trimmed && isspace(*s_z_trimmed_end)) { + --s_z_trimmed_end; + } + *(s_z_trimmed_end + 1) = '\0'; + + *data = strdup(s_z_trimmed); + + free(s_z); +} + +static void XMLCALL _db_game_xml_name_end(void *pv, const char *name) { XML_Parser p; @@ -74,7 +118,6 @@ _db_game_xml_name_end(void *pv, const char *name) p = (XML_Parser) pv; if (db_xml_check_tag(name, "name")) { - /* TODO */ db_xml_node_pop(p); } else { db_xml_unexpected_end_tag(p, name, "name"); @@ -91,7 +134,6 @@ _db_game_xml_description_end(void *pv, const char *name) p = (XML_Parser) pv; if (db_xml_check_tag(name, "description")) { - /* TODO */ db_xml_node_pop(p); } else { db_xml_unexpected_end_tag(p, name, "description"); @@ -177,10 +219,12 @@ _db_game_xml_game_el_start(void *pv, const char *name, const char **attr) return; } db_dbg(" lang=\"%s\"", lang); + game->xml_parsing = DB_GAME_XML_PARSING_NAME; /* TODO */ free(lang); db_xml_node_push(p, game, _db_game_xml_invalid_start, - _db_game_xml_name_end, NULL /* TODO */); + _db_game_xml_name_end, + _db_game_xml_cdata); } else if (db_xml_check_tag(name, "description")) { lang = NULL; db_xml_get_string_attr(p, attr, "lang", &lang, 1); @@ -188,10 +232,12 @@ _db_game_xml_game_el_start(void *pv, const char *name, const char **attr) return; } db_dbg(" lang=\"%s\"", lang); + game->xml_parsing = DB_GAME_XML_PARSING_DESCRIPTION; /* TODO */ free(lang); db_xml_node_push(p, game, _db_game_xml_invalid_start, - _db_game_xml_description_end, NULL /* TODO */); + _db_game_xml_description_end, + _db_game_xml_cdata); } else if (db_xml_check_tag(name, "levels")) { db_xml_node_push(p, game, _db_game_xml_levels_el_start, _db_game_xml_levels_end, NULL); diff --git a/src/main.c b/src/main.c index 6529c88..b547a9f 100644 --- a/src/main.c +++ b/src/main.c @@ -26,7 +26,8 @@ main(int argc, char *argv[]) if (n > 0) { printf("%d games:\n", n); for (i = 0; i < n; ++i) { - printf("\t%s\n", db_game_get_name(games[i])); + printf("\t%s - %s\n", db_game_get_name(games[i]), + db_game_get_desc(games[i])); db_game_free(games[i]); } free(games); -- cgit v0.9.1