From: John Darrington Date: Sat, 16 Feb 2013 14:09:35 +0000 (+0100) Subject: Show errors on reading badly formed gnumeric files X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9f93ff4fb4b1836b6ead55d84476fbd39530764c;p=pspp Show errors on reading badly formed gnumeric files --- diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index 07b8816339..201ef599a1 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -433,8 +433,20 @@ gnumeric_destroy (struct spreadsheet *s) } +static void +gnumeric_error_handler (void *ctx, const char *mesg, + UNUSED xmlParserSeverities sev, xmlTextReaderLocatorPtr loc) +{ + struct gnumeric_reader *r = ctx; + + msg (MW, _("There was a problem whilst reading the Gnumeric file `%s' (near line %d): `%s'"), + r->spreadsheet.file_name, + xmlTextReaderLocatorLineNumber (loc), + mesg); +} + static struct gnumeric_reader * -gnumeric_reopen (struct gnumeric_reader *r, const char *filename) +gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_errors) { int ret; @@ -454,9 +466,11 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename) if (NULL == gz) return NULL; + xtr = xmlReaderForIO ((xmlInputReadCallback) gzread, - (xmlInputCloseCallback) gzclose, gz, - NULL, NULL, 0); + (xmlInputCloseCallback) gzclose, gz, + NULL, NULL, + show_errors ? 0 : (XML_PARSE_NOERROR | XML_PARSE_NOWARNING) ); if (xtr == NULL) { @@ -470,6 +484,9 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename) r->spreadsheet.n_sheets = -1; r->spreadsheet.file_name = filename; } + + if (show_errors) + xmlTextReaderSetErrorHandler (xtr, gnumeric_error_handler, r); r->target_sheet = NULL; r->target_sheet_index = -1; @@ -503,9 +520,9 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename) struct spreadsheet * -gnumeric_probe (const char *filename) +gnumeric_probe (const char *filename, bool report_errors) { - struct gnumeric_reader *r = gnumeric_reopen (NULL, filename); + struct gnumeric_reader *r = gnumeric_reopen (NULL, filename, report_errors); return &r->spreadsheet; } @@ -527,7 +544,7 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, r = (struct gnumeric_reader *) (spreadsheet); if (r->row != -1) - r = gnumeric_reopen (r, NULL); + r = gnumeric_reopen (r, NULL, true); if ( opts->cell_range ) { diff --git a/src/data/gnumeric-reader.h b/src/data/gnumeric-reader.h index 8c7518f808..a2aaabf7bc 100644 --- a/src/data/gnumeric-reader.h +++ b/src/data/gnumeric-reader.h @@ -24,7 +24,7 @@ struct dictionary; struct spreadsheet_read_info; struct spreadsheet_read_options; -struct spreadsheet *gnumeric_probe (const char *filename); +struct spreadsheet *gnumeric_probe (const char *filename, bool report_errors); const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n); diff --git a/src/data/ods-reader.c b/src/data/ods-reader.c index d6ed43e8f6..dd19898c53 100644 --- a/src/data/ods-reader.c +++ b/src/data/ods-reader.c @@ -368,7 +368,7 @@ get_sheet_count (struct zip_reader *zreader) return -1; } -struct spreadsheet *ods_probe (const char *filename) +struct spreadsheet *ods_probe (const char *filename, bool report_errors) { struct ods_reader *r; struct string errs; diff --git a/src/data/ods-reader.h b/src/data/ods-reader.h index 18eb65bc90..f068aa39d7 100644 --- a/src/data/ods-reader.h +++ b/src/data/ods-reader.h @@ -23,7 +23,7 @@ struct spreadsheet_read_info; struct spreadsheet_read_options; -struct spreadsheet *ods_probe (const char *filename); +struct spreadsheet *ods_probe (const char *filename, bool report_errors); struct casereader * ods_make_reader (struct spreadsheet *spreadsheet, const struct spreadsheet_read_info *gri, diff --git a/src/data/spreadsheet-reader.c b/src/data/spreadsheet-reader.c index b010999c1f..29e84e6340 100644 --- a/src/data/spreadsheet-reader.c +++ b/src/data/spreadsheet-reader.c @@ -32,7 +32,7 @@ spreadsheet_open (const char *filename) { struct spreadsheet *ss = NULL; - ss = gnumeric_probe (filename); + ss = gnumeric_probe (filename, true); return ss; } diff --git a/src/language/data-io/get-data.c b/src/language/data-io/get-data.c index 7b1d2882a2..f12261a10f 100644 --- a/src/language/data-io/get-data.c +++ b/src/language/data-io/get-data.c @@ -88,13 +88,13 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) if ( 0 == strncasecmp (tok, "GNM", 3)) { - struct spreadsheet *spreadsheet = gnumeric_probe (filename); + struct spreadsheet *spreadsheet = gnumeric_probe (filename, true); reader = gnumeric_make_reader (spreadsheet, &sri, &opts); dict = spreadsheet->dict; } else if (0 == strncasecmp (tok, "ODS", 3)) { - struct spreadsheet *spreadsheet = ods_probe (filename); + struct spreadsheet *spreadsheet = ods_probe (filename, true); reader = ods_make_reader (spreadsheet, &sri, &opts); dict = spreadsheet->dict; } diff --git a/src/ui/gui/page-assistant.c b/src/ui/gui/page-assistant.c index b0b616e265..f1c95f71fd 100644 --- a/src/ui/gui/page-assistant.c +++ b/src/ui/gui/page-assistant.c @@ -180,16 +180,12 @@ on_prepare (GtkAssistant *assistant, GtkWidget *page, else gtk_widget_grab_focus (assistant->forward); - - - #if 0 gtk_widget_show (ia->asst.reset_button); if (page == ia->formats->page) gtk_widget_show (ia->asst.paste_button); else gtk_widget_hide (ia->asst.paste_button); - #endif } diff --git a/src/ui/gui/page-file.c b/src/ui/gui/page-file.c index a781fcad2e..0e0a496de6 100644 --- a/src/ui/gui/page-file.c +++ b/src/ui/gui/page-file.c @@ -99,12 +99,12 @@ init_file (struct import_assistant *ia, GtkWindow *parent_window) printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet); if (ia->spreadsheet == NULL) - ia->spreadsheet = gnumeric_probe (file->file_name); + ia->spreadsheet = gnumeric_probe (file->file_name, false); printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet); if (ia->spreadsheet == NULL) - ia->spreadsheet = ods_probe (file->file_name); + ia->spreadsheet = ods_probe (file->file_name, false); printf ("%s:%d %p\n", __FILE__, __LINE__, ia->spreadsheet); diff --git a/src/ui/gui/sheet-test.c b/src/ui/gui/sheet-test.c index 8f38e90f06..dc903eb7e9 100644 --- a/src/ui/gui/sheet-test.c +++ b/src/ui/gui/sheet-test.c @@ -80,7 +80,7 @@ main (int argc, char *argv[] ) if ( argc < 2) g_error ("Usage: prog file\n"); - sp = gnumeric_probe (argv[1]); + sp = gnumeric_probe (argv[1], true); if (sp == NULL) {