- Copyright (C) 1997-9, 2000, 2006, 2009, 2010 Free Software Foundation, Inc.
+ Copyright (C) 1997-9, 2000, 2006, 2009, 2010, 2011 Free Software Foundation, Inc.
-#include <data/case.h>
-#include <data/casegrouper.h>
-#include <data/casereader.h>
-#include <data/data-out.h>
-#include <data/dictionary.h>
-#include <data/format.h>
-#include <data/procedure.h>
-#include <data/value-labels.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/array.h>
-#include <libpspp/assertion.h>
-#include <libpspp/compiler.h>
-#include <libpspp/hash-functions.h>
-#include <libpspp/hmap.h>
-#include <libpspp/hmapx.h>
-#include <libpspp/message.h>
-#include <libpspp/misc.h>
-#include <libpspp/pool.h>
-#include <libpspp/str.h>
-#include <output/tab.h>
-
-#include "minmax.h"
-#include "xalloc.h"
-#include "xsize.h"
+#include "data/case.h"
+#include "data/casegrouper.h"
+#include "data/casereader.h"
+#include "data/data-out.h"
+#include "data/dictionary.h"
+#include "data/format.h"
+#include "data/procedure.h"
+#include "data/value-labels.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/array.h"
+#include "libpspp/assertion.h"
+#include "libpspp/compiler.h"
+#include "libpspp/hash-functions.h"
+#include "libpspp/hmap.h"
+#include "libpspp/hmapx.h"
+#include "libpspp/message.h"
+#include "libpspp/misc.h"
+#include "libpspp/pool.h"
+#include "libpspp/str.h"
+#include "output/tab.h"
+
+#include "gl/minmax.h"
+#include "gl/xalloc.h"
+#include "gl/xsize.h"
proc.weight_format = wv ? *var_get_print_format (wv) : F_8_0;
if (!parse_crosstabs (lexer, ds, &cmd, &proc))
proc.weight_format = wv ? *var_get_print_format (wv) : F_8_0;
if (!parse_crosstabs (lexer, ds, &cmd, &proc))
/* Ensure that this is a TABLES subcommand. */
if (!lex_match_id (lexer, "TABLES")
&& (lex_token (lexer) != T_ID ||
/* Ensure that this is a TABLES subcommand. */
if (!lex_match_id (lexer, "TABLES")
&& (lex_token (lexer) != T_ID ||
static void output_pivot_table (struct crosstabs_proc *,
struct pivot_table *);
static void make_pivot_table_subset (struct pivot_table *pt,
static void output_pivot_table (struct crosstabs_proc *,
struct pivot_table *);
static void make_pivot_table_subset (struct pivot_table *pt,
hmap_destroy (&pt->data);
sort (pt->entries, pt->n_entries, sizeof *pt->entries,
hmap_destroy (&pt->data);
sort (pt->entries, pt->n_entries, sizeof *pt->entries,
- enum_var_values (pt, COL_VAR, &pt->cols, &pt->n_cols);
+ enum_var_values (pt, COL_VAR, &pt->cols, &pt->n_cols, proc->descending);
+
+ if (pt->n_cols == 0)
+ {
+ struct string vars;
+ int i;
+
+ ds_init_cstr (&vars, var_get_name (pt->vars[0]));
+ for (i = 1; i < pt->n_vars; i++)
+ ds_put_format (&vars, " * %s", var_get_name (pt->vars[i]));
+
+ /* TRANSLATORS: The %s here describes a crosstabulation. It takes the
+ form "var1 * var2 * var3 * ...". */
+ msg (SW, _("Crosstabulation %s contained no non-missing cases."),
+ ds_cstr (&vars));
+
+ ds_destroy (&vars);
+ return;
+ }
make_pivot_table_subset (pt, row0, row1, &x);
/* Find all the row variable values. */
make_pivot_table_subset (pt, row0, row1, &x);
/* Find all the row variable values. */
s = data_out (&pt->const_values[i], var_get_encoding (var),
var_get_print_format (var));
s = data_out (&pt->const_values[i], var_get_encoding (var),
var_get_print_format (var));
/* Given an array of ENTRY_CNT table_entry structures starting at
ENTRIES, creates a sorted list of the values that the variable
with index VAR_IDX takes on. The values are returned as a
/* Given an array of ENTRY_CNT table_entry structures starting at
ENTRIES, creates a sorted list of the values that the variable
with index VAR_IDX takes on. The values are returned as a
- sort (values, *n_values, sizeof *values, compare_value_3way, &width);
+ sort (values, *n_values, sizeof *values,
+ descending ? compare_value_3way_inv : compare_value_3way,
+ &width);