Fix bug in parse_design_interaction.
authorJohn Darrington <john@darrington.wattle.id.au>
Fri, 2 Nov 2012 14:36:00 +0000 (15:36 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Fri, 2 Nov 2012 14:36:00 +0000 (15:36 +0100)
Previously this function would crash if it failed to succesfully parse
an interaction. This change fixes that.

src/language/lexer/variable-parser.c

index c1e1c28cdf404441cd701edd1ef62fdbaee2d6a8..5c19b81e2f5bd8c477f80742464416b8a58f8fb2 100644 (file)
@@ -893,8 +893,8 @@ lex_match_variable (struct lexer *lexer, const struct dictionary *dict, const st
 }
 
 /* An interaction is a variable followed by {*, BY} followed by an interaction */
-bool
-parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact)
+static bool
+parse_internal_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact, struct interaction **it)
 {
   const struct variable *v = NULL;
   assert (iact);
@@ -915,7 +915,8 @@ parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, st
 
   if (! lex_match_variable (lexer, dict, &v))
     {
-      interaction_destroy (*iact);
+      if (it)
+       interaction_destroy (*it);
       *iact = NULL;
       return false;
     }
@@ -929,9 +930,15 @@ parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, st
 
   if ( lex_match (lexer, T_ASTERISK) || lex_match (lexer, T_BY))
     {
-      return parse_design_interaction (lexer, dict, iact);
+      return parse_internal_interaction (lexer, dict, iact, iact);
     }
 
   return true;
 }
 
+bool
+parse_design_interaction (struct lexer *lexer, const struct dictionary *dict, struct interaction **iact)
+{
+  return parse_internal_interaction (lexer, dict, iact, NULL);
+}
+