Fix leak check in oneway command
[pspp] / src / language / stats / glm.c
index f5ee149af017627a4b03a51a5c2d1d061c3d774f..3d71779ff6e35ddacef4e3de5e6f66518d1ac48d 100644 (file)
@@ -326,6 +326,7 @@ cmd_glm (struct lexer *lexer, struct dataset *ds)
   free (glm.factor_vars);
   for (i = 0 ; i < glm.n_interactions; ++i)
     interaction_destroy (glm.interactions[i]);
+
   free (glm.interactions);
   free (glm.dep_vars);
 
@@ -590,7 +591,7 @@ run_glm (struct glm_spec *cmd, struct casereader *input,
   struct covariance *cov;
 
   ws.cats = categoricals_create (cmd->interactions, cmd->n_interactions,
-                                cmd->wv, cmd->exclude);
+                                cmd->wv, cmd->exclude, MV_ANY);
 
   cov = covariance_2pass_create (cmd->n_dep_vars, cmd->dep_vars,
                                 ws.cats, cmd->wv, cmd->exclude);
@@ -885,71 +886,11 @@ dump_matrix (const gsl_matrix * m)
 
 
 \f
-
-/* Match a variable.
-   If the match succeeds, the variable will be placed in VAR.
-   Returns true if successful */
-static bool
-lex_match_variable (struct lexer *lexer, const struct glm_spec *glm, const struct variable **var)
-{
-  if (lex_token (lexer) !=  T_ID)
-    return false;
-
-  *var = parse_variable_const  (lexer, glm->dict);
-
-  if ( *var == NULL)
-    return false;
-  return true;
-}
-
-/* An interaction is a variable followed by {*, BY} followed by an interaction */
-static bool
-parse_design_interaction (struct lexer *lexer, struct glm_spec *glm, struct interaction **iact)
-{
-  const struct variable *v = NULL;
-  assert (iact);
-
-  switch  (lex_next_token (lexer, 1))
-    {
-    case T_ENDCMD:
-    case T_SLASH:
-    case T_COMMA:
-    case T_ID:
-    case T_BY:
-    case T_ASTERISK:
-      break;
-    default:
-      return false;
-      break;
-    }
-
-  if (! lex_match_variable (lexer, glm, &v))
-    {
-      interaction_destroy (*iact);
-      *iact = NULL;
-      return false;
-    }
-  
-  assert (v);
-
-  if ( *iact == NULL)
-    *iact = interaction_create (v);
-  else
-    interaction_add_variable (*iact, v);
-
-  if ( lex_match (lexer, T_ASTERISK) || lex_match (lexer, T_BY))
-    {
-      return parse_design_interaction (lexer, glm, iact);
-    }
-
-  return true;
-}
-
 static bool
 parse_nested_variable (struct lexer *lexer, struct glm_spec *glm)
 {
   const struct variable *v = NULL;
-  if ( ! lex_match_variable (lexer, glm, &v))
+  if ( ! lex_match_variable (lexer, glm->dict, &v))
     return false;
 
   if (lex_match (lexer, T_LPAREN))
@@ -970,7 +911,7 @@ static bool
 parse_design_term (struct lexer *lexer, struct glm_spec *glm)
 {
   struct interaction *iact = NULL;
-  if (parse_design_interaction (lexer, glm, &iact))
+  if (parse_design_interaction (lexer, glm->dict, &iact))
     {
       /* Interaction parsing successful.  Add to list of interactions */
       glm->interactions = xrealloc (glm->interactions, sizeof *glm->interactions * ++glm->n_interactions);