output: Introduce pivot tables.
[pspp] / src / language / stats / npar.c
index 019e958cb20818ffcfd3a1277fac6e57643818e1..1d369eca44a6b091451762c1dd16a61ce1ca576f 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis. -*-c-*-
-   Copyright (C) 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2006, 2008, 2009, 2010, 2011, 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
@@ -498,7 +498,6 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests
         if (!lex_match (lexer, T_SLASH))
           break;
       }
-
     if (lex_token (lexer) != T_ENDCMD)
       {
         lex_error (lexer, _("expecting end of command"));
@@ -540,7 +539,7 @@ npar_execute (struct casereader *input,
       test->execute (ds, casereader_clone (input), specs->filter, test, specs->exact, specs->timer);
     }
 
-  if ( specs->descriptives )
+  if (specs->descriptives && specs->n_vars > 0)
     {
       summary_descriptives = xnmalloc (sizeof (*summary_descriptives),
                                       specs->n_vars);
@@ -554,7 +553,8 @@ npar_execute (struct casereader *input,
 
   if ( (specs->descriptives || specs->quartiles)
        && !taint_has_tainted_successor (casereader_get_taint (input)) )
-    do_summary_box (summary_descriptives, specs->vv, specs->n_vars );
+    do_summary_box (summary_descriptives, specs->vv, specs->n_vars,
+                    dict_get_weight_format (dataset_dict (ds)));
 
   free (summary_descriptives);
   casereader_destroy (input);
@@ -602,7 +602,7 @@ cmd_npar_tests (struct lexer *lexer, struct dataset *ds)
       }
   }
 
-  sort (npar_specs.vv, npar_specs.n_vars, sizeof (*npar_specs.vv), 
+  sort (npar_specs.vv, npar_specs.n_vars, sizeof (*npar_specs.vv),
         compare_var_ptrs_by_name, NULL);
 
   if ( cmd.statistics )
@@ -691,9 +691,13 @@ npar_runs (struct lexer *lexer, struct dataset *ds,
          lex_error (lexer, _("Expecting %s, %s, %s or a number."), "MEAN", "MEDIAN", "MODE");
          return 0;
        }
-                 
-      lex_force_match (lexer, T_RPAREN);
-      lex_force_match (lexer, T_EQUALS);
+
+      if (! lex_force_match (lexer, T_RPAREN))
+       return 2;
+
+      if (! lex_force_match (lexer, T_EQUALS))
+       return 2;
+
       if (!parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds),
                                  &tp->vars, &tp->n_vars,
                                  PV_NO_SCRATCH | PV_NO_DUPLICATE | PV_NUMERIC))
@@ -716,7 +720,7 @@ static int
 npar_friedman (struct lexer *lexer, struct dataset *ds,
               struct npar_specs *specs)
 {
-  struct friedman_test *ft = pool_alloc (specs->pool, sizeof (*ft)); 
+  struct friedman_test *ft = pool_alloc (specs->pool, sizeof (*ft));
   struct one_sample_test *ost = &ft->parent;
   struct npar_test *nt = &ost->parent;
 
@@ -747,7 +751,7 @@ static int
 npar_kendall (struct lexer *lexer, struct dataset *ds,
               struct npar_specs *specs)
 {
-  struct friedman_test *kt = pool_alloc (specs->pool, sizeof (*kt)); 
+  struct friedman_test *kt = pool_alloc (specs->pool, sizeof (*kt));
   struct one_sample_test *ost = &kt->parent;
   struct npar_test *nt = &ost->parent;
 
@@ -779,7 +783,7 @@ static int
 npar_cochran (struct lexer *lexer, struct dataset *ds,
               struct npar_specs *specs)
 {
-  struct one_sample_test *ft = pool_alloc (specs->pool, sizeof (*ft)); 
+  struct one_sample_test *ft = pool_alloc (specs->pool, sizeof (*ft));
   struct npar_test *nt = &ft->parent;
 
   nt->execute = cochran_execute;
@@ -832,7 +836,7 @@ npar_chisquare (struct lexer *lexer, struct dataset *ds,
       if ( ! lex_force_num (lexer)) return 0;
       cstp->lo = lex_number (lexer);
       lex_get (lexer);
-      lex_force_match (lexer, T_COMMA);
+      if (! lex_force_match (lexer, T_COMMA)) return 0;
       if (! lex_force_num (lexer) ) return 0;
       cstp->hi = lex_number (lexer);
       if ( cstp->lo >= cstp->hi )
@@ -851,8 +855,8 @@ npar_chisquare (struct lexer *lexer, struct dataset *ds,
   cstp->expected = NULL;
   if (lex_match_phrase (lexer, "/EXPECTED"))
     {
-      lex_force_match (lexer, T_EQUALS);
-      if ( ! lex_match_id (lexer, "EQUAL") )
+      if (! lex_force_match (lexer, T_EQUALS)) return 0;
+      if (! lex_match_id (lexer, "EQUAL") )
         {
           double f;
           int n;
@@ -865,6 +869,8 @@ npar_chisquare (struct lexer *lexer, struct dataset *ds,
               if ( lex_match (lexer, T_ASTERISK))
                 {
                   n = f;
+                  if (!lex_force_num (lexer))
+                    return 0;
                   f = lex_number (lexer);
                   lex_get (lexer);
                 }
@@ -929,7 +935,8 @@ npar_binomial (struct lexer *lexer, struct dataset *ds,
        {
          btp->p = lex_number (lexer);
          lex_get (lexer);
-         lex_force_match (lexer, T_RPAREN);
+         if (!lex_force_match (lexer, T_RPAREN))
+           return 0;
        }
       else
        return 0;
@@ -937,36 +944,41 @@ npar_binomial (struct lexer *lexer, struct dataset *ds,
   else
     equals = true;
 
-  if (equals || lex_match (lexer, T_EQUALS) )
-    {
-      if (parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds),
-                                     &tp->vars, &tp->n_vars,
-                                     PV_NUMERIC | PV_NO_SCRATCH | PV_NO_DUPLICATE) )
-       {
-         if (lex_match (lexer, T_LPAREN))
-           {
-             if (! lex_force_num (lexer))
-               return 2;
-             btp->category1 = lex_number (lexer);
-             lex_get (lexer);
-             if ( lex_match (lexer, T_COMMA))
-               {
-                 if ( ! lex_force_num (lexer) ) return 2;
-                 btp->category2 = lex_number (lexer);
-                 lex_get (lexer);
-               }
-             else
-               {
-                 btp->cutpoint = btp->category1;
-               }
-
-             lex_force_match (lexer, T_RPAREN);
-           }
-       }
-      else
-       return 2;
+  if (!equals)
+    if (!lex_force_match (lexer, T_EQUALS))
+      return 0;
 
-    }
+  {
+    if (parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds),
+                                    &tp->vars, &tp->n_vars,
+                                    PV_NUMERIC | PV_NO_SCRATCH | PV_NO_DUPLICATE) )
+      {
+        if (lex_match (lexer, T_LPAREN))
+          {
+            if (! lex_force_num (lexer))
+              return 2;
+            btp->category1 = lex_number (lexer);
+            lex_get (lexer);
+            if ( lex_match (lexer, T_COMMA))
+              {
+                if ( ! lex_force_num (lexer) ) return 2;
+                btp->category2 = lex_number (lexer);
+                lex_get (lexer);
+              }
+            else
+              {
+                btp->cutpoint = btp->category1;
+              }
+
+            if (! lex_force_match (lexer, T_RPAREN))
+              return 0;
+          }
+      }
+    else
+      {
+        return 2;
+      }
+  }
 
   specs->n_tests++;
   specs->test = pool_realloc (specs->pool,
@@ -1189,6 +1201,8 @@ parse_n_sample_related_test (struct lexer *lexer,
     return false;
 
   nst->indep_var = parse_variable_const (lexer, dict);
+  if (!nst->indep_var)
+    return false;
 
   if ( ! lex_force_match (lexer, T_LPAREN))
     return false;
@@ -1274,12 +1288,12 @@ npar_median (struct lexer *lexer,
 
   mt->median = SYSMIS;
 
-  if ( lex_match (lexer, T_LPAREN))
+  if ( lex_match (lexer, T_LPAREN) && lex_force_num (lexer))
     {
-      lex_force_num (lexer);
       mt->median = lex_number (lexer);
       lex_get (lexer);
-      lex_force_match (lexer, T_RPAREN);
+      if (! lex_force_match (lexer, T_RPAREN))
+       return 0;
     }
 
   lex_match (lexer, T_EQUALS);
@@ -1401,7 +1415,7 @@ insert_variable_into_map (struct hmapx *var_map, const struct variable *var)
   size_t hash = hash_pointer (var, 0);
   struct hmapx_node *node;
   const struct variable *v = NULL;
-      
+
   HMAPX_FOR_EACH_WITH_HASH (v, node, hash, var_map)
     {
       if ( v == var)
@@ -1440,7 +1454,7 @@ two_sample_insert_variables (const struct npar_test *test,
     }
 }
 
-static void 
+static void
 n_sample_insert_variables (const struct npar_test *test,
                           struct hmapx *var_map)
 {
@@ -1467,12 +1481,13 @@ npar_method (struct lexer *lexer,  struct npar_specs *specs)
 
          if ( lex_match (lexer, T_LPAREN))
            {
-             if ( lex_force_num (lexer) )
+             if (lex_force_num (lexer) )
                {
                  specs->timer = lex_number (lexer);
                  lex_get (lexer);
                }
-             lex_force_match (lexer, T_RPAREN);
+             if (lex_force_match (lexer, T_RPAREN))
+               return 0;
            }
        }
     }