X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fgnumeric-reader.c;h=9193cfb061c4949be89b8467877174bcbf1a0264;hb=bbec8db61a8288576c4d2f158c24c1e429a21ee4;hp=578ff8ab4b69a67764653df5eff52154a46a6abe;hpb=9d9870db0d89e8f7f72de8ff5c9d37c8d9eb15c2;p=pspp diff --git a/src/data/gnumeric-reader.c b/src/data/gnumeric-reader.c index 578ff8ab4b..9193cfb061 100644 --- a/src/data/gnumeric-reader.c +++ b/src/data/gnumeric-reader.c @@ -63,6 +63,7 @@ static void gnm_file_casereader_destroy (struct casereader *, void *); static struct ccase *gnm_file_casereader_read (struct casereader *, void *); + static const struct casereader_class gnm_file_casereader_class = { gnm_file_casereader_read, @@ -103,6 +104,7 @@ struct sheet_detail struct gnumeric_reader { struct spreadsheet spreadsheet; + int ref_cnt; /* The libxml reader for this instance */ xmlTextReaderPtr xtr; @@ -133,6 +135,30 @@ struct gnumeric_reader }; +void +gnumeric_destroy (struct spreadsheet *s) +{ + struct gnumeric_reader *r = (struct gnumeric_reader *) s; + + +#if 0 + if (0 == --r->ref_cnt) + { + int i; + + for (i = 0; i < s->n_sheets; ++i) + { + xmlFree (r->sheets[i].name); + } + + free (r->sheets); + + free (r); + } +#endif +} + + const char * gnumeric_get_sheet_name (struct spreadsheet *s, int n) { @@ -175,11 +201,12 @@ gnumeric_get_sheet_range (struct spreadsheet *s, int n) static void gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) { - int i; struct gnumeric_reader *r = r_; + if ( r == NULL) return ; +#if 0 if ( r->xtr) xmlFreeTextReader (r->xtr); r->xtr = NULL; @@ -189,17 +216,11 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_) caseproto_unref (r->proto); - for (i = 0; i < r->spreadsheet.n_sheets; ++i) - { - xmlFree (r->sheets[i].name); - } - - free (r->sheets); - - - free (r); + gnumeric_destroy (&r->spreadsheet); +#endif } + static void process_node (struct gnumeric_reader *r) { @@ -424,13 +445,6 @@ struct var_spec }; -void -gnumeric_destroy (struct spreadsheet *s) -{ - gnm_file_casereader_destroy (NULL, s); -} - - static void gnumeric_error_handler (void *ctx, const char *mesg, UNUSED xmlParserSeverities sev, xmlTextReaderLocatorPtr loc) @@ -493,6 +507,7 @@ gnumeric_reopen (struct gnumeric_reader *r, const char *filename, bool show_erro r->row = r->col = -1; r->state = STATE_PRE_INIT; r->xtr = xtr; + r->ref_cnt++; /* Advance to the start of the workbook. This gives us some confidence that we are actually dealing with a gnumeric @@ -562,6 +577,8 @@ gnumeric_make_reader (struct spreadsheet *spreadsheet, if (r->row != -1) r = gnumeric_reopen (r, NULL, true); + + if ( opts->cell_range ) { if ( ! convert_cell_ref (opts->cell_range,