Add routepoint <rtept> support to shut up users of RouteConverter
[gpx-import.git] / src / gpx.c
index efc208c8a09a6245c3de9db74302232fabc8fab2..838de2a14df79d11490cdc7814c96bb5fc0fbc0b 100644 (file)
--- a/src/gpx.c
+++ b/src/gpx.c
@@ -30,6 +30,7 @@
 #include <errno.h>
 #include <stdarg.h>
 #include <time.h>
+#include <inttypes.h>
 
 #include <archive.h>
 #include <archive_entry.h>
@@ -66,6 +67,8 @@ typedef enum {
   TRACKPOINT,
   ELEVATION,
   TIMESTAMP,
+  WAYPOINT,
+  ROUTEPOINT,
 } GPXParseState;
 
 static const char *
@@ -80,6 +83,10 @@ gpx_state_name(GPXParseState p)
     return "ELEVATION";
   case TIMESTAMP:
     return "TIMESTAMP";
+  case WAYPOINT:
+    return "WAYPOINT";
+  case ROUTEPOINT:
+    return "ROUTEPOINT";
   }
   return "INVALID";
 }
@@ -115,8 +122,8 @@ gpx_record_error(GPXParseContext *ctx, char *fmt, ...)
            (ctx->subfile == NULL) ? "" : ctx->subfile,
            (ctx->subfile == NULL) ? "" : " inside your upload:\n  ",
            msg,
-           XML_GetCurrentLineNumber(ctx->p),
-           XML_GetCurrentColumnNumber(ctx->p));
+           ctx->p ? XML_GetCurrentLineNumber(ctx->p) : 0,
+           ctx->p ? XML_GetCurrentColumnNumber(ctx->p) : 0);
 }
 
 static GPXCoord
@@ -191,6 +198,8 @@ gpx_handle_start_element(void *_ctx, const XML_Char *name, const XML_Char **atts
       }
     }
   } else if (strcmp(name, "ele") == 0) {
+    if (ctx->state == WAYPOINT || ctx->state == ROUTEPOINT)
+      return;
     REQUIRE_STATE(TRACKPOINT);
     ctx->state = ELEVATION;
     gpx_clear_accumulator(ctx);
@@ -199,6 +208,12 @@ gpx_handle_start_element(void *_ctx, const XML_Char *name, const XML_Char **atts
       ctx->state = TIMESTAMP;
       gpx_clear_accumulator(ctx);
     }
+  } else if (strcmp(name, "wpt") == 0) {
+    REQUIRE_STATE(UNKNOWN);
+    ctx->state = WAYPOINT;
+  } else if (strcmp(name, "rtept") == 0) {
+    REQUIRE_STATE(UNKNOWN);
+    ctx->state = ROUTEPOINT;
   }
 }
 
@@ -270,14 +285,16 @@ gpx_handle_end_element(void *_ctx, const XML_Char *name)
     }
     ctx->state = UNKNOWN;
   } else if (strcmp(name, "ele") == 0) {
+    if (ctx->state == WAYPOINT || ctx->state == ROUTEPOINT)
+      return;
     REQUIRE_STATE(ELEVATION);
-    ctx->point->elevation = strtof(ctx->accumulator, NULL);
+    ctx->point->elevation = strtof(ctx->accumulator ? ctx->accumulator : "", NULL);
     ctx->state = TRACKPOINT;
     ctx->got_ele = true;
   } else if (strcmp(name, "time") == 0) {
     char *pnull = NULL;
     struct tm ignored;
-    if (ctx->state == UNKNOWN)
+    if (ctx->state == UNKNOWN || ctx->state == WAYPOINT || ctx->state == ROUTEPOINT)
       return;
     REQUIRE_STATE(TIMESTAMP);
     pnull = strptime(ctx->accumulator ? ctx->accumulator : "",
@@ -292,6 +309,12 @@ gpx_handle_end_element(void *_ctx, const XML_Char *name)
   } else if (strcmp(name, "trkseg") == 0) {
     REQUIRE_STATE(UNKNOWN);
     ctx->curseg++;
+  } else if (strcmp(name, "wpt") == 0) {
+    REQUIRE_STATE(WAYPOINT);
+    ctx->state = UNKNOWN;
+  } else if (strcmp(name, "rtept") == 0) {
+    REQUIRE_STATE(ROUTEPOINT);
+    ctx->state = UNKNOWN;
   }
 }
 
@@ -576,6 +599,7 @@ gpx_parse_file(const char *gpxfile, char **err)
   ctx.state = UNKNOWN;
   ctx.accumulator_size = 0;
   ctx.subfile = NULL;
+  ctx.p = NULL;
   
   if (gpx_parse_archive(&ctx, gpxfile) == true) {
     goto success;
@@ -641,7 +665,7 @@ gpx_print(GPX *gpx)
   GPXTrackPoint *pt;
   int pointnr;
   
-  printf("minlat=%ld maxlat=%ld minlon=%ld maxlon=%ld\n",
+  printf("minlat=%"PRId64" maxlat=%"PRId64" minlon=%"PRId64" maxlon=%"PRId64"\n",
          gpx->minlatitude, gpx->maxlatitude,
          gpx->minlongitude, gpx->maxlongitude);
   
@@ -650,7 +674,7 @@ gpx_print(GPX *gpx)
          gpx->badpoints);
   return;
   for (pt = gpx->points, pointnr = 1; pt != NULL; pt = pt->next, pointnr++)
-    printf("%4d: lat=%ld lon=%ld ele=%f time=%s seg=%d\n",
+    printf("%4d: lat=%"PRId64" lon=%"PRId64" ele=%f time=%s seg=%d\n",
            pointnr, pt->latitude, pt->longitude, pt->elevation,
            pt->timestamp, pt->segment);