treewide: Replace <name>_cnt by n_<name>s and <name>_cap by allocated_<name>.
[pspp] / src / data / ods-reader.c
index bb72e2437c85800319ca3b7cb8b302c8592fb35d..b2efe2c5734c5c8a07dda87e39f4f8b69b75b15f 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2011, 2012, 2013, 2016, 2020 Free Software Foundation, Inc.
+   Copyright (C) 2011, 2012, 2013, 2016, 2020, 2021 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -121,7 +121,6 @@ struct ods_reader
 
   struct string ods_errs;
 
-  struct string zip_errs;
   struct hmap cache;
 };
 
@@ -164,7 +163,7 @@ ods_destroy (struct spreadsheet *s)
 
   dict_unref (r->spreadsheet.dict);
 
-  zip_reader_destroy (r->zreader);
+  zip_reader_unref (r->zreader);
   free (r->spreadsheet.sheets);
   free (s->file_name);
 
@@ -206,10 +205,12 @@ state_data_init (const struct ods_reader *r, struct state_data *sd)
 {
   memset (sd, 0, sizeof (*sd));
 
-  sd->zm = zip_member_open (r->zreader, "content.xml");
-
-  if (sd->zm == NULL)
-    return false;
+  char *error = zip_member_open (r->zreader, "content.xml", &sd->zm);
+  if (error)
+    {
+      free (error);
+      return false;
+    }
 
   sd->xtr =
     xmlReaderForIO (xml_reader_for_zip_member, NULL, sd->zm, NULL, NULL,
@@ -698,10 +699,12 @@ get_sheet_count (struct zip_reader *zreader)
 {
   xmlTextReaderPtr mxtr;
   struct zip_member *meta = NULL;
-  meta = zip_member_open (zreader, "meta.xml");
-
-  if (meta == NULL)
-    return -1;
+  char *error = zip_member_open (zreader, "meta.xml", &meta);
+  if (error)
+    {
+      free (error);
+      return -1;
+    }
 
   mxtr = xmlReaderForIO (xml_reader_for_zip_member, NULL, meta, NULL, NULL, 0);
 
@@ -906,25 +909,27 @@ ods_make_reader (struct spreadsheet *spreadsheet,
        {
          if (idx >= n_var_specs)
            {
-             var_spec = xrealloc (var_spec, sizeof (*var_spec) * (idx + 1));
+             var_spec = xrealloc (var_spec, sizeof (*var_spec) * (idx + r->rsd.col_span));
              memset (var_spec + n_var_specs,
-                     0,
-                     (idx - n_var_specs + 1) * sizeof (*var_spec));
+                     0,
+                     (idx + r->rsd.col_span - n_var_specs) * sizeof (*var_spec));
 
              var_spec [idx].name = NULL;
              n_var_specs = idx + 1;
            }
 
-         var_spec [idx].firstval.type = type;
-         var_spec [idx].firstval.text = xmlTextReaderValue (r->rsd.xtr);
-         var_spec [idx].firstval.value = val_string;
+          for (int x = 0; x < r->rsd.col_span; ++x)
+          {
+            var_spec [idx - x].firstval.type = xmlStrdup (type);
+            var_spec [idx - x].firstval.text = xmlTextReaderValue (r->rsd.xtr);
+            var_spec [idx - x].firstval.value = xmlStrdup (val_string);
+          }
 
-         val_string = NULL;
-         type = NULL;
+          free (val_string);
+          free (type);
        }
     }
 
-
   /* Create the dictionary and populate it */
   r->spreadsheet.dict = dict_create (
     CHAR_CAST (const char *, xmlTextReaderConstEncoding (r->rsd.xtr)));
@@ -1074,7 +1079,7 @@ ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
           r->rsd.node_type == XML_READER_TYPE_TEXT)
        {
          int col;
-         struct xml_value *xmv = xzalloc (sizeof *xmv);
+         struct xml_value *xmv = XZALLOC (struct xml_value);
          xmv->text = xmlTextReaderValue (r->rsd.xtr);
          xmv->value = val_string;
          val_string = NULL;
@@ -1089,7 +1094,7 @@ ods_file_casereader_read (struct casereader *reader UNUSED, void *r_)
                continue;
              if (r->spreadsheet.stop_col != -1 && idx > r->spreadsheet.stop_col - r->spreadsheet.start_col)
                break;
-             if (idx >= dict_get_var_cnt (r->spreadsheet.dict))
+             if (idx >= dict_get_n_vars (r->spreadsheet.dict))
                break;
 
               var = dict_get_var (r->spreadsheet.dict, idx);
@@ -1119,9 +1124,13 @@ init_reader (struct ods_reader *r, bool report_errors,
 
   if (state)
     {
-      struct zip_member *content = zip_member_open (r->zreader, "content.xml");
+      struct zip_member *content;
+      char *error = zip_member_open (r->zreader, "content.xml", &content);
       if (content == NULL)
-       return NULL;
+        {
+          free (error);
+          return NULL;
+        }
 
       xmlTextReaderPtr xtr = xmlReaderForIO (xml_reader_for_zip_member, NULL, content, NULL, NULL,
                                             report_errors
@@ -1154,21 +1163,18 @@ init_reader (struct ods_reader *r, bool report_errors,
 struct spreadsheet *
 ods_probe (const char *filename, bool report_errors)
 {
-  struct ods_reader *r = xzalloc (sizeof *r);
-  struct zip_reader *zr;
-
-  ds_init_empty (&r->zip_errs);
+  struct ods_reader *r = XZALLOC (struct ods_reader);
 
-  zr = zip_reader_create (filename, &r->zip_errs);
-
-  if (zr == NULL)
+  struct zip_reader *zr;
+  char *error = zip_reader_create (filename, &zr);
+  if (error)
     {
       if (report_errors)
        {
          msg (ME, _("Cannot open %s as a OpenDocument file: %s"),
-              filename, ds_cstr (&r->zip_errs));
+              filename, error);
        }
-      ds_destroy (&r->zip_errs);
+      free (error);
       free (r);
       return NULL;
     }
@@ -1188,8 +1194,7 @@ ods_probe (const char *filename, bool report_errors)
   return &r->spreadsheet;
 
  error:
-  ds_destroy (&r->zip_errs);
-  zip_reader_destroy (r->zreader);
+  zip_reader_unref (r->zreader);
   free (r);
   return NULL;
 }