Merge remote branch 'origin/master' into import-gui
[pspp] / src / data / ods-reader.c
index cbd7feaa170d8f51d4245f879c9b526a4594be20..fa364090c4564b583d5f4b3bee982ea63772a24b 100644 (file)
@@ -113,6 +113,16 @@ struct state_data
   int col_span;
 };
 
+static void
+state_data_destroy (struct state_data *sd)
+{
+  xmlFree (sd->current_sheet_name);
+  sd->current_sheet_name = NULL;
+
+  xmlFreeTextReader (sd->xtr);
+  sd->xtr = NULL;
+}
+
 struct ods_reader
 {
   struct spreadsheet spreadsheet;
@@ -121,7 +131,10 @@ struct ods_reader
   int target_sheet_index;
   xmlChar *target_sheet_name;
   
-  struct state_data foo;
+  /* State data for the meta data */
+  struct state_data msd;
+
+  /* State data for the reader */
   struct state_data rsd;
 
   int start_row;
@@ -144,37 +157,37 @@ struct ods_reader
 void
 ods_destroy (struct spreadsheet *s)
 {
-#if 0
   struct ods_reader *r = (struct ods_reader *) s;
 
   if (--r->ref_cnt == 0)
     {
       int i;
 
+      state_data_destroy (&r->msd);
       for (i = 0; i < r->n_allocated_sheets; ++i)
        {
          xmlFree (r->sheets[i].name);
        }
-
+       
       zip_reader_destroy (r->zreader);
       free (r->sheets);
+       
       free (r);
     }
-#endif
 }
 
 
 
 static bool
-reading_target_sheet (const struct ods_reader *r, const struct state_data *foo)
+reading_target_sheet (const struct ods_reader *r, const struct state_data *msd)
 {
   if (r->target_sheet_name != NULL)
     {
-      if ( 0 == xmlStrcmp (r->target_sheet_name, foo->current_sheet_name))
+      if ( 0 == xmlStrcmp (r->target_sheet_name, msd->current_sheet_name))
        return true;
     }
   
-  if (r->target_sheet_index == foo->current_sheet + 1)
+  if (r->target_sheet_index == msd->current_sheet + 1)
     return true;
 
   return false;
@@ -188,7 +201,7 @@ const char *
 ods_get_sheet_name (struct spreadsheet *s, int n)
 {
   struct ods_reader *r = (struct ods_reader *) s;
-  struct state_data *or = &r->foo;
+  struct state_data *or = &r->msd;
 
   assert (n < s->n_sheets);
 
@@ -211,7 +224,7 @@ char *
 ods_get_sheet_range (struct spreadsheet *s, int n)
 {
   struct ods_reader *r = (struct ods_reader *) s;
-  struct state_data *or = &r->foo;
+  struct state_data *or = &r->msd;
   
   assert (n < s->n_sheets);
 
@@ -239,30 +252,29 @@ ods_get_sheet_range (struct spreadsheet *s, int n)
 static void
 ods_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
 {
-#if 0
   struct ods_reader *r = r_;
   if ( r == NULL)
     return ;
 
-  if (r->xtr)
-    xmlFreeTextReader (r->xtr);
-  r->xtr = NULL;
+  state_data_destroy (&r->rsd);
 
   if ( ! ds_is_empty (&r->ods_errs))
     msg (ME, "%s", ds_cstr (&r->ods_errs));
 
   ds_destroy (&r->ods_errs);
 
-  if ( ! r->used_first_case )
+  if ( r->first_case && ! r->used_first_case )
     case_unref (r->first_case);
 
+
   caseproto_unref (r->proto);
+  r->proto = NULL;
 
-  xmlFree (r->current_sheet_name);
   xmlFree (r->target_sheet_name);
+  r->target_sheet_name = NULL;
+
 
   ods_destroy (&r->spreadsheet);
-#endif
 }
 
 
@@ -562,9 +574,8 @@ init_reader (struct ods_reader *r, bool report_errors)
   if ( content == NULL)
     return NULL;
 
-  zip_member_ref (content);
   xtr = xmlReaderForIO ((xmlInputReadCallback) zip_member_read,
-                       (xmlInputCloseCallback) zip_member_finish,
+                       (xmlInputCloseCallback) NULL,
                        content,   NULL, NULL,
                        report_errors ? 0 : (XML_PARSE_NOERROR | XML_PARSE_NOWARNING) );
 
@@ -611,11 +622,11 @@ ods_probe (const char *filename, bool report_errors)
     {
       goto error;
     }
-  r->foo.xtr = xtr;
-  r->foo.row = 0;
-  r->foo.col = 0;
-  r->foo.current_sheet = 0;
-  r->foo.state = STATE_INIT;
+  r->msd.xtr = xtr;
+  r->msd.row = 0;
+  r->msd.col = 0;
+  r->msd.current_sheet = 0;
+  r->msd.state = STATE_INIT;
 
 
   r->spreadsheet.n_sheets = sheet_count;
@@ -665,6 +676,8 @@ ods_make_reader (struct spreadsheet *spreadsheet,
   r->rsd.current_sheet = 0;
   r->rsd.state = STATE_INIT;
 
+  r->used_first_case = false;
+  r->first_case = NULL;
 
   if (opts->cell_range)
     {
@@ -831,9 +844,6 @@ ods_make_reader (struct spreadsheet *spreadsheet,
       var_set_both_formats (var, &fmt);
     }
 
-  /* Create the first case, and cache it */
-  r->used_first_case = false;
-
   if ( n_var_specs ==  0 )
     {
       msg (MW, _("Selected sheet or range of spreadsheet `%s' is empty."),
@@ -841,6 +851,7 @@ ods_make_reader (struct spreadsheet *spreadsheet,
       goto error;
     }
 
+  /* Create the first case, and cache it */
   r->proto = caseproto_ref (dict_get_proto (r->dict));
   r->first_case = case_create (r->proto);
   case_set_missing (r->first_case);
@@ -905,9 +916,10 @@ static struct ccase *
 ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
 {
   struct ccase *c = NULL;
+  struct ods_reader *r = r_;
+
   xmlChar *val_string = NULL;
   xmlChar *type = NULL;
-  struct ods_reader *r = r_;
 
   if (!r->used_first_case)
     {