work on lexer
[pspp] / src / data / case.c
index 60704185a6a105b5a5730447c9a018919fc5bac1..9f1c404193911651e9192277b42204bd3ca15d70 100644 (file)
@@ -201,8 +201,8 @@ case_copy (struct ccase *dst, size_t dst_idx,
   assert (!case_is_shared (dst));
   assert (caseproto_range_is_valid (dst->proto, dst_idx, n_values));
   assert (caseproto_range_is_valid (src->proto, src_idx, n_values));
-  assert (caseproto_equal (dst->proto, dst_idx, src->proto, src_idx,
-                           n_values));
+  assert (caseproto_range_equal (dst->proto, dst_idx, src->proto, src_idx,
+                                 n_values));
 
   if (dst != src)
     {
@@ -265,7 +265,7 @@ const union value *
 case_data (const struct ccase *c, const struct variable *v)
 {
   assert_variable_matches_case (c, v);
-  return &c->values[var_get_case_index (v)];
+  return &c->values[var_get_dict_index (v)];
 }
 
 /* Returns a pointer to the `union value' used for the element of
@@ -288,7 +288,7 @@ case_data_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)];
+  return &c->values[var_get_dict_index (v)];
 }
 
 /* Returns a pointer to the `union value' used for the
@@ -311,7 +311,7 @@ double
 case_num (const struct ccase *c, const struct variable *v)
 {
   assert_variable_matches_case (c, v);
-  return c->values[var_get_case_index (v)].f;
+  return c->values[var_get_dict_index (v)].f;
 }
 
 /* Returns the numeric value of the `union value' in C numbered
@@ -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_dict_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_dict_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_dict_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
@@ -361,9 +403,9 @@ uint8_t *
 case_str_rw (struct ccase *c, const struct variable *v)
 {
   assert_variable_matches_case (c, v);
-  size_t idx = var_get_case_index (v);
+  size_t idx = var_get_dict_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
@@ -471,9 +513,9 @@ case_size (const struct caseproto *proto)
 static void
 assert_variable_matches_case (const struct ccase *c, const struct variable *v)
 {
-  size_t case_idx = var_get_case_index (v);
-  assert (case_idx < caseproto_get_n_widths (c->proto));
-  assert (caseproto_get_width (c->proto, case_idx) == var_get_width (v));
+  size_t var_idx = var_get_dict_index (v);
+  assert (var_idx < caseproto_get_n_widths (c->proto));
+  assert (caseproto_get_width (c->proto, var_idx) == var_get_width (v));
 }
 
 /* Internal helper function for case_copy(). */
@@ -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));
 }