Implemented long variable names a la spss V12.
[pspp-builds.git] / src / count.c
index dd88e01a62aeac8d4bf845af1ae0f9c06584c524..665248de6ca591ecb2de02406c00b8b12cd99ab5 100644 (file)
@@ -21,7 +21,9 @@
 #include "error.h"
 #include <stdlib.h>
 #include "alloc.h"
+#include "case.h"
 #include "command.h"
+#include "dictionary.h"
 #include "error.h"
 #include "lexer.h"
 #include "str.h"
@@ -106,7 +108,7 @@ struct cnt_var_info
     struct cnt_var_info *next;
 
     struct variable *d;                /* Destination variable. */
-    char n[9];                 /* Name of dest var. */
+    char n[SHORT_NAME_LEN + 1];        /* Name of dest var. */
 
     struct counting *c;                /* The counting specifications. */
   };
@@ -242,13 +244,13 @@ parse_numeric_criteria (struct counting * c)
        }
 
       cur = &c->crit.n[n++];
-      if (token == T_NUM)
+      if (lex_is_number ())
        {
          cur->a = tokval;
          lex_get ();
          if (lex_match_id ("THRU"))
            {
-             if (token == T_NUM)
+             if (lex_is_number ())
                {
                  if (!lex_force_num ())
                    return 0;
@@ -280,7 +282,7 @@ parse_numeric_criteria (struct counting * c)
        {
          if (!lex_force_match_id ("THRU"))
            return 0;
-         if (token == T_NUM)
+         if (lex_is_number ())
            {
              cur->type = CNT_LOW;
              cur->a = tokval;
@@ -366,16 +368,14 @@ static inline int
 count_numeric (struct counting * cnt, struct ccase * c)
 {
   int counter = 0;
-
-  struct cnt_num *num;
-
-  double cmp;
   int i;
 
   for (i = 0; i < cnt->n; i++)
     {
+      struct cnt_num *num;
+
       /* Extract the variable value and eliminate missing values. */
-      cmp = c->data[cnt->v[i]->fv].f;
+      double cmp = case_num (c, cnt->v[i]->fv);
       if (cmp == SYSMIS)
        {
          if (cnt->missing >= 1)
@@ -433,27 +433,21 @@ static inline int
 count_string (struct counting * cnt, struct ccase * c)
 {
   int counter = 0;
-
-  struct cnt_str *str;
-
-  char *cmp;
-  int len;
-
   int i;
 
   for (i = 0; i < cnt->n; i++)
     {
-      /* Extract the variable value, variable width. */
-      cmp = c->data[cnt->v[i]->fv].s;
-      len = cnt->v[i]->width;
+      struct cnt_str *str;
 
+      /* Extract the variable value, variable width. */
       for (str = cnt->crit.s;; str++)
        switch (str->type)
          {
          case CNT_ERROR:
            assert (0);
          case CNT_SINGLE:
-           if (memcmp (cmp, str->s, len))
+           if (memcmp (case_str (c, cnt->v[i]->fv), str->s,
+                        cnt->v[i]->width))
              break;
            counter++;
            goto done;
@@ -484,7 +478,7 @@ count_trns_proc (struct trns_header * trns, struct ccase * c,
          counter += count_numeric (cnt, c);
        else
          counter += count_string (cnt, c);
-      c->data[info->d->fv].f = counter;
+      case_data_rw (c, info->d->fv)->f = counter;
     }
   return -1;
 }