struct state_data
{
xmlTextReaderPtr xtr;
+ struct zip_member *zm;
int node_type;
enum reader_state state;
int row;
xmlFreeTextReader (sd->xtr);
sd->xtr = NULL;
+
+ zip_member_finish (sd->zm);
+ sd->zm = NULL;
}
struct ods_reader
{
int s = _xmlchar_to_int (attr);
xmlFreeTextReader (mxtr);
+ zip_member_finish (meta);
xmlFree (name);
xmlFree (attr);
return s;
}
xmlFreeTextReader (mxtr);
+ zip_member_finish (meta);
return -1;
}
}
-static xmlTextReaderPtr
-init_reader (struct ods_reader *r, bool report_errors)
+static bool
+init_reader (struct ods_reader *r, bool report_errors,
+ struct state_data *state)
{
struct zip_member *content = zip_member_open (r->zreader, "content.xml");
xmlTextReaderPtr xtr;
report_errors ? 0 : (XML_PARSE_NOERROR | XML_PARSE_NOWARNING) );
if ( xtr == NULL)
- return false;
+ return false;
+ *state = (struct state_data) { .xtr = xtr,
+ .zm = content,
+ .state = STATE_INIT };
r->spreadsheet.type = SPREADSHEET_ODS;
if (report_errors)
xmlTextReaderSetErrorHandler (xtr, ods_error_handler, r);
- return xtr;
+ return true;
}
{
int sheet_count;
struct ods_reader *r = xzalloc (sizeof *r);
- xmlTextReaderPtr xtr;
struct zip_reader *zr;
ds_init_empty (&r->zip_errs);
r->zreader = zr;
r->spreadsheet.ref_cnt = 1;
- xtr = init_reader (r, report_errors);
- if (xtr == NULL)
- {
- goto error;
- }
- r->msd.xtr = xtr;
- r->msd.row = 0;
- r->msd.col = 0;
- r->msd.current_sheet = 0;
- r->msd.state = STATE_INIT;
-
+ if (!init_reader (r, report_errors, &r->msd))
+ goto error;
r->spreadsheet.n_sheets = sheet_count;
r->n_allocated_sheets = 0;
int i;
struct var_spec *var_spec = NULL;
int n_var_specs = 0;
- xmlTextReaderPtr xtr;
struct ods_reader *r = (struct ods_reader *) spreadsheet;
xmlChar *val_string = NULL;
ds_init_empty (&r->ods_errs);
++r->spreadsheet.ref_cnt;
- xtr = init_reader (r, true);
- if ( xtr == NULL)
+ if (!init_reader (r, true, &r->rsd))
goto error;
- r->rsd.xtr = xtr;
- r->rsd.row = 0;
- r->rsd.col = 0;
- r->rsd.current_sheet = 0;
- r->rsd.state = STATE_INIT;
-
r->used_first_case = false;
r->first_case = NULL;
&ods_file_casereader_class, r);
error:
-
+
for ( i = 0 ; i < n_var_specs ; ++i )
{
free (var_spec[i].firstval.type);