From 2fe0749f0892964767cefadb5fac1c9784e9df84 Mon Sep 17 00:00:00 2001
From: John Darrington <john@darrington.wattle.id.au>
Date: Tue, 16 Jun 2009 07:27:31 +0800
Subject: [PATCH] Add new functions to define subcase orderings.

Allow subcases to be defined from a index and width,
rather from a variable.  This avoids much of the
need for var_create_internal.
---
 src/data/subcase.c       | 25 +++++++++++++++++++++++--
 src/data/subcase.h       |  6 ++++++
 src/language/stats/roc.c |  3 +--
 3 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/src/data/subcase.c b/src/data/subcase.c
index be58609693..6ffaa4c2be 100644
--- a/src/data/subcase.c
+++ b/src/data/subcase.c
@@ -64,6 +64,16 @@ subcase_init_var (struct subcase *sc, const struct variable *var,
   subcase_add_var (sc, var, direction);
 }
 
+
+void
+subcase_init (struct subcase *sc, int index, int width,
+                  enum subcase_direction direction)
+{
+  subcase_init_empty (sc);
+  subcase_add (sc, index, width, direction);
+}
+
+
 /* Removes all the fields from SC. */
 void
 subcase_clear (struct subcase *sc)
@@ -89,6 +99,7 @@ subcase_destroy (struct subcase *sc)
   caseproto_unref (sc->proto);
 }
 
+
 /* Add a field for VAR to SC, with DIRECTION as the sort order.
    Returns true if successful, false if VAR already has a field
    in SC. */
@@ -96,7 +107,17 @@ bool
 subcase_add_var (struct subcase *sc, const struct variable *var,
                  enum subcase_direction direction)
 {
-  size_t case_index = var_get_case_index (var);
+  return subcase_add (sc, var_get_case_index (var),
+		      var_get_width (var), direction);
+}
+
+/* Add a field for CASE_INDEX, WIDTH to SC, with DIRECTION as the sort order.
+   Returns true if successful, false if CASE_INDEX already has a field
+   in SC. */
+bool
+subcase_add (struct subcase *sc, int case_index, int width,
+                 enum subcase_direction direction)
+{
   struct subcase_field *field;
   size_t i;
 
@@ -107,7 +128,7 @@ subcase_add_var (struct subcase *sc, const struct variable *var,
   sc->fields = xnrealloc (sc->fields, sc->n_fields + 1, sizeof *sc->fields);
   field = &sc->fields[sc->n_fields++];
   field->case_index = case_index;
-  field->width = var_get_width (var);
+  field->width = width;
   field->direction = direction;
   invalidate_proto (sc);
   return true;
diff --git a/src/data/subcase.h b/src/data/subcase.h
index 050cf17dcd..6e59da1d36 100644
--- a/src/data/subcase.h
+++ b/src/data/subcase.h
@@ -53,10 +53,16 @@ void subcase_init_vars (struct subcase *,
                         const struct variable *const *, size_t n_vars);
 void subcase_init_var (struct subcase *,
                        const struct variable *, enum subcase_direction);
+void subcase_init (struct subcase *, int index, int width,
+		   enum subcase_direction);
+
 void subcase_clone (struct subcase *, const struct subcase *);
 void subcase_clear (struct subcase *);
 void subcase_destroy (struct subcase *);
 
+bool subcase_add (struct subcase *sc, int index, int width,
+		  enum subcase_direction direction);
+
 bool subcase_add_var (struct subcase *, const struct variable *,
                       enum subcase_direction);
 
diff --git a/src/language/stats/roc.c b/src/language/stats/roc.c
index 3dff0407f8..eae528a38a 100644
--- a/src/language/stats/roc.c
+++ b/src/language/stats/roc.c
@@ -560,8 +560,7 @@ do_roc (struct cmd_roc *roc, struct casereader *input, struct dictionary *dict)
     struct caseproto *proto = caseproto_create ();
 
     struct subcase ordering;
-    struct variable *iv = var_create_internal (CUTPOINT);
-    subcase_init_var (&ordering, iv, SC_ASCEND);
+    subcase_init (&ordering, CUTPOINT, 0, SC_ASCEND);
 
 
     proto = caseproto_add_width (proto, 0); /* cutpoint */
-- 
2.30.2