Move var_set and variable parsing declarations into new header.
[pspp-builds.git] / src / language / stats / crosstabs.q
index 2818a17992656726401f1ee1dc2318605c3c3f41..c821ce0ad6484e477b162979e628f346059e1ac1 100644 (file)
 */
 
 #include <config.h>
-#include <libpspp/message.h>
+
 #include <ctype.h>
+#include <gsl/gsl_cdf.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include <gsl/gsl_cdf.h>
-#include <libpspp/array.h>
-#include <libpspp/alloc.h>
+
 #include <data/case.h>
 #include <data/dictionary.h>
-#include <libpspp/hash.h>
-#include <libpspp/pool.h>
+#include <data/procedure.h>
+#include <data/value-labels.h>
+#include <data/variable.h>
 #include <language/command.h>
-#include <libpspp/compiler.h>
+#include <language/dictionary/split-file.h>
 #include <language/lexer/lexer.h>
-#include <libpspp/message.h>
+#include <language/lexer/variable-parser.h>
+#include <libpspp/alloc.h>
+#include <libpspp/array.h>
+#include <libpspp/compiler.h>
+#include <libpspp/hash.h>
 #include <libpspp/magic.h>
+#include <libpspp/message.h>
+#include <libpspp/message.h>
 #include <libpspp/misc.h>
-#include <output/output.h>
+#include <libpspp/pool.h>
 #include <libpspp/str.h>
+#include <output/output.h>
 #include <output/table.h>
-#include <data/value-labels.h>
-#include <data/variable.h>
-#include <procedure.h>
 
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
@@ -60,8 +64,6 @@
 
 /* (headers) */
 
-#include <libpspp/debug-print.h>
-
 /* (specification)
    crosstabs (crs_):
      *^tables=custom;
@@ -173,9 +175,9 @@ static struct pool *pl_tc;  /* For table cells. */
 static struct pool *pl_col;    /* For column data. */
 
 static int internal_cmd_crosstabs (void);
-static void precalc (void *);
-static bool calc_general (struct ccase *, void *);
-static bool calc_integer (struct ccase *, void *);
+static void precalc (const struct ccase *, void *);
+static bool calc_general (const struct ccase *, void *);
+static bool calc_integer (const struct ccase *, void *);
 static void postcalc (void *);
 static void submit (struct tab_table *);
 
@@ -485,8 +487,9 @@ static unsigned hash_table_entry (const void *, void *);
 
 /* Set up the crosstabulation tables for processing. */
 static void
-precalc (void *aux UNUSED)
+precalc (const struct ccase *first, void *aux UNUSED)
 {
+  output_split_file_values (first);
   if (mode == GENERAL)
     {
       gen_tab = hsh_create (512, compare_table_entry, hash_table_entry,
@@ -558,7 +561,7 @@ precalc (void *aux UNUSED)
 
 /* Form crosstabulations for general mode. */
 static bool
-calc_general (struct ccase *c, void *aux UNUSED)
+calc_general (const struct ccase *c, void *aux UNUSED)
 {
   int bad_warn = 1;
 
@@ -632,7 +635,7 @@ calc_general (struct ccase *c, void *aux UNUSED)
 }
 
 static bool
-calc_integer (struct ccase *c, void *aux UNUSED)
+calc_integer (const struct ccase *c, void *aux UNUSED)
 {
   int bad_warn = 1;
 
@@ -809,7 +812,7 @@ make_summary_table (void)
   int cur_tab = 0;
 
   summary = tab_create (7, 3 + nxtab, 1);
-  tab_title (summary, 0, _("Summary."));
+  tab_title (summary, _("Summary."));
   tab_headers (summary, 1, 0, 3, 0);
   tab_joint_text (summary, 1, 0, 6, 0, TAB_CENTER, _("Cases"));
   tab_joint_text (summary, 1, 1, 2, 1, TAB_CENTER, _("Valid"));
@@ -1088,7 +1091,7 @@ output_pivot_table (struct table_entry **pb, struct table_entry **pe,
          }
        strcpy (cp, "].");
 
-       tab_title (table, 0, title);
+       tab_title (table, "%s", title);
        local_free (title);
       }
       
@@ -1104,7 +1107,7 @@ output_pivot_table (struct table_entry **pb, struct table_entry **pe,
                          (pe - pb) / n_cols * 3 / 2 * N_CHISQ + 10, 1);
       tab_headers (chisq, 1 + (nvar - 2), 0, 1, 0);
 
-      tab_title (chisq, 0, "Chi-square tests.");
+      tab_title (chisq, _("Chi-square tests."));
       
       tab_offset (chisq, nvar - 2, 0);
       tab_text (chisq, 0, 0, TAB_LEFT | TAT_TITLE, _("Statistic"));
@@ -1130,7 +1133,7 @@ output_pivot_table (struct table_entry **pb, struct table_entry **pe,
     {
       sym = tab_create (6 + (nvar - 2), (pe - pb) / n_cols * 7 + 10, 1);
       tab_headers (sym, 2 + (nvar - 2), 0, 1, 0);
-      tab_title (sym, 0, "Symmetric measures.");
+      tab_title (sym, _("Symmetric measures."));
 
       tab_offset (sym, nvar - 2, 0);
       tab_text (sym, 0, 0, TAB_LEFT | TAT_TITLE, _("Category"));
@@ -1149,11 +1152,11 @@ output_pivot_table (struct table_entry **pb, struct table_entry **pe,
     {
       risk = tab_create (4 + (nvar - 2), (pe - pb) / n_cols * 4 + 10, 1);
       tab_headers (risk, 1 + nvar - 2, 0, 2, 0);
-      tab_title (risk, 0, "Risk estimate.");
+      tab_title (risk, _("Risk estimate."));
 
       tab_offset (risk, nvar - 2, 0);
       tab_joint_text (risk, 2, 0, 3, 0, TAB_CENTER | TAT_TITLE | TAT_PRINTF,
-                     _(" 95%% Confidence Interval"));
+                     _("95%% Confidence Interval"));
       tab_text (risk, 0, 1, TAB_LEFT | TAT_TITLE, _("Statistic"));
       tab_text (risk, 1, 1, TAB_RIGHT | TAT_TITLE, _("Value"));
       tab_text (risk, 2, 1, TAB_RIGHT | TAT_TITLE, _("Lower"));
@@ -1171,7 +1174,7 @@ output_pivot_table (struct table_entry **pb, struct table_entry **pe,
     {
       direct = tab_create (7 + (nvar - 2), (pe - pb) / n_cols * 7 + 10, 1);
       tab_headers (direct, 3 + (nvar - 2), 0, 1, 0);
-      tab_title (direct, 0, "Directional measures.");
+      tab_title (direct, _("Directional measures."));
 
       tab_offset (direct, nvar - 2, 0);
       tab_text (direct, 0, 0, TAB_LEFT | TAT_TITLE, _("Category"));
@@ -1466,7 +1469,7 @@ submit (struct tab_table *t)
   tab_box (t, TAL_2, TAL_2, -1, -1, 0, 0, tab_nc (t) - 1, tab_nr (t) - 1);
   tab_box (t, -1, -1, -1, TAL_1, tab_l (t), tab_t (t) - 1, tab_nc (t) - 1,
           tab_nr (t) - 1);
-  tab_box (t, -1, -1, -1, TAL_1 | TAL_SPACING, 0, tab_t (t), tab_l (t) - 1,
+  tab_box (t, -1, -1, -1, TAL_GAP, 0, tab_t (t), tab_l (t) - 1,
           tab_nr (t) - 1);
   tab_vline (t, TAL_2, tab_l (t), 0, tab_nr (t) - 1);
   tab_dim (t, crosstabs_dim);
@@ -1481,14 +1484,20 @@ crosstabs_dim (struct tab_table *t, struct outp_driver *d)
   int i;
   
   /* Width of a numerical column. */
-  int c = outp_string_width (d, "0.000000");
+  int c = outp_string_width (d, "0.000000", OUTP_PROPORTIONAL);
   if (cmd.miss == CRS_REPORT)
-    c += outp_string_width (d, "M");
+    c += outp_string_width (d, "M", OUTP_PROPORTIONAL);
 
   /* Set width for header columns. */
   if (t->l != 0)
     {
-      int w = (d->width - t->vr_tot - c * (t->nc - t->l)) / t->l;
+      size_t i;
+      int w;
+
+      w = d->width - c * (t->nc - t->l);
+      for (i = 0; i <= t->nc; i++)
+        w -= t->wrv[i];
+      w /= t->l;
       
       if (w < d->prop_em_width * 8)
        w = d->prop_em_width * 8;
@@ -1653,7 +1662,7 @@ static void
 table_value_missing (struct tab_table *table, int c, int r, unsigned char opt,
                     const union value *v, const struct variable *var)
 {
-  struct fixed_string s;
+  struct substring s;
 
   const char *label = val_labs_find (var->val_labs, *v);
   if (label) 
@@ -1700,7 +1709,7 @@ format_cell_entry (struct tab_table *table, int c, int r, double value,
 {
   const struct fmt_spec f = {FMT_F, 10, 1};
   union value v;
-  struct fixed_string s;
+  struct substring s;
   
   s.length = 10;
   s.string = tab_alloc (table, 16);