X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Foneway.c;h=08449103c522f92e834ffda095404780729614b4;hb=e0bcf133ab9091a2fa5227d2767651d8ec58caef;hp=a67493ec4a048b1ec5398c9a93722c4f55a03a7b;hpb=afcd7961919d0e2d3d8ecd240a14ace4a201e8d3;p=pspp diff --git a/src/language/stats/oneway.c b/src/language/stats/oneway.c index a67493ec4a..08449103c5 100644 --- a/src/language/stats/oneway.c +++ b/src/language/stats/oneway.c @@ -384,6 +384,30 @@ static void show_homogeneity (const struct oneway_spec *, const struct oneway_wo static void output_oneway (const struct oneway_spec *, struct oneway_workspace *ws); static void run_oneway (const struct oneway_spec *cmd, struct casereader *input, const struct dataset *ds); +static void +oneway_cleanup (struct oneway_spec *cmd) +{ + struct contrasts_node *coeff_list = NULL; + struct contrasts_node *coeff_next = NULL; + ll_for_each_safe (coeff_list, coeff_next, struct contrasts_node, ll, &cmd->contrast_list) + { + struct coeff_node *cn = NULL; + struct coeff_node *cnx = NULL; + struct ll_list *cl = &coeff_list->coefficient_list; + + ll_for_each_safe (cn, cnx, struct coeff_node, ll, cl) + { + free (cn); + } + + free (coeff_list); + } + + free (cmd->posthoc); +} + + + int cmd_oneway (struct lexer *lexer, struct dataset *ds) { @@ -560,10 +584,12 @@ cmd_oneway (struct lexer *lexer, struct dataset *ds) ok = proc_commit (ds) && ok; } + oneway_cleanup (&oneway); free (oneway.vars); return CMD_SUCCESS; error: + oneway_cleanup (&oneway); free (oneway.vars); return CMD_FAILURE; } @@ -664,10 +690,10 @@ run_oneway (const struct oneway_spec *cmd, struct payload payload; payload.create = makeit; payload.update = updateit; - payload.destroy = NULL; + payload.calculate = NULL; ws.vws[v].cat = categoricals_create (&inter, 1, cmd->wv, - cmd->exclude); + cmd->exclude, cmd->exclude); categoricals_set_payload (ws.vws[v].cat, &payload, CONST_CAST (struct variable *, cmd->vars[v]), @@ -774,7 +800,7 @@ run_oneway (const struct oneway_spec *cmd, gsl_matrix *cm; struct per_var_ws *pvw = &ws.vws[v]; const struct categoricals *cats = covariance_get_categoricals (pvw->cov); - const bool ok = categoricals_done (cats); + const bool ok = categoricals_sane (cats); if ( ! ok) { @@ -824,6 +850,7 @@ run_oneway (const struct oneway_spec *cmd, taint_destroy (taint); finish: + for (v = 0; v < cmd->n_vars; ++v) { covariance_destroy (ws.vws[v].cov);