X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=save-xml.c;h=a1553193d63965212a13f16def8be0f323b0a011;hb=d9106995d39138dbce5f3306a391361f68ce0a07;hp=efff300886b54fe6a03031bff53b3d160802146f;hpb=0189de695c1b361a1ef85c0523a50f2abc5f0dbf;p=ext%2Fsubsurface.git diff --git a/save-xml.c b/save-xml.c index efff300..a155319 100644 --- a/save-xml.c +++ b/save-xml.c @@ -40,16 +40,84 @@ 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 <, >, &. + * + * Technically I don't think we'd necessarily need to quote the control + * characters, but at least libxml2 doesn't like them. It doesn't even + * allow them quoted. So we just skip them and replace them with '?'. + * + * 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 1 ... 8: + case 11: case 12: + case 14 ... 31: + escape = "?"; + break; + case '<': + escape = "<"; + break; + case '>': + escape = ">"; + break; + case '&': + escape = "&"; + 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, " ", "\n"); show_depth(f, dive->meandepth, " ", "\n"); show_temperature(f, dive->airtemp, " ", "\n"); - show_temperature(f, dive->watertemp, " ", "\n"); + show_temperature(f, dive->watertemp, " ", "\n"); show_duration(f, dive->duration, " ", "\n"); show_duration(f, dive->surfacetime, " ", "\n"); show_pressure(f, dive->beginning_pressure, " ", "\n"); show_pressure(f, dive->end_pressure, " ", "\n"); + show_utf8(f, dive->location, " ","\n"); + show_utf8(f, dive->notes, " ","\n"); } static void save_gasmix(FILE *f, struct dive *dive) @@ -106,6 +174,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, "\n\n", VERSION); for (i = 0; i < dive_table.nr; i++) save_dive(f, get_dive(i));