X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvariable.h;h=0b619a497ed1eefa04a1dac97ec4be20afac4b80;hb=8830c95bb9e8d72621787866141a27fc22e8c786;hp=479452411dc620471d061869f7e012cfb64d3666;hpb=985c40f2a83588b25f0e6fe7f7d82863c5d34d43;p=pspp-builds.git diff --git a/src/data/variable.h b/src/data/variable.h index 47945241..0b619a49 100644 --- a/src/data/variable.h +++ b/src/data/variable.h @@ -1,242 +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; -/* Script variables. */ +/* 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 type. */ -enum var_type + +/* 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); +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 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 *); +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); -/* Maximum variable name lengths. */ -#define SHORT_NAME_LEN 8 /* Short name length. */ -#define LONG_NAME_LEN 64 /* Long name length. */ +enum measure var_default_measure (enum val_type); -/* A variable's dictionary entry. */ -struct variable +/* 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 { - /* 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 init; /* True if needs init and possibly reinit. */ - bool reinit; /* True: reinitialize; false: leave. */ - - /* 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. */ - }; - -void discard_variables (void); - -/* This is the active file dictionary. */ -extern struct dictionary *default_dict; - -/* Transformation state. */ - -/* PROCESS IF expression. */ -extern struct expression *process_if_expr; - -/* TEMPORARY support. */ - -/* 1=TEMPORARY has been executed at some point. */ -extern int temporary; - -/* If temporary!=0, the saved dictionary. */ -extern struct dictionary *temp_dict; - -/* If temporary!=0, index into t_trns[] (declared far below) that - gives the point at which data should be written out. -1 means that - the data shouldn't be changed since all transformations are - temporary. */ -extern size_t temp_trns; - -void cancel_temporary (void); - -struct ccase; -void dump_split_vars (const struct ccase *); - -/* Transformations. */ - -/* trns_proc_func return values. */ -#define TRNS_CONTINUE -1 /* Continue to next transformation. */ -#define TRNS_DROP_CASE -2 /* Drop this case. */ -#define TRNS_ERROR -3 /* A serious error, so stop the procedure. */ -#define TRNS_NEXT_CASE -4 /* Skip to next case. INPUT PROGRAM only. */ -#define TRNS_END_FILE -5 /* End of input. INPUT PROGRAM only. */ - -typedef int trns_proc_func (void *, struct ccase *, int); -typedef bool trns_free_func (void *); - -/* A transformation. */ -struct transformation - { - trns_proc_func *proc; /* Transformation proc. */ - trns_free_func *free; /* Garbage collector proc. */ - void *private; /* Private data. */ - }; - -/* Array of transformations */ -extern struct transformation *t_trns; - -/* Number of transformations, maximum number in array currently. */ -extern size_t n_trns, m_trns; - -/* Index of first transformation that is really a transformation. Any - transformations before this belong to INPUT PROGRAM. */ -extern size_t f_trns; - -void add_transformation (trns_proc_func *, trns_free_func *, void *); -size_t next_transformation (void); -bool cancel_transformations (void); - -struct var_set; - -struct var_set *var_set_create_from_dict (const struct dictionary *d); -struct var_set *var_set_create_from_array (struct variable *const *var, - size_t); - -size_t var_set_get_cnt (const struct var_set *vs); -struct variable *var_set_get_var (const struct var_set *vs, size_t idx); -struct variable *var_set_lookup_var (const struct var_set *vs, - const char *name); -bool var_set_lookup_var_idx (const struct var_set *vs, const char *name, - size_t *idx); -void var_set_destroy (struct var_set *vs); - -/* Variable parsers. */ - -enum - { - PV_NONE = 0, /* No options. */ - PV_SINGLE = 0001, /* Restrict to a single name or TO use. */ - PV_DUPLICATE = 0002, /* Don't merge duplicates. */ - PV_APPEND = 0004, /* Append to existing list. */ - PV_NO_DUPLICATE = 0010, /* Error on duplicates. */ - PV_NUMERIC = 0020, /* Vars must be numeric. */ - PV_STRING = 0040, /* Vars must be string. */ - PV_SAME_TYPE = 00100, /* All vars must be the same type. */ - PV_NO_SCRATCH = 00200 /* Disallow scratch variables. */ - }; - -struct pool; -struct variable *parse_variable (void); -struct variable *parse_dict_variable (const struct dictionary *); -int parse_variables (const struct dictionary *, struct variable ***, size_t *, - int opts); -int parse_var_set_vars (const struct var_set *, struct variable ***, size_t *, - int opts); -int parse_DATA_LIST_vars (char ***names, size_t *cnt, int opts); -int parse_mixed_vars (char ***names, size_t *cnt, int opts); -int parse_mixed_vars_pool (struct pool *, - char ***names, size_t *cnt, int opts); - +/* 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 *); -/* 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); +/* 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 */