#include <config.h>
#include <assert.h>
#include <ctype.h>
+#include <math.h>
#include <stdlib.h>
#include "alloc.h"
-#include "approx.h"
-#include "cases.h"
#include "command.h"
#include "error.h"
#include "lexer.h"
\f
/* Definitions. */
+/* Type of source value for RECODE. */
enum
{
RCD_END, /* sentinel value */
static int parse_dest_spec (struct rcd_var * rcd, union value *v,
size_t *max_dst_width);
static int parse_src_spec (struct rcd_var * rcd, int type, size_t max_src_width);
-static int recode_trns_proc (struct trns_header *, struct ccase *);
-static void recode_trns_free (struct trns_header *);
+static trns_proc_func recode_trns_proc;
+static trns_free_func recode_trns_free;
static double convert_to_double (char *, int);
#if DEBUGGING
rcd->dest = dict_create_var (default_dict, rcd->dest_name, 0);
if (!rcd->dest)
{
- /* This can occur if a destname is duplicated. We could
- give an error at parse time but I don't care enough. */
- rcd->dest = dict_lookup_var (default_dict, rcd->dest_name);
- assert (rcd->dest != NULL);
+ /* FIXME: This can occur if a destname is duplicated.
+ We could give an error at parse time but I don't
+ care enough. */
+ rcd->dest = dict_lookup_var_assert (default_dict, rcd->dest_name);
}
- else
- envector (rcd->dest);
}
trns = xmalloc (sizeof *trns);
v->c = NULL;
}
}
+ else
+ {
+ lex_error (_("expecting output value"));
+ return 0;
+ }
if ((rcd->flags & RCD_DEST_MASK) == RCD_DEST_ERROR)
rcd->flags |= flags;
return cp;
break;
case RCD_SINGLE:
- if (approx_eq (cmp, cp->f1.f))
+ if (cmp == cp->f1.f)
return cp;
break;
case RCD_HIGH:
- if (approx_ge (cmp, cp->f1.f))
+ if (cmp >= cp->f1.f)
return cp;
break;
case RCD_LOW:
- if (approx_le (cmp, cp->f1.f))
+ if (cmp <= cp->f1.f)
return cp;
break;
case RCD_RANGE:
- if (approx_in_range (cmp, cp->f1.f, cp->f2.f))
+ if (cmp >= cp->f1.f && cmp <= cp->f2.f)
return cp;
break;
case RCD_ELSE:
}
static int
-recode_trns_proc (struct trns_header * t, struct ccase * c)
+recode_trns_proc (struct trns_header * t, struct ccase * c,
+ int case_num UNUSED)
{
struct rcd_var *v;
- struct coding *cp;
for (v = ((struct recode_trns *) t)->codings; v; v = v->next)
{
+ struct coding *cp;
+
switch (v->flags & RCD_SRC_MASK)
{
case RCD_SRC_NUMERIC:
case RCD_SRC_STRING:
cp = find_src_string (v, c);
break;
+ default:
+ assert (0);
}
if (!cp)
continue;