From 089d3014c936b2b83efb924f2c07801044cc663f Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sun, 13 Jan 2013 13:08:58 +0100 Subject: [PATCH] Started polymorphism of Gnumeric --- src/data/gnumeric-reader.c | 34 +++++++++++---------------------- src/data/gnumeric-reader.h | 6 +++--- src/data/spreadsheet-reader.h | 2 -- src/language/data-io/get-data.c | 10 ++++++++-- src/ui/gui/page-sheet-spec.c | 5 ++++- 5 files changed, 26 insertions(+), 31 deletions(-) diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index cfdd45424d..9bb961a459 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -95,9 +95,6 @@ struct gnumeric_reader enum reader_state state; - /* The total number of sheets in the "workbook" */ - int sheet_total ; - int row; int col; int min_col; @@ -157,7 +154,7 @@ process_node (struct gnumeric_reader *r) XML_READER_TYPE_ELEMENT == r->node_type) { r->state = STATE_SHEET_COUNT; - r->sheet_total = 0; + r->spreadsheet.sheets = 0; } break; @@ -165,7 +162,7 @@ process_node (struct gnumeric_reader *r) if (0 == xmlStrcasecmp (name, _xml("gnm:SheetName")) && XML_READER_TYPE_ELEMENT == r->node_type) { - r->sheet_total++; + r->spreadsheet.sheets++; } else if (0 == xmlStrcasecmp (name, _xml("gnm:SheetNameIndex")) && XML_READER_TYPE_END_ELEMENT == r->node_type) @@ -327,7 +324,7 @@ gnumeric_probe (const char *filename) r = xzalloc (sizeof *r); r->xtr = xtr; - r->sheet_total = -1; + r->spreadsheet.sheets = -1; r->state = STATE_PRE_INIT; @@ -350,18 +347,17 @@ gnumeric_probe (const char *filename) } r->spreadsheet.type = SPREADSHEET_GNUMERIC; - r->spreadsheet.sheets = r->sheet_total; - r->spreadsheet.make_reader = NULL; - return &r->spreadsheet; } + struct casereader * -gnumeric_open_reader (const struct spreadsheet_read_info *gri, - struct spreadsheet_read_options *opts, - struct dictionary **dict) +gnumeric_make_reader (struct spreadsheet *spreadsheet, + const struct spreadsheet_read_info *gri, + struct spreadsheet_read_options *opts) { + struct gnumeric_reader *r = NULL; unsigned long int vstart = 0; int ret; casenumber n_cases = CASENUMBER_MAX; @@ -369,14 +365,6 @@ gnumeric_open_reader (const struct spreadsheet_read_info *gri, struct var_spec *var_spec = NULL; int n_var_specs = 0; - struct spreadsheet * spreadsheet = NULL; - struct gnumeric_reader *r = NULL; - - spreadsheet = gnumeric_probe (gri->file_name); - - if (spreadsheet == NULL) - goto error; - r = (struct gnumeric_reader *) (spreadsheet); if ( opts->cell_range ) @@ -508,7 +496,7 @@ gnumeric_open_reader (const struct spreadsheet_read_info *gri, if ( enc == NULL) goto error; /* Create the dictionary and populate it */ - *dict = r->dict = dict_create (CHAR_CAST (const char *, enc)); + spreadsheet->dict = r->dict = dict_create (CHAR_CAST (const char *, enc)); } for (i = 0 ; i < n_var_specs ; ++i ) @@ -587,8 +575,8 @@ gnumeric_open_reader (const struct spreadsheet_read_info *gri, } free (var_spec); - dict_destroy (*dict); - *dict = NULL; + dict_destroy (spreadsheet->dict); + spreadsheet->dict = NULL; gnm_file_casereader_destroy (NULL, r); diff --git a/src/data/gnumeric-reader.h b/src/data/gnumeric-reader.h index 529670e35c..b21ddfd558 100644 --- a/src/data/gnumeric-reader.h +++ b/src/data/gnumeric-reader.h @@ -27,9 +27,9 @@ struct spreadsheet_read_options; struct spreadsheet *gnumeric_probe (const char *filename); -struct casereader * gnumeric_open_reader (const struct spreadsheet_read_info *, - struct spreadsheet_read_options *, - struct dictionary **); +struct casereader * gnumeric_make_reader (struct spreadsheet *spreadsheet, + const struct spreadsheet_read_info *gri, + struct spreadsheet_read_options *opts); #endif diff --git a/src/data/spreadsheet-reader.h b/src/data/spreadsheet-reader.h index d25aaf32f6..3fbbde1d21 100644 --- a/src/data/spreadsheet-reader.h +++ b/src/data/spreadsheet-reader.h @@ -62,8 +62,6 @@ struct spreadsheet { enum spreadsheet_type type; - struct casereader * (*make_reader) (struct spreadsheet *); - /* The total number of sheets in the "workbook" */ int sheets; diff --git a/src/language/data-io/get-data.c b/src/language/data-io/get-data.c index 8f75272e2d..723a16c8d1 100644 --- a/src/language/data-io/get-data.c +++ b/src/language/data-io/get-data.c @@ -86,9 +86,15 @@ cmd_get_data (struct lexer *lexer, struct dataset *ds) goto error; if ( 0 == strncasecmp (tok, "GNM", 3)) - reader = gnumeric_open_reader (&sri, &opts, &dict); + { + struct spreadsheet *spreadsheet = gnumeric_probe (sri.file_name); + reader = gnumeric_make_reader (spreadsheet, &sri, &opts); + dict = spreadsheet->dict; + } else if (0 == strncasecmp (tok, "ODS", 3)) - reader = ods_open_reader (&sri, &opts, &dict); + { + reader = ods_open_reader (&sri, &opts, &dict); + } if (reader) { diff --git a/src/ui/gui/page-sheet-spec.c b/src/ui/gui/page-sheet-spec.c index 8f8bb381cc..f87bce21f6 100644 --- a/src/ui/gui/page-sheet-spec.c +++ b/src/ui/gui/page-sheet-spec.c @@ -151,7 +151,10 @@ post_sheet_spec_page (struct import_assistant *ia) creader = ods_open_reader (&ssp->sri, &ssp->opts, &dict); break; case FTYPE_GNUMERIC: - creader = gnumeric_open_reader (&ssp->sri, &ssp->opts, &dict); + { + creader = gnumeric_make_reader (ssp->spreadsheet, &ssp->sri, &ssp->opts); + dict = ssp->spreadsheet->dict; + } break; default: g_assert_not_reached (); -- 2.30.2