X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvars-atr.c;h=5f42fc8f4051e7865f8f3d668edf80c77df15ddf;hb=b2f22a54346df45ab24d83e1228700649f62d63c;hp=cf4ef4e32c2030d5fbd9ab21498f545e782de241;hpb=06f9ee45954e5e71fa7f6262dbf37defa1dbf996;p=pspp diff --git a/src/vars-atr.c b/src/vars-atr.c index cf4ef4e32c..5f42fc8f40 100644 --- a/src/vars-atr.c +++ b/src/vars-atr.c @@ -23,6 +23,7 @@ #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,16 +81,32 @@ 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;