X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fvar.h;h=c1ad04c5ef2803560c8ce02bc27b681078b193ad;hb=0dfeb46aa388fae94797accde705a13d9ef7aff8;hp=71c645387b0c8bc8aa45f3211f265722b741d912;hpb=2381b300df6b6a2023d15cc3bce02db92039aa87;p=pspp diff --git a/src/var.h b/src/var.h index 71c645387b..c1ad04c5ef 100644 --- a/src/var.h +++ b/src/var.h @@ -22,54 +22,9 @@ #include #include "format.h" +#include "group_proc.h" +#include "val.h" -/* Values. */ - -/* Definition of the max length of a short string value, generally - eight characters. */ -#define MAX_SHORT_STRING ((SIZEOF_DOUBLE)>=8 ? ((SIZEOF_DOUBLE)+1)/2*2 : 8) -#define MIN_LONG_STRING (MAX_SHORT_STRING+1) - -/* 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]; - - /* This member is used by data-in.c to return a string result, - since it may need to return a long string. As currently - implemented, it's a pointer to a static internal buffer in - data-in.c. - - Also 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; - - /* Sometimes we insert value's in a hash table. */ - unsigned long hash[SIZEOF_DOUBLE / SIZEOF_LONG]; - }; - /* Frequency tables. */ /* Frequency table entry. */ @@ -129,32 +84,6 @@ struct crosstab_proc }; -/* T-TEST private data */ -struct t_test_proc - { - double mean; - - double std_dev; - - /* count */ - double n; - - double sum; - - /* Sum of squares */ - double ssq; - - /* Std Err of Mean */ - double se_mean; - - /* Sum of differnces */ - double sum_diff; - - /* Mean of differences */ - double mean_diff ; - }; - - /* FREQUENCIES private data. */ enum { @@ -186,55 +115,12 @@ struct list_proc 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 { @@ -298,21 +184,17 @@ enum MISSING_COUNT }; -/* A variable's dictionary entry. Note: don't reorder name[] from the - first element; a pointer to `variable' should be a pointer to - member `name'.*/ +/* A variable's dictionary entry. */ struct variable { - /* Required by parse_variables() to be in this order. */ char name[9]; /* As a string. */ int index; /* Index into its dictionary's var[]. */ - int type; /* NUMERIC or ALPHA. */ + 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. */ - int left; /* 0=reinitialize each case, 1=don't. */ + unsigned init : 1; /* 1=VFM must init and possibly reinit. */ + unsigned reinit : 1; /* Cases are: 1=reinitialized; 0=left. */ /* Missing values. */ int miss_type; /* One of the MISSING_* constants. */ @@ -332,14 +214,12 @@ struct variable 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; + struct group_proc grp_data; } p; }; @@ -367,15 +247,6 @@ struct vector 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. */ @@ -394,11 +265,15 @@ void dict_get_vars (const struct dictionary *, 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 *, @@ -409,8 +284,10 @@ int dict_rename_vars (struct dictionary *, struct variable **, char **new_names, size_t count, char **err_name); +struct ccase; struct variable *dict_get_weight (const struct dictionary *); -double dict_get_case_weight (const struct dictionary *, const struct ccase *); +double dict_get_case_weight (const struct dictionary *, + const struct ccase *, int *); void dict_set_weight (struct dictionary *, struct variable *); struct variable *dict_get_filter (const struct dictionary *); @@ -419,8 +296,12 @@ 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_value_cnt (const struct dictionary *); +int dict_get_next_value_idx (const struct dictionary *); +size_t dict_get_case_size (const struct dictionary *); + void dict_compact_values (struct dictionary *); +size_t dict_get_compacted_value_cnt (const struct dictionary *); +int *dict_get_compacted_idx_to_fv (const struct dictionary *); struct variable *const *dict_get_split_vars (const struct dictionary *); size_t dict_get_split_cnt (const struct dictionary *); @@ -480,6 +361,7 @@ void cancel_temporary (void); /* Functions. */ 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 *); @@ -487,34 +369,19 @@ int is_missing (const union value *, const struct variable *); int is_system_missing (const union value *, const struct variable *); int is_user_missing (const union value *, const struct variable *); void copy_missing_values (struct variable *dest, const struct variable *src); - -#if GLOBAL_DEBUGGING -struct variable *force_create_variable (struct dictionary *, const char *name, - int type, int width); -struct variable *force_dup_variable (struct dictionary *, - const struct variable *src, - const char *name); -#else -#define force_create_variable(A, B, C, D) \ - create_variable (A, B, C, D) -#define force_dup_variable(A, B, C) \ - dup_variable (A, B, C) -#endif - /* 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 */ @@ -532,14 +399,15 @@ 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); void var_set_destroy (struct var_set *vs); - /* Variable parsers. */ @@ -553,16 +421,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 */