X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-case-array.c;h=871e9e154d78ade8e763e5a9a1a0ad24d0941af8;hb=e294a372f351d7105c21a2db58022af8b119aa64;hp=e6ab7f7f3d5472dc344704c67d535fde480a237b;hpb=a19b858e0ac3c69e4a28c0ca6d8674427268a863;p=pspp diff --git a/src/ui/gui/psppire-case-array.c b/src/ui/gui/psppire-case-array.c index e6ab7f7f3d..871e9e154d 100644 --- a/src/ui/gui/psppire-case-array.c +++ b/src/ui/gui/psppire-case-array.c @@ -176,24 +176,15 @@ psppire_case_array_resize(PsppireCaseArray *ca, gint new_size) ca->width = new_size; } -/* FIXME: add_case and insert_case need to be merged/refactored */ -gboolean -psppire_case_array_add_case(PsppireCaseArray *ca, + +/* Append a case to the case array. If FILL_CASE_FUNC is not NULL, + * then use it to populate the case */ +inline gboolean +psppire_case_array_append_case(PsppireCaseArray *ca, psppire_case_array_fill_case_func fill_case_func, gpointer aux) { - g_return_val_if_fail(ca->size < ca->capacity, FALSE); - - case_create(&ca->cases[ca->size], ca->width); - - if ( !fill_case_func(&ca->cases[ca->size], aux)) - return FALSE; - - ca->size++; - - g_signal_emit(ca, signal[CASE_INSERTED], 0, ca->size - 1); - - return TRUE; + return psppire_case_array_insert_case(ca, ca->size, fill_case_func, aux); } @@ -215,33 +206,44 @@ psppire_case_array_iterate_case(PsppireCaseArray *ca, } -void -psppire_case_array_insert_case(PsppireCaseArray *ca, gint posn) +/* Insert a new case before case POSN. + * If FILL_CASE_FUNC is not NULL, then use it to populate the new case */ +gboolean +psppire_case_array_insert_case(PsppireCaseArray *ca, gint posn, + psppire_case_array_fill_case_func fill_case_func, + gpointer aux) + { - g_return_if_fail(posn >= 0); - g_return_if_fail(posn <= ca->size); + gint i; - g_assert(ca->size + 1 <= ca->capacity); + g_return_val_if_fail(posn >= 0, FALSE); + g_return_val_if_fail(posn <= ca->size, FALSE); - gint i; + g_return_val_if_fail(ca->size < ca->capacity, FALSE); for(i = ca->size; i > posn ; --i) case_move(&ca->cases[i], &ca->cases[i - 1]); case_create(&ca->cases[posn], ca->width); + if ( fill_case_func && !fill_case_func(&ca->cases[posn], aux)) + return FALSE; + ca->size++; g_signal_emit(ca, signal[CASE_INSERTED], 0, posn); + + return TRUE; } void psppire_case_array_delete_cases(PsppireCaseArray *ca, gint first, gint n_cases) { + gint i; + g_return_if_fail(n_cases > 0); g_return_if_fail(first >= 0); g_return_if_fail(first + n_cases < ca->size); - gint i; /* FIXME: Is this right ?? */ for ( i = first; i < first + n_cases ; ++i ) @@ -290,13 +292,17 @@ psppire_case_array_set_value(PsppireCaseArray *ca, gint c, gint idx, value_fill_func_t ff, gpointer data) { + struct ccase *cc ; + union value *val ; + gboolean changed ; + g_return_if_fail(c < ca->size); - struct ccase *cc = &ca->cases[c]; + cc = &ca->cases[c]; - union value *val = case_data_rw(cc, idx); + val = case_data_rw(cc, idx); - gboolean changed = ff(val, data); + changed = ff(val, data); case_unshare(cc);