X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcase.c;h=9f1c404193911651e9192277b42204bd3ca15d70;hb=refs%2Fheads%2Frust;hp=76769223980e0f820081c2aa6cb1df676bf9937e;hpb=829735a75b39004abe9a5ff6b72306b3c1230ca4;p=pspp diff --git a/src/data/case.c b/src/data/case.c index 7676922398..9f1c404193 100644 --- a/src/data/case.c +++ b/src/data/case.c @@ -110,7 +110,7 @@ case_get_cost (const struct caseproto *proto) { /* FIXME: improve approximation? */ return (1 + caseproto_get_n_widths (proto) - + 3 * caseproto_get_n_long_strings (proto)) * sizeof (union value); + + 3 * caseproto_get_n_strings (proto)) * sizeof (union value); } /* Changes the prototype for case C, which must not be shared. @@ -201,12 +201,12 @@ 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) { - if (!dst->proto->n_long_strings || !src->proto->n_long_strings) + if (!dst->proto->n_strings || !src->proto->n_strings) memcpy (&dst->values[dst_idx], &src->values[src_idx], sizeof dst->values[0] * n_values); else @@ -214,7 +214,7 @@ case_copy (struct ccase *dst, size_t dst_idx, } else if (dst_idx != src_idx) { - if (!dst->proto->n_long_strings) + if (!dst->proto->n_strings) memmove (&dst->values[dst_idx], &src->values[src_idx], sizeof dst->values[0] * n_values); else if (dst_idx < src_idx) @@ -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)); }