Replace more uses of 'cnt' by 'n'.
[pspp] / src / data / caseinit.c
index 69a0f01869fb7a66c97522d0a86243b9f523dfaf..815041fd1e6cb4453356f6248a7030c8503a9bd6 100644 (file)
@@ -1,5 +1,5 @@
 /* PSPP - a program for statistical analysis.
-   Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -47,13 +47,13 @@ struct init_value
 struct init_list
   {
     struct init_value *values;
-    size_t cnt;
+    size_t n;
   };
 
 /* A bitmap of the "left" status of variables. */
 enum leave_class
   {
-    LEAVE_REINIT = 0x001,       /* Reinitalize for every case. */
+    LEAVE_REINIT = 0x001,       /* Reinitialize for every case. */
     LEAVE_LEFT = 0x002          /* Keep the value from one case to the next. */
   };
 
@@ -62,7 +62,23 @@ static void
 init_list_create (struct init_list *list)
 {
   list->values = NULL;
-  list->cnt = 0;
+  list->n = 0;
+}
+
+/* Initializes NEW as a copy of OLD. */
+static void
+init_list_clone (struct init_list *new, const struct init_list *old)
+{
+  size_t i;
+
+  new->values = xmemdup (old->values, old->n * sizeof *old->values);
+  new->n = old->n;
+
+  for (i = 0; i < new->n; i++)
+    {
+      struct init_value *iv = &new->values[i];
+      value_clone (&iv->value, &iv->value, iv->width);
+    }
 }
 
 /* Frees the storage associated with LIST. */
@@ -71,7 +87,7 @@ init_list_destroy (struct init_list *list)
 {
   struct init_value *iv;
 
-  for (iv = &list->values[0]; iv < &list->values[list->cnt]; iv++)
+  for (iv = &list->values[0]; iv < &list->values[list->n]; iv++)
     value_destroy (&iv->value, iv->width);
   free (list->values);
 }
@@ -101,7 +117,7 @@ init_list_includes (const struct init_list *list, size_t case_index)
 {
   struct init_value value;
   value.case_index = case_index;
-  return binary_search (list->values, list->cnt, sizeof *list->values,
+  return binary_search (list->values, list->n, sizeof *list->values,
                         &value, compare_init_values, NULL) != NULL;
 }
 
@@ -112,13 +128,12 @@ static void
 init_list_mark (struct init_list *list, const struct init_list *exclude,
                 enum leave_class include, const struct dictionary *d)
 {
-  size_t var_cnt = dict_get_var_cnt (d);
-  size_t i;
+  size_t n_vars = dict_get_n_vars (d);
 
   assert (list != exclude);
-  list->values = xnrealloc (list->values, list->cnt + dict_get_var_cnt (d),
+  list->values = xnrealloc (list->values, list->n + dict_get_n_vars (d),
                             sizeof *list->values);
-  for (i = 0; i < var_cnt; i++)
+  for (size_t i = 0; i < n_vars; i++)
     {
       struct variable *v = dict_get_var (d, i);
       size_t case_index = var_get_case_index (v);
@@ -132,7 +147,7 @@ init_list_mark (struct init_list *list, const struct init_list *exclude,
       if (exclude != NULL && init_list_includes (exclude, case_index))
         continue;
 
-      iv = &list->values[list->cnt++];
+      iv = &list->values[list->n++];
       iv->case_index = case_index;
       iv->width = var_get_width (v);
       value_init (&iv->value, iv->width);
@@ -143,8 +158,8 @@ init_list_mark (struct init_list *list, const struct init_list *exclude,
     }
 
   /* Drop duplicates. */
-  list->cnt = sort_unique (list->values, list->cnt, sizeof *list->values,
-                           compare_init_values, NULL);
+  list->n = sort_unique (list->values, list->n, sizeof *list->values,
+                         compare_init_values, NULL);
 }
 
 /* Initializes data in case C to the values in the initializer
@@ -154,7 +169,7 @@ init_list_init (const struct init_list *list, struct ccase *c)
 {
   const struct init_value *iv;
 
-  for (iv = &list->values[0]; iv < &list->values[list->cnt]; iv++)
+  for (iv = &list->values[0]; iv < &list->values[list->n]; iv++)
     value_copy (case_data_rw_idx (c, iv->case_index), &iv->value, iv->width);
 }
 
@@ -165,7 +180,7 @@ init_list_update (const struct init_list *list, const struct ccase *c)
 {
   struct init_value *iv;
 
-  for (iv = &list->values[0]; iv < &list->values[list->cnt]; iv++)
+  for (iv = &list->values[0]; iv < &list->values[list->n]; iv++)
     value_copy (&iv->value, case_data_idx (c, iv->case_index), iv->width);
 }
 \f
@@ -198,6 +213,17 @@ caseinit_create (void)
   return ci;
 }
 
+/* Creates and returns a copy of OLD. */
+struct caseinit *
+caseinit_clone (struct caseinit *old)
+{
+  struct caseinit *new = xmalloc (sizeof *new);
+  init_list_clone (&new->preinited_values, &old->preinited_values);
+  init_list_clone (&new->reinit_values, &old->reinit_values);
+  init_list_clone (&new->left_values, &old->left_values);
+  return new;
+}
+
 /* Clears the contents of case initializer CI. */
 void
 caseinit_clear (struct caseinit *ci)