02110-1301, USA. */
#include <config.h>
-#include <libpspp/message.h>
+
#include <stdlib.h>
-#include <libpspp/alloc.h>
+
#include <data/any-writer.h>
+#include <data/case-sink.h>
#include <data/case.h>
#include <data/casefile.h>
-#include <language/command.h>
#include <data/dictionary.h>
-#include <libpspp/message.h>
#include <data/file-handle-def.h>
+#include <data/procedure.h>
+#include <data/settings.h>
+#include <data/storage-stream.h>
+#include <data/sys-file-writer.h>
+#include <data/variable.h>
+#include <language/command.h>
+#include <language/data-io/file-handle.h>
#include <language/lexer/lexer.h>
+#include <language/stats/sort-criteria.h>
+#include <libpspp/alloc.h>
+#include <libpspp/message.h>
+#include <libpspp/message.h>
#include <libpspp/misc.h>
-#include <math/moments.h>
#include <libpspp/pool.h>
-#include <data/settings.h>
-#include <data/sys-file-writer.h>
-#include <math/sort.h>
#include <libpspp/str.h>
-#include <data/variable.h>
-#include <procedure.h>
+#include <math/moments.h>
+#include <math/sort.h>
#include "gettext.h"
#define _(msgid) gettext (msgid)
+/* Argument for AGGREGATE function. */
+union agr_argument
+ {
+ double f; /* Numeric. */
+ char *c; /* Short or long string. */
+ };
+
/* Specifies how to make an aggregate variable. */
struct agr_var
{
struct variable *dest; /* Target variable. */
int function; /* Function. */
int include_missing; /* 1=Include user-missing values. */
- union value arg[2]; /* Arguments. */
+ union agr_argument arg[2]; /* Arguments. */
/* Accumulated during AGGREGATE execution. */
double dbl[3];
static void dump_aggregate_info (struct agr_proc *agr, struct ccase *output);
/* Aggregating to the active file. */
-static bool agr_to_active_file (struct ccase *, void *aux);
+static bool agr_to_active_file (const struct ccase *, void *aux);
/* Aggregating to a system file. */
-static bool presorted_agr_to_sysfile (struct ccase *, void *aux);
+static bool presorted_agr_to_sysfile (const struct ccase *, void *aux);
\f
/* Parsing. */
{
/* The active file will be replaced by the aggregated data,
so TEMPORARY is moot. */
- cancel_temporary ();
+ proc_cancel_temporary_transformations ();
if (agr.sort != NULL && !presorted)
{
agr.sink = create_case_sink (&storage_sink_class, agr.dict, NULL);
if (agr.sink->class->open != NULL)
agr.sink->class->open (agr.sink);
- vfm_sink = create_case_sink (&null_sink_class, default_dict, NULL);
+ proc_set_sink (create_case_sink (&null_sink_class, default_dict, NULL));
if (!procedure (agr_to_active_file, &agr))
goto error;
if (agr.case_cnt > 0)
if (!agr.sink->class->write (agr.sink, &agr.agr_case))
goto error;
}
- dict_destroy (default_dict);
+ discard_variables ();
default_dict = agr.dict;
agr.dict = NULL;
- vfm_source = agr.sink->class->make_source (agr.sink);
+ proc_set_source (agr.sink->class->make_source (agr.sink));
free_case_sink (agr.sink);
}
else
const struct agr_func *function;
int func_index;
- union value arg[2];
+ union agr_argument arg[2];
struct variable **src;
size_t n_src;
|| (src[0]->type == ALPHA
&& str_compare_rpad (arg[0].c, arg[1].c) > 0)))
{
- union value t = arg[0];
+ union agr_argument t = arg[0];
arg[0] = arg[1];
arg[1] = t;
}
free (dest[i]);
- destvar->init = 0;
if (dest_label[i])
{
destvar->label = dest_label[i];
are dropped.
Returns true if successful, false if an I/O error occurred. */
static bool
-agr_to_active_file (struct ccase *c, void *agr_)
+agr_to_active_file (const struct ccase *c, void *agr_)
{
struct agr_proc *agr = agr_;
/* Aggregate the current case and output it if we passed a
breakpoint. */
static bool
-presorted_agr_to_sysfile (struct ccase *c, void *agr_)
+presorted_agr_to_sysfile (const struct ccase *c, void *agr_)
{
struct agr_proc *agr = agr_;