X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fvariable.h;h=0178b908faa5bc951aba229f4766d79bb6617abe;hb=f5c108becd49d78f4898cab11352291f5689d24e;hp=479452411dc620471d061869f7e012cfb64d3666;hpb=985c40f2a83588b25f0e6fe7f7d82863c5d34d43;p=pspp-builds.git diff --git a/src/data/variable.h b/src/data/variable.h index 47945241..0178b908 100644 --- a/src/data/variable.h +++ b/src/data/variable.h @@ -1,6 +1,5 @@ /* PSPP - computes sample statistics. Copyright (C) 1997-9, 2000 Free Software Foundation, Inc. - Written by Ben Pfaff . This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -20,95 +19,155 @@ #if !variable_h #define variable_h 1 - #include -#include "config.h" #include -#include "category.h" -#include "format.h" -#include "missing-values.h" +#include -/* Script variables. */ +union value; /* Variable type. */ enum var_type { - NUMERIC, /* A numeric variable. */ - ALPHA /* A string variable. */ + VAR_NUMERIC, /* A numeric variable. */ + VAR_STRING /* A string variable. */ }; -const char *var_type_adj (enum var_type); -const char *var_type_noun (enum var_type); +bool var_type_is_valid (enum var_type); +enum var_type var_type_from_width (int width); -/* Maximum variable name lengths. */ -#define SHORT_NAME_LEN 8 /* Short name length. */ -#define LONG_NAME_LEN 64 /* Long name length. */ +/* Variables. */ +struct variable *var_create (const char *name, int width); +struct variable *var_clone (const struct variable *); +void var_destroy (struct variable *); -/* A variable's dictionary entry. */ -struct variable - { - /* 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; - }; +/* Variable names. + Long variable names can be used in most contexts, but a few + procedures and file formats are limited to short names. */ +#define SHORT_NAME_LEN 8 +#define LONG_NAME_LEN 64 -/* Variable names. */ +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 *, void *); -unsigned hash_var_name (const void *, void *); + +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 *); + +/* Variable types and widths. */ +enum var_type var_get_type (const struct variable *); +int var_get_width (const struct variable *); +void var_set_width (struct variable *, int width); + +typedef bool var_predicate_func (const struct variable *); + +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 *); +size_t var_get_value_cnt (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 struct val_labs *var_get_value_labels (const struct variable *); +bool var_has_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 *); +const char *var_lookup_value_label (const struct variable *, + const union value *); +const char *var_get_value_name (const struct variable *, const union value *); + +/* 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 *); + +/* 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 + { + 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); + +/* GUI display width. */ +int var_get_display_width (const struct variable *); +void var_set_display_width (struct variable *, int display_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); + +/* 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 *); -/* 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 *); +/* 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 *); + /* Classes of variables. */ -enum dict_class +enum dict_class { DC_ORDINARY, /* Ordinary identifier. */ DC_SYSTEM, /* System variable. */ @@ -117,126 +176,5 @@ enum dict_class 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); - - -/* 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); - #endif /* !variable.h */