X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcategory.c;h=ac8664c4ce72723a58b39920e5332dfe8bbe0efb;hb=a11762f51d86a173ebf187434a4ecf87ba97ab3f;hp=21506ed8b5d0af64b2d2dc0e538776d9db27a78e;hpb=888d0f91d57e0c3c5a4206c30ac71eb87bf44227;p=pspp-builds.git diff --git a/src/data/category.c b/src/data/category.c index 21506ed8..ac8664c4 100644 --- a/src/data/category.c +++ b/src/data/category.c @@ -1,6 +1,5 @@ /* PSPP - binary encodings for categorical variables. Copyright (C) 2005 Free Software Foundation, Inc. - Written by Jason H Stover . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -33,46 +32,57 @@ */ #include -#include "category.h" - #include #include #include #include #include -#include "cat-routines.h" +#include "category.h" +#include "value.h" #include "variable.h" +#define CAT_VALUE_NOT_FOUND -2 + #define N_INITIAL_CATEGORIES 1 +/* + This structure contains the observed values of a + categorical variable. + */ +struct cat_vals +{ + union value *vals; + size_t n_categories; + size_t n_allocated_categories; /* This is used only during + initialization to keep + track of the number of + values stored. + */ +}; + void -cat_stored_values_create (struct variable *v) +cat_stored_values_create (const struct variable *v) { - if (v->obs_vals == NULL) + if (!var_has_obs_vals (v)) { - v->obs_vals = xmalloc (sizeof (*v->obs_vals)); - v->obs_vals->n_categories = 0; - v->obs_vals->n_allocated_categories = N_INITIAL_CATEGORIES; - v->obs_vals->vals = - xnmalloc (N_INITIAL_CATEGORIES, sizeof *v->obs_vals->vals); + struct cat_vals *obs_vals = xmalloc (sizeof *obs_vals); + + obs_vals->n_categories = 0; + obs_vals->n_allocated_categories = N_INITIAL_CATEGORIES; + obs_vals->vals = xnmalloc (N_INITIAL_CATEGORIES, sizeof *obs_vals->vals); + var_set_obs_vals (v, obs_vals); } } void -cat_stored_values_destroy (struct variable *v) +cat_stored_values_destroy (struct cat_vals *obs_vals) { - assert (v != NULL); - - if (v->obs_vals != NULL) + if (obs_vals != NULL) { - if (v->obs_vals->n_allocated_categories > 0) - { - free (v->obs_vals->vals); - v->obs_vals->vals = NULL; - } - free (v->obs_vals); - v->obs_vals = NULL; + if (obs_vals->n_allocated_categories > 0) + free (obs_vals->vals); + free (obs_vals); } } @@ -82,15 +92,13 @@ cat_stored_values_destroy (struct variable *v) size_t cat_value_find (const struct variable *v, const union value *val) { + struct cat_vals *obs_vals = var_get_obs_vals (v); size_t i; const union value *candidate; - assert (val != NULL); - assert (v != NULL); - assert (v->obs_vals != NULL); - for (i = 0; i < v->obs_vals->n_categories; i++) + for (i = 0; i < obs_vals->n_categories; i++) { - candidate = v->obs_vals->vals + i; + candidate = obs_vals->vals + i; assert (candidate != NULL); if (!compare_values (candidate, val, var_get_width (v))) { @@ -104,15 +112,11 @@ cat_value_find (const struct variable *v, const union value *val) Add the new value unless it is already present. */ void -cat_value_update (struct variable *v, const union value *val) +cat_value_update (const struct variable *v, const union value *val) { - struct cat_vals *cv; - if (var_is_alpha (v)) { - assert (val != NULL); - assert (v != NULL); - cv = v->obs_vals; + struct cat_vals *cv = var_get_obs_vals (v); if (cat_value_find (v, val) == CAT_VALUE_NOT_FOUND) { if (cv->n_categories >= cv->n_allocated_categories) @@ -128,18 +132,11 @@ cat_value_update (struct variable *v, const union value *val) } } -union value * -cat_subscript_to_value (const size_t s, struct variable *v) +const union value * +cat_subscript_to_value (const size_t s, const struct variable *v) { - assert (v->obs_vals != NULL); - if (s < v->obs_vals->n_categories) - { - return (v->obs_vals->vals + s); - } - else - { - return NULL; - } + struct cat_vals *obs_vals = var_get_obs_vals (v); + return s < obs_vals->n_categories ? obs_vals->vals + s : NULL; } /* @@ -148,6 +145,6 @@ cat_subscript_to_value (const size_t s, struct variable *v) size_t cat_get_n_categories (const struct variable *v) { - return v->obs_vals->n_categories; + return var_get_obs_vals (v)->n_categories; }