X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvar.h;h=63296b9f4b35c6554e3c244c12d9c934a05b2110;hb=e35ff8ccb29404f2098e6f2fccace1c99c61b7be;hp=fc9827d93b94785661a27a2c08a57884ac2e873e;hpb=6f972e0ef93c3a7e00fd5335ea22af2c878f4589;p=pspp-builds.git diff --git a/src/var.h b/src/var.h index fc9827d9..63296b9f 100644 --- a/src/var.h +++ b/src/var.h @@ -20,229 +20,15 @@ #if !var_h #define var_h 1 + #include +#include "config.h" +#include "bool.h" #include "format.h" -#include "t-test.h" - -/* Values. */ - -/* Max length of a short string value, generally 8 chars. */ -#define MAX_SHORT_STRING ((SIZEOF_DOUBLE)>=8 ? ((SIZEOF_DOUBLE)+1)/2*2 : 8) -#define MIN_LONG_STRING (MAX_SHORT_STRING+1) - -/* Max string length. */ -#define MAX_STRING 255 - -/* FYI: It is a bad situation if sizeof(flt64) < MAX_SHORT_STRING: - then short string missing values can be truncated in system files - because there's only room for as many characters as can fit in a - flt64. */ -#if MAX_SHORT_STRING > 8 -#error MAX_SHORT_STRING must be less than 8. -#endif - -/* Special values. */ -#define SYSMIS (-DBL_MAX) -#define LOWEST second_lowest_value -#define HIGHEST DBL_MAX - -/* Describes one value, which is either a floating-point number or a - short string. */ -union value - { - /* A numeric value. */ - double f; - - /* A short-string value. */ - unsigned char s[MAX_SHORT_STRING]; - - /* Used by evaluate_expression() to return a string result. - As currently implemented, it's a pointer to a dynamic - buffer in the appropriate expression. - - Also used by the AGGREGATE procedure in handling string - values. */ - unsigned char *c; - }; - -/* Maximum number of `union value's in a single number or string - value. */ -#define MAX_ELEMS_PER_VALUE (MAX_STRING / sizeof (union value) + 1) - -int compare_values (union value *a, union value *b, int width); - -/* Frequency tables. */ - -/* Frequency table entry. */ -struct freq - { - union value v; /* The value. */ - double c; /* The number of occurrences of the value. */ - }; - -/* Types of frequency tables. */ -enum - { - FRQM_GENERAL, - FRQM_INTEGER - }; - -/* Entire frequency table. */ -struct freq_tab - { - int mode; /* FRQM_GENERAL or FRQM_INTEGER. */ - - /* General mode. */ - struct hsh_table *data; /* Undifferentiated data. */ - - /* Integer mode. */ - double *vector; /* Frequencies proper. */ - int min, max; /* The boundaries of the table. */ - double out_of_range; /* Sum of weights of out-of-range values. */ - double sysmis; /* Sum of weights of SYSMIS values. */ - - /* All modes. */ - struct freq *valid; /* Valid freqs. */ - int n_valid; /* Number of total freqs. */ +#include "val.h" - struct freq *missing; /* Missing freqs. */ - int n_missing; /* Number of missing freqs. */ - /* Statistics. */ - double total_cases; /* Sum of weights of all cases. */ - double valid_cases; /* Sum of weights of valid cases. */ - }; - -/* Procedures' private per-variable data. */ - -/* Structure name suffixes for private data: - _proc: for a procedure (i.e., LIST -> list_proc). - _trns: for a transformation (i.e., COMPUTE -> compute_trns. - _pgm: for an input program (i.e., DATA LIST -> data_list_pgm). */ - -/* CROSSTABS private data. */ -struct crosstab_proc - { - /* Integer mode only. */ - int min; /* Minimum value. */ - int max; /* Maximum value + 1. */ - int count; /* max - min. */ - }; - - -/* FREQUENCIES private data. */ -enum - { - frq_mean = 0, frq_semean, frq_median, frq_mode, frq_stddev, frq_variance, - frq_kurt, frq_sekurt, frq_skew, frq_seskew, frq_range, frq_min, frq_max, - frq_sum, frq_n_stats - }; - -struct frequencies_proc - { - int used; /* 1=This variable already used. */ - - /* Freqency table. */ - struct freq_tab tab; /* Frequencies table to use. */ - - /* Percentiles. */ - int n_groups; /* Number of groups. */ - double *groups; /* Groups. */ - - /* Statistics. */ - double stat[frq_n_stats]; - }; - -/* LIST private data. */ -struct list_proc - { - int newline; /* Whether a new line begins here. */ - int width; /* Field width. */ - int vert; /* Whether to print the varname vertically. */ - }; - -/* DESCRIPTIVES private data. Note that the DESCRIPTIVES procedure also - has a transformation, descriptives_trns. */ -enum - { - /* As these are used as bit indexes, there must be 32 or fewer. - Be very careful in adjusting these, see the structure below - and the table in descriptives.q. */ - dsc_mean = 0, dsc_semean, dsc_stddev, dsc_variance, dsc_kurt, - dsc_sekurt, dsc_skew, dsc_seskew, dsc_range, dsc_min, - dsc_max, dsc_sum, dsc_n_stats - }; - -struct descriptives_proc - { - /* Miscellaneous. */ - int dup; /* Finds duplicates in list of - variables. */ - char zname[10]; /* Name for z-score variable. */ - /* Counts. */ - double valid, miss; /* Valid, missing--general. */ - - /* Mean, moments about the mean. */ - double X_bar, M2, M3, M4; - double min, max; - - /* Statistics. */ - double stats[dsc_n_stats]; /* Everything glommed together. */ - }; - -/* GET private data. */ -struct get_proc - { - int fv, nv; /* First, # of values. */ - }; - -/* Sort order. */ -enum - { - SRT_ASCEND, /* A, B, C, ..., X, Y, Z. */ - SRT_DESCEND /* Z, Y, X, ..., C, B, A. */ - }; - -/* SORT CASES private data. */ -struct sort_cases_proc - { - int order; /* SRT_ASCEND or SRT_DESCEND. */ - }; - -/* MEANS private data. */ -struct means_proc - { - double min, max; /* Range for integer mode. */ - }; - -/* Different types of variables for MATRIX DATA procedure. Order is - important: these are used for sort keys. */ -enum - { - MXD_SPLIT, /* SPLIT FILE variables. */ - MXD_ROWTYPE, /* ROWTYPE_. */ - MXD_FACTOR, /* Factor variables. */ - MXD_VARNAME, /* VARNAME_. */ - MXD_CONTINUOUS, /* Continuous variables. */ - - MXD_COUNT - }; - -/* MATRIX DATA private data. */ -struct matrix_data_proc - { - int vartype; /* Variable type. */ - int subtype; /* Subtype. */ - }; - -/* MATCH FILES private data. */ -struct match_files_proc - { - struct variable *master; /* Corresponding master file variable. */ - }; - - /* Script variables. */ /* Variable type. */ @@ -253,8 +39,7 @@ enum }; /* Types of missing values. Order is significant, see - mis-val.c:parse_numeric(), sfm-read.c:sfm_read_dictionary() - sfm-write.c:sfm_write_dictionary(), + mis-val.c:parse_numeric(), sfm-read.c, sfm-write.c, sysfile-info.c:cmd_sysfile_info(), mis-val.c:copy_missing_values(), pfm-read.c:read_variables(), pfm-write.c:write_variables(), apply-dict.c:cmd_apply_dictionary(), and more (?). */ @@ -273,15 +58,15 @@ enum MISSING_COUNT }; + /* A variable's dictionary entry. */ struct variable { - char name[9]; /* As a string. */ + char name[SHORT_NAME_LEN + 1]; /* As a string. */ + char *longname; /* Pointer to entry in dictionary's table */ int index; /* Index into its dictionary's var[]. */ int type; /* NUMERIC or ALPHA. */ - /* Also important but parse_variables() doesn't need it. Still, - check before reordering. */ int width; /* Size of string variables in chars. */ int fv, nv; /* Index into `value's, number of values. */ unsigned init : 1; /* 1=VFM must init and possibly reinit. */ @@ -296,29 +81,48 @@ struct variable struct fmt_spec write; /* Default format for WRITE. */ /* Labels. */ - struct val_labs *val_labs; + struct val_labs *val_labs; /* Value labels. */ char *label; /* Variable label. */ - /* Per-procedure info. */ + + /* GUI display parameters */ + enum measure measure; /* Nominal ordinal or continuous */ + int display_width; /* Width of data editor column */ + enum alignment alignment; /* Alignment of data in gui */ + + /* Per-command info. */ void *aux; - struct get_proc get; - union - { - struct crosstab_proc crs; - struct descriptives_proc dsc; - struct frequencies_proc frq; - struct list_proc lst; - struct means_proc mns; - struct sort_cases_proc srt; - struct matrix_data_proc mxd; - struct match_files_proc mtf; - struct t_test_proc t_t; - } - p; + void (*aux_dtor) (struct variable *); }; -int compare_variables (const void *, const void *, void *); -unsigned hash_variable (const void *, void *); + +/* A tuple containing short names and longnames */ +struct name_table_entry +{ + char *longname; + char *name; +}; + +bool var_is_valid_name (const char *, bool issue_error); +int compare_var_names (const void *, const void *, void *); +unsigned hash_var_name (const void *, void *); + +/* Destroy and free up an nte */ +void free_nte(struct name_table_entry *nte); + + +unsigned hash_long_name (const void *e_, void *aux UNUSED) ; +int compare_long_names(const void *a_, const void *b_, void *aux); + + +int compare_var_ptr_names (const void *, const void *, void *); +unsigned hash_var_ptr_name (const void *, void *); + +void *var_attach_aux (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 @@ -335,91 +139,11 @@ const char *dict_class_to_name (enum dict_class dict_class); struct vector { int idx; /* Index for dict_get_vector(). */ - char name[9]; /* Name. */ + char name[SHORT_NAME_LEN + 1]; /* Name. */ struct variable **var; /* Vector of variables. */ int cnt; /* Number of variables. */ }; -/* Cases. */ - -/* A single case. (This doesn't need to be a struct anymore, but it - remains so for hysterical raisins.) */ -struct ccase - { - union value data[1]; - }; - -/* Dictionary. */ - -/* Complete dictionary state. */ -struct dictionary; - -struct dictionary *dict_create (void); -struct dictionary *dict_clone (const struct dictionary *); -void dict_clear (struct dictionary *); -void dict_destroy (struct dictionary *); - -size_t dict_get_var_cnt (const struct dictionary *); -struct variable *dict_get_var (const struct dictionary *, size_t idx); -void dict_get_vars (const struct dictionary *, - struct variable ***vars, size_t *cnt, - unsigned exclude_classes); - -struct variable *dict_create_var (struct dictionary *, const char *, - int width); -struct variable *dict_create_var_assert (struct dictionary *, const char *, - int width); -struct variable *dict_clone_var (struct dictionary *, const struct variable *, - const char *); -void dict_rename_var (struct dictionary *, struct variable *, const char *); - -struct variable *dict_lookup_var (const struct dictionary *, const char *); -struct variable *dict_lookup_var_assert (const struct dictionary *, - const char *); -int dict_contains_var (const struct dictionary *, const struct variable *); -void dict_delete_var (struct dictionary *, struct variable *); -void dict_delete_vars (struct dictionary *, - struct variable *const *, size_t count); -void dict_reorder_vars (struct dictionary *, - struct variable *const *, size_t count); -int dict_rename_vars (struct dictionary *, - struct variable **, char **new_names, - size_t count, char **err_name); - -struct variable *dict_get_weight (const struct dictionary *); -double dict_get_case_weight (const struct dictionary *, const struct ccase *); -void dict_set_weight (struct dictionary *, struct variable *); - -struct variable *dict_get_filter (const struct dictionary *); -void dict_set_filter (struct dictionary *, struct variable *); - -int dict_get_case_limit (const struct dictionary *); -void dict_set_case_limit (struct dictionary *, int); - -int dict_get_next_value_idx (const struct dictionary *); -size_t dict_get_case_size (const struct dictionary *); -void dict_compact_values (struct dictionary *); - -struct variable *const *dict_get_split_vars (const struct dictionary *); -size_t dict_get_split_cnt (const struct dictionary *); -void dict_set_split_vars (struct dictionary *, - struct variable *const *, size_t cnt); - -const char *dict_get_label (const struct dictionary *); -void dict_set_label (struct dictionary *, const char *); - -const char *dict_get_documents (const struct dictionary *); -void dict_set_documents (struct dictionary *, const char *); - -int dict_create_vector (struct dictionary *, - const char *name, - struct variable **, size_t cnt); -const struct vector *dict_get_vector (const struct dictionary *, - size_t idx); -size_t dict_get_vector_cnt (const struct dictionary *); -const struct vector *dict_lookup_vector (const struct dictionary *, - const char *name); -void dict_clear_vectors (struct dictionary *); void discard_variables (void); @@ -457,7 +181,9 @@ void cancel_temporary (void); /* Functions. */ +struct ccase; void dump_split_vars (const struct ccase *); +typedef int (* is_missing_func )(const union value *, const struct variable *); int is_num_user_missing (double, const struct variable *); int is_str_user_missing (const unsigned char[], const struct variable *); @@ -468,17 +194,16 @@ void copy_missing_values (struct variable *dest, const struct variable *src); /* Transformations. */ +struct trns_header; +typedef int trns_proc_func (struct trns_header *, struct ccase *, int); +typedef void trns_free_func (struct trns_header *); + /* Header for all transformations. */ struct trns_header { - /* Index into t_trns[]. */ - int index; - - /* Transformation proc. */ - int (*proc) (struct trns_header *, struct ccase *); - - /* Garbage collector proc. */ - void (*free) (struct trns_header *); + int index; /* Index into t_trns[]. */ + trns_proc_func *proc; /* Transformation proc. */ + trns_free_func *free; /* Garbage collector proc. */ }; /* Array of transformations */ @@ -496,14 +221,16 @@ void cancel_transformations (void); struct var_set; -struct var_set *var_set_create_from_dict (struct dictionary *d); -struct var_set *var_set_create_from_array (struct variable **var, size_t); +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 (struct var_set *vs); -struct variable *var_set_get_var (struct var_set *vs, size_t idx); -struct variable *var_set_lookup_var (struct var_set *vs, const char *name); +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); +int var_set_lookup_var_idx (const struct var_set *vs, const char *name); void var_set_destroy (struct var_set *vs); - /* Variable parsers. */ @@ -517,16 +244,25 @@ enum 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. */ + PV_NO_SCRATCH = 00200 /* Disallow scratch variables. */ }; struct variable *parse_variable (void); -struct variable *parse_dict_variable (struct dictionary *); -int parse_variables (struct dictionary *, struct variable ***, int *, +struct variable *parse_dict_variable (const struct dictionary *); +int parse_variables (const struct dictionary *, struct variable ***, int *, int opts); -int parse_var_set_vars (struct var_set *, struct variable ***, int *, +int parse_var_set_vars (const struct var_set *, struct variable ***, int *, int opts); int parse_DATA_LIST_vars (char ***names, int *cnt, int opts); int parse_mixed_vars (char ***names, int *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 /* !var_h */