summaryrefslogtreecommitdiff
path: root/gscanner.c
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>1998-10-28 01:32:54 +0000
committerTim Janik <timj@src.gnome.org>1998-10-28 01:32:54 +0000
commit7428120d37820cfc6a16c324e1d23366039a21d3 (patch)
treec335c580c9a2e16b88643c32e351d2940ca22437 /gscanner.c
parent167b4fbbfc90cdd220db856a31f8c6634dbdfb35 (diff)
new function for file input. rewind the filedescriptor to the current
Tue Oct 27 07:25:53 1998 Tim Janik <timj@gtk.org> * glib.h: * gscanner.c: (g_scanner_sync_file_offset): new function for file input. rewind the filedescriptor to the current buffer position and blow the file read ahead buffer. usefull for third party uses of our filedescriptor, which hooks onto the current scanning position. (this became neccessary with the implementation of buffered reads). (g_scanner_input_file): (g_scanner_input_text): automatically blow the read ahead buffer. (g_scanner_get_char): blow the read ahead buffer when the end of input is reached, i.e. a '\000' char is read.
Diffstat (limited to 'gscanner.c')
-rw-r--r--gscanner.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/gscanner.c b/gscanner.c
index 0372b1871..2bb0f471a 100644
--- a/gscanner.c
+++ b/gscanner.c
@@ -658,6 +658,9 @@ g_scanner_input_file (GScanner *scanner,
g_return_if_fail (scanner != NULL);
g_return_if_fail (input_fd >= 0);
+ if (scanner->input_fd >= 0)
+ g_scanner_sync_file_offset (scanner);
+
scanner->token = G_TOKEN_NONE;
scanner->value.v_int = 0;
scanner->line = 1;
@@ -683,6 +686,9 @@ g_scanner_input_text (GScanner *scanner,
else
text = NULL;
+ if (scanner->input_fd >= 0)
+ g_scanner_sync_file_offset (scanner);
+
scanner->token = G_TOKEN_NONE;
scanner->value.v_int = 0;
scanner->line = 1;
@@ -737,6 +743,33 @@ g_scanner_peek_next_char (GScanner *scanner)
return 0;
}
+void
+g_scanner_sync_file_offset (GScanner *scanner)
+{
+ g_return_if_fail (scanner != NULL);
+
+ /* for file input, rewind the filedescriptor to the current
+ * buffer position and blow the file read ahead buffer. usefull for
+ * third party uses of our filedescriptor, which hooks onto the current
+ * scanning position.
+ */
+
+ if (scanner->input_fd >= 0 && scanner->text_end > scanner->text)
+ {
+ gint buffered;
+
+ buffered = scanner->text_end - scanner->text;
+ if (lseek (scanner->input_fd, - buffered, SEEK_CUR) >= 0)
+ {
+ /* we succeeded, blow our buffer's contents now */
+ scanner->text = NULL;
+ scanner->text_end = NULL;
+ }
+ else
+ errno = 0;
+ }
+}
+
static guchar
g_scanner_get_char (GScanner *scanner,
guint *line_p,
@@ -768,6 +801,12 @@ g_scanner_get_char (GScanner *scanner,
scanner->text = buffer + 1;
scanner->text_end = buffer + count;
fchar = *buffer;
+ if (!fchar)
+ {
+ g_scanner_sync_file_offset (scanner);
+ scanner->text_end = scanner->text;
+ scanner->input_fd = -1;
+ }
}
}
else