/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
bool leave; /* Leave value from case to case? */
/* Data for use by containing dictionary. */
- struct vardict_info vardict;
+ struct vardict_info *vardict;
/* Used only for system and portable file input and output.
See short-names.h. */
assert (width >= 0 && width <= MAX_STRING);
v = xmalloc (sizeof *v);
- v->vardict.dict_index = v->vardict.case_index = -1;
+ v->vardict = NULL;
var_set_name (v, name);
v->width = width;
mv_init (&v->miss, width);
return new_var;
}
-/* Create a variable of the specified WIDTH to be used for
- internal calculations only. The variable is assigned a unique
- dictionary index and a case index of CASE_IDX. */
-struct variable *
-var_create_internal (int case_idx, int width)
-{
- struct variable *v = var_create ("$internal", width);
- struct vardict_info vdi;
- static int counter = INT_MAX / 2;
-
- vdi.dict = NULL;
- vdi.case_index = case_idx;
- vdi.dict_index = counter++;
- if (counter == INT_MAX)
- counter = INT_MAX / 2;
-
- var_set_vardict (v, &vdi);
-
- return v;
-}
-
/* Destroys variable V.
V must not belong to a dictionary. If it does, use
dict_delete_var instead. */
{
if (v != NULL)
{
- if (var_has_vardict (v))
- {
- const struct vardict_info *vdi = var_get_vardict (v);
- assert (vdi->dict == NULL);
- }
+ assert (!var_has_vardict (v));
mv_destroy (&v->miss);
cat_stored_values_destroy (v->obs_vals);
var_clear_short_names (v);
void
var_set_name (struct variable *v, const char *name)
{
- assert (v->vardict.dict_index == -1);
+ assert (!var_has_vardict (v));
assert (var_is_plausible_name (name, false));
str_copy_trunc (v->name, sizeof v->name, name);
struct string *str)
{
const char *name = var_lookup_value_label (v, value);
- const struct dictionary *dict = var_get_vardict (v)->dict;
if (name == NULL)
{
- char *s = data_out (value, dict_get_encoding (dict), &v->print);
+ char *s = data_out (value, var_get_encoding (v), &v->print);
ds_put_cstr (str, s);
free (s);
}
size_t
var_get_dict_index (const struct variable *v)
{
- assert (v->vardict.dict_index != -1);
- return v->vardict.dict_index;
+ assert (var_has_vardict (v));
+ return vardict_get_dict_index (v->vardict);
}
/* Returns V's index within the case represented by its
size_t
var_get_case_index (const struct variable *v)
{
- assert (v->vardict.case_index != -1);
- return v->vardict.case_index;
+ assert (var_has_vardict (v));
+ return vardict_get_case_index (v->vardict);
}
\f
/* Returns V's auxiliary data, or a null pointer if none has been
return attrset_count (&v->attributes) > 0;
}
\f
+/* Returns the encoding of values of variable VAR. (This is actually a
+ property of the dictionary.) Returns null if no specific encoding has been
+ set. */
+const char *
+var_get_encoding (const struct variable *var)
+{
+ return (var_has_vardict (var)
+ ? dict_get_encoding (vardict_get_dictionary (var->vardict))
+ : NULL);
+}
+\f
/* Returns V's vardict structure. */
-const struct vardict_info *
+struct vardict_info *
var_get_vardict (const struct variable *v)
{
- assert (var_has_vardict (v));
- return &v->vardict;
+ return CONST_CAST (struct vardict_info *, v->vardict);
}
/* Sets V's vardict data to VARDICT. */
void
-var_set_vardict (struct variable *v, const struct vardict_info *vardict)
+var_set_vardict (struct variable *v, struct vardict_info *vardict)
{
- assert (vardict->dict_index >= 0);
- assert (vardict->case_index >= 0);
- v->vardict = *vardict;
+ v->vardict = vardict;
}
/* Returns true if V has vardict data. */
bool
var_has_vardict (const struct variable *v)
{
- return v->vardict.dict_index != -1;
+ return v->vardict != NULL;
}
/* Clears V's vardict data. */
void
var_clear_vardict (struct variable *v)
{
- v->vardict.dict_index = v->vardict.case_index = -1;
+ v->vardict = NULL;
}