X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fcount.c;h=a6e70616460cf7ce40583c0f858e5801095d75a7;hb=1fc3af93c0ba6cbaf7ef09edc979096b6f16dd6f;hp=2ab52e250ea82aafdb1efdd7074b65d02b6fa3ac;hpb=48d68723da059bce11f1d507a67bf73cd3fd0bed;p=pspp diff --git a/src/count.c b/src/count.c index 2ab52e250e..a6e7061646 100644 --- a/src/count.c +++ b/src/count.c @@ -18,9 +18,10 @@ 02111-1307, USA. */ #include -#include +#include "error.h" #include #include "alloc.h" +#include "case.h" #include "command.h" #include "error.h" #include "lexer.h" @@ -134,8 +135,6 @@ cmd_count (void) struct count_trns *trns; /* Transformation. */ struct cnt_var_info *head; /* First counting in chain. */ - lex_match_id ("COUNT"); - /* Parses each slash-delimited specification. */ head = cnt = xmalloc (sizeof *cnt); for (;;) @@ -349,7 +348,7 @@ parse_string_criteria (struct counting * c) cur = &c->crit.s[n++]; cur->type = CNT_SINGLE; cur->s = malloc (len + 1); - st_pad_copy (cur->s, ds_value (&tokstr), len + 1); + st_pad_copy (cur->s, ds_c_str (&tokstr), len + 1); lex_get (); lex_match (','); @@ -368,16 +367,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) @@ -435,27 +432,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; @@ -486,7 +477,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; }