X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fvars-atr.c;h=5f42fc8f4051e7865f8f3d668edf80c77df15ddf;hb=2c4c4a789e9c23478bce195d2ed98bab6064dfc1;hp=ee4d230246c6e233d68a52e65b8de7f97b60a897;hpb=60d7d619ee7885ad065f178eb0cf1e5d432b1921;p=pspp-builds.git diff --git a/src/vars-atr.c b/src/vars-atr.c index ee4d2302..5f42fc8f 100644 --- a/src/vars-atr.c +++ b/src/vars-atr.c @@ -19,10 +19,11 @@ #include #include "var.h" -#include +#include "error.h" #include #include "alloc.h" #include "command.h" +#include "dictionary.h" #include "do-ifP.h" #include "expr.h" #include "file-handle.h" @@ -34,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 @@ -42,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; }