subcase: Rename subcase_destroy() to subcase_uninit().
[pspp] / src / language / stats / rank.c
index 3d090b2bdca567e58f8902fdaffe7978a0b92bfc..af0eb215387160c5bf037f329a0f398203c33ae9 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] = {
@@ -243,7 +243,7 @@ destroy_rank (struct rank *rank)
 {
  free (rank->vars);
  free (rank->group_vars);
- subcase_destroy (&rank->sc);
+ subcase_uninit (&rank->sc);
  pool_destroy (rank->pool);
 }
 
@@ -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);
@@ -555,7 +555,7 @@ rank_sorted_file (struct casereader *input,
   /* Do ranking. */
   subcase_init (&input_var, 0, 0, SC_ASCEND);
   tie_grouper = casegrouper_create_subcase (input, &input_var);
-  subcase_destroy (&input_var);
+  subcase_uninit (&input_var);
   for (; casegrouper_get_next_group (tie_grouper, &tied_cases);
        casereader_destroy (tied_cases))
     {
@@ -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);
@@ -661,6 +661,7 @@ cmd_rank (struct lexer *lexer, struct dataset *ds)
   rank.ties = TIES_MEAN;
   rank.fraction = FRAC_BLOM;
   rank.print = true;
+  rank.vars = NULL;
   rank.pool = pool_create ();
 
   string_set_init (&new_names);
@@ -911,7 +912,7 @@ advance_ranking (struct rank_trns_input_var *iv)
   iv->current = casereader_read (iv->input);
 }
 
-static int
+static enum trns_result
 rank_trns_proc (void *trns_, struct ccase **c, casenumber case_idx UNUSED)
 {
   struct rank_trns *trns = trns_;
@@ -928,7 +929,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;
@@ -960,6 +961,12 @@ rank_trns_free (void *trns_)
   return true;
 }
 
+static const struct trns_class rank_trns_class = {
+  .name = "RANK",
+  .execute = rank_trns_proc,
+  .destroy = rank_trns_free,
+};
+
 static bool
 rank_cmd (struct dataset *ds, const struct rank *cmd)
 {
@@ -989,7 +996,7 @@ rank_cmd (struct dataset *ds, const struct rank *cmd)
     for (i = 0; i < cmd->n_vars; i++)
       outputs[i] = sort_create_writer (&by_order, output_proto);
 
-    subcase_destroy (&by_order);
+    subcase_uninit (&by_order);
     caseproto_unref (output_proto);
   }
 
@@ -1031,16 +1038,16 @@ rank_cmd (struct dataset *ds, const struct rank *cmd)
       subcase_add_vars_always (&projection,
                                cmd->group_vars, cmd->n_group_vars);
       subcase_add_vars_always (&projection, dict_get_split_vars (d),
-                               dict_get_split_cnt (d));
+                               dict_get_n_splits (d));
       if (weight_var != NULL)
         {
           subcase_add_var_always (&projection, weight_var, SC_ASCEND);
-          weight_idx = 2 + cmd->n_group_vars + dict_get_split_cnt (d);
+          weight_idx = 2 + cmd->n_group_vars + dict_get_n_splits (d);
         }
       else
         weight_idx = -1;
       input_pass = casereader_project (input_pass, &projection);
-      subcase_destroy (&projection);
+      subcase_uninit (&projection);
 
       /* Prepare 'group_vars' as the set of grouping variables. */
       subcase_init_empty (&group_vars);
@@ -1056,12 +1063,12 @@ rank_cmd (struct dataset *ds, const struct rank *cmd)
 
       /* Group by split variables */
       subcase_init_empty (&split_vars);
-      for (j = 0; j < dict_get_split_cnt (d); j++)
+      for (j = 0; j < dict_get_n_splits (d); j++)
         subcase_add_always (&split_vars, 2 + j + cmd->n_group_vars,
                             var_get_width (dict_get_split_vars (d)[j]),
                             SC_ASCEND);
       split_grouper = casegrouper_create_subcase (input_pass, &split_vars);
-      subcase_destroy (&split_vars);
+      subcase_uninit (&split_vars);
       while (casegrouper_get_next_group (split_grouper, &split_group))
         {
           struct casereader *ordered;
@@ -1074,8 +1081,8 @@ rank_cmd (struct dataset *ds, const struct rank *cmd)
             rank_sorted_file (by_group, outputs[i], weight_idx, cmd);
           ok = casegrouper_destroy (by_grouper) && ok;
         }
-      subcase_destroy (&group_vars);
-      subcase_destroy (&rank_ordering);
+      subcase_uninit (&group_vars);
+      subcase_uninit (&rank_ordering);
 
       ok = casegrouper_destroy (split_grouper) && ok;
     }
@@ -1115,7 +1122,7 @@ rank_cmd (struct dataset *ds, const struct rank *cmd)
     }
   free (outputs);
 
-  add_transformation (ds, rank_trns_proc, rank_trns_free, trns);
+  add_transformation (ds, &rank_trns_class, trns);
 
   /* Delete our sort key, which we don't need anymore. */
   dict_delete_var (d, order_var);