X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvars-atr.c;h=3ce08b05ce753c69eb841c53482d5dc90f8dde68;hb=cd7b08ad5e6bbec75e778acf008f84e1eb548154;hp=00453767b2aefaea346363a1eab1f5294e9bf6ca;hpb=f9d47b5bba8416419cf3bcd3aa23c2d40a05fcac;p=pspp-builds.git diff --git a/src/vars-atr.c b/src/vars-atr.c index 00453767..3ce08b05 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 @@ -45,21 +84,35 @@ compare_values (const union value *a, const union value *b, int width) return memcmp (a->s, b->s, 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, 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; }