diff options
Diffstat (limited to 'mixlib/mix_src_file.c')
-rw-r--r-- | mixlib/mix_src_file.c | 56 |
1 files changed, 33 insertions, 23 deletions
diff --git a/mixlib/mix_src_file.c b/mixlib/mix_src_file.c index 0569aa6..c6e1be0 100644 --- a/mixlib/mix_src_file.c +++ b/mixlib/mix_src_file.c @@ -1,7 +1,7 @@ /* -*-c-*- -------------- mix_src_file.c : * Implementation of the functions declared in mix_src_file.h * ------------------------------------------------------------------ - * Last change: Time-stamp: "00/12/17 12:56:50 jose" + * Last change: Time-stamp: "00/12/17 22:46:27 jose" * ------------------------------------------------------------------ * Copyright (C) 2000 jose antonio ortega ruiz <jaortega@acm.org> * @@ -33,36 +33,43 @@ struct mix_src_file_t guint lineno; /* the number of lines */ }; - -/* create a new src file from an existing disk file */ -mix_src_file_t * -mix_src_file_new_for_read (const gchar *path) +/* load the source file lines into memory */ +static gboolean +load_file_ (mix_src_file_t *file) { - mix_file_t *file = mix_file_new_with_def_ext (path, - mix_io_READ, - MIX_SRC_DEFEXT); - if (file == NULL) - return NULL; - else + mix_file_t *mf = mix_file_new_with_def_ext (file->path, + mix_io_READ, + MIX_SRC_DEFEXT); + if (mf != NULL) { enum {BUFFER_SIZE = 256}; static gchar BUFFER[BUFFER_SIZE]; - mix_src_file_t *result = g_new (mix_src_file_t, 1); - FILE *f = mix_file_to_FILE (file); - result->lines = g_ptr_array_new (); - result->path = g_strdup (path); - result->lineno = 0; + FILE *f = mix_file_to_FILE (mf); + file->lines = g_ptr_array_new (); + file->lineno = 0; while (fgets (BUFFER, BUFFER_SIZE, f) == BUFFER) { - g_ptr_array_add (result->lines, (gpointer) g_strdup (BUFFER)); - result->lineno++; + g_ptr_array_add (file->lines, (gpointer) g_strdup (BUFFER)); + file->lineno++; } - mix_file_delete (file); - return result; + mix_file_delete (mf); + return TRUE; } + return FALSE; +} + +/* create a new src file from an existing disk file */ +mix_src_file_t * +mix_src_file_new_for_read (const gchar *path) +{ + mix_src_file_t *result = g_new (mix_src_file_t, 1); + result->lines = NULL; + result->path = g_strdup (path); + result->lineno = 0; + return result; } /* destroy a src file object */ @@ -70,7 +77,7 @@ void mix_src_file_delete (mix_src_file_t *src) { g_return_if_fail (src != NULL); - g_ptr_array_free (src->lines, TRUE); + if (src->lines) g_ptr_array_free (src->lines, TRUE); g_free (src->path); g_free (src); } @@ -88,10 +95,11 @@ const gchar * mix_src_file_get_line (const mix_src_file_t *src, guint lineno) { g_return_val_if_fail (src != NULL, NULL); + if (src->lines == NULL && !load_file_ ((mix_src_file_t*)src)) + return NULL; if (lineno > src->lineno || lineno == 0) return NULL; - else - return (gchar *)g_ptr_array_index (src->lines, lineno - 1); + return (gchar *)g_ptr_array_index (src->lines, lineno - 1); } /* get the total no. of lines in the file */ @@ -99,6 +107,8 @@ guint mix_src_file_get_line_no (const mix_src_file_t *src) { g_return_val_if_fail (src != NULL, 0); + if (src->lines == NULL && !load_file_ ((mix_src_file_t*)src)) + return 0; return src->lineno; } |