projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
(dump_aggregate_info) Properly test whether the destination variable
[pspp]
/
src
/
count.c
diff --git
a/src/count.c
b/src/count.c
index 2ab52e250ea82aafdb1efdd7074b65d02b6fa3ac..af9642b8a233d2cb65bb914737cd391a417089da 100644
(file)
--- a/
src/count.c
+++ b/
src/count.c
@@
-18,10
+18,12
@@
02111-1307, USA. */
#include <config.h>
02111-1307, USA. */
#include <config.h>
-#include
<assert.h>
+#include
"error.h"
#include <stdlib.h>
#include "alloc.h"
#include <stdlib.h>
#include "alloc.h"
+#include "case.h"
#include "command.h"
#include "command.h"
+#include "dictionary.h"
#include "error.h"
#include "lexer.h"
#include "str.h"
#include "error.h"
#include "lexer.h"
#include "str.h"
@@
-134,8
+136,6
@@
cmd_count (void)
struct count_trns *trns; /* Transformation. */
struct cnt_var_info *head; /* First counting in chain. */
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 (;;)
/* Parses each slash-delimited specification. */
head = cnt = xmalloc (sizeof *cnt);
for (;;)
@@
-244,13
+244,13
@@
parse_numeric_criteria (struct counting * c)
}
cur = &c->crit.n[n++];
}
cur = &c->crit.n[n++];
- if (
token == T_NUM
)
+ if (
lex_is_number ()
)
{
cur->a = tokval;
lex_get ();
if (lex_match_id ("THRU"))
{
{
cur->a = tokval;
lex_get ();
if (lex_match_id ("THRU"))
{
- if (
token == T_NUM
)
+ if (
lex_is_number ()
)
{
if (!lex_force_num ())
return 0;
{
if (!lex_force_num ())
return 0;
@@
-282,7
+282,7
@@
parse_numeric_criteria (struct counting * c)
{
if (!lex_force_match_id ("THRU"))
return 0;
{
if (!lex_force_match_id ("THRU"))
return 0;
- if (
token == T_NUM
)
+ if (
lex_is_number ()
)
{
cur->type = CNT_LOW;
cur->a = tokval;
{
cur->type = CNT_LOW;
cur->a = tokval;
@@
-349,7
+349,7
@@
parse_string_criteria (struct counting * c)
cur = &c->crit.s[n++];
cur->type = CNT_SINGLE;
cur->s = malloc (len + 1);
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 (',');
lex_get ();
lex_match (',');
@@
-368,16
+368,14
@@
static inline int
count_numeric (struct counting * cnt, struct ccase * c)
{
int counter = 0;
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++)
{
int i;
for (i = 0; i < cnt->n; i++)
{
+ struct cnt_num *num;
+
/* Extract the variable value and eliminate missing values. */
/* 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)
if (cmp == SYSMIS)
{
if (cnt->missing >= 1)
@@
-435,27
+433,21
@@
static inline int
count_string (struct counting * cnt, struct ccase * c)
{
int counter = 0;
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++)
{
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:
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;
break;
counter++;
goto done;
@@
-486,7
+478,7
@@
count_trns_proc (struct trns_header * trns, struct ccase * c,
counter += count_numeric (cnt, c);
else
counter += count_string (cnt, c);
counter += count_numeric (cnt, c);
else
counter += count_string (cnt, c);
- c
->data[info->d->fv].
f = counter;
+ c
ase_data_rw (c, info->d->fv)->
f = counter;
}
return -1;
}
}
return -1;
}