Merge remote branch 'origin/master' into import-gui
[pspp] / src / data / gnumeric-reader.c
index cda95e5378e5d435c524aa50086fc3e77e0c87da..1b7a646a83ebe5d3bbf2ec89cf10e471e346824c 100644 (file)
@@ -104,6 +104,7 @@ struct sheet_detail
 struct gnumeric_reader
 {
   struct spreadsheet spreadsheet;
+  int ref_cnt;
 
   /* The libxml reader for this instance */
   xmlTextReaderPtr xtr;
@@ -137,17 +138,21 @@ struct gnumeric_reader
 void
 gnumeric_destroy (struct spreadsheet *s)
 {
-  struct gnumeric_reader *r = s;
-  int i;
+  struct gnumeric_reader *r = (struct gnumeric_reader *) s;
 
-  for (i = 0; i < s->n_sheets; ++i)
+  if (0 == --r->ref_cnt)
     {
-      xmlFree (r->sheets[i].name);
-    }
+      int i;
+
+      for (i = 0; i < s->n_sheets; ++i)
+       {
+         xmlFree (r->sheets[i].name);
+       }
     
-  free (r->sheets);
+      free (r->sheets);
 
-  free (r);
+      free (r);
+    }
 }
 
 
@@ -205,6 +210,8 @@ gnm_file_casereader_destroy (struct casereader *reader UNUSED, void *r_)
     case_unref (r->first_case);
 
   caseproto_unref (r->proto);
+
+  gnumeric_destroy (&r->spreadsheet);
 }
 
 
@@ -494,6 +501,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
@@ -563,6 +571,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,