X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvariable.h;h=5d28d5b8940234846d47dc1abf5419cd443beb7d;hb=04c88b897db0d2281faa2829ed57b0f344395b8a;hp=8668119b35f511667ea3661a5317727d49fdf869;hpb=e9aa6e433b846849da90550f6800095d569fb549;p=pspp-builds.git diff --git a/src/data/variable.h b/src/data/variable.h index 8668119b..5d28d5b8 100644 --- a/src/data/variable.h +++ b/src/data/variable.h @@ -1,140 +1,184 @@ -/* 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" +#include +#include +#include + +union value; + +/* 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); + + +/* Variable names. */ +#define VAR_NAME_LEN 64 /* Maximum length of variable name, in bytes. */ -/* Variable type. */ -enum var_type +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); +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 *); + +/* 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 *); + +/* Variables' missing values. */ +const struct missing_values *var_get_missing_values (const struct variable *); +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 *); + +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 char[], 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 *); +void var_set_print_format (struct variable *, const struct fmt_spec *); +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 *); + +/* How data is measured. */ +enum measure { - NUMERIC, /* A numeric variable. */ - ALPHA /* A string variable. */ + MEASURE_NOMINAL = 0, + MEASURE_ORDINAL = 1, + MEASURE_SCALE = 2, + n_MEASURES }; -const char *var_type_adj (enum var_type); -const char *var_type_noun (enum var_type); +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); -/* 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. */ +/* GUI display width. */ +int var_get_display_width (const struct variable *); +void var_set_display_width (struct variable *, int display_width); -/* A variable's dictionary entry. */ -struct variable +int var_default_display_width (int width); + +/* Alignment of data for display. */ +enum alignment { - /* Dictionary information. */ - char name[LONG_NAME_LEN + 1]; /* Variable name. Mixed case. */ - enum var_type type; /* NUMERIC or ALPHA. */ - int width; /* Size of string variables in chars. */ - 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. */ - 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, nv; /* Index into `value's, number of values. */ - 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; + ALIGN_LEFT = 0, + ALIGN_RIGHT = 1, + ALIGN_CENTRE = 2, + n_ALIGN }; -/* Variable names. */ -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 *, void *); -unsigned hash_var_name (const void *, void *); +bool alignment_is_valid (enum alignment); +enum alignment var_get_alignment (const struct variable *); +void var_set_alignment (struct variable *, enum alignment); + +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. */ -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 *, void *); -unsigned hash_var_ptr_name (const void *, 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); - +/* 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 *); -int width_to_bytes(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 */