Diff of /trunk/src/gpx.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 30 by harbaum, Fri Jul 24 19:24:42 2009 UTC revision 101 by harbaum, Tue Sep 8 12:28:24 2009 UTC
# Line 360  static gboolean skip_element(xmlTextRead Line 360  static gboolean skip_element(xmlTextRead
360    
361  static char *process_text(xmlTextReaderPtr reader) {  static char *process_text(xmlTextReaderPtr reader) {
362    char *text = NULL;    char *text = NULL;
363    int depth = xmlTextReaderDepth(reader);  
364    int ret = xmlTextReaderRead(reader);    if(!xmlTextReaderIsEmptyElement(reader)) {
365    while((ret == 1) &&  
366          ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) ||      int depth = xmlTextReaderDepth(reader);
367           (xmlTextReaderDepth(reader) != depth))) {      int ret = xmlTextReaderRead(reader);
368        while((ret == 1) &&
369      /* found a text fragment */            ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) ||
370      if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) ||             (xmlTextReaderDepth(reader) != depth))) {
371         (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) {  
372        char *frag = (char*)xmlTextReaderConstValue(reader);        /* found a text fragment */
373          if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) ||
374        if(!text) text = strdup(frag);           (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) {
375        else {          char *frag = (char*)xmlTextReaderConstValue(reader);
376          char *old = text;  
377          text = malloc(strlen(old) + strlen(frag) + 1);          if(!text) text = strdup(frag);
378          strcpy(text, old);          else {
379          strcat(text, frag);            char *old = text;
380          free(old);            text = malloc(strlen(old) + strlen(frag) + 1);
381              strcpy(text, old);
382              strcat(text, frag);
383              free(old);
384            }
385        }        }
386          ret = xmlTextReaderRead(reader);
387      }      }
     ret = xmlTextReaderRead(reader);  
388    }    }
389    
390    return text;    return text;
# Line 463  static log_t *process_gpx_wpt_gc_logs_lo Line 467  static log_t *process_gpx_wpt_gc_logs_lo
467      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
468    }    }
469    
470    g_assert(0);    gpx_free_log(log);
471    return log;    return NULL;
472  }  }
473    
474  static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) {  static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) {
# Line 513  static log_t *process_gpx_wpt_gc_logs(xm Line 517  static log_t *process_gpx_wpt_gc_logs(xm
517      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
518    }    }
519    
520    g_assert(0);    /* free the entire log chain */
521    return log_chain;    while(log_chain) {
522        log_t *next = log_chain->next;
523        gpx_free_log(log_chain);
524        log_chain = next;
525      }
526    
527      return NULL;
528  }  }
529    
530  static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) {  static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) {
# Line 563  static tb_t *process_gpx_wpt_gc_tbs_trav Line 573  static tb_t *process_gpx_wpt_gc_tbs_trav
573      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
574    }    }
575    
576    g_assert(0);    gpx_free_tb(tb);
577    return tb;    return NULL;
578  }  }
579    
580  static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) {  static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) {
# Line 605  static tb_t *process_gpx_wpt_gc_tbs(xmlT Line 615  static tb_t *process_gpx_wpt_gc_tbs(xmlT
615      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
616    }    }
617    
618    g_assert(0);    while(tb) {
619    return tb;      tb_t *next = tb;
620        gpx_free_tb(tb);
621        tb = next;
622      }
623    
624      return NULL;
625  }  }
626    
627  static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) {  static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) {
# Line 653  static void process_gpx_wpt_gc(xmlTextRe Line 668  static void process_gpx_wpt_gc(xmlTextRe
668                    (strcasecmp(name, "hints") == 0))     {                    (strcasecmp(name, "hints") == 0))     {
669            if(!cache->hint) {            if(!cache->hint) {
670              cache->hint = process_text(reader);              cache->hint = process_text(reader);
671    
672              /* often hints aren't more than just a bunch of blanks ... */              /* often hints aren't more than just a bunch of blanks ... */
673              if(cache->hint && all_is_white(cache->hint)) {              if(cache->hint && all_is_white(cache->hint)) {
674                free(cache->hint);                free(cache->hint);
# Line 831  static cache_t *process_gpx_wpt(xmlTextR Line 847  static cache_t *process_gpx_wpt(xmlTextR
847      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
848    }    }
849    
850    g_assert(0);    gpx_free_cache(cache);
851    return cache;    return NULL;
852  }  }
853    
854  static void process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog,  static gboolean process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog,
855                          gpx_t *gpx) {                              gpx_t *gpx) {
856    
857    /* no attributes of interest */    /* no attributes of interest */
858    
# Line 847  static void process_gpx(xmlTextReaderPtr Line 863  static void process_gpx(xmlTextReaderPtr
863    while(*cache) cache = &(*cache)->next;    while(*cache) cache = &(*cache)->next;
864    
865    const xmlChar *name = xmlTextReaderConstName(reader);    const xmlChar *name = xmlTextReaderConstName(reader);
866    g_assert(name);    if(!name) return FALSE;
867    
868    /* read next node */    /* read next node */
869    int ret = xmlTextReaderRead(reader);    int ret = xmlTextReaderRead(reader);
# Line 877  static void process_gpx(xmlTextReaderPtr Line 893  static void process_gpx(xmlTextReaderPtr
893      case XML_READER_TYPE_END_ELEMENT:      case XML_READER_TYPE_END_ELEMENT:
894        /* end element must be for the current element */        /* end element must be for the current element */
895        g_assert(xmlTextReaderDepth(reader) == 0);        g_assert(xmlTextReaderDepth(reader) == 0);
896        return;        return TRUE;
897        break;        break;
898    
899      default:      default:
# Line 886  static void process_gpx(xmlTextReaderPtr Line 902  static void process_gpx(xmlTextReaderPtr
902      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
903    }    }
904    
905    g_assert(0);    return FALSE;
906  }  }
907    
908  /* parse loc waypoint entry */  /* parse loc waypoint entry */
# Line 1346  float gpx_pos_get_distance(pos_t p1, pos Line 1362  float gpx_pos_get_distance(pos_t p1, pos
1362    
1363  void gpx_pos_get_distance_str(char *str, int len,  void gpx_pos_get_distance_str(char *str, int len,
1364                                pos_t p1, pos_t p2, int mil) {                                pos_t p1, pos_t p2, int mil) {
1365    if(!p1.lat && !p1.lon) {    if(isnan(p1.lat) || isnan(p1.lon)) {
1366      snprintf(str, len, "---");      snprintf(str, len, "---");
1367      return;      return;
1368    }    }

Legend:
Removed from v.30  
changed lines
  Added in v.101