diff options
author | Vlad Brezae <brezaevlad@gmail.com> | 2016-05-06 00:17:45 +0300 |
---|---|---|
committer | Vlad Brezae <brezaevlad@gmail.com> | 2016-05-10 02:31:42 +0300 |
commit | 6b35377caa1f211a52eb940abaa1f4b731f3de9c (patch) | |
tree | e84e6cc1b62e62a05be08c9e11aaae3109ce0584 /tools | |
parent | 8e469b9d3d0b4e0fd9c7d9a00261b82d40012fbc (diff) |
[sgen] Extract entry stream code into new file
Diffstat (limited to 'tools')
-rw-r--r-- | tools/sgen/Makefile.am | 3 | ||||
-rw-r--r-- | tools/sgen/sgen-entry-stream.c | 59 | ||||
-rw-r--r-- | tools/sgen/sgen-entry-stream.h | 19 | ||||
-rw-r--r-- | tools/sgen/sgen-grep-binprot.c | 54 |
4 files changed, 81 insertions, 54 deletions
diff --git a/tools/sgen/Makefile.am b/tools/sgen/Makefile.am index 582cbae3189..828090624c9 100644 --- a/tools/sgen/Makefile.am +++ b/tools/sgen/Makefile.am @@ -3,7 +3,8 @@ bin_PROGRAMS = sgen-grep-binprot AM_CPPFLAGS = $(GLIB_CFLAGS) -I$(top_srcdir) sgen_grep_binprot_SOURCES = \ - sgen-grep-binprot.c + sgen-grep-binprot.c \ + sgen-entry-stream.c sgen_grep_binprot_LDADD = \ $(GLIB_LIBS) $(LIBICONV) diff --git a/tools/sgen/sgen-entry-stream.c b/tools/sgen/sgen-entry-stream.c new file mode 100644 index 00000000000..0e0a3c5fc25 --- /dev/null +++ b/tools/sgen/sgen-entry-stream.c @@ -0,0 +1,59 @@ +/* + * sgen-entry-stream.c: EntryStream implementation + * + * Copyright (C) 2016 Xamarin Inc + * + * Licensed under the MIT license. See LICENSE file in the project root for full license information. + */ + +#include <stdlib.h> +#include <unistd.h> +#include <glib.h> +#include "sgen-entry-stream.h" + +#define BUFFER_SIZE (1 << 20) + +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; +} + +void +close_stream (EntryStream *stream) +{ + g_free (stream->buffer); +} + +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; +} + +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; +} diff --git a/tools/sgen/sgen-entry-stream.h b/tools/sgen/sgen-entry-stream.h new file mode 100644 index 00000000000..1cf6418006c --- /dev/null +++ b/tools/sgen/sgen-entry-stream.h @@ -0,0 +1,19 @@ +/* + * sgen-entry-stream.h: EntryStream definitions + * + * Copyright (C) 2016 Xamarin Inc + * + * Licensed under the MIT license. See LICENSE file in the project root for full license information. + */ + +typedef struct { + int file; + char *buffer; + const char *end; + const char *pos; +} EntryStream; + +void init_stream (EntryStream *stream, int file); +void close_stream (EntryStream *stream); +gboolean refill_stream (EntryStream *in, size_t size); +ssize_t read_stream (EntryStream *stream, void *out, size_t size); diff --git a/tools/sgen/sgen-grep-binprot.c b/tools/sgen/sgen-grep-binprot.c index a152af83707..673943ba665 100644 --- a/tools/sgen/sgen-grep-binprot.c +++ b/tools/sgen/sgen-grep-binprot.c @@ -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) |