if (old)
{
d->callbacks->var_changed (d, var_get_dict_index (var), VAR_TRAIT_POSITION, old, d->cb_data);
- var_destroy (old);
+ var_unref (old);
}
}
}
}
invalidate_proto (d);
- var_destroy (v);
+ var_unref (v);
}
/* Deletes variable V from dictionary D and frees V.
var_clear_vardict (dv->var);
if (d->callbacks && d->callbacks->var_deleted)
d->callbacks->var_deleted (d, dv->var, vi, dv->case_index, d->cb_data);
- var_destroy (dv->var);
+ var_unref (dv->var);
free (dv);
}
}
if (d->callbacks && d->callbacks->var_changed)
d->callbacks->var_changed (d, var_get_dict_index (v), VAR_TRAIT_NAME, old, d->cb_data);
- var_destroy (old);
+ var_unref (old);
return true;
}
if (d->callbacks && d->callbacks->var_changed)
d->callbacks->var_changed (d, var_get_dict_index (v), what, oldvar, d->cb_data);
}
- var_destroy (oldvar);
+ var_unref (oldvar);
}
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013, 2014, 2016 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011, 2012, 2013,
+ 2014, 2016, 2020 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
/* A variable. */
struct variable
{
+ int ref_cnt;
/* Dictionary information. */
char *name; /* Variable name. Mixed case. */
int width; /* 0 for numeric, otherwise string width. */
attrset_init (&v->attributes);
ds_init_empty (&v->name_and_label);
+ v->ref_cnt = 1;
+
return v;
}
/* Destroys variable V.
V must not belong to a dictionary. If it does, use
dict_delete_var instead. */
+static void
+var_destroy__ (struct variable *v)
+{
+ assert (!var_has_vardict (v));
+ mv_destroy (&v->miss);
+ var_clear_short_names (v);
+ val_labs_destroy (v->val_labs);
+ var_set_label_quiet (v, NULL);
+ attrset_destroy (var_get_attributes (v));
+ free (v->name);
+ ds_destroy (&v->name_and_label);
+ free (v);
+}
+
+struct variable *
+var_ref (struct variable *v)
+{
+ v->ref_cnt++;
+ return v;
+}
+
void
-var_destroy (struct variable *v)
+var_unref (struct variable *v)
{
- if (v != NULL)
- {
- assert (!var_has_vardict (v));
- mv_destroy (&v->miss);
- var_clear_short_names (v);
- val_labs_destroy (v->val_labs);
- var_set_label_quiet (v, NULL);
- attrset_destroy (var_get_attributes (v));
- free (v->name);
- ds_destroy (&v->name_and_label);
- free (v);
- }
+ if (--v->ref_cnt == 0)
+ var_destroy__ (v);
}
+
+
\f
/* Variable names. */
/* PSPP - a program for statistical analysis.
- Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2009, 2010, 2011, 2012, 2013,
+ 2014, 2020 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
instead. */
struct variable *var_create (const char *name, int width);
struct variable *var_clone (const struct variable *);
-void var_destroy (struct variable *);
+struct variable * var_ref (struct variable *) WARN_UNUSED_RESULT;
+void var_unref (struct variable *);
/* Variable names. */
const char *var_get_name (const struct variable *);