]> git.tdb.fi Git - ext/subsurface.git/blobdiff - parse-xml.c
Improve libdivecomputer event printout
[ext/subsurface.git] / parse-xml.c
index cecfbb30417b9a167371540e6f67fae36599c926..1eb6e95fdd1007aff73d326c7d6b073c7fe36f36 100644 (file)
@@ -422,7 +422,7 @@ static void water_pressure(char *buffer, void *_depth)
                 * atm to cm. Why not mm? The precision just isn't
                 * there.
                 */
-               cm = 100 * (atm - 1) + 0.5;
+               cm = 100 * atm + 0.5;
                if (cm > 0) {
                        depth->mm = 10 * (long)cm;
                        break;
@@ -521,7 +521,7 @@ static void fahrenheit(char *buffer, void *_temperature)
  * pressures are in PSI. But the tank working pressure is in
  * bar. WTF^2?
  *
- * Crazy stuff like this is why diveclog has everything in
+ * Crazy stuff like this is why subsurface has everything in
  * these inconvenient typed structures, and you have to say
  * "pressure->mbar" to get the actual value. Exactly so that
  * you can never have unit confusion.
@@ -882,6 +882,20 @@ static int uddf_dive_match(struct dive *dive, const char *name, int len, char *b
                0;
 }
 
+static void gps_location(char *buffer, void *_dive)
+{
+       int i;
+       struct dive *dive = _dive;
+       double latitude, longitude;
+
+       i = sscanf(buffer, "%lf %lf", &latitude, &longitude);
+       if (i == 2) {
+               dive->latitude = latitude;
+               dive->longitude = longitude;
+       }
+       free(buffer);
+}
+
 /* We're in the top-level dive xml. Try to convert whatever value to a dive value */
 static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
 {
@@ -950,6 +964,8 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf)
                return;
        if (MATCH(".cylinderendpressure", pressure, &dive->cylinder[0].end))
                return;
+       if (MATCH(".gps", gps_location, dive))
+               return;
        if (MATCH(".location", utf8_string, &dive->location))
                return;
        if (MATCH(".notes", utf8_string, &dive->notes))
@@ -1357,14 +1373,16 @@ void parse_xml_file(const char *filename, GError **error)
                fprintf(stderr, "Failed to parse '%s'.\n", filename);
                if (error != NULL)
                {
-                       *error = g_error_new(g_quark_from_string("divelog"),
+                       *error = g_error_new(g_quark_from_string("subsurface"),
                                             DIVE_ERROR_PARSE,
                                             "Failed to parse '%s'",
                                             filename);
                }
                return;
        }
-
+       /* we assume that the last (or only) filename passed as argument is a 
+        * great filename to use as default when saving the dives */ 
+       set_filename(filename);
        reset_all();
        dive_start();
        traverse(xmlDocGetRootElement(doc));