Fixed a bug in the Mann-Whitney test vs. missing=analysis.
[pspp] / src / language / stats / factor.c
index ed93271b90c5e7d71ddc0d946dea1164bd89d785..38c66cc751d7b920e698b540224cf6ee64241b46 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2009, 2010, 2011, 2012, 2014, 2015 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2011, 2012, 2014, 2015, 2016 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -1134,12 +1134,13 @@ cmd_factor (struct lexer *lexer, struct dataset *ds)
              else if (lex_match_id (lexer, "PROMAX"))
                {
                  factor.promax_power = 5;
-                 if (lex_match (lexer, T_LPAREN))
+                 if (lex_match (lexer, T_LPAREN)
+                      && lex_force_int (lexer))
                    {
-                     lex_force_int (lexer);
                      factor.promax_power = lex_integer (lexer);
                      lex_get (lexer);
-                     lex_force_match (lexer, T_RPAREN);
+                     if (! lex_force_match (lexer, T_RPAREN))
+                       goto error;
                    }
                  factor.rotation = ROT_PROMAX;
                }
@@ -1162,52 +1163,57 @@ cmd_factor (struct lexer *lexer, struct dataset *ds)
            {
              if (lex_match_id (lexer, "FACTORS"))
                {
-                 if ( lex_force_match (lexer, T_LPAREN))
+                 if ( lex_force_match (lexer, T_LPAREN)
+                       && lex_force_int (lexer))
                    {
-                     lex_force_int (lexer);
                      factor.n_factors = lex_integer (lexer);
                      lex_get (lexer);
-                     lex_force_match (lexer, T_RPAREN);
+                     if (! lex_force_match (lexer, T_RPAREN))
+                       goto error;
                    }
                }
              else if (lex_match_id (lexer, "MINEIGEN"))
                {
-                 if ( lex_force_match (lexer, T_LPAREN))
+                 if ( lex_force_match (lexer, T_LPAREN)
+                       && lex_force_num (lexer))
                    {
-                     lex_force_num (lexer);
                      factor.min_eigen = lex_number (lexer);
                      lex_get (lexer);
-                     lex_force_match (lexer, T_RPAREN);
+                     if (! lex_force_match (lexer, T_RPAREN))
+                       goto error;
                    }
                }
              else if (lex_match_id (lexer, "ECONVERGE"))
                {
-                 if ( lex_force_match (lexer, T_LPAREN))
+                 if ( lex_force_match (lexer, T_LPAREN)
+                       && lex_force_num (lexer))
                    {
-                     lex_force_num (lexer);
                      factor.econverge = lex_number (lexer);
                      lex_get (lexer);
-                     lex_force_match (lexer, T_RPAREN);
+                     if (! lex_force_match (lexer, T_RPAREN))
+                       goto error;
                    }
                }
              else if (lex_match_id (lexer, "RCONVERGE"))
-               {
-                 if ( lex_force_match (lexer, T_LPAREN))
-                   {
-                     lex_force_num (lexer);
-                     factor.rconverge = lex_number (lexer);
-                     lex_get (lexer);
-                     lex_force_match (lexer, T_RPAREN);
-                   }
+                {
+                  if (lex_force_match (lexer, T_LPAREN)
+                      && lex_force_num (lexer))
+                    {
+                      factor.rconverge = lex_number (lexer);
+                      lex_get (lexer);
+                      if (! lex_force_match (lexer, T_RPAREN))
+                       goto error;
+                    }
                }
              else if (lex_match_id (lexer, "ITERATE"))
                {
-                 if ( lex_force_match (lexer, T_LPAREN))
+                 if ( lex_force_match (lexer, T_LPAREN)
+                       && lex_force_int (lexer))
                    {
-                     lex_force_int (lexer);
                      n_iterations = lex_integer (lexer);
                      lex_get (lexer);
-                     lex_force_match (lexer, T_RPAREN);
+                     if (! lex_force_match (lexer, T_RPAREN))
+                       goto error;
                    }
                }
              else if (lex_match_id (lexer, "DEFAULT"))
@@ -1263,12 +1269,13 @@ cmd_factor (struct lexer *lexer, struct dataset *ds)
                }
              else if (lex_match_id (lexer, "BLANK"))
                {
-                 if ( lex_force_match (lexer, T_LPAREN))
+                 if ( lex_force_match (lexer, T_LPAREN)
+                       && lex_force_num (lexer))
                    {
-                     lex_force_num (lexer);
                      factor.blank = lex_number (lexer);
                      lex_get (lexer);
-                     lex_force_match (lexer, T_RPAREN);
+                     if (! lex_force_match (lexer, T_RPAREN))
+                       goto error;
                    }
                }
              else if (lex_match_id (lexer, "DEFAULT"))