[sgen] Extract entry stream code into new file
[mono.git] / tools / sgen / sgen-grep-binprot.c
index a152af8370762ae4e3c1ccb1ba04ca4a7781b02a..673943ba665875469386c7aa920b355e3046404a 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdint.h>
 #include <inttypes.h>
 #include <config.h>
+#include "sgen-entry-stream.h"
 
 #if SIZEOF_VOID_P == 4
 typedef int32_t mword;
@@ -27,59 +28,6 @@ typedef int64_t mword;
 #define WORKER(t)      ((t) & 0x80)
 
 #define MAX_ENTRY_SIZE (1 << 10)
-#define BUFFER_SIZE (1 << 20)
-
-typedef struct {
-       int file;
-       char *buffer;
-       const char *end;
-       const char *pos;
-} EntryStream;
-
-static void
-init_stream (EntryStream *stream, int file)
-{
-       stream->file = file;
-       stream->buffer = g_malloc0 (BUFFER_SIZE);
-       stream->end = stream->buffer + BUFFER_SIZE;
-       stream->pos = stream->end;
-}
-
-static void
-close_stream (EntryStream *stream)
-{
-       g_free (stream->buffer);
-}
-
-static gboolean
-refill_stream (EntryStream *in, size_t size)
-{
-       size_t remainder = in->end - in->pos;
-       ssize_t refilled;
-       g_assert (size > 0);
-       g_assert (in->pos >= in->buffer);
-       if (in->pos + size <= in->end)
-               return TRUE;
-       memmove (in->buffer, in->pos, remainder);
-       in->pos = in->buffer;
-       refilled = read (in->file, in->buffer + remainder, BUFFER_SIZE - remainder);
-       if (refilled < 0)
-               return FALSE;
-       g_assert (refilled + remainder <= BUFFER_SIZE);
-       in->end = in->buffer + refilled + remainder;
-       return in->end - in->buffer >= size;
-}
-
-static ssize_t
-read_stream (EntryStream *stream, void *out, size_t size)
-{
-       if (refill_stream (stream, size)) {
-               memcpy (out, stream->pos, size);
-               stream->pos += size;
-               return size;
-       }
-       return 0;
-}
 
 static int
 read_entry (EntryStream *stream, void *data)