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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 8e34d63b893304ebdf3a9d531622bc449ed44713..c6c9fbce3eb2973af0240ea43d9f2d2a4f3d7e81 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 64ed88ed87237b2f09c42f6ae021046a5d37eb03..8e8c8cbf692f9fbf3ca70537423f6cb5d807d04c 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 64ed88ed87237b2f09c42f6ae021046a5d37eb03..8e8c8cbf692f9fbf3ca70537423f6cb5d807d04c 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 0372b18716328b81dd983d11b97259ca697023eb..2bb0f471a319451ba3a84335d98d43777d121bc8 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 0372b18716328b81dd983d11b97259ca697023eb..2bb0f471a319451ba3a84335d98d43777d121bc8 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