summaryrefslogtreecommitdiffstats
path: root/save-xml.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-01 19:56:04 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-09-01 19:56:04 -0700
commit22fcef2ec7fd1efd3d1df2aba2b7b3af5d463288 (patch)
tree02e55dce4695cf93e4f54756903ea84564c1342e /save-xml.c
parent0189de695c1b361a1ef85c0523a50f2abc5f0dbf (diff)
downloadsubsurface-22fcef2ec7fd1efd3d1df2aba2b7b3af5d463288.tar.gz
Save and parse notes and locations
It's pretty rough, but it seems to work. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'save-xml.c')
-rw-r--r--save-xml.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/save-xml.c b/save-xml.c
index efff30088..cd7bad2ba 100644
--- a/save-xml.c
+++ b/save-xml.c
@@ -40,6 +40,63 @@ static void show_pressure(FILE *f, pressure_t pressure, const char *pre, const c
fprintf(f, "%s%u.%03u bar%s", pre, FRACTION(pressure.mbar, 1000), post);
}
+/*
+ * We're outputting utf8 in xml.
+ * We need to quote the characters <, >, &.
+ *
+ * Nothing else (and if we ever do this using attributes, we'd need to
+ * quote the quotes we use too).
+ */
+static void quote(FILE *f, const char *text)
+{
+ const char *p = text;
+
+ for (;;) {
+ const char *escape;
+
+ switch (*p++) {
+ default:
+ continue;
+ case 0:
+ escape = NULL;
+ break;
+ case '<':
+ escape = "&lt;";
+ break;
+ case '>':
+ escape = "&gt;";
+ break;
+ case '&':
+ escape = "&amp;";
+ break;
+ }
+ fwrite(text, (p - text - 1), 1, f);
+ if (!escape)
+ break;
+ fputs(escape, f);
+ text = p;
+ }
+}
+
+static void show_utf8(FILE *f, const char *text, const char *pre, const char *post)
+{
+ int len;
+
+ if (!text)
+ return;
+ while (isspace(*text))
+ text++;
+ len = strlen(text);
+ if (!len)
+ return;
+ while (len && isspace(text[len-1]))
+ len--;
+ /* FIXME! Quoting! */
+ fputs(pre, f);
+ quote(f, text);
+ fputs(post, f);
+}
+
static void save_overview(FILE *f, struct dive *dive)
{
show_depth(f, dive->maxdepth, " <maxdepth>", "</maxdepth>\n");
@@ -50,6 +107,8 @@ static void save_overview(FILE *f, struct dive *dive)
show_duration(f, dive->surfacetime, " <surfacetime>", "</surfacetime>\n");
show_pressure(f, dive->beginning_pressure, " <cylinderstartpressure>", "</cylinderstartpressure>\n");
show_pressure(f, dive->end_pressure, " <cylinderendpressure>", "</cylinderendpressure>\n");
+ show_utf8(f, dive->location, " <location>","</location>\n");
+ show_utf8(f, dive->notes, " <notes>","</notes>\n");
}
static void save_gasmix(FILE *f, struct dive *dive)
@@ -106,6 +165,10 @@ void save_dives(const char *filename)
if (!f)
return;
+
+ /* Flush any edits of current dives back to the dives! */
+ flush_dive_info_changes();
+
fprintf(f, "<dives>\n<program name='diveclog' version='%d'></program>\n", VERSION);
for (i = 0; i < dive_table.nr; i++)
save_dive(f, get_dive(i));