/* FIXME: Many possible optimizations. */
#include <config.h>
-#include "message.h"
+
#include <limits.h>
#include <math.h>
#include <stdlib.h>
-#include "array.h"
-#include "alloc.h"
-#include "case.h"
-#include "casefile.h"
-#include "command.h"
-#include "compiler.h"
-#include "dictionary.h"
-#include "lexer.h"
-#include "message.h"
-#include "magic.h"
-#include "moments.h"
-#include "manager.h"
-#include "table.h"
-#include "variable.h"
-#include "procedure.h"
+
+#include <data/case.h>
+#include <data/casefile.h>
+#include <data/dictionary.h>
+#include <data/procedure.h>
+#include <data/transformations.h>
+#include <data/variable.h>
+#include <language/command.h>
+#include <language/dictionary/split-file.h>
+#include <language/lexer/lexer.h>
+#include <language/lexer/variable-parser.h>
+#include <libpspp/alloc.h>
+#include <libpspp/array.h>
+#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>
#include "gettext.h"
#define _(msgid) gettext (msgid)
/* Accumulated results. */
double missing_listwise; /* Sum of weights of cases missing listwise. */
double valid; /* Sum of weights of valid cases. */
- int bad_warn; /* Warn if bad weight found. */
+ bool bad_warn; /* Warn if bad weight found. */
enum dsc_statistic sort_by_stat; /* Statistic to sort by; -1: name. */
int sort_ascending; /* !0: ascending order; 0: descending. */
unsigned long show_stats; /* Statistics to display. */
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,
+static bool try_name (struct dsc_proc *dsc, char *name);
+static bool generate_z_varname (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 *);
/* Procedure execution functions. */
-static bool calc_descriptives (const struct casefile *, void *dsc_);
+static bool calc_descriptives (const struct ccase *first,
+ const struct casefile *, void *dsc_);
static void display (struct dsc_proc *dsc);
\f
/* Parser and outline. */
{
int i;
- if (!parse_variables (default_dict, &vars, &var_cnt,
+ if (!parse_variables (dataset_dict (current_dataset), &vars, &var_cnt,
PV_APPEND | PV_NO_DUPLICATE | PV_NUMERIC))
goto error;
dsc->vars[i].moments = moments_create (dsc->max_moment);
/* Data pass. */
- ok = multipass_procedure_with_splits (calc_descriptives, dsc);
+ ok = multipass_procedure_with_splits (current_dataset, calc_descriptives, dsc);
/* Z-scoring! */
if (ok && z_cnt)
\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
+/* 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 (struct dsc_proc *dsc, char *name)
{
size_t i;
- if (dict_lookup_var (default_dict, name) != NULL)
- return 0;
+ if (dict_lookup_var (dataset_dict (current_dataset), 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
+ 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 (struct dsc_proc *dsc, char *z_name,
const char *var_name, size_t *z_cnt)
{
if (try_name (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))
{
strcpy (z_name, name);
- return 1;
+ return true;
}
}
+ NOT_REACHED();
}
/* Outputs a table describing the mapping between source
}
t = tab_create (2, cnt + 1, 0);
- tab_title (t, 0, _("Mapping of variables to corresponding Z-scores."));
+ tab_title (t, _("Mapping of variables to corresponding Z-scores."));
tab_columns (t, SOM_COL_DOWN, 1);
tab_headers (t, 0, 0, 1, 0);
tab_box (t, TAL_1, TAL_1, TAL_0, TAL_1, 0, 0, 1, cnt);
*/
static int
descriptives_trns_proc (void *trns_, struct ccase * c,
- int case_idx UNUSED)
+ casenum_t case_idx UNUSED)
{
struct dsc_trns *t = trns_;
struct dsc_z_score *z;
char *cp;
struct variable *dst_var;
- dst_var = dict_create_var_assert (default_dict, dv->z_name, 0);
- dst_var->init = 0;
+ dst_var = dict_create_var_assert (dataset_dict (current_dataset), 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 (current_dataset,
+ 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 casefile *cf, void *dsc_)
+calc_descriptives (const struct ccase *first,
+ const struct casefile *cf, void *dsc_)
{
struct dsc_proc *dsc = dsc_;
struct casereader *reader;
struct ccase c;
size_t i;
+ output_split_file_values (first);
+
for (i = 0; i < dsc->var_cnt; i++)
{
struct dsc_var *dv = &dsc->vars[i];
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 (current_dataset), &c, &dsc->bad_warn);
if (weight <= 0.0)
continue;
casereader_read (reader, &c);
case_destroy (&c))
{
- double weight = dict_get_case_weight (default_dict, &c,
+ double weight = dict_get_case_weight (dataset_dict (current_dataset), &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. */
tab_float (t, nc++, i + 1, TAB_NONE, dv->stats[j], 10, 3);
}
- tab_title (t, 1, _("Valid cases = %g; cases with missing value(s) = %g."),
+ tab_title (t, _("Valid cases = %g; cases with missing value(s) = %g."),
dsc->valid, dsc->missing_listwise);
tab_submit (t);