Merge remote branch 'origin/master' into import-gui
[pspp] / src / data / ods-reader.c
index 5363d40fe4e5df6ae3eafb134a1b9f6c9b5e0483..39e82e5caea953dbe35e491e70098513a7e2494b 100644 (file)
@@ -113,7 +113,17 @@ struct state_data
   int col_span;
 };
 
-struct ods_reader              /*  */
+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;
   struct zip_reader *zreader;
@@ -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
 }
 
 
@@ -490,11 +502,11 @@ convert_xml_to_value (struct ccase *c, const struct variable *var,
            CHAR_CAST (const char *, xmv->value) : CHAR_CAST (const char *, xmv->text);
 
 
-         data_in (ss_cstr (text), "UTF-8",
+         free (data_in (ss_cstr (text), "UTF-8",
                         fmt->type,
                         v,
                         var_get_width (var),
-                        "UTF-8");
+                        "UTF-8"));
        }
     }
 }
@@ -562,7 +574,6 @@ 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) NULL,
                        content,   NULL, NULL,
@@ -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)
     {
@@ -707,7 +720,7 @@ ods_make_reader (struct spreadsheet *spreadsheet,
 
   if ( opts->read_names)
     {
-      while (1 == (ret = xmlTextReaderRead (r->rsd.xtr)))
+      while (1 == xmlTextReaderRead (r->rsd.xtr))
        {
          int idx;
 
@@ -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);
@@ -907,6 +918,9 @@ 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;
+
   if (!r->used_first_case)
     {
       r->used_first_case = true;
@@ -934,9 +948,6 @@ ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
   c = case_create (r->proto);
   case_set_missing (c);
   
-  xmlChar *val_string = NULL;
-  xmlChar *type = NULL;
-
   while (1 == xmlTextReaderRead (r->rsd.xtr))
     {
       process_node (r, &r->rsd);