+struct descriptive_data
+{
+ struct moments1 *mom;
+ double minimum;
+ double maximum;
+};
+
+static void *
+makeit (void)
+{
+ struct descriptive_data *dd = xmalloc (sizeof *dd);
+ dd->mom = moments1_create (MOMENT_VARIANCE);
+ dd->minimum = DBL_MAX;
+ dd->maximum = -DBL_MAX;
+
+ return dd;
+}
+
+static void
+updateit (void *user_data, const struct variable *wv,
+ const struct variable *catvar, const struct ccase *c, void *aux)
+{
+ const union value *val = case_data_idx (c, 0);
+ struct descriptive_data *dd = user_data;
+ struct oneway_workspace *ws = aux;
+
+ double weight = 1.0;
+ if (wv)
+ weight = case_data (c, wv)->f;
+
+ moments1_add (dd->mom, val->f, weight);
+ moments1_add (ws->totals, val->f, weight);
+
+ if (val->f * weight < dd->minimum)
+ dd->minimum = val->f * weight;
+
+ if (val->f * weight > dd->maximum)
+ dd->maximum = val->f * weight;
+
+
+ if (val->f * weight < ws->minimum)
+ ws->minimum = val->f * weight;
+
+ if (val->f * weight > ws->maximum)
+ ws->maximum = val->f * weight;
+}