02111-1307, USA. */
#include <config.h>
-#include <assert.h>
+#include "error.h"
#include <stdlib.h>
#include "alloc.h"
#include "command.h"
Perhaps simultaneity could be implemented as an option. On the
other hand, what good are the above commands? */
-
-#include "debug-print.h"
\f
/* Definitions. */
struct trns_header h;
struct cnt_var_info *specs;
};
-
-#if DEBUGGING
-static void debug_print (void);
-#endif
-
-/* First counting in chain. */
-static struct cnt_var_info *head;
\f
/* Parser. */
-static int count_trns_proc (struct trns_header *, struct ccase *);
-static void count_trns_free (struct trns_header *);
+static trns_proc_func count_trns_proc;
+static trns_free_func count_trns_free;
static int parse_numeric_criteria (struct counting *);
static int parse_string_criteria (struct counting *);
int
cmd_count (void)
{
- /* Specification currently being parsed. */
- struct cnt_var_info *cnt;
-
- /* Counting currently being parsed. */
- struct counting *c;
-
- /* Return value from parsing function. */
- int ret;
-
- /* Transformation. */
- struct count_trns *trns;
-
- lex_match_id ("COUNT");
+ struct cnt_var_info *cnt; /* Specification currently being parsed. */
+ struct counting *c; /* Counting currently being parsed. */
+ int ret; /* Return value from parsing function. */
+ struct count_trns *trns; /* Transformation. */
+ struct cnt_var_info *head; /* First counting in chain. */
/* Parses each slash-delimited specification. */
head = cnt = xmalloc (sizeof *cnt);
cnt->d = dict_create_var_assert (default_dict, cnt->n, 0);
}
-#if DEBUGGING
- debug_print ();
-#endif
-
trns = xmalloc (sizeof *trns);
trns->h.proc = count_trns_proc;
trns->h.free = count_trns_free;
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 (',');
/* Performs the COUNT transformation T on case C. */
static int
-count_trns_proc (struct trns_header * trns, struct ccase * c)
+count_trns_proc (struct trns_header * trns, struct ccase * c,
+ int case_num UNUSED)
{
struct cnt_var_info *info;
struct counting *cnt;
free (iter);
}
}
-\f
-/* Debugging. */
-
-#if DEBUGGING
-static void
-debug_print (void)
-{
- struct cnt_var_info *iter;
- struct counting *i;
- int j;
-
- printf ("COUNT\n");
- for (iter = head; iter; iter = iter->next)
- {
- printf (" %s=", iter->d->name);
- for (i = iter->c; i; i = i->next)
- {
- for (j = 0; j < i->n; j++)
- printf ("%s%s", j ? " " : "", i->v[j]->name);
- printf (" (");
- if (i->v[0]->type == NUMERIC)
- {
- struct cnt_num *n;
-
- if (i->missing == 2)
- printf ("MISSING");
- else if (i->missing == 1)
- printf ("SYSMIS");
- else
- assert (i->missing == 0);
-
- for (n = i->crit.n; n->type != CNT_SENTINEL; n++)
- {
- if (i->missing && n != i->crit.n)
- printf (",");
- switch (n->type)
- {
- case CNT_SINGLE:
- printf ("%g", n->a);
- break;
- case CNT_HIGH:
- printf ("%g THRU HIGH", n->a);
- break;
- case CNT_LOW:
- printf ("LOW THRU %g", n->a);
- break;
- case CNT_RANGE:
- printf ("%g THRU %g", n->a, n->b);
- break;
- case CNT_ANY:
- printf ("LOW THRU HIGH");
- break;
- default:
- printf ("<ERROR %d>", n->type);
- break;
- }
- }
- }
- else
- {
- struct cnt_str *s;
-
- for (s = i->crit.s; s->type != CNT_SENTINEL; s++)
- {
- if (s != i->crit.s)
- printf (",");
- if (s->type == CNT_SINGLE)
- printf ("'%s'", s->s);
- else
- printf ("<ERROR %d>", s->type);
- }
- }
- printf (") ");
- }
- printf ("\n");
- }
-}
-#endif /* DEBUGGING */