new function for file input. rewind the filedescriptor to the current
authorTim Janik <timj@gtk.org>
Wed, 28 Oct 1998 01:32:54 +0000 (01:32 +0000)
committerTim Janik <timj@src.gnome.org>
Wed, 28 Oct 1998 01:32:54 +0000 (01:32 +0000)
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.

12 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
glib.h
glib/glib.h
glib/gscanner.c
gscanner.c

index 8e34d63..c6c9fbc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
index 8e34d63..c6c9fbc 100644 (file)
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
index 8e34d63..c6c9fbc 100644 (file)
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
index 8e34d63..c6c9fbc 100644 (file)
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
index 8e34d63..c6c9fbc 100644 (file)
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
index 8e34d63..c6c9fbc 100644 (file)
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
index 8e34d63..c6c9fbc 100644 (file)
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
index 8e34d63..c6c9fbc 100644 (file)
@@ -1,3 +1,18 @@
+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.
+
 Tue Oct 27 00:27:31 PST 1998 Manish Singh <yosh@gimp.org>
 
        * glib.h: get rid of duplicate #g_htonl and friends in the
diff --git a/glib.h b/glib.h
index 64ed88e..8e8c8cb 100644 (file)
--- a/glib.h
+++ b/glib.h
@@ -2085,6 +2085,7 @@ GScanner* g_scanner_new                   (GScannerConfig *config_templ);
 void           g_scanner_destroy               (GScanner       *scanner);
 void           g_scanner_input_file            (GScanner       *scanner,
                                                 gint           input_fd);
+void           g_scanner_sync_file_offset      (GScanner       *scanner);
 void           g_scanner_input_text            (GScanner       *scanner,
                                                 const  gchar   *text,
                                                 guint          text_len);
index 64ed88e..8e8c8cb 100644 (file)
@@ -2085,6 +2085,7 @@ GScanner* g_scanner_new                   (GScannerConfig *config_templ);
 void           g_scanner_destroy               (GScanner       *scanner);
 void           g_scanner_input_file            (GScanner       *scanner,
                                                 gint           input_fd);
+void           g_scanner_sync_file_offset      (GScanner       *scanner);
 void           g_scanner_input_text            (GScanner       *scanner,
                                                 const  gchar   *text,
                                                 guint          text_len);
index 0372b18..2bb0f47 100644 (file)
@@ -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
index 0372b18..2bb0f47 100644 (file)
@@ -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