diff options
author | Tim Janik <timj@gtk.org> | 1998-10-28 01:32:54 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-10-28 01:32:54 +0000 |
commit | 7428120d37820cfc6a16c324e1d23366039a21d3 (patch) | |
tree | c335c580c9a2e16b88643c32e351d2940ca22437 /gscanner.c | |
parent | 167b4fbbfc90cdd220db856a31f8c6634dbdfb35 (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.c | 39 |
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 |