X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fgui%2Fpsppire-delimited-text.c;h=c999f220eb1afb376d1b89578d2b5483403c6637;hb=bbebcf3f9d827d8c68aeaf90b65c88ad1b77ba8e;hp=a4874eefe0861909f21edbb8c6f93148fda47015;hpb=0c9c3a513c26044082e546085747ddf8e7ec128a;p=pspp diff --git a/src/ui/gui/psppire-delimited-text.c b/src/ui/gui/psppire-delimited-text.c index a4874eefe0..c999f220eb 100644 --- a/src/ui/gui/psppire-delimited-text.c +++ b/src/ui/gui/psppire-delimited-text.c @@ -68,7 +68,18 @@ count_delims (PsppireDelimitedText *tf) g_free (foo); } } - // g_print ("Max Number of delimiters per row: %d\n", tf->max_delimiters); +} + +static void +cache_invalidate (PsppireDelimitedText *tf) +{ + memset (tf->cache_starts, 0, 512); + if (tf->const_cache.string) + { + ss_dealloc (&tf->const_cache); + tf->const_cache.string = NULL; + tf->cache_row = -1; + } } static void @@ -83,14 +94,10 @@ psppire_delimited_text_set_property (GObject *object, { case PROP_FIRST_LINE: tf->first_line = g_value_get_int (value); - if (tf->const_cache.string) - { - ss_dealloc (&tf->const_cache); - tf->cache_row = -1; - } break; case PROP_CHILD: tf->child = g_value_get_object (value); + g_return_if_fail (PSPPIRE_IS_TEXT_FILE (tf->child)); break; case PROP_DELIMITERS: g_slist_free (tf->delimiters); @@ -101,8 +108,8 @@ psppire_delimited_text_set_property (GObject *object, break; }; - if (tf->child) - count_delims (tf); + cache_invalidate (tf); + count_delims (tf); } static void @@ -136,6 +143,13 @@ static void psppire_delimited_text_dispose (GObject *object); static GObjectClass *parent_class = NULL; +static gint +n_lines (PsppireDelimitedText *file) +{ + PsppireTextFile *child = PSPPIRE_TEXT_FILE (file->child); + + return child->maximum_lines; +} static gboolean __tree_get_iter (GtkTreeModel *tree_model, @@ -146,7 +160,6 @@ __tree_get_iter (GtkTreeModel *tree_model, if (path == NULL) return FALSE; - // g_print ("%s:%d %s %s\n", __FILE__, __LINE__, __FUNCTION__, gtk_tree_path_to_string (path)); gint *indices = gtk_tree_path_get_indices (path); @@ -155,12 +168,11 @@ __tree_get_iter (GtkTreeModel *tree_model, gint n = *indices; - gint children = gtk_tree_model_iter_n_children (file->child, NULL); + gint children = n_lines (file); if (n >= children - file->first_line) return FALSE; - // g_print ("%s:%d %s %d Children: %d\n", __FILE__, __LINE__, __FUNCTION__, n, children); iter->user_data = GINT_TO_POINTER (n); iter->stamp = file->stamp; @@ -178,9 +190,8 @@ __tree_iter_next (GtkTreeModel *tree_model, gint n = GPOINTER_TO_INT (iter->user_data); - // g_print ("%s:%d %s %d\n", __FILE__, __LINE__, __FUNCTION__, n); - gint children = gtk_tree_model_iter_n_children (file->child, NULL); + gint children = n_lines (file); if (n + 1 >= children - file->first_line) return FALSE; @@ -195,7 +206,6 @@ static GType __tree_get_column_type (GtkTreeModel *tree_model, gint index) { - // g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); if (index == 0) return G_TYPE_INT; @@ -206,7 +216,6 @@ static gboolean __iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter) { - g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); return 0; } @@ -216,7 +225,6 @@ __iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) { - g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); return 0; } @@ -224,13 +232,12 @@ static GtkTreePath * __tree_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter) { - // g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); PsppireDelimitedText *file = PSPPIRE_DELIMITED_TEXT (tree_model); g_return_val_if_fail (file->stamp == iter->stamp, FALSE); gint n = GPOINTER_TO_INT (iter->user_data); - gint children = gtk_tree_model_iter_n_children (file->child, NULL); + gint children = n_lines (file); if (n >= children - file->first_line) return NULL; @@ -244,7 +251,6 @@ __iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) { - g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); return 0; } @@ -253,15 +259,17 @@ static gint __tree_model_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter) { - g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); + PsppireDelimitedText *file = PSPPIRE_DELIMITED_TEXT (tree_model); g_assert (iter == NULL); - return 0; + + gint children = n_lines (file); + + return children - file->first_line; } static GtkTreeModelFlags __tree_model_get_flags (GtkTreeModel *model) { - // g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); g_return_val_if_fail (PSPPIRE_IS_DELIMITED_TEXT (model), (GtkTreeModelFlags) 0); return GTK_TREE_MODEL_LIST_ONLY; @@ -270,7 +278,6 @@ __tree_model_get_flags (GtkTreeModel *model) static gint __tree_model_get_n_columns (GtkTreeModel *tree_model) { - // g_print ("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__); PsppireDelimitedText *tf = PSPPIRE_DELIMITED_TEXT (tree_model); /* + 1 for the trailing field and +1 for the leading line number column */ @@ -284,7 +291,6 @@ __iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *parent, gint n) { - // g_print ("%s:%d %s %d\n", __FILE__, __LINE__, __FUNCTION__, n); PsppireDelimitedText *file = PSPPIRE_DELIMITED_TEXT (tree_model); g_assert (parent == NULL); @@ -312,41 +318,46 @@ __iter_nth_child (GtkTreeModel *tree_model, static void split_row_into_fields (PsppireDelimitedText *file, gint n) { - if (n != file->cache_row) + if (n == file->cache_row) /* Cache hit */ { - if (file->const_cache.string) - { - ss_dealloc (&file->const_cache); - } - ss_alloc_substring (&file->const_cache, PSPPIRE_TEXT_FILE (file->child)->lines[n]); - file->cache = file->const_cache; - int field = 0; - file->cache_starts[0] = file->cache.string; - for (; - UINT32_MAX != ss_first_mb (file->cache); - ss_get_mb (&file->cache)) + return; + } + + memset (file->cache_starts, 0, 512); + /* Cache miss */ + if (file->const_cache.string) + { + ss_dealloc (&file->const_cache); + } + ss_alloc_substring_pool (&file->const_cache, + PSPPIRE_TEXT_FILE (file->child)->lines[n], NULL); + struct substring cs = file->const_cache; + int field = 0; + file->cache_starts[0] = cs.string; + for (; + UINT32_MAX != ss_first_mb (cs); + ss_get_mb (&cs)) + { + ucs4_t xx = ss_first_mb (cs); + GSList *del; + for (del = file->delimiters; del; del = g_slist_next (del)) { - ucs4_t xx = ss_first_mb (file->cache); - GSList *del; - for (del = file->delimiters; del; del = g_slist_next (del)) + if (xx == GPOINTER_TO_INT (del->data)) { - if (xx == GPOINTER_TO_INT (del->data)) + field++; + int char_len = ss_first_mblen (cs); + file->cache_starts[field] = cs.string + char_len; + while (char_len > 0) { - field++; - int char_len = ss_first_mblen (file->cache); - file->cache_starts[field] = file->cache.string + char_len; - while (char_len > 0) - { - file->cache.string[char_len - 1] = '\0'; - char_len--; - } - break; + cs.string[char_len - 1] = '\0'; + char_len--; } + break; } } - - file->cache_row = n; } + + file->cache_row = n; } const gchar * @@ -366,14 +377,12 @@ __get_value (GtkTreeModel *tree_model, gint column, GValue *value) { - // g_print ("%s:%d %s Col: %d\n", __FILE__, __LINE__, __FUNCTION__, column); PsppireDelimitedText *file = PSPPIRE_DELIMITED_TEXT (tree_model); g_return_if_fail (iter->stamp == file->stamp); gint n = GPOINTER_TO_INT (iter->user_data) + file->first_line; - // g_print ("%s:%d Row: %d\n", __FILE__, __LINE__, n); if (column == 0) { @@ -505,6 +514,7 @@ psppire_delimited_text_init (PsppireDelimitedText *text_file) text_file->const_cache.string = NULL; text_file->const_cache.length = 0; text_file->cache_row = -1; + memset (text_file->cache_starts, 0, 512); text_file->max_delimiters = 0; @@ -513,7 +523,7 @@ psppire_delimited_text_init (PsppireDelimitedText *text_file) } -PsppireDelimitedText * +GtkTreeModel * psppire_delimited_text_new (GtkTreeModel *child) { PsppireDelimitedText *retval =