X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Fxo-file.c;h=04992f96cf433ff64c3fa63d9da62d55040d9abe;hb=3d2aca5e4781cf52291afc063e37b65f61638df8;hp=1afcd18436545f71ba535a797986d55569625dd6;hpb=59df9eb838b273295a6b86ce9f522dc4ad71dc4d;p=xournal.git diff --git a/src/xo-file.c b/src/xo-file.c index 1afcd18..04992f9 100644 --- a/src/xo-file.c +++ b/src/xo-file.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "xournal.h" #include "xo-interface.h" @@ -81,6 +82,8 @@ gboolean save_journal(const char *filename) f = gzopen(filename, "w"); if (f==NULL) return FALSE; chk_attach_names(); + + setlocale(LC_NUMERIC, "C"); gzprintf(f, "\n" "Xournal document - see http://math.mit.edu/~auroux/software/xournal/\n" @@ -179,6 +182,8 @@ gboolean save_journal(const char *filename) gzprintf(f, "\n"); } gzclose(f); + setlocale(LC_NUMERIC, ""); + return TRUE; } @@ -201,6 +206,13 @@ gboolean close_journal(void) use new_journal() to reinitialize them */ } +// sanitize a string containing floats, in case it may have , instead of . + +void cleanup_numeric(char *s) +{ + while (*s!=0) { if (*s==',') *s='.'; s++; } +} + // the XML parser functions for open_journal() struct Journal tmpJournal; @@ -253,13 +265,15 @@ void xoj_parser_start_element(GMarkupParseContext *context, while (*attribute_names!=NULL) { if (!strcmp(*attribute_names, "width")) { if (has_attr & 1) *error = xoj_invalid(); - tmpPage->width = strtod(*attribute_values, &ptr); + cleanup_numeric((gchar *)*attribute_values); + tmpPage->width = g_ascii_strtod(*attribute_values, &ptr); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 1; } else if (!strcmp(*attribute_names, "height")) { if (has_attr & 2) *error = xoj_invalid(); - tmpPage->height = strtod(*attribute_values, &ptr); + cleanup_numeric((gchar *)*attribute_values); + tmpPage->height = g_ascii_strtod(*attribute_values, &ptr); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 2; } @@ -374,7 +388,7 @@ void xoj_parser_start_element(GMarkupParseContext *context, else if (!strcmp(*attribute_names, "pageno")) { if (tmpPage->bg->type != BG_PDF || (has_attr & 32)) { *error = xoj_invalid(); return; } - tmpPage->bg->file_page_seq = strtod(*attribute_values, &ptr); + tmpPage->bg->file_page_seq = strtol(*attribute_values, &ptr, 10); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 32; } @@ -415,7 +429,8 @@ void xoj_parser_start_element(GMarkupParseContext *context, while (*attribute_names!=NULL) { if (!strcmp(*attribute_names, "width")) { if (has_attr & 1) *error = xoj_invalid(); - tmpItem->brush.thickness = strtod(*attribute_values, &ptr); + cleanup_numeric((gchar *)*attribute_values); + tmpItem->brush.thickness = g_ascii_strtod(*attribute_values, &ptr); if (ptr == *attribute_values) *error = xoj_invalid(); has_attr |= 1; } @@ -496,11 +511,12 @@ void xoj_parser_text(GMarkupParseContext *context, element_name = g_markup_parse_context_get_element(context); if (element_name == NULL) return; if (!strcmp(element_name, "stroke")) { + cleanup_numeric((gchar *)text); ptr = text; n = 0; while (text_len > 0) { realloc_cur_path(n/2 + 1); - ui.cur_path.coords[n] = strtod(text, (char **)(&ptr)); + ui.cur_path.coords[n] = g_ascii_strtod(text, (char **)(&ptr)); if (ptr == text) break; text_len -= (ptr - text); text = ptr;