summaryrefslogtreecommitdiffhomepage
path: root/mixlib/mix_src_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'mixlib/mix_src_file.c')
-rw-r--r--mixlib/mix_src_file.c56
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;
}