case: Introduce new functions for numbers and substrings in cases.
[pspp] / src / language / stats / rank.c
index 48eda85474c5e995f3768b0d1d088220aae44abc..dc40a0954a02e20b2377c19f3e4ec9eb33007256 100644 (file)
@@ -91,14 +91,14 @@ enum rank_func
   };
 
 static const struct fmt_spec dest_format[n_RANK_FUNCS] = {
-  {FMT_F, 9, 3}, /* rank */
-  {FMT_F, 6, 4}, /* normal */
-  {FMT_F, 6, 2}, /* percent */
-  {FMT_F, 6, 4}, /* rfraction */
-  {FMT_F, 6, 4}, /* proportion */
-  {FMT_F, 6, 0}, /* n */
-  {FMT_F, 3, 0}, /* ntiles */
-  {FMT_F, 8, 4}  /* savage */
+  [RANK]       = { .type = FMT_F, .w = 9, .d = 3 },
+  [NORMAL]     = { .type = FMT_F, .w = 6, .d = 4 },
+  [PERCENT]    = { .type = FMT_F, .w = 6, .d = 2 },
+  [RFRACTION]  = { .type = FMT_F, .w = 6, .d = 4 },
+  [PROPORTION] = { .type = FMT_F, .w = 6, .d = 4 },
+  [N]          = { .type = FMT_F, .w = 6, .d = 0 },
+  [NTILES]     = { .type = FMT_F, .w = 3, .d = 0 },
+  [SAVAGE]     = { .type = FMT_F, .w = 8, .d = 4 }
 };
 
 static const char * const function_name[n_RANK_FUNCS] = {
@@ -290,7 +290,7 @@ parse_into (struct lexer *lexer, struct rank *cmd,
       if (!lex_force_match (lexer, T_LPAREN))
        return false;
 
-      if (! lex_force_int (lexer))
+      if (! lex_force_int_range (lexer, "NTILES", 1, INT_MAX))
        return false;
 
       cmd->k_ntiles = lex_integer (lexer);
@@ -573,12 +573,12 @@ rank_sorted_file (struct casereader *input,
           size_t i;
 
           out_case = case_create (casewriter_get_proto (output));
-          case_data_rw_idx (out_case, 0)->f = case_num_idx (c, 1);
+          *case_num_rw_idx (out_case, 0) = case_num_idx (c, 1);
           for (i = 0; i < cmd->n_rs; ++i)
             {
               rank_function_t func = rank_func[cmd->rs[i].rfunc];
               double rank = func (cmd, tw, cc, cc_1, tie_group, w);
-              case_data_rw_idx (out_case, i + 1)->f = rank;
+              *case_num_rw_idx (out_case, i + 1) = rank;
             }
 
           casewriter_write (output, out_case);
@@ -823,7 +823,6 @@ cmd_rank (struct lexer *lexer, struct dataset *ds)
     {
       struct pivot_table *table = pivot_table_create (
         N_("Variables Created by RANK"));
-      table->omit_empty = true;
 
       pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("New Variable"),
                               N_("New Variable"), N_("Function"),
@@ -929,7 +928,7 @@ rank_trns_proc (void *trns_, struct ccase **c, casenumber case_idx UNUSED)
             size_t i;
 
             for (i = 0; i < trns->n_funcs; i++)
-              case_data_rw (*c, iv->output_vars[i])->f
+              *case_num_rw (*c, iv->output_vars[i])
                 = case_num_idx (iv->current, i + 1);
             advance_ranking (iv);
             break;