X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-case-file.c;h=215eecc51802be034fea0f7dfb50f4e99be65ca2;hb=d908f52b818f4fdf2ab23797756812ec2986bd2b;hp=9d3e3a14b4c07e5affe31f0834e4dabbfa8fde4c;hpb=f5c108becd49d78f4898cab11352291f5689d24e;p=pspp-builds.git diff --git a/src/ui/gui/psppire-case-file.c b/src/ui/gui/psppire-case-file.c index 9d3e3a14..215eecc5 100644 --- a/src/ui/gui/psppire-case-file.c +++ b/src/ui/gui/psppire-case-file.c @@ -28,11 +28,12 @@ #include #include #include +#include #include #include #include "xalloc.h" -#include "xallocsa.h" +#include "xmalloca.h" /* --- prototypes --- */ static void psppire_case_file_class_init (PsppireCaseFileClass *class); @@ -93,7 +94,7 @@ psppire_case_file_class_init (PsppireCaseFileClass *class) object_class->finalize = psppire_case_file_finalize; signals [CASE_CHANGED] = - g_signal_new ("case_changed", + g_signal_new ("case-changed", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST, 0, @@ -105,7 +106,7 @@ psppire_case_file_class_init (PsppireCaseFileClass *class) signals [CASE_INSERTED] = - g_signal_new ("case_inserted", + g_signal_new ("case-inserted", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST, 0, @@ -117,7 +118,7 @@ psppire_case_file_class_init (PsppireCaseFileClass *class) signals [CASES_DELETED] = - g_signal_new ("cases_deleted", + g_signal_new ("cases-deleted", G_TYPE_FROM_CLASS (class), G_SIGNAL_RUN_FIRST, 0, @@ -133,7 +134,8 @@ psppire_case_file_finalize (GObject *object) { PsppireCaseFile *cf = PSPPIRE_CASE_FILE (object); - datasheet_destroy (cf->datasheet); + if ( cf->accessible) + datasheet_destroy (cf->datasheet); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -142,6 +144,7 @@ static void psppire_case_file_init (PsppireCaseFile *cf) { cf->datasheet = NULL; + cf->accessible = FALSE; } @@ -152,24 +155,17 @@ psppire_case_file_init (PsppireCaseFile *cf) * Creates a new #PsppireCaseFile. */ PsppireCaseFile* -psppire_case_file_new (void) +psppire_case_file_new (const struct casereader *reader) { PsppireCaseFile *cf = g_object_new (G_TYPE_PSPPIRE_CASE_FILE, NULL); - cf->datasheet = datasheet_create (NULL); + cf->datasheet = datasheet_create (casereader_clone (reader)); + cf->accessible = TRUE; return cf; } -void -psppire_case_file_replace_datasheet (PsppireCaseFile *cf, struct datasheet *ds) -{ - cf->datasheet = ds; -} - - - gboolean psppire_case_file_delete_cases (PsppireCaseFile *cf, gint n_cases, gint first) { @@ -234,6 +230,7 @@ inline gint psppire_case_file_get_case_count (const PsppireCaseFile *cf) { g_return_val_if_fail (cf, FALSE); + g_return_val_if_fail (cf->accessible, FALSE); if ( ! cf->datasheet) return 0; @@ -316,7 +313,7 @@ psppire_case_file_data_in (PsppireCaseFile *cf, gint casenum, gint idx, g_return_val_if_fail (idx < datasheet_get_column_cnt (cf->datasheet), FALSE); width = fmt_var_width (fmt); - value = xallocsa (value_cnt_from_width (width) * sizeof *value); + value = xmalloca (value_cnt_from_width (width) * sizeof *value); ok = (datasheet_get_value (cf->datasheet, casenum, idx, value, width) && data_in (input, fmt->type, 0, 0, value, width) && datasheet_put_value (cf->datasheet, casenum, idx, value, width)); @@ -324,7 +321,7 @@ psppire_case_file_data_in (PsppireCaseFile *cf, gint casenum, gint idx, if (ok) g_signal_emit (cf, signals [CASE_CHANGED], 0, casenum); - freesa (value); + freea (value); return TRUE; } @@ -354,6 +351,7 @@ psppire_case_file_insert_values (PsppireCaseFile *cf, { union value *values; g_return_val_if_fail (cf, FALSE); + g_return_val_if_fail (cf->accessible, FALSE); if ( ! cf->datasheet ) cf->datasheet = datasheet_create (NULL); @@ -377,3 +375,14 @@ psppire_case_file_get_case (const PsppireCaseFile *cf, gint casenum, return datasheet_get_row (cf->datasheet, casenum, c); } + + + +struct casereader * +psppire_case_file_make_reader (PsppireCaseFile *cf) +{ + struct casereader *r = datasheet_make_reader (cf->datasheet); + cf->accessible = FALSE; + return r; +} +