X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Frecode.c;h=e415dcf84bbcd89d7a18cb986267322043aadf50;hb=9b4b94c6d3b5fd98bf396e23d015380b87d2d296;hp=185067bae8a263e337b763a3b67035f23d57c6b4;hpb=18febf84744dc7ab4248542c2f88d91c01ef3fa1;p=pspp-builds.git diff --git a/src/recode.c b/src/recode.c index 185067ba..e415dcf8 100644 --- a/src/recode.c +++ b/src/recode.c @@ -18,22 +18,21 @@ 02111-1307, USA. */ #include -#include +#include "error.h" #include +#include #include #include "alloc.h" -#include "approx.h" #include "command.h" #include "error.h" #include "lexer.h" #include "magic.h" #include "str.h" #include "var.h" - -#include "debug-print.h" /* Definitions. */ +/* Type of source value for RECODE. */ enum { RCD_END, /* sentinel value */ @@ -104,23 +103,12 @@ struct recode_trns 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 -static void debug_print (struct rcd_var * head); -#endif /* Parser. */ -/* First transformation in the list. rcd is in this list. */ -static struct rcd_var *head; - -/* Variables in the current part of the recoding. */ -struct variable **v; -int nv; - /* Parses the RECODE transformation. */ int cmd_recode (void) @@ -147,10 +135,16 @@ cmd_recode (void) rcd_var's. */ struct recode_trns *trns; - lex_match_id ("RECODE"); + /* First transformation in the list. rcd is in this list. */ + struct rcd_var *head; + + /* Variables in the current part of the recoding. */ + struct variable **v; + int nv; /* Parses each specification between slashes. */ head = rcd = xmalloc (sizeof *rcd); + v = NULL; for (;;) { /* Whether we've already encountered a specification for SYSMIS. */ @@ -401,6 +395,7 @@ cmd_recode (void) rcd = rcd->next = xmalloc (sizeof *rcd); free (v); + v = NULL; } if (token != '.') @@ -428,13 +423,10 @@ cmd_recode (void) trns->codings = head; add_transformation ((struct trns_header *) trns); -#if DEBUGGING - debug_print (head); -#endif - return CMD_SUCCESS; lossage: + free (v); { struct recode_trns t; @@ -487,6 +479,11 @@ parse_dest_spec (struct rcd_var * rcd, union value * v, size_t *max_dst_width) v->c = NULL; } } + else + { + lex_error (_("expecting output value")); + return 0; + } if ((rcd->flags & RCD_DEST_MASK) == RCD_DEST_ERROR) rcd->flags |= flags; @@ -716,19 +713,19 @@ find_src_numeric (struct rcd_var * v, struct ccase * c) 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: @@ -772,13 +769,15 @@ find_src_string (struct rcd_var * v, struct ccase * c) } 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: @@ -787,6 +786,9 @@ recode_trns_proc (struct trns_header * t, struct ccase * c) case RCD_SRC_STRING: cp = find_src_string (v, c); break; + default: + assert (0); + abort (); } if (!cp) continue; @@ -814,112 +816,6 @@ recode_trns_proc (struct trns_header * t, struct ccase * c) return -1; } - -/* Debug output. */ - -#if DEBUGGING -static void -dump_dest (struct rcd_var * v, union value * c) -{ - if ((v->flags & RCD_DEST_MASK) == RCD_DEST_NUMERIC) - if (c->f == SYSMIS) - printf ("=SYSMIS"); - else if (c->f == -SYSMIS) - printf ("=COPY"); - else - printf ("=%g", c->f); - else if (c->c) - printf ("=\"%s\"", c->c); - else - printf ("=COPY"); -} - -static void -debug_print (struct rcd_var * head) -{ - struct rcd_var *iter, *start; - struct coding *c; - - printf ("RECODE\n"); - for (iter = head; iter; iter = iter->next) - { - start = iter; - printf (" %s%s", iter == head ? "" : "/", iter->src->name); - while (iter->next && (iter->next->flags & RCD_MISC_DUPLICATE)) - { - iter = iter->next; - printf (" %s", iter->src->name); - } - if (iter->has_sysmis) - { - printf ("(SYSMIS"); - dump_dest (iter, &iter->sysmis); - printf (")"); - } - for (c = iter->map; c->type != RCD_END; c++) - { - printf ("("); - if ((iter->flags & RCD_SRC_MASK) == RCD_SRC_NUMERIC) - switch (c->type) - { - case RCD_END: - printf (_("!!END!!")); - break; - case RCD_USER: - printf ("MISSING"); - break; - case RCD_SINGLE: - printf ("%g", c->f1.f); - break; - case RCD_HIGH: - printf ("%g THRU HIGH", c->f1.f); - break; - case RCD_LOW: - printf ("LOW THRU %g", c->f1.f); - break; - case RCD_RANGE: - printf ("%g THRU %g", c->f1.f, c->f2.f); - break; - case RCD_ELSE: - printf ("ELSE"); - break; - default: - printf (_("!!ERROR!!")); - break; - } - else - switch (c->type) - { - case RCD_SINGLE: - printf ("\"%s\"", c->f1.c); - break; - case RCD_ELSE: - printf ("ELSE"); - break; - case RCD_CONVERT: - printf ("CONVERT"); - break; - default: - printf (_("!!ERROR!!")); - break; - } - if (c->type != RCD_CONVERT) - dump_dest (iter, &c->t); - printf (")"); - } - printf ("\n INTO"); - for (;;) - { - printf (" %s", - start->dest_name[0] ? start->dest_name : start->dest->name); - if (start == iter) - break; - start = start->next; - } - printf ("\n"); - } -} -#endif /* Convert NPTR to a `long int' in base 10. Returns the long int on success, NOT_LONG on failure. On success stores a pointer to the