Added test for ntiles. Fixed q2c parsing of integer/double subcommands
authorJohn Darrington <john@darrington.wattle.id.au>
Mon, 1 Nov 2004 04:51:21 +0000 (04:51 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Mon, 1 Nov 2004 04:51:21 +0000 (04:51 +0000)
po/en_GB.po
po/pspp.pot
src/ChangeLog
src/frequencies.q
src/q2c.c
src/set.q
src/t-test.q
tests/Makefile.am
tests/stats/ntiles.sh [new file with mode: 0755]

index 041fd6226cdc46999eec9084a5ce82b6611208a0..f319976d1a70163d6254eef078d62036b96246ea 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.3.1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
 msgstr ""
 "Project-Id-Version: PSPP 0.3.1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-10-30 17:37+0800\n"
+"POT-Creation-Date: 2004-11-01 11:56+0800\n"
 "PO-Revision-Date: 2004-01-23 13:04+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
 "PO-Revision-Date: 2004-01-23 13:04+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
@@ -3808,7 +3808,7 @@ msgstr ""
 
 #: src/sysfile-info.c:529 src/vfm.c:875 src/crosstabs.q:1068
 #: src/crosstabs.q:1095 src/crosstabs.q:1115 src/crosstabs.q:1137
 
 #: src/sysfile-info.c:529 src/vfm.c:875 src/crosstabs.q:1068
 #: src/crosstabs.q:1095 src/crosstabs.q:1115 src/crosstabs.q:1137
-#: src/frequencies.q:1068 src/frequencies.q:1186
+#: src/frequencies.q:1058 src/frequencies.q:1176
 msgid "Value"
 msgstr ""
 
 msgid "Value"
 msgstr ""
 
@@ -4033,26 +4033,26 @@ msgstr ""
 msgid "Cases"
 msgstr ""
 
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:772 src/frequencies.q:1066 src/frequencies.q:1433
+#: src/crosstabs.q:772 src/frequencies.q:1056 src/frequencies.q:1423
 msgid "Valid"
 msgstr ""
 
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:773 src/frequencies.q:1133 src/frequencies.q:1434
+#: src/crosstabs.q:773 src/frequencies.q:1123 src/frequencies.q:1424
 msgid "Missing"
 msgstr ""
 
 #: src/crosstabs.q:774 src/crosstabs.q:977 src/crosstabs.q:1690
 msgid "Missing"
 msgstr ""
 
 #: src/crosstabs.q:774 src/crosstabs.q:977 src/crosstabs.q:1690
-#: src/frequencies.q:1142 src/oneway.q:287 src/oneway.q:464
+#: src/frequencies.q:1132 src/oneway.q:287 src/oneway.q:464
 msgid "Total"
 msgstr ""
 
 msgid "Total"
 msgstr ""
 
-#: src/crosstabs.q:784 src/frequencies.q:1432 src/oneway.q:374
+#: src/crosstabs.q:784 src/frequencies.q:1422 src/oneway.q:374
 #: src/t-test.q:680 src/t-test.q:703 src/t-test.q:828 src/t-test.q:1365
 msgid "N"
 msgstr ""
 
 #: src/t-test.q:680 src/t-test.q:703 src/t-test.q:828 src/t-test.q:1365
 msgid "N"
 msgstr ""
 
-#: src/crosstabs.q:785 src/frequencies.q:1070 src/frequencies.q:1071
-#: src/frequencies.q:1072
+#: src/crosstabs.q:785 src/frequencies.q:1060 src/frequencies.q:1061
+#: src/frequencies.q:1062
 msgid "Percent"
 msgstr ""
 
 msgid "Percent"
 msgstr ""
 
@@ -4324,85 +4324,76 @@ msgstr ""
 msgid "S.E. Skew"
 msgstr ""
 
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/frequencies.q:289
+#: src/frequencies.q:306
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
-#: src/frequencies.q:372
+#: src/frequencies.q:389
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
-#: src/frequencies.q:696
+#: src/frequencies.q:713
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
-#: src/frequencies.q:708
+#: src/frequencies.q:725
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
-#: src/frequencies.q:721
+#: src/frequencies.q:738
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
-#: src/frequencies.q:783
+#: src/frequencies.q:800
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
-#: src/frequencies.q:796
+#: src/frequencies.q:813
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
-#: src/frequencies.q:799
+#: src/frequencies.q:816
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
-#: src/frequencies.q:855
-msgid "Percentile list expected after PERCENTILES."
-msgstr ""
-
-#: src/frequencies.q:863
-#, fuzzy
-msgid "Percentiles must be between 0 and 100."
-msgstr "Frame colour must be between 0 and 6."
-
-#: src/frequencies.q:1067 src/frequencies.q:1158 src/frequencies.q:1159
-#: src/frequencies.q:1189
+#: src/frequencies.q:1057 src/frequencies.q:1148 src/frequencies.q:1149
+#: src/frequencies.q:1179
 msgid "Cum"
 msgstr ""
 
 msgid "Cum"
 msgstr ""
 
-#: src/frequencies.q:1069
+#: src/frequencies.q:1059
 msgid "Frequency"
 msgstr ""
 
 msgid "Frequency"
 msgstr ""
 
-#: src/frequencies.q:1088
+#: src/frequencies.q:1078
 msgid "Value Label"
 msgstr ""
 
 msgid "Value Label"
 msgstr ""
 
-#: src/frequencies.q:1187
+#: src/frequencies.q:1177
 msgid "Freq"
 msgstr ""
 
 msgid "Freq"
 msgstr ""
 
-#: src/frequencies.q:1188 src/frequencies.q:1190
+#: src/frequencies.q:1178 src/frequencies.q:1180
 msgid "Pct"
 msgstr ""
 
 msgid "Pct"
 msgstr ""
 
-#: src/frequencies.q:1406
+#: src/frequencies.q:1396
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
-#: src/frequencies.q:1445
+#: src/frequencies.q:1435
 msgid "Percentiles"
 msgstr ""
 
 msgid "Percentiles"
 msgstr ""
 
@@ -4846,3 +4837,7 @@ msgstr ""
 #, c-format
 msgid "%s & %s"
 msgstr ""
 #, c-format
 msgid "%s & %s"
 msgstr ""
+
+#, fuzzy
+#~ msgid "Percentiles must be between 0 and 100."
+#~ msgstr "Frame colour must be between 0 and 6."
index 86a951e791db9841d50847b0009f06427f5f4cf3..b10d5db7b00d21c87d63b245ff11c0338a889ef6 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2004-10-30 17:37+0800\n"
+"POT-Creation-Date: 2004-11-01 11:56+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -3808,7 +3808,7 @@ msgstr ""
 
 #: src/sysfile-info.c:529 src/vfm.c:875 src/crosstabs.q:1068
 #: src/crosstabs.q:1095 src/crosstabs.q:1115 src/crosstabs.q:1137
 
 #: src/sysfile-info.c:529 src/vfm.c:875 src/crosstabs.q:1068
 #: src/crosstabs.q:1095 src/crosstabs.q:1115 src/crosstabs.q:1137
-#: src/frequencies.q:1068 src/frequencies.q:1186
+#: src/frequencies.q:1058 src/frequencies.q:1176
 msgid "Value"
 msgstr ""
 
 msgid "Value"
 msgstr ""
 
@@ -4033,26 +4033,26 @@ msgstr ""
 msgid "Cases"
 msgstr ""
 
 msgid "Cases"
 msgstr ""
 
-#: src/crosstabs.q:772 src/frequencies.q:1066 src/frequencies.q:1433
+#: src/crosstabs.q:772 src/frequencies.q:1056 src/frequencies.q:1423
 msgid "Valid"
 msgstr ""
 
 msgid "Valid"
 msgstr ""
 
-#: src/crosstabs.q:773 src/frequencies.q:1133 src/frequencies.q:1434
+#: src/crosstabs.q:773 src/frequencies.q:1123 src/frequencies.q:1424
 msgid "Missing"
 msgstr ""
 
 #: src/crosstabs.q:774 src/crosstabs.q:977 src/crosstabs.q:1690
 msgid "Missing"
 msgstr ""
 
 #: src/crosstabs.q:774 src/crosstabs.q:977 src/crosstabs.q:1690
-#: src/frequencies.q:1142 src/oneway.q:287 src/oneway.q:464
+#: src/frequencies.q:1132 src/oneway.q:287 src/oneway.q:464
 msgid "Total"
 msgstr ""
 
 msgid "Total"
 msgstr ""
 
-#: src/crosstabs.q:784 src/frequencies.q:1432 src/oneway.q:374
+#: src/crosstabs.q:784 src/frequencies.q:1422 src/oneway.q:374
 #: src/t-test.q:680 src/t-test.q:703 src/t-test.q:828 src/t-test.q:1365
 msgid "N"
 msgstr ""
 
 #: src/t-test.q:680 src/t-test.q:703 src/t-test.q:828 src/t-test.q:1365
 msgid "N"
 msgstr ""
 
-#: src/crosstabs.q:785 src/frequencies.q:1070 src/frequencies.q:1071
-#: src/frequencies.q:1072
+#: src/crosstabs.q:785 src/frequencies.q:1060 src/frequencies.q:1061
+#: src/frequencies.q:1062
 msgid "Percent"
 msgstr ""
 
 msgid "Percent"
 msgstr ""
 
@@ -4324,84 +4324,76 @@ msgstr ""
 msgid "S.E. Skew"
 msgstr ""
 
 msgid "S.E. Skew"
 msgstr ""
 
-#: src/frequencies.q:289
+#: src/frequencies.q:306
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
 msgid ""
 "At most one of BARCHART, HISTOGRAM, or HBAR should be given.  HBAR will be "
 "assumed.  Argument values will be given precedence increasing along the "
 "order given."
 msgstr ""
 
-#: src/frequencies.q:372
+#: src/frequencies.q:389
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
 #, c-format
 msgid ""
 "MAX must be greater than or equal to MIN, if both are specified.  However, "
 "MIN was specified as %g and MAX as %g.  MIN and MAX will be ignored."
 msgstr ""
 
-#: src/frequencies.q:696
+#: src/frequencies.q:713
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
 msgid ""
 "Upper limit of integer mode value range must be greater than lower limit."
 msgstr ""
 
-#: src/frequencies.q:708
+#: src/frequencies.q:725
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variable %s specified multiple times on VARIABLES subcommand."
 msgstr ""
 
-#: src/frequencies.q:721
+#: src/frequencies.q:738
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
 #, c-format
 msgid "Integer mode specified, but %s is not a numeric variable."
 msgstr ""
 
-#: src/frequencies.q:783
+#: src/frequencies.q:800
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
 msgid "`)' expected after GROUPED interval list."
 msgstr ""
 
-#: src/frequencies.q:796
+#: src/frequencies.q:813
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified on GROUPED but not on VARIABLES."
 msgstr ""
 
-#: src/frequencies.q:799
+#: src/frequencies.q:816
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
 #, c-format
 msgid "Variables %s specified multiple times on GROUPED subcommand."
 msgstr ""
 
-#: src/frequencies.q:855
-msgid "Percentile list expected after PERCENTILES."
-msgstr ""
-
-#: src/frequencies.q:863
-msgid "Percentiles must be between 0 and 100."
-msgstr ""
-
-#: src/frequencies.q:1067 src/frequencies.q:1158 src/frequencies.q:1159
-#: src/frequencies.q:1189
+#: src/frequencies.q:1057 src/frequencies.q:1148 src/frequencies.q:1149
+#: src/frequencies.q:1179
 msgid "Cum"
 msgstr ""
 
 msgid "Cum"
 msgstr ""
 
-#: src/frequencies.q:1069
+#: src/frequencies.q:1059
 msgid "Frequency"
 msgstr ""
 
 msgid "Frequency"
 msgstr ""
 
-#: src/frequencies.q:1088
+#: src/frequencies.q:1078
 msgid "Value Label"
 msgstr ""
 
 msgid "Value Label"
 msgstr ""
 
-#: src/frequencies.q:1187
+#: src/frequencies.q:1177
 msgid "Freq"
 msgstr ""
 
 msgid "Freq"
 msgstr ""
 
-#: src/frequencies.q:1188 src/frequencies.q:1190
+#: src/frequencies.q:1178 src/frequencies.q:1180
 msgid "Pct"
 msgstr ""
 
 msgid "Pct"
 msgstr ""
 
-#: src/frequencies.q:1406
+#: src/frequencies.q:1396
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
 #, c-format
 msgid "No valid data for variable %s; statistics not displayed."
 msgstr ""
 
-#: src/frequencies.q:1445
+#: src/frequencies.q:1435
 msgid "Percentiles"
 msgstr ""
 
 msgid "Percentiles"
 msgstr ""
 
index 11de18a8a6428a991559b46afb5fa9620f1cebd0..69c756d48587955f95709b3ad627a9b977e1f45d 100644 (file)
@@ -1,3 +1,10 @@
+Mon Nov  1 12:46:17 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * q2c.c frequencies.q set.q t-test.q  Fixed the q2c parsing of DBL 
+       subcommand types.  Changed frequencies.q to use it rather then the 
+       custom parser.  Dealt with the consequences.  Added a test for NTILES
+       subcommand of frequencies.
+
 Sat Oct 30 09:16:29 WST 2004 John Darrington <john@darrington.wattle.id.au>
 
        * oneway.q   Fixed up the behaviour when given missing values
 Sat Oct 30 09:16:29 WST 2004 John Darrington <john@darrington.wattle.id.au>
 
        * oneway.q   Fixed up the behaviour when given missing values
index 9eb171724565e65338b51d1c79de87256acabbbd..9a69e9723d18618febdd55f27976adf67a7c6f37 100644 (file)
@@ -78,8 +78,8 @@
            norm:!nonormal/normal,
            incr:increment(d:inc,"%s>0");
      grouped=custom;
            norm:!nonormal/normal,
            incr:increment(d:inc,"%s>0");
      grouped=custom;
-     ntiles=custom;
-     percentiles=custom;
+     ntiles=integer;
+     +percentiles = double list;
      statistics[st_]=1|mean,2|semean,3|median,4|mode,5|stddev,6|variance,
            7|kurtosis,8|skewness,9|range,10|minimum,11|maximum,12|sum,
            13|default,14|seskewness,15|sekurtosis,all,none.
      statistics[st_]=1|mean,2|semean,3|median,4|mode,5|stddev,6|variance,
            7|kurtosis,8|skewness,9|range,10|minimum,11|maximum,12|sum,
            13|default,14|seskewness,15|sekurtosis,all,none.
@@ -126,6 +126,10 @@ struct percentile
   int flag2;       /* Set to 1 if this percentile value has been found */
 };
 
   int flag2;       /* Set to 1 if this percentile value has been found */
 };
 
+
+static void add_percentile (double x) ;
+
+
 static struct percentile *percentiles;
 static int n_percentiles;
 
 static struct percentile *percentiles;
 static int n_percentiles;
 
@@ -265,6 +269,28 @@ internal_cmd_frequencies (void)
   if (chart != GFT_NONE || cmd.sbc_ntiles)
     cmd.sort = FRQ_AVALUE;
 
   if (chart != GFT_NONE || cmd.sbc_ntiles)
     cmd.sort = FRQ_AVALUE;
 
+  /* Work out what percentiles need to be calculated */
+  if ( cmd.sbc_percentiles ) 
+    {
+      for ( i = 0 ; i < MAXLISTS ; ++i ) 
+       {
+         int pl;
+         subc_list_double *ptl_list = &cmd.dl_percentiles[i];
+         for ( pl = 0 ; pl < subc_list_double_count(ptl_list); ++pl)
+             add_percentile(subc_list_double_at(ptl_list,pl) / 100.0 );
+       }
+    }
+  if ( cmd.sbc_ntiles ) 
+    {
+      for ( i = 0 ; i < cmd.sbc_ntiles ; ++i ) 
+       {
+         int j;
+         for (j = 0; j <= cmd.n_ntiles[i]; ++j ) 
+             add_percentile(j / (double) cmd.n_ntiles[i]);
+       }
+    }
+  
+
   /* Do it! */
   procedure_with_splits (precalc, calc, postcalc, NULL);
 
   /* Do it! */
   procedure_with_splits (precalc, calc, postcalc, NULL);
 
@@ -826,8 +852,14 @@ add_percentile (double x)
   int i;
 
   for (i = 0; i < n_percentiles; i++)
   int i;
 
   for (i = 0; i < n_percentiles; i++)
-    if (x <= percentiles[i].p)
-      break;
+    {
+      /* Do nothing if it's already in the list */
+      if ( fabs(x - percentiles[i].p) < DBL_EPSILON ) 
+       return;
+
+      if (x < percentiles[i].p)
+       break;
+    }
 
   if (i >= n_percentiles || tokval != percentiles[i].p)
     {
 
   if (i >= n_percentiles || tokval != percentiles[i].p)
     {
@@ -844,50 +876,6 @@ add_percentile (double x)
     }
 }
 
     }
 }
 
-/* Parses the PERCENTILES subcommand, adding user-specified
-   percentiles to the list. */
-static int
-frq_custom_percentiles (struct cmd_frequencies *cmd UNUSED)
-{
-  lex_match ('=');
-  if (token != T_NUM)
-    {
-      msg (SE, _("Percentile list expected after PERCENTILES."));
-      return 0;
-    }
-  
-  do
-    {
-      if (tokval < 0 || tokval > 100)
-       {
-         msg (SE, _("Percentiles must be between 0 and 100."));
-         return 0;
-       }
-      
-      add_percentile (tokval / 100.0);
-      lex_get ();
-      lex_match (',');
-    }
-  while (token == T_NUM);
-  return 1;
-}
-
-/* Parses the NTILES subcommand, adding the percentiles that
-   correspond to the specified evenly-distributed ntiles. */
-static int
-frq_custom_ntiles (struct cmd_frequencies *cmd UNUSED)
-{
-  int i;
-
-  lex_match ('=');
-  if (!lex_force_int ())
-    return 0;
-  for (i = 1; i < lex_integer (); i++)
-    add_percentile (1.0 / lex_integer () * i);
-  lex_get ();
-  return 1;
-}
-\f
 /* Comparison functions. */
 
 /* Hash of numeric values. */
 /* Comparison functions. */
 
 /* Hash of numeric values. */
index e8f09d8d5daa38f195166f44355de5f0a84ce7ea..39a6cc4ec610d09152d3a6091a78f9e1fc3af790 100644 (file)
--- a/src/q2c.c
+++ b/src/q2c.c
@@ -1137,11 +1137,11 @@ dump_declarations (void)
 
          case SBC_INT:
          case SBC_PINT:
 
          case SBC_INT:
          case SBC_PINT:
-           dump (0, "long n_%s;", st_lower (sbc->name));
+           dump (0, "long n_%s[MAXLISTS];", st_lower (sbc->name));
            break;
 
          case SBC_DBL:
            break;
 
          case SBC_DBL:
-           dump (0, "double n_%s;", st_lower (sbc->name));
+           dump (0, "double n_%s[MAXLISTS];", st_lower (sbc->name));
            break;
 
          case SBC_DBL_LIST:
            break;
 
          case SBC_DBL_LIST:
@@ -1254,16 +1254,23 @@ dump_vars_init (int persistent)
                break;
 
              case SBC_DBL_LIST:
                break;
 
              case SBC_DBL_LIST:
-               dump (0, "int i;");
-               dump (0, "for (i = 0; i < MAXLISTS; ++i)");
                dump (1, "{");
                dump (1, "{");
+               dump (0, "int i;");
+               dump (1, "for (i = 0; i < MAXLISTS; ++i)");
                dump (0, "subc_list_double_create(&p->dl_%s[i]) ;",
                      st_lower (sbc->name)
                      );
                dump (0, "subc_list_double_create(&p->dl_%s[i]) ;",
                      st_lower (sbc->name)
                      );
-               dump (-1, "}");
+               dump (-2, "}");
                break;
 
              case SBC_DBL:
                break;
 
              case SBC_DBL:
+               dump (1, "{");
+               dump (0, "int i;");
+               dump (1, "for (i = 0; i < MAXLISTS; ++i)");
+               dump (0, "p->n_%s[i] = SYSMIS;", st_lower (sbc->name));
+               dump (-2, "}");
+               break;
+
              case SBC_CUSTOM:
                /* nothing */
                break;
              case SBC_CUSTOM:
                /* nothing */
                break;
@@ -1308,7 +1315,11 @@ dump_vars_init (int persistent)
 
              case SBC_INT:
              case SBC_PINT:
 
              case SBC_INT:
              case SBC_PINT:
-               dump (0, "p->n_%s = NOT_LONG;", st_lower (sbc->name));
+               dump (1, "{");
+               dump (0, "int i;");
+               dump (1, "for (i = 0; i < MAXLISTS; ++i)");
+               dump (0, "p->n_%s[i] = NOT_LONG;", st_lower (sbc->name));
+               dump (-2, "}");
                break;
 
              default:
                break;
 
              default:
@@ -1614,7 +1625,8 @@ dump_subcommand (const subcommand *sbc)
     {
       dump (1, "if (!lex_force_num ())");
       dump (0, "goto lossage;");
     {
       dump (1, "if (!lex_force_num ())");
       dump (0, "goto lossage;");
-      dump (-1, "p->n_%s = lex_double ();", st_lower (sbc->name));
+      dump (-1, "p->n_%s[p->sbc_%s - 1] = lex_double ();", 
+           st_lower (sbc->name), st_lower (sbc->name) );
       dump (0, "lex_get();");
     }
   else if (sbc->type == SBC_INT)
       dump (0, "lex_get();");
     }
   else if (sbc->type == SBC_INT)
@@ -1638,7 +1650,7 @@ dump_subcommand (const subcommand *sbc)
          dump (0, "goto lossage;");
          dump (-1, "}");
       }
          dump (0, "goto lossage;");
          dump (-1, "}");
       }
-      dump (-1, "p->n_%s = x;", st_lower (sbc->name));
+      dump (0, "p->n_%s[p->sbc_%s - 1] = x;", st_lower (sbc->name), st_lower(sbc->name) );
       dump (-1,"}");
     }
   else if (sbc->type == SBC_PINT)
       dump (-1,"}");
     }
   else if (sbc->type == SBC_PINT)
@@ -1848,7 +1860,12 @@ dump_aux_subcommand (const subcommand *sbc)
     }
   else if (sbc->type == SBC_INT)
     {
     }
   else if (sbc->type == SBC_INT)
     {
-      dump (0, "msg(MM,\"%s is %%ld\",p->n_%s);", sbc->name,st_lower(sbc->name) ); 
+      dump (1, "{");
+      dump (0, "int i;");
+      dump (1, "for (i = 0; i < MAXLISTS; ++i)");
+      dump (0, "msg(MM,\"%s is %%ld\",p->n_%s[i]);", sbc->name,st_lower(sbc->name) ); 
+      outdent();
+      dump (-1, "}");
     }
   else if (sbc->type == SBC_CUSTOM)
     {
     }
   else if (sbc->type == SBC_CUSTOM)
     {
@@ -2105,7 +2122,7 @@ main (int argc, char *argv[])
          continue;
        }
       
          continue;
        }
       
-      dump (0, "#line %d \"%s\"", oln - 1, ofn);
+      dump (0, "#line %d \"%s\"", oln + 1, ofn);
       if (!strcmp (directive, "specification"))
        {
          /* Skip leading slash-star line. */
       if (!strcmp (directive, "specification"))
        {
          /* Skip leading slash-star line. */
index 3c1b38d5af50f77170c22efbae9cae1b33fb53f4..4c2d66a3a1d6b450b99837313f602ab34b0ab35f 100644 (file)
--- a/src/set.q
+++ b/src/set.q
@@ -1063,8 +1063,8 @@ init_settings(void)
   cmd.safe = STC_OFF;
 
   cmd.dec = STC_DOT;
   cmd.safe = STC_OFF;
 
   cmd.dec = STC_DOT;
-  cmd.n_cpi = 6;
-  cmd.n_lpi = 10;
+  cmd.n_cpi[0] = 6;
+  cmd.n_lpi[0] = 10;
   cmd.echo = STC_OFF;
   cmd.more = STC_ON;
   cmd.headers = STC_YES;
   cmd.echo = STC_OFF;
   cmd.more = STC_ON;
   cmd.headers = STC_YES;
@@ -1080,10 +1080,10 @@ init_settings(void)
   set_journal = xstrdup ("pspp.jnl");
   set_journaling = 1;
 
   set_journal = xstrdup ("pspp.jnl");
   set_journaling = 1;
 
-  cmd.n_mxwarns = 100;
-  cmd.n_mxerrs = 100;
-  cmd.n_mxloops = 1;
-  cmd.n_workspace = 4L * 1024 * 1024;
+  cmd.n_mxwarns[0] = 100;
+  cmd.n_mxerrs[0] = 100;
+  cmd.n_mxloops[0] = 1;
+  cmd.n_workspace[0] = 4L * 1024 * 1024;
 
 
 #if !USE_INTERNAL_PAGER
 
 
 #if !USE_INTERNAL_PAGER
@@ -1211,13 +1211,13 @@ get_undefined(void)
 int
 get_mxwarns(void)
 {  
 int
 get_mxwarns(void)
 {  
-  return cmd.n_mxwarns;
+  return cmd.n_mxwarns[0];
 }
 
 int
 get_mxerrs(void)
 {
 }
 
 int
 get_mxerrs(void)
 {
-  return cmd.n_mxerrs;
+  return cmd.n_mxerrs[0];
 }
 
 int
 }
 
 int
@@ -1235,7 +1235,7 @@ get_printback(void)
 int
 get_mxloops(void)
 {
 int
 get_mxloops(void)
 {
-  return cmd.n_mxloops;
+  return cmd.n_mxloops[0];
 }
 
 int
 }
 
 int
@@ -1260,7 +1260,7 @@ get_endcmd(void)
 size_t
 get_max_workspace(void)
 {
 size_t
 get_max_workspace(void)
 {
-  return cmd.n_workspace;
+  return cmd.n_workspace[0];
 }
 
 double
 }
 
 double
index 44dd502ee7f90c929ff475f02d10a6ca72079979..ab25065f2f3dc007394e3dddc13328f61b12101a 100644 (file)
@@ -46,7 +46,7 @@
 /* (specification)
    "T-TEST" (tts_):
      +groups=custom;
 /* (specification)
    "T-TEST" (tts_):
      +groups=custom;
-     +testval=double;
+     testval=double;
      variables=varlist("PV_NO_SCRATCH | PV_NUMERIC");
      pairs=custom;
      +missing=miss:!analysis/listwise,
      variables=varlist("PV_NO_SCRATCH | PV_NUMERIC");
      pairs=custom;
      +missing=miss:!analysis/listwise,
@@ -1248,7 +1248,7 @@ trbox_one_sample_init(struct trbox *self, struct cmd_t_test *cmd )
   tab_vline(self->t, TAL_2, 1, 0, vsize - 1);
 
   tab_joint_text(self->t, 1, 0, hsize-1,0, TAB_CENTER | TAT_PRINTF, 
   tab_vline(self->t, TAL_2, 1, 0, vsize - 1);
 
   tab_joint_text(self->t, 1, 0, hsize-1,0, TAB_CENTER | TAT_PRINTF, 
-                _("Test Value = %f"),cmd->n_testval);
+                _("Test Value = %f"), cmd->n_testval[0]);
 
   tab_box(self->t, -1, -1, -1, TAL_1, 1,1,hsize-1,vsize-1);
 
 
   tab_box(self->t, -1, -1, -1, TAL_1, 1,1,hsize-1,vsize-1);
 
@@ -1288,7 +1288,7 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd)
 
       tab_text (trb->t, 0, i+3, TAB_LEFT, cmd->v_variables[i]->name);
 
 
       tab_text (trb->t, 0, i+3, TAB_LEFT, cmd->v_variables[i]->name);
 
-      t = (gs->mean - cmd->n_testval ) * sqrt(gs->n) / gs->std_dev ;
+      t = (gs->mean - cmd->n_testval[0] ) * sqrt(gs->n) / gs->std_dev ;
 
       tab_float (trb->t, 1, i+3, TAB_RIGHT, t, 8,3);
 
 
       tab_float (trb->t, 1, i+3, TAB_RIGHT, t, 8,3);
 
@@ -1536,7 +1536,7 @@ one_sample_calc (const struct ccase *c, void *cmd_)
       gs= &cmd->v_variables[i]->p.grp_data.ugs;
       
       if ( ! value_is_missing(val,v))
       gs= &cmd->v_variables[i]->p.grp_data.ugs;
       
       if ( ! value_is_missing(val,v))
-       gs->sum_diff += weight * (val->f - cmd->n_testval);
+       gs->sum_diff += weight * (val->f - cmd->n_testval[0]);
     }
 
   return 0;
     }
 
   return 0;
index f651aa43762f4f06e683402092b2b922c6bae410..ed566ef47e9184ac5fcb99fc79ddf1b20044b545 100644 (file)
@@ -57,6 +57,7 @@ TESTS = \
        stats/descript-mean-bug.sh \
        stats/moments.sh \
        stats/percentiles-compatible.sh \
        stats/descript-mean-bug.sh \
        stats/moments.sh \
        stats/percentiles-compatible.sh \
+       stats/ntiles.sh \
        stats/percentiles-enhanced.sh
 
 noinst_PROGRAMS = gengarbage
        stats/percentiles-enhanced.sh
 
 noinst_PROGRAMS = gengarbage
diff --git a/tests/stats/ntiles.sh b/tests/stats/ntiles.sh
new file mode 100755 (executable)
index 0000000..35d4af7
--- /dev/null
@@ -0,0 +1,108 @@
+#! /bin/sh
+
+# Tests the NTILE subcommand of the frequencies command
+
+TEMPDIR=/tmp/pspp-tst-$$
+
+here=`pwd`;
+
+# ensure that top_srcdir is absolute
+cd $top_srcdir; top_srcdir=`pwd`
+
+export STAT_CONFIG_PATH=$top_srcdir/config
+
+
+cleanup()
+{
+     rm -rf $TEMPDIR
+     :
+}
+
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    cleanup;
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    cleanup;
+    exit 2;
+}
+
+pass()
+{
+    cleanup;
+    exit 0;
+}
+
+mkdir -p $TEMPDIR
+
+cd $TEMPDIR
+
+
+i=1;
+
+activity="create program $i"
+cat > $TEMPDIR/prog.sps <<EOF
+DATA LIST LIST notable /x * .
+BEGIN DATA.
+1 
+2 
+3 
+4 
+5
+END DATA.
+
+FREQUENCIES 
+       VAR=x
+       /PERCENTILES = 0 25 33.333 50 66.666 75 100
+
+EOF
+if [ $? -ne 0 ] ; then no_result; fi
+
+activity="run program $i"
+$SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/prog.sps
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="move output"
+cp $TEMPDIR/pspp.list $TEMPDIR/list.ref
+if [ $? -ne 0 ] ; then no_result ; fi
+
+i=$[$i+1];
+
+activity="create program $i"
+cat > $TEMPDIR/prog.sps <<EOF
+DATA LIST LIST notable /x * .
+BEGIN DATA.
+1 
+2 
+3 
+4 
+5
+END DATA.
+
+FREQUENCIES 
+       VAR=x
+       /NTILES = 3
+       /NTILES = 4
+       .
+EOF
+if [ $? -ne 0 ] ; then no_result; fi
+
+activity="run program $i"
+$SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/prog.sps
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="compare output"
+diff $TEMPDIR/pspp.list $TEMPDIR/list.ref
+if [ $? -ne 0 ] ; then fail; fi
+
+
+pass;