X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvars-prs.c;h=563ac2b29e9746b1a11bd37087057eeb555bea7b;hb=5c5204d433be6419112bd77f75b9a9adb642f766;hp=bed6031d94414a7c6046e21a23a36cdddb8fae56;hpb=65620ac48c2b146a580a80af120590e4e3d4a6d4;p=pspp diff --git a/src/vars-prs.c b/src/vars-prs.c index bed6031d94..563ac2b29e 100644 --- a/src/vars-prs.c +++ b/src/vars-prs.c @@ -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; +} + /* A set of variables. */ struct var_set