--- trunk/src/gpx.c 2009/07/29 19:24:15 34 +++ trunk/src/gpx.c 2009/10/12 20:27:55 133 @@ -360,27 +360,31 @@ static char *process_text(xmlTextReaderPtr reader) { char *text = NULL; - int depth = xmlTextReaderDepth(reader); - int ret = xmlTextReaderRead(reader); - while((ret == 1) && - ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) || - (xmlTextReaderDepth(reader) != depth))) { - - /* found a text fragment */ - if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) || - (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) { - char *frag = (char*)xmlTextReaderConstValue(reader); - - if(!text) text = strdup(frag); - else { - char *old = text; - text = malloc(strlen(old) + strlen(frag) + 1); - strcpy(text, old); - strcat(text, frag); - free(old); + + if(!xmlTextReaderIsEmptyElement(reader)) { + + int depth = xmlTextReaderDepth(reader); + int ret = xmlTextReaderRead(reader); + while((ret == 1) && + ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) || + (xmlTextReaderDepth(reader) != depth))) { + + /* found a text fragment */ + if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) || + (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) { + char *frag = (char*)xmlTextReaderConstValue(reader); + + if(!text) text = strdup(frag); + else { + char *old = text; + text = malloc(strlen(old) + strlen(frag) + 1); + strcpy(text, old); + strcat(text, frag); + free(old); + } } + ret = xmlTextReaderRead(reader); } - ret = xmlTextReaderRead(reader); } return text; @@ -463,8 +467,8 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return log; + gpx_free_log(log); + return NULL; } static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) { @@ -513,8 +517,14 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return log_chain; + /* free the entire log chain */ + while(log_chain) { + log_t *next = log_chain->next; + gpx_free_log(log_chain); + log_chain = next; + } + + return NULL; } static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) { @@ -532,6 +542,9 @@ else tb->ref = strdup(""); + if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "id"))) + tb->id = atoi(prop); + /* process all sub-nodes */ int depth = xmlTextReaderDepth(reader); int ret = xmlTextReaderRead(reader); @@ -563,8 +576,8 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return tb; + gpx_free_tb(tb); + return NULL; } static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) { @@ -605,8 +618,13 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return tb; + while(tb) { + tb_t *next = tb; + gpx_free_tb(tb); + tb = next; + } + + return NULL; } static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) { @@ -653,6 +671,7 @@ (strcasecmp(name, "hints") == 0)) { if(!cache->hint) { cache->hint = process_text(reader); + /* often hints aren't more than just a bunch of blanks ... */ if(cache->hint && all_is_white(cache->hint)) { free(cache->hint); @@ -831,12 +850,12 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return cache; + gpx_free_cache(cache); + return NULL; } -static void process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, - gpx_t *gpx) { +static gboolean process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, + gpx_t *gpx) { /* no attributes of interest */ @@ -847,7 +866,7 @@ while(*cache) cache = &(*cache)->next; const xmlChar *name = xmlTextReaderConstName(reader); - g_assert(name); + if(!name) return FALSE; /* read next node */ int ret = xmlTextReaderRead(reader); @@ -877,7 +896,7 @@ case XML_READER_TYPE_END_ELEMENT: /* end element must be for the current element */ g_assert(xmlTextReaderDepth(reader) == 0); - return; + return TRUE; break; default: @@ -886,7 +905,7 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); + return FALSE; } /* parse loc waypoint entry */