#include <config.h>
#include "var.h"
-#include <assert.h>
+#include "error.h"
#include <stdlib.h>
#include "alloc.h"
-#include "approx.h"
#include "command.h"
+#include "dictionary.h"
#include "do-ifP.h"
#include "expr.h"
#include "file-handle.h"
#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
+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, 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;
}
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);
}