X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvars-atr.c;h=5f42fc8f4051e7865f8f3d668edf80c77df15ddf;hb=20fd432b34d65999f06fabfa8e9c3f5efbac41bd;hp=7efc5390a6d3c4ada3b8a426139c60576060a4cc;hpb=ccf2f45c091ce1555b4e2a36186c501675c18a59;p=pspp-builds.git diff --git a/src/vars-atr.c b/src/vars-atr.c index 7efc5390..5f42fc8f 100644 --- a/src/vars-atr.c +++ b/src/vars-atr.c @@ -19,11 +19,11 @@ #include #include "var.h" -#include +#include "error.h" #include #include "alloc.h" -#include "approx.h" #include "command.h" +#include "dictionary.h" #include "do-ifP.h" #include "expr.h" #include "file-handle.h" @@ -35,6 +35,44 @@ #include "debug-print.h" +void * +var_attach_aux (struct variable *v, + void *aux, void (*aux_dtor) (struct variable *)) +{ + assert (v->aux == NULL); + assert (aux != NULL); + v->aux = aux; + v->aux_dtor = aux_dtor; + return aux; +} + +void * +var_detach_aux (struct variable *v) +{ + void *aux = v->aux; + assert (aux != NULL); + v->aux = NULL; + return aux; +} + +void +var_clear_aux (struct variable *v) +{ + assert (v != NULL); + if (v->aux != NULL) + { + if (v->aux_dtor != NULL) + v->aux_dtor (v); + v->aux = NULL; + } +} + +void +var_dtor_free (struct variable *v) +{ + free (v->aux); +} + /* Compares A and B, which both have the given WIDTH, and returns a strcmp()-type result. */ int @@ -43,22 +81,38 @@ compare_values (const union value *a, const union value *b, int width) if (width == 0) return a->f < b->f ? -1 : a->f > b->f; else - return memcmp (a->s, b->s, width); + return memcmp (a->s, b->s, min(MAX_SHORT_STRING, width)); +} + +/* Create a hash of v */ +unsigned +hash_value(const union value *v, int width) +{ + unsigned id_hash; + + if ( 0 == width ) + id_hash = hsh_hash_double (v->f); + else + id_hash = hsh_hash_bytes (v->s, min(MAX_SHORT_STRING, width)); + + return id_hash; } + + /* Discards all the current state in preparation for a data-input command like DATA LIST or GET. */ void discard_variables (void) { dict_clear (default_dict); - default_handle = inline_file; + default_handle = NULL; n_lag = 0; - if (vfm_source) + if (vfm_source != NULL) { - vfm_source->destroy_source (); + free_case_source (vfm_source); vfm_source = NULL; } @@ -84,31 +138,25 @@ is_num_user_missing (double x, const struct variable *v) case MISSING_NONE: return 0; case MISSING_1: - return approx_eq (x, v->missing[0].f); + return x == v->missing[0].f; case MISSING_2: - return (approx_eq (x, v->missing[0].f) - || approx_eq (x, v->missing[1].f)); + return x == v->missing[0].f || x == v->missing[1].f; case MISSING_3: - return (approx_eq (x, v->missing[0].f) - || approx_eq (x, v->missing[1].f) - || approx_eq (x, v->missing[2].f)); + return (x == v->missing[0].f || x == v->missing[1].f + || x == v->missing[2].f); case MISSING_RANGE: - return (approx_ge (x, v->missing[0].f) - && approx_le (x, v->missing[1].f)); + return x >= v->missing[0].f && x <= v->missing[1].f; case MISSING_LOW: - return approx_le (x, v->missing[0].f); + return x <= v->missing[0].f; case MISSING_HIGH: - return approx_ge (x, v->missing[0].f); + return x >= v->missing[0].f; case MISSING_RANGE_1: - return ((approx_ge (x, v->missing[0].f) - && approx_le (x, v->missing[1].f)) - || approx_eq (x, v->missing[2].f)); + return ((x >= v->missing[0].f && x <= v->missing[1].f) + || x == v->missing[2].f); case MISSING_LOW_1: - return (approx_le (x, v->missing[0].f) - || approx_eq (x, v->missing[1].f)); + return x <= v->missing[0].f || x == v->missing[1].f; case MISSING_HIGH_1: - return (approx_ge (x, v->missing[0].f) - || approx_eq (x, v->missing[1].f)); + return x >= v->missing[0].f || x == v->missing[1].f; default: assert (0); }