X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvariable.h;h=0b619a497ed1eefa04a1dac97ec4be20afac4b80;hb=8830c95bb9e8d72621787866141a27fc22e8c786;hp=685c5104a22a4dbd8f21497fa99383c9d961bb80;hpb=ade89522516fe8cc47299d8da6e28e129d96de94;p=pspp-builds.git diff --git a/src/data/variable.h b/src/data/variable.h index 685c5104..0b619a49 100644 --- a/src/data/variable.h +++ b/src/data/variable.h @@ -1,130 +1,64 @@ -/* PSPP - computes sample statistics. - Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by Ben Pfaff . +/* PSPP - a program for statistical analysis. + Copyright (C) 1997-9, 2000, 2009 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 the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. + 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 + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ - -#if !variable_h -#define variable_h 1 + along with this program. If not, see . */ +#ifndef DATA_VARIABLE_H +#define DATA_VARIABLE_H 1 #include -#include "config.h" #include -#include "category.h" -#include "format.h" -#include "missing-values.h" - -/* Variable type. */ -enum var_type - { - NUMERIC, /* A numeric variable. */ - ALPHA /* A string variable. */ - }; +#include +#include +#include -bool var_type_is_valid (enum var_type); -const char *var_type_adj (enum var_type); -const char *var_type_noun (enum var_type); +union value; -/* Alignment of data for display. */ -enum alignment - { - ALIGN_LEFT = 0, - ALIGN_RIGHT = 1, - ALIGN_CENTRE = 2, - n_ALIGN - }; +/* Variables. + These functions should rarely be called directly: use + dict_create_var, dict_clone_var, or dict_delete_var + 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_create_internal (int case_idx, int width); -bool alignment_is_valid (enum alignment); - -/* How data is measured. */ -enum measure - { - MEASURE_NOMINAL = 1, - MEASURE_ORDINAL = 2, - MEASURE_SCALE = 3, - n_MEASURES - }; - -bool measure_is_valid (enum measure); - -/* Maximum lengths of short and long variable names. - Most operations support long variable names, - but some file formats are limited to short names. */ -#define SHORT_NAME_LEN 8 /* Short name length. */ -#define LONG_NAME_LEN 64 /* Long name length. */ - -/* A variable's dictionary entry. */ -struct variable - { - /* Dictionary information. */ - char name[LONG_NAME_LEN + 1]; /* Variable name. Mixed case. */ - int width; /* 0 for numeric, otherwise string width. */ - struct missing_values miss; /* Missing values. */ - struct fmt_spec print; /* Default format for PRINT. */ - struct fmt_spec write; /* Default format for WRITE. */ - struct val_labs *val_labs; /* Value labels. */ - char *label; /* Variable label. */ - - /* GUI information. */ - enum measure measure; /* Nominal, ordinal, or continuous. */ - int display_width; /* Width of data editor column. */ - enum alignment alignment; /* Alignment of data in GUI. */ - - /* Case information. */ - int fv; /* Index into `value's. */ - bool leave; /* Leave value from case to case? */ - - /* Data for use by containing dictionary. */ - int index; /* Dictionary index. */ - - /* Short name, used only for system and portable file input - and output. Upper case only. There is no index for short - names. Short names are not necessarily unique. Any - variable may have no short name, indicated by an empty - string. */ - char short_name[SHORT_NAME_LEN + 1]; - - /* Each command may use these fields as needed. */ - void *aux; - void (*aux_dtor) (struct variable *); - - /* Values of a categorical variable. Procedures need - vectors with binary entries, so any variable of type ALPHA will - have its values stored here. */ - struct cat_vals *obs_vals; - }; /* Variable names. */ +#define VAR_NAME_LEN 64 /* Maximum length of variable name, in bytes. */ + const char *var_get_name (const struct variable *); void var_set_name (struct variable *, const char *); bool var_is_valid_name (const char *, bool issue_error); bool var_is_plausible_name (const char *name, bool issue_error); -int compare_var_names (const void *, const void *, const void *); -unsigned hash_var_name (const void *, const void *); +enum dict_class var_get_dict_class (const struct variable *); + +int compare_vars_by_name (const void *, const void *, const void *); +unsigned hash_var_by_name (const void *, const void *); + +int compare_var_ptrs_by_name (const void *, const void *, const void *); +unsigned hash_var_ptr_by_name (const void *, const void *); + +int compare_var_ptrs_by_dict_index (const void *, const void *, const void *); -/* Variable types and widths. */ -enum var_type var_get_type (const struct variable *); +/* Types and widths of values associated with a variable. */ +enum val_type var_get_type (const struct variable *); int var_get_width (const struct variable *); void var_set_width (struct variable *, int width); + bool var_is_numeric (const struct variable *); bool var_is_alpha (const struct variable *); -bool var_is_short_string (const struct variable *); -bool var_is_long_string (const struct variable *); -bool var_is_very_long_string (const struct variable *); /* Variables' missing values. */ const struct missing_values *var_get_missing_values (const struct variable *); @@ -132,17 +66,31 @@ void var_set_missing_values (struct variable *, const struct missing_values *); void var_clear_missing_values (struct variable *); bool var_has_missing_values (const struct variable *); -typedef bool var_is_missing_func (const struct variable *, - const union value *); -bool var_is_value_missing (const struct variable *, const union value *); -bool var_is_num_missing (const struct variable *, double); -bool var_is_str_missing (const struct variable *, const char[]); -bool var_is_value_user_missing (const struct variable *, - const union value *); -bool var_is_num_user_missing (const struct variable *, double); -bool var_is_str_user_missing (const struct variable *, const char[]); -bool var_is_value_system_missing (const struct variable *, - const union value *); +bool var_is_value_missing (const struct variable *, const union value *, + enum mv_class); +bool var_is_num_missing (const struct variable *, double, enum mv_class); +bool var_is_str_missing (const struct variable *, const uint8_t[], enum mv_class); + +/* Value labels. */ +const char *var_lookup_value_label (const struct variable *, + const union value *); +struct string; +void var_append_value_name (const struct variable *, const union value *, + struct string *); + +const char * +var_get_value_name (const struct variable *v, const union value *value); + + +bool var_has_value_labels (const struct variable *); +const struct val_labs *var_get_value_labels (const struct variable *); +void var_set_value_labels (struct variable *, const struct val_labs *); + +bool var_add_value_label (struct variable *, + const union value *, const char *); +void var_replace_value_label (struct variable *, + const union value *, const char *); +void var_clear_value_labels (struct variable *); /* Print and write formats. */ const struct fmt_spec *var_get_print_format (const struct variable *); @@ -151,77 +99,86 @@ const struct fmt_spec *var_get_write_format (const struct variable *); void var_set_write_format (struct variable *, const struct fmt_spec *); void var_set_both_formats (struct variable *, const struct fmt_spec *); +struct fmt_spec var_default_formats (int width); + /* Variable labels. */ +const char *var_to_string (const struct variable *); const char *var_get_label (const struct variable *); void var_set_label (struct variable *, const char *); void var_clear_label (struct variable *); bool var_has_label (const struct variable *); -/* GUI information. */ +/* How data is measured. */ +enum measure + { + MEASURE_NOMINAL = 0, + MEASURE_ORDINAL = 1, + MEASURE_SCALE = 2, + n_MEASURES + }; + +bool measure_is_valid (enum measure); enum measure var_get_measure (const struct variable *); void var_set_measure (struct variable *, enum measure); +enum measure var_default_measure (enum val_type); + +/* GUI display width. */ int var_get_display_width (const struct variable *); void var_set_display_width (struct variable *, int display_width); +int var_default_display_width (int width); + +/* Alignment of data for display. */ +enum alignment + { + ALIGN_LEFT = 0, + ALIGN_RIGHT = 1, + ALIGN_CENTRE = 2, + n_ALIGN + }; + +bool alignment_is_valid (enum alignment); enum alignment var_get_alignment (const struct variable *); void var_set_alignment (struct variable *, enum alignment); -/* Variable location in cases. */ -size_t var_get_value_cnt (const struct variable *); +enum alignment var_default_alignment (enum val_type); /* Whether variables' values should be preserved from case to case. */ bool var_get_leave (const struct variable *); +void var_set_leave (struct variable *, bool leave); +bool var_must_leave (const struct variable *); /* Short names. */ -const char *var_get_short_name (const struct variable *); -void var_set_short_name (struct variable *, const char *); -void var_set_short_name_suffix (struct variable *, const char *, int suffix); -void var_clear_short_name (struct variable *); +size_t var_get_short_name_cnt (const struct variable *); +const char *var_get_short_name (const struct variable *, size_t idx); +void var_set_short_name (struct variable *, size_t, const char *); +void var_clear_short_names (struct variable *); -/* Pointers to `struct variable', by name. */ -int compare_var_ptr_names (const void *, const void *, const void *); -unsigned hash_var_ptr_name (const void *, const void *); +/* Relationship with dictionary. */ +size_t var_get_dict_index (const struct variable *); +size_t var_get_case_index (const struct variable *); /* Variable auxiliary data. */ -void *var_attach_aux (struct variable *, +void *var_get_aux (const struct variable *); +void *var_attach_aux (const struct variable *, void *aux, void (*aux_dtor) (struct variable *)); void var_clear_aux (struct variable *); void *var_detach_aux (struct variable *); void var_dtor_free (struct variable *); -/* Classes of variables. */ -enum dict_class - { - DC_ORDINARY, /* Ordinary identifier. */ - DC_SYSTEM, /* System variable. */ - DC_SCRATCH /* Scratch variable. */ - }; - -enum dict_class dict_class_from_id (const char *name); -const char *dict_class_to_name (enum dict_class dict_class); - -/* Vector of variables. */ -struct vector - { - int idx; /* Index for dict_get_vector(). */ - char name[LONG_NAME_LEN + 1]; /* Name. */ - struct variable **var; /* Vector of variables. */ - int cnt; /* Number of variables. */ - }; - - -/* Return a string representing this variable, in the form most - appropriate from a human factors perspective. - (IE: the label if it has one, otherwise the name ) -*/ -const char * var_to_string(const struct variable *var); - - -int width_to_bytes(int width); +/* Observed categorical values. */ +struct cat_vals *var_get_obs_vals (const struct variable *); +void var_set_obs_vals (const struct variable *, struct cat_vals *); +bool var_has_obs_vals (const struct variable *); -union value * value_dup (const union value *val, int width); +/* Custom attributes. */ +struct attrset *var_get_attributes (const struct variable *); +void var_set_attributes (struct variable *, const struct attrset *); +bool var_has_attributes (const struct variable *); +/* Function types. */ +typedef bool var_predicate_func (const struct variable *); -#endif /* !variable.h */ +#endif /* data/variable.h */