X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fdictionary.c;h=6e6ab1edb4b1b0654390855fc2990a4599876596;hb=844259de34f3b5ed9c1b4a024da63f96f4f2194e;hp=bca92dabe300b4c34439845c47abf485c900a778;hpb=fd674641880b82597fa35492207f189136e83fbb;p=pspp diff --git a/src/data/dictionary.c b/src/data/dictionary.c index bca92dabe3..6e6ab1edb4 100644 --- a/src/data/dictionary.c +++ b/src/data/dictionary.c @@ -1474,4 +1474,52 @@ dict_var_display_width_changed (const struct variable *v) d->callbacks->var_display_width_changed (d, var_get_dict_index (v), d->cb_data); } } + +/* Dictionary used to contain "internal variables". */ +static struct dictionary *internal_dict; + +/* Create a variable of the specified WIDTH to be used for internal + calculations only. The variable is assigned case index CASE_IDX. */ +struct variable * +dict_create_internal_var (int case_idx, int width) +{ + if (internal_dict == NULL) + internal_dict = dict_create (); + + for (;;) + { + static int counter = INT_MAX / 2; + struct variable *var; + char name[64]; + + if (++counter == INT_MAX) + counter = INT_MAX / 2; + + sprintf (name, "$internal%d", counter); + var = dict_create_var (internal_dict, name, width); + if (var != NULL) + { + set_var_case_index (var, case_idx); + return var; + } + } +} + +/* Destroys VAR, which must have been created with + dict_create_internal_var(). */ +void +dict_destroy_internal_var (struct variable *var) +{ + if (var != NULL) + { + dict_delete_var (internal_dict, var); + /* Destroy internal_dict if it has no variables left, just so that + valgrind --leak-check --show-reachable won't show internal_dict. */ + if (dict_get_var_cnt (internal_dict) == 0) + { + dict_destroy (internal_dict); + internal_dict = NULL; + } + } +}