/* PSPPIRE - a graphical user interface for PSPP.
- Copyright (C) 2017 Free Software Foundation
+ Copyright (C) 2017, 2020 Free Software Foundation
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
PROP_LINE_COUNT
};
-enum {MAX_LINE_LEN = 16384}; /* Max length of an acceptable line. */
-
static void
read_lines (PsppireTextFile *tf)
{
+ /* Max length of an acceptable line. */
+ static const int MAX_LINE_LEN = 16384;
+
if (tf->file_name && 0 != g_strcmp0 ("unset", tf->encoding))
{
struct line_reader *reader = line_reader_for_file (tf->encoding, tf->file_name, O_RDONLY);
struct string input;
ds_init_empty (&input);
- for (tf->line_cnt = 0; tf->line_cnt < MAX_PREVIEW_LINES; tf->line_cnt++)
+ for (tf->n_lines = 0; tf->n_lines < MAX_PREVIEW_LINES; tf->n_lines++)
{
ds_clear (&input);
if (!line_reader_read (reader, &input, MAX_LINE_LEN + 1)
"a text file."),
tf->file_name, MAX_LINE_LEN);
line_reader_close (reader);
- for (i = 0; i < tf->line_cnt; i++)
- g_free (&tf->lines[i]);
- tf->line_cnt = 0;
+ for (i = 0; i < tf->n_lines; i++)
+ g_free (tf->lines[i].string);
+ tf->n_lines = 0;
ds_destroy (&input);
return;
}
- tf->lines[tf->line_cnt]
+ tf->lines[tf->n_lines]
= recode_substring_pool ("UTF-8",
line_reader_get_encoding (reader),
input.ss, NULL);
- }
+ }
ds_destroy (&input);
- if (tf->line_cnt == 0)
+ if (tf->n_lines == 0)
{
int i;
msg (ME, _("`%s' is empty."), tf->file_name);
line_reader_close (reader);
- for (i = 0; i < tf->line_cnt; i++)
- g_free (&tf->lines[i]);
- tf->line_cnt = 0;
+ for (i = 0; i < tf->n_lines; i++)
+ g_free (tf->lines[i].string);
+ tf->n_lines = 0;
goto done;
}
- if (tf->line_cnt < MAX_PREVIEW_LINES)
+ if (tf->n_lines < MAX_PREVIEW_LINES)
{
- tf->total_lines = tf->line_cnt;
+ tf->total_lines = tf->n_lines;
tf->total_is_exact = true;
}
else
off_t position = line_reader_tell (reader);
if (fstat (line_reader_fileno (reader), &s) == 0 && position > 0)
{
- tf->total_lines = (double) tf->line_cnt / position * s.st_size;
+ tf->total_lines = (double) tf->n_lines / position * s.st_size;
tf->total_is_exact = false;
}
else
g_value_set_int (value, text_file->maximum_lines);
break;
case PROP_LINE_COUNT:
- g_value_set_int (value, text_file->line_cnt);
+ g_value_set_int (value, text_file->n_lines);
break;
case PROP_FILE_NAME:
g_value_set_string (value, text_file->file_name);
};
}
-
-static void psppire_text_file_init (PsppireTextFile *text_file);
-static void psppire_text_file_class_init (PsppireTextFileClass *class);
-
static void psppire_text_file_finalize (GObject *object);
static void psppire_text_file_dispose (GObject *object);
gint n = *indices;
- if (n >= file->line_cnt)
+ if (n >= file->n_lines)
return FALSE;
iter->user_data = GINT_TO_POINTER (n);
gint n = GPOINTER_TO_INT (iter->user_data) + 1;
- if (n >= file->line_cnt)
+ if (n >= file->n_lines)
return FALSE;
iter->user_data = GINT_TO_POINTER (n);
{
PsppireTextFile *file = PSPPIRE_TEXT_FILE (tree_model);
g_assert (iter == NULL);
- return file->line_cnt;
+ return file->n_lines;
}
static GtkTreeModelFlags
static gint
__tree_model_get_n_columns (GtkTreeModel *tree_model)
{
- PsppireTextFile *tf = PSPPIRE_TEXT_FILE (tree_model);
return 2;
}
g_return_val_if_fail (file, FALSE);
- if (n >= file->line_cnt)
+ if (n >= file->n_lines)
{
iter->stamp = -1;
iter->user_data = NULL;
gint n = GPOINTER_TO_INT (iter->user_data);
- g_return_if_fail (n < file->line_cnt);
+ g_return_if_fail (n < file->n_lines);
if (column == 0)
{
iface->iter_parent = __iter_parent;
}
-
-GType
-psppire_text_file_get_type (void)
-{
- static GType text_file_type = 0;
-
- if (!text_file_type)
- {
- static const GTypeInfo text_file_info =
- {
- sizeof (PsppireTextFileClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) psppire_text_file_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (PsppireTextFile),
- 0,
- (GInstanceInitFunc) psppire_text_file_init,
- };
-
- static const GInterfaceInfo tree_model_info = {
- (GInterfaceInitFunc) __tree_model_init,
- NULL,
- NULL
- };
-
- text_file_type = g_type_register_static (G_TYPE_OBJECT,
- "PsppireTextFile",
- &text_file_info, 0);
-
- g_type_add_interface_static (text_file_type, GTK_TYPE_TREE_MODEL,
- &tree_model_info);
- }
-
- return text_file_type;
-}
-
+G_DEFINE_TYPE_WITH_CODE (PsppireTextFile, psppire_text_file, G_TYPE_OBJECT,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
+ __tree_model_init))
static void
psppire_text_file_class_init (PsppireTextFileClass *class)
GObjectClass *object_class;
parent_class = g_type_class_peek_parent (class);
- object_class = (GObjectClass*) class;
+ object_class = G_OBJECT_CLASS (class);
GParamSpec *maximum_lines_spec =
g_param_spec_int ("maximum-lines",
{
PsppireTextFile *tf = PSPPIRE_TEXT_FILE (object);
+ for (int i = 0; i < tf->n_lines; i++)
+ g_free (tf->lines[i].string);
+
g_free (tf->encoding);
g_free (tf->file_name);