case: Introduce new functions for numbers and substrings in cases.
[pspp] / src / data / case.c
index 60704185a6a105b5a5730447c9a018919fc5bac1..742d1f0f22ca46e6743f0c0a6d808b6fd28250a6 100644 (file)
@@ -323,6 +323,29 @@ case_num_idx (const struct ccase *c, size_t idx)
   return c->values[idx].f;
 }
 
+/* Returns a pointer to the `double' in the `union value' in C for variable V.
+   The caller is allowed to modify the returned data.
+
+   Case C must be drawn from V's dictionary and must not be shared. */
+double *
+case_num_rw (struct ccase *c, const struct variable *v)
+{
+  assert_variable_matches_case (c, v);
+  assert (!case_is_shared (c));
+  return &c->values[var_get_case_index (v)].f;
+}
+
+/* Returns a pointer to the `double' in the `union value' in C numbered IDX.
+   The caller is allowed to modify the returned data.
+
+   Case C must not be shared. */
+double *
+case_num_rw_idx (struct ccase *c, size_t idx)
+{
+  assert (!case_is_shared (c));
+  return &c->values[idx].f;
+}
+
 /* Returns the string value of the `union value' in C for
    variable V.  Case C must be drawn from V's dictionary.  The
    caller must not modify the return value.
@@ -333,8 +356,7 @@ const uint8_t *
 case_str (const struct ccase *c, const struct variable *v)
 {
   assert_variable_matches_case (c, v);
-  size_t idx = var_get_case_index (v);
-  return value_str (&c->values[idx], caseproto_get_width (c->proto, idx));
+  return c->values[var_get_case_index (v)].s;
 }
 
 /* Returns the string value of the `union value' in C numbered
@@ -346,7 +368,27 @@ const uint8_t *
 case_str_idx (const struct ccase *c, size_t idx)
 {
   assert (idx < c->proto->n_widths);
-  return value_str (&c->values[idx], caseproto_get_width (c->proto, idx));
+  return c->values[idx].s;
+}
+
+/* Returns a substring for the `union value' in C for variable V.  Case C must
+   be drawn from V's dictionary. */
+struct substring
+case_ss (const struct ccase *c, const struct variable *v)
+{
+  assert_variable_matches_case (c, v);
+  return ss_buffer (CHAR_CAST (char *, c->values[var_get_case_index (v)].s),
+                    var_get_width (v));
+}
+
+/* Returns a substring for the `union value' in C numbered IDX.  WIDTH must be
+   the value's width. */
+struct substring
+case_ss_idx (const struct ccase *c, size_t width, size_t idx)
+{
+  assert (width > 0);
+  assert (idx < c->proto->n_widths);
+  return ss_buffer (CHAR_CAST (char *, c->values[idx].s), width);
 }
 
 /* Returns the string value of the `union value' in C for
@@ -363,7 +405,7 @@ case_str_rw (struct ccase *c, const struct variable *v)
   assert_variable_matches_case (c, v);
   size_t idx = var_get_case_index (v);
   assert (!case_is_shared (c));
-  return value_str_rw (&c->values[idx], caseproto_get_width (c->proto, idx));
+  return c->values[idx].s;
 }
 
 /* Returns the string value of the `union value' in C numbered
@@ -378,7 +420,7 @@ case_str_rw_idx (struct ccase *c, size_t idx)
 {
   assert (idx < c->proto->n_widths);
   assert (!case_is_shared (c));
-  return value_str_rw (&c->values[idx], caseproto_get_width (c->proto, idx));
+  return c->values[idx].s;
 }
 
 /* Compares the values of the N_VARS variables in VP
@@ -497,7 +539,7 @@ copy_backward (struct ccase *dst, size_t dst_idx,
 {
   size_t i;
 
-  for (i = n_values; i-- != 0; )
+  for (i = n_values; i-- != 0;)
     value_copy (&dst->values[dst_idx + i], &src->values[src_idx + i],
                 caseproto_get_width (dst->proto, dst_idx + i));
 }