#include <stddef.h>
#include "format.h"
-#include "t-test.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;
+#include "group_proc.h"
+#include "val.h"
- /* Sometimes we insert value's in a hash table. */
- unsigned long hash[SIZEOF_DOUBLE / SIZEOF_LONG];
- };
-\f
/* Frequency tables. */
/* Frequency table entry. */
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
{
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. */
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;
};
int cnt; /* Number of variables. */
};
\f
-/* 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];
- };
-\f
/* Dictionary. */
/* Complete dictionary state. */
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 **, 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 *);
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 *);
/* 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 *);
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
-
\f
/* 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 */
\f
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);
-
\f
/* Variable parsers. */
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);