Merge remote-tracking branch 'origin/master' into sheet
[pspp] / src / language / stats / t-test-parser.c
index 138969f8bf4f3d3437733fc53e9d2a34393b2c97..9a0043aa45761db7771a25a96a2f7db02b046e39 100644 (file)
@@ -44,9 +44,9 @@ cmd_t_test (struct lexer *lexer, struct dataset *ds)
 
   /* Variables pertaining to the paired mode */
   const struct variable **v1 = NULL;
-  size_t n_v1;
+  size_t n_v1 = 0;
   const struct variable **v2 = NULL;
-  size_t n_v2;
+  size_t n_v2 = 0;
          
   size_t n_pairs = 0;
   vp *pairs = NULL;
@@ -80,7 +80,8 @@ cmd_t_test (struct lexer *lexer, struct dataset *ds)
          mode_count++;
          tt.mode = MODE_SINGLE;
          lex_match (lexer, T_EQUALS);
-         lex_force_num (lexer);
+         if (!lex_force_num (lexer))
+           goto parse_failed;
          testval = lex_number (lexer);
          lex_get (lexer);
        }
@@ -100,14 +101,16 @@ cmd_t_test (struct lexer *lexer, struct dataset *ds)
              value_init (&gval0, var_get_width (gvar));
              parse_value (lexer, &gval0, gvar);
              cut = true;
-             if (lex_match (lexer, T_COMMA))
+             if (lex_token (lexer) != T_RPAREN)
                {
+                 lex_match (lexer, T_COMMA);
                  value_init (&gval1, var_get_width (gvar));
                  parse_value (lexer, &gval1, gvar);
                  cut = false;
                }
 
-             lex_force_match (lexer, T_RPAREN);
+             if (! lex_force_match (lexer, T_RPAREN))
+               goto parse_failed;
            }
          else
            {
@@ -275,10 +278,12 @@ cmd_t_test (struct lexer *lexer, struct dataset *ds)
          if ( lex_match_id (lexer, "CIN") || lex_force_match_id (lexer, "CI"))
            if ( lex_force_match (lexer, T_LPAREN))
              {
-               lex_force_num (lexer);
+               if (!lex_force_num (lexer))
+                 goto parse_failed;
                tt.confidence = lex_number (lexer);
                lex_get (lexer);
-               lex_force_match (lexer, T_RPAREN);
+               if (! lex_force_match (lexer, T_RPAREN))
+                 goto parse_failed;
              }
        }
       else 
@@ -362,12 +367,17 @@ cmd_t_test (struct lexer *lexer, struct dataset *ds)
   free (pairs);
   free (v1);
   free (v2);
-
   free (tt.vars);
 
   return ok ? CMD_SUCCESS : CMD_FAILURE;
 
  parse_failed:
+
+  free (pairs);
+  free (v1);
+  free (v2);
+  free (tt.vars);
+
   return CMD_FAILURE;
 }