X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvars-atr.c;h=9f2baf0ea1e6f4593decbfb9dd2da769de2b5873;hb=f1696fab032a5ae5c44e3a3dedba343fce9ffd5c;hp=c0730022354f2ab88dfe278b4d6949fb61bc04b9;hpb=205ac3afa4c2b19c85819d8695abf3975bb11807;p=pspp diff --git a/src/vars-atr.c b/src/vars-atr.c index c073002235..9f2baf0ea1 100644 --- a/src/vars-atr.c +++ b/src/vars-atr.c @@ -23,8 +23,9 @@ #include #include "alloc.h" #include "command.h" +#include "dictionary.h" #include "do-ifP.h" -#include "expr.h" +#include "expressions/public.h" #include "file-handle.h" #include "hash.h" #include "misc.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,24 +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 != NULL) { - if (vfm_source->class->destroy != NULL) - vfm_source->class->destroy (vfm_source); - free (vfm_source); + free_case_source (vfm_source); vfm_source = NULL; } @@ -180,7 +233,7 @@ is_user_missing (const union value *val, const struct variable *v) /* A hsh_compare_func that orders variables A and B by their names. */ int -compare_variables (const void *a_, const void *b_, void *foo UNUSED) +compare_var_names (const void *a_, const void *b_, void *foo UNUSED) { const struct variable *a = a_; const struct variable *b = b_; @@ -190,9 +243,30 @@ compare_variables (const void *a_, const void *b_, void *foo UNUSED) /* A hsh_hash_func that hashes variable V based on its name. */ unsigned -hash_variable (const void *v_, void *foo UNUSED) +hash_var_name (const void *v_, void *foo UNUSED) { const struct variable *v = v_; return hsh_hash_string (v->name); } + +/* A hsh_compare_func that orders pointers to variables A and B + by their names. */ +int +compare_var_ptr_names (const void *a_, const void *b_, void *foo UNUSED) +{ + struct variable *const *a = a_; + struct variable *const *b = b_; + + return strcmp ((*a)->name, (*b)->name); +} + +/* A hsh_hash_func that hashes pointer to variable V based on its + name. */ +unsigned +hash_var_ptr_name (const void *v_, void *foo UNUSED) +{ + struct variable *const *v = v_; + + return hsh_hash_string ((*v)->name); +}