1 /* PSPP - computes sample statistics.
2 Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
3 Written by Ben Pfaff <blp@gnu.org>.
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
29 #include "missing-values.h"
31 /* Script variables. */
36 NUMERIC, /* A numeric variable. */
37 ALPHA /* A string variable. */
40 const char *var_type_adj (enum var_type);
41 const char *var_type_noun (enum var_type);
43 /* A variable's dictionary entry. */
46 /* Dictionary information. */
47 char name[LONG_NAME_LEN + 1]; /* Variable name. Mixed case. */
48 enum var_type type; /* NUMERIC or ALPHA. */
49 int width; /* Size of string variables in chars. */
50 struct missing_values miss; /* Missing values. */
51 struct fmt_spec print; /* Default format for PRINT. */
52 struct fmt_spec write; /* Default format for WRITE. */
53 struct val_labs *val_labs; /* Value labels. */
54 char *label; /* Variable label. */
55 enum measure measure; /* Nominal, ordinal, or continuous. */
56 int display_width; /* Width of data editor column. */
57 enum alignment alignment; /* Alignment of data in GUI. */
59 /* Case information. */
60 int fv, nv; /* Index into `value's, number of values. */
61 bool init; /* True if needs init and possibly reinit. */
62 bool reinit; /* True: reinitialize; false: leave. */
64 /* Data for use by containing dictionary. */
65 int index; /* Dictionary index. */
67 /* Short name, used only for system and portable file input
68 and output. Upper case only. There is no index for short
69 names. Short names are not necessarily unique. Any
70 variable may have no short name, indicated by an empty
72 char short_name[SHORT_NAME_LEN + 1];
74 /* Each command may use these fields as needed. */
76 void (*aux_dtor) (struct variable *);
78 /* Values of a categorical variable. Procedures need
79 vectors with binary entries, so any variable of type ALPHA will
80 have its values stored here. */
81 struct cat_vals *obs_vals;
85 bool var_is_valid_name (const char *, bool issue_error);
86 int compare_var_names (const void *, const void *, void *);
87 unsigned hash_var_name (const void *, void *);
90 void var_set_short_name (struct variable *, const char *);
91 void var_set_short_name_suffix (struct variable *, const char *, int suffix);
92 void var_clear_short_name (struct variable *);
94 /* Pointers to `struct variable', by name. */
95 int compare_var_ptr_names (const void *, const void *, void *);
96 unsigned hash_var_ptr_name (const void *, void *);
98 /* Variable auxiliary data. */
99 void *var_attach_aux (struct variable *,
100 void *aux, void (*aux_dtor) (struct variable *));
101 void var_clear_aux (struct variable *);
102 void *var_detach_aux (struct variable *);
103 void var_dtor_free (struct variable *);
105 /* Classes of variables. */
108 DC_ORDINARY, /* Ordinary identifier. */
109 DC_SYSTEM, /* System variable. */
110 DC_SCRATCH /* Scratch variable. */
113 enum dict_class dict_class_from_id (const char *name);
114 const char *dict_class_to_name (enum dict_class dict_class);
116 /* Vector of variables. */
119 int idx; /* Index for dict_get_vector(). */
120 char name[LONG_NAME_LEN + 1]; /* Name. */
121 struct variable **var; /* Vector of variables. */
122 int cnt; /* Number of variables. */
125 void discard_variables (void);
127 /* This is the active file dictionary. */
128 extern struct dictionary *default_dict;
130 /* Transformation state. */
132 /* PROCESS IF expression. */
133 extern struct expression *process_if_expr;
135 /* TEMPORARY support. */
137 /* 1=TEMPORARY has been executed at some point. */
138 extern int temporary;
140 /* If temporary!=0, the saved dictionary. */
141 extern struct dictionary *temp_dict;
143 /* If temporary!=0, index into t_trns[] (declared far below) that
144 gives the point at which data should be written out. -1 means that
145 the data shouldn't be changed since all transformations are
147 extern size_t temp_trns;
149 void cancel_temporary (void);
152 void dump_split_vars (const struct ccase *);
154 /* Transformations. */
156 /* trns_proc_func return values. */
157 #define TRNS_CONTINUE -1 /* Continue to next transformation. */
158 #define TRNS_DROP_CASE -2 /* Drop this case. */
159 #define TRNS_ERROR -3 /* A serious error, so stop the procedure. */
160 #define TRNS_NEXT_CASE -4 /* Skip to next case. INPUT PROGRAM only. */
161 #define TRNS_END_FILE -5 /* End of input. INPUT PROGRAM only. */
163 typedef int trns_proc_func (void *, struct ccase *, int);
164 typedef bool trns_free_func (void *);
166 /* A transformation. */
167 struct transformation
169 trns_proc_func *proc; /* Transformation proc. */
170 trns_free_func *free; /* Garbage collector proc. */
171 void *private; /* Private data. */
174 /* Array of transformations */
175 extern struct transformation *t_trns;
177 /* Number of transformations, maximum number in array currently. */
178 extern size_t n_trns, m_trns;
180 /* Index of first transformation that is really a transformation. Any
181 transformations before this belong to INPUT PROGRAM. */
182 extern size_t f_trns;
184 void add_transformation (trns_proc_func *, trns_free_func *, void *);
185 size_t next_transformation (void);
186 bool cancel_transformations (void);
190 struct var_set *var_set_create_from_dict (const struct dictionary *d);
191 struct var_set *var_set_create_from_array (struct variable *const *var,
194 size_t var_set_get_cnt (const struct var_set *vs);
195 struct variable *var_set_get_var (const struct var_set *vs, size_t idx);
196 struct variable *var_set_lookup_var (const struct var_set *vs,
198 bool var_set_lookup_var_idx (const struct var_set *vs, const char *name,
200 void var_set_destroy (struct var_set *vs);
202 /* Variable parsers. */
206 PV_NONE = 0, /* No options. */
207 PV_SINGLE = 0001, /* Restrict to a single name or TO use. */
208 PV_DUPLICATE = 0002, /* Don't merge duplicates. */
209 PV_APPEND = 0004, /* Append to existing list. */
210 PV_NO_DUPLICATE = 0010, /* Error on duplicates. */
211 PV_NUMERIC = 0020, /* Vars must be numeric. */
212 PV_STRING = 0040, /* Vars must be string. */
213 PV_SAME_TYPE = 00100, /* All vars must be the same type. */
214 PV_NO_SCRATCH = 00200 /* Disallow scratch variables. */
218 struct variable *parse_variable (void);
219 struct variable *parse_dict_variable (const struct dictionary *);
220 int parse_variables (const struct dictionary *, struct variable ***, size_t *,
222 int parse_var_set_vars (const struct var_set *, struct variable ***, size_t *,
224 int parse_DATA_LIST_vars (char ***names, size_t *cnt, int opts);
225 int parse_mixed_vars (char ***names, size_t *cnt, int opts);
226 int parse_mixed_vars_pool (struct pool *,
227 char ***names, size_t *cnt, int opts);
230 /* Return a string representing this variable, in the form most
231 appropriate from a human factors perspective.
232 (IE: the label if it has one, otherwise the name )
234 const char * var_to_string(const struct variable *var);
237 #endif /* !variable.h */