#include <libpspp/compiler.h>
#include <libpspp/magic.h>
#include <libpspp/message.h>
+#include <libpspp/assertion.h>
#include <math/moments.h>
#include <output/manager.h>
#include <output/table.h>
static void free_dsc_proc (struct dsc_proc *);
/* Z-score functions. */
-static int try_name (struct dsc_proc *dsc, char *name);
-static int generate_z_varname (struct dsc_proc *dsc, char *z_name,
- const char *name, size_t *z_cnt);
+static bool try_name (const struct dictionary *dict,
+ struct dsc_proc *dsc, char *name);
+static bool generate_z_varname (const struct dictionary *dict,
+ struct dsc_proc *dsc, char *z_name,
+ const char *name, size_t *z_cnt);
static void dump_z_table (struct dsc_proc *);
-static void setup_z_trns (struct dsc_proc *);
+static void setup_z_trns (struct dsc_proc *, struct dataset *);
/* Procedure execution functions. */
static bool calc_descriptives (const struct ccase *first,
- const struct casefile *, void *dsc_);
+ const struct casefile *, void *dsc_,
+ const struct dataset *);
static void display (struct dsc_proc *dsc);
\f
/* Parser and outline. */
/* Handles DESCRIPTIVES. */
int
-cmd_descriptives (void)
+cmd_descriptives (struct dataset *ds)
{
+ struct dictionary *dict = dataset_dict (ds);
struct dsc_proc *dsc;
struct variable **vars = NULL;
size_t var_cnt = 0;
{
int i;
- if (!parse_variables (default_dict, &vars, &var_cnt,
+ if (!parse_variables (dataset_dict (ds), &vars, &var_cnt,
PV_APPEND | PV_NO_DUPLICATE | PV_NUMERIC))
goto error;
lex_error (NULL);
goto error;
}
- if (try_name (dsc, tokid))
+ if (try_name (dict, dsc, tokid))
{
strcpy (dsc->vars[dsc->var_cnt - 1].z_name, tokid);
z_cnt++;
for (i = 0; i < dsc->var_cnt; i++)
if (dsc->vars[i].z_name[0] == 0)
{
- if (!generate_z_varname (dsc, dsc->vars[i].z_name,
+ if (!generate_z_varname (dict, dsc, dsc->vars[i].z_name,
dsc->vars[i].v->name, &gen_cnt))
goto error;
z_cnt++;
dsc->vars[i].moments = moments_create (dsc->max_moment);
/* Data pass. */
- ok = multipass_procedure_with_splits (calc_descriptives, dsc);
+ ok = multipass_procedure_with_splits (ds, calc_descriptives, dsc);
/* Z-scoring! */
if (ok && z_cnt)
- setup_z_trns (dsc);
+ setup_z_trns (dsc, ds);
/* Done. */
free (vars);
\f
/* Z scores. */
-/* Returns 0 if NAME is a duplicate of any existing variable name or
- of any previously-declared z-var name; otherwise returns 1. */
-static int
-try_name (struct dsc_proc *dsc, char *name)
+/* Returns false if NAME is a duplicate of any existing variable name or
+ of any previously-declared z-var name; otherwise returns true. */
+static bool
+try_name (const struct dictionary *dict, struct dsc_proc *dsc, char *name)
{
size_t i;
- if (dict_lookup_var (default_dict, name) != NULL)
- return 0;
+ if (dict_lookup_var (dict, name) != NULL)
+ return false;
for (i = 0; i < dsc->var_cnt; i++)
if (!strcasecmp (dsc->vars[i].z_name, name))
- return 0;
- return 1;
+ return false;
+ return true;
}
/* Generates a name for a Z-score variable based on a variable
named VAR_NAME, given that *Z_CNT generated variable names are
- known to already exist. If successful, returns nonzero and
- copies the new name into Z_NAME. On failure, returns zero. */
-static int
-generate_z_varname (struct dsc_proc *dsc, char *z_name,
+ known to already exist. If successful, returns true and
+ copies the new name into Z_NAME. On failure, returns false. */
+static bool
+generate_z_varname (const struct dictionary *dict, struct dsc_proc *dsc, char *z_name,
const char *var_name, size_t *z_cnt)
{
char name[LONG_NAME_LEN + 1];
/* Try a name based on the original variable name. */
name[0] = 'Z';
str_copy_trunc (name + 1, sizeof name - 1, var_name);
- if (try_name (dsc, name))
+ if (try_name (dict, dsc, name))
{
strcpy (z_name, name);
- return 1;
+ return true;
}
/* Generate a synthetic name. */
msg (SE, _("Ran out of generic names for Z-score variables. "
"There are only 126 generic names: ZSC001-ZSC0999, "
"STDZ01-STDZ09, ZZZZ01-ZZZZ09, ZQZQ01-ZQZQ09."));
- return 0;
+ return false;
}
- if (try_name (dsc, name))
+ if (try_name (dict, dsc, name))
{
strcpy (z_name, name);
- return 1;
+ return true;
}
}
+ NOT_REACHED();
}
/* Outputs a table describing the mapping between source
*/
static int
descriptives_trns_proc (void *trns_, struct ccase * c,
- int case_idx UNUSED)
+ casenumber case_idx UNUSED)
{
struct dsc_trns *t = trns_;
struct dsc_z_score *z;
/* Sets up a transformation to calculate Z scores. */
static void
-setup_z_trns (struct dsc_proc *dsc)
+setup_z_trns (struct dsc_proc *dsc, struct dataset *ds)
{
struct dsc_trns *t;
size_t cnt, i;
char *cp;
struct variable *dst_var;
- dst_var = dict_create_var_assert (default_dict, dv->z_name, 0);
+ dst_var = dict_create_var_assert (dataset_dict (ds), dv->z_name, 0);
if (dv->v->label)
{
dst_var->label = xmalloc (strlen (dv->v->label) + 12);
}
}
- add_transformation (descriptives_trns_proc, descriptives_trns_free, t);
+ add_transformation (ds,
+ descriptives_trns_proc, descriptives_trns_free, t);
}
\f
/* Statistical calculation. */
-static int listwise_missing (struct dsc_proc *dsc, const struct ccase *c);
+static bool listwise_missing (struct dsc_proc *dsc, const struct ccase *c);
/* Calculates and displays descriptive statistics for the cases
in CF. */
static bool
calc_descriptives (const struct ccase *first,
- const struct casefile *cf, void *dsc_)
+ const struct casefile *cf, void *dsc_,
+ const struct dataset *ds)
{
struct dsc_proc *dsc = dsc_;
struct casereader *reader;
struct ccase c;
size_t i;
- output_split_file_values (first);
+ output_split_file_values (ds, first);
for (i = 0; i < dsc->var_cnt; i++)
{
dsc->valid = 0.;
/* First pass to handle most of the work. */
- for (reader = casefile_get_reader (cf);
+ for (reader = casefile_get_reader (cf, NULL);
casereader_read (reader, &c);
case_destroy (&c))
{
- double weight = dict_get_case_weight (default_dict, &c, &dsc->bad_warn);
+ double weight = dict_get_case_weight (dataset_dict (ds), &c, &dsc->bad_warn);
if (weight <= 0.0)
continue;
/* Second pass for higher-order moments. */
if (dsc->max_moment > MOMENT_MEAN)
{
- for (reader = casefile_get_reader (cf);
+ for (reader = casefile_get_reader (cf, NULL);
casereader_read (reader, &c);
case_destroy (&c))
{
- double weight = dict_get_case_weight (default_dict, &c,
+ double weight = dict_get_case_weight (dataset_dict (ds), &c,
&dsc->bad_warn);
if (weight <= 0.0)
continue;
return true;
}
-/* Returns nonzero if any of the descriptives variables in DSC's
- variable list have missing values in case C, zero otherwise. */
-static int
+/* Returns true if any of the descriptives variables in DSC's
+ variable list have missing values in case C, false otherwise. */
+static bool
listwise_missing (struct dsc_proc *dsc, const struct ccase *c)
{
size_t i;
if (x == SYSMIS
|| (!dsc->include_user_missing
&& mv_is_num_user_missing (&dv->v->miss, x)))
- return 1;
+ return true;
}
- return 0;
+ return false;
}
\f
/* Statistical display. */
/* Compares `struct dsc_var's A and B according to the ordering
specified by CMD. */
static int
-descriptives_compare_dsc_vars (const void *a_, const void *b_, void *dsc_)
+descriptives_compare_dsc_vars (const void *a_, const void *b_, const void *dsc_)
{
const struct dsc_var *a = a_;
const struct dsc_var *b = b_;
- struct dsc_proc *dsc = dsc_;
+ const struct dsc_proc *dsc = dsc_;
int result;