lexer: New type enum token_type.
[pspp-builds.git] / src / language / xforms / count.c
index 1c9b4d65735f9487b147da120585465b7501ea0d..6d055f836974fcfab1554de48d18bf436c1faa24 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1997-9, 2000, 2009, 2010 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
 #include <data/variable.h>
 #include <language/command.h>
 #include <language/lexer/lexer.h>
-#include <language/lexer/range-parser.h>
+#include <language/lexer/value-parser.h>
 #include <language/lexer/variable-parser.h>
 #include <libpspp/compiler.h>
 #include <libpspp/message.h>
-#include <libpspp/message.h>
 #include <libpspp/pool.h>
 #include <libpspp/str.h>
 
@@ -128,7 +127,7 @@ cmd_count (struct lexer *lexer, struct dataset *ds)
         dv->name = pool_strdup (trns->pool, lex_tokid (lexer));
 
       lex_get (lexer);
-      if (!lex_force_match (lexer, '='))
+      if (!lex_force_match (lexer, T_EQUALS))
        goto fail;
 
       crit = dv->crit = pool_alloc (trns->pool, sizeof *crit);
@@ -144,7 +143,7 @@ cmd_count (struct lexer *lexer, struct dataset *ds)
            goto fail;
           pool_register (trns->pool, free, crit->vars);
 
-         if (!lex_force_match (lexer, '('))
+         if (!lex_force_match (lexer, T_LPAREN))
            goto fail;
 
           crit->value_cnt = 0;
@@ -155,16 +154,16 @@ cmd_count (struct lexer *lexer, struct dataset *ds)
          if (!ok)
            goto fail;
 
-         if (lex_token (lexer) == '/' || lex_token (lexer) == '.')
+         if (lex_token (lexer) == T_SLASH || lex_token (lexer) == T_ENDCMD)
            break;
 
          crit = crit->next = pool_alloc (trns->pool, sizeof *crit);
        }
 
-      if (lex_token (lexer) == '.')
+      if (lex_token (lexer) == T_ENDCMD)
        break;
 
-      if (!lex_force_match (lexer, '/'))
+      if (!lex_force_match (lexer, T_SLASH))
        goto fail;
       dv = dv->next = pool_alloc (trns->pool, sizeof *dv);
     }
@@ -222,8 +221,8 @@ parse_numeric_criteria (struct lexer *lexer, struct pool *pool, struct criteria
       else
         return false;
 
-      lex_match (lexer, ',');
-      if (lex_match (lexer, ')'))
+      lex_match (lexer, T_COMMA);
+      if (lex_match (lexer, T_RPAREN))
        break;
     }
   return true;
@@ -257,8 +256,8 @@ parse_string_criteria (struct lexer *lexer, struct pool *pool, struct criteria *
       str_copy_rpad (*cur, len + 1, ds_cstr (lex_tokstr (lexer)));
       lex_get (lexer);
 
-      lex_match (lexer, ',');
-      if (lex_match (lexer, ')'))
+      lex_match (lexer, T_COMMA);
+      if (lex_match (lexer, T_RPAREN))
        break;
     }
 
@@ -268,8 +267,8 @@ parse_string_criteria (struct lexer *lexer, struct pool *pool, struct criteria *
 /* Transformation. */
 
 /* Counts the number of values in case C matching CRIT. */
-static inline int
-count_numeric (struct criteria *crit, struct ccase *c)
+static int
+count_numeric (struct criteria *crit, const struct ccase *c)
 {
   int counter = 0;
   size_t i;
@@ -302,8 +301,8 @@ count_numeric (struct criteria *crit, struct ccase *c)
 }
 
 /* Counts the number of values in case C matching CRIT. */
-static inline int
-count_string (struct criteria *crit, struct ccase *c)
+static int
+count_string (struct criteria *crit, const struct ccase *c)
 {
   int counter = 0;
   size_t i;
@@ -325,12 +324,13 @@ count_string (struct criteria *crit, struct ccase *c)
 
 /* Performs the COUNT transformation T on case C. */
 static int
-count_trns_proc (void *trns_, struct ccase *c,
+count_trns_proc (void *trns_, struct ccase **c,
                  casenumber case_num UNUSED)
 {
   struct count_trns *trns = trns_;
   struct dst_var *dv;
 
+  *c = case_unshare (*c);
   for (dv = trns->dst_vars; dv; dv = dv->next)
     {
       struct criteria *crit;
@@ -339,10 +339,10 @@ count_trns_proc (void *trns_, struct ccase *c,
       counter = 0;
       for (crit = dv->crit; crit; crit = crit->next)
        if (var_is_numeric (crit->vars[0]))
-         counter += count_numeric (crit, c);
+         counter += count_numeric (crit, *c);
        else
-         counter += count_string (crit, c);
-      case_data_rw (c, dv->var)->f = counter;
+         counter += count_string (crit, *c);
+      case_data_rw (*c, dv->var)->f = counter;
     }
   return TRNS_CONTINUE;
 }
@@ -351,7 +351,7 @@ count_trns_proc (void *trns_, struct ccase *c,
 static bool
 count_trns_free (void *trns_)
 {
-  struct count_trns *trns = (struct count_trns *) trns_;
+  struct count_trns *trns = trns_;
   pool_destroy (trns->pool);
   return true;
 }