Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorVlad Brezae <brezaevlad@gmail.com>2016-05-06 00:17:45 +0300
committerVlad Brezae <brezaevlad@gmail.com>2016-05-10 02:31:42 +0300
commit6b35377caa1f211a52eb940abaa1f4b731f3de9c (patch)
treee84e6cc1b62e62a05be08c9e11aaae3109ce0584 /tools
parent8e469b9d3d0b4e0fd9c7d9a00261b82d40012fbc (diff)
[sgen] Extract entry stream code into new file
Diffstat (limited to 'tools')
-rw-r--r--tools/sgen/Makefile.am3
-rw-r--r--tools/sgen/sgen-entry-stream.c59
-rw-r--r--tools/sgen/sgen-entry-stream.h19
-rw-r--r--tools/sgen/sgen-grep-binprot.c54
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)