Move global initialization and cleanup code into main.c.
[pspp] / src / vars-prs.c
index bed6031d94414a7c6046e21a23a36cdddb8fae56..563ac2b29e9746b1a11bd37087057eeb555bea7b 100644 (file)
@@ -29,6 +29,7 @@
 #include "hash.h"
 #include "lexer.h"
 #include "misc.h"
+#include "pool.h"
 #include "size_max.h"
 #include "str.h"
 
@@ -164,7 +165,7 @@ add_variable (struct variable ***v, size_t *nv, size_t *mv,
       if (*nv >= *mv)
         {
           *mv = 2 * (*nv + 1);
-          *v = xrealloc (*v, *mv * sizeof **v);
+          *v = xnrealloc (*v, *mv, sizeof **v);
         }
 
       if ((pv_opts & PV_DUPLICATE) || !included[idx])
@@ -426,7 +427,7 @@ parse_DATA_LIST_vars (char ***names, size_t *nnames, int pv_opts)
          if (mvar < nvar + (n2 - n1 + 1))
            {
              mvar += ROUND_UP (n2 - n1 + 1, 16);
-             *names = xrealloc (*names, mvar * sizeof **names);
+             *names = xnrealloc (*names, mvar, sizeof **names);
            }
 
          for (n = n1; n <= n2; n++)
@@ -442,7 +443,7 @@ parse_DATA_LIST_vars (char ***names, size_t *nnames, int pv_opts)
          if (nvar >= mvar)
            {
              mvar += 16;
-             *names = xrealloc (*names, mvar * sizeof **names);
+             *names = xnrealloc (*names, mvar, sizeof **names);
            }
          (*names)[nvar++] = xstrdup (name1);
        }
@@ -495,7 +496,7 @@ parse_mixed_vars (char ***names, size_t *nnames, int pv_opts)
 
          if (!parse_variables (default_dict, &v, &nv, PV_NONE))
            goto fail;
-         *names = xrealloc (*names, (*nnames + nv) * sizeof **names);
+         *names = xnrealloc (*names, *nnames + nv, sizeof **names);
          for (i = 0; i < nv; i++)
            (*names)[*nnames + i] = xstrdup (v[i]->name);
          free (v);
@@ -508,12 +509,33 @@ parse_mixed_vars (char ***names, size_t *nnames, int pv_opts)
 
 fail:
   for (i = 0; i < *nnames; i++)
-    free ((*names)[*nnames]);
-  free (names);
+    free ((*names)[i]);
+  free (*names);
   *names = NULL;
   *nnames = 0;
   return 0;
 }
+
+/* Parses a list of variables where some of the variables may be
+   existing and the rest are to be created.  Same args as
+   parse_DATA_LIST_vars(), except that all allocations are taken
+   from the given POOL. */
+int
+parse_mixed_vars_pool (struct pool *pool,
+                       char ***names, size_t *nnames, int pv_opts)
+{
+  int retval = parse_mixed_vars (names, nnames, pv_opts);
+  if (retval)
+    {
+      size_t i;
+
+      for (i = 0; i < *nnames; i++)
+        pool_register (pool, free, (*names)[i]);
+      pool_register (pool, free, *names);
+    }
+  return retval;
+}
+
 \f
 /* A set of variables. */
 struct var_set