--- /dev/null
+/*
+ * sgen-grep-binprot-main.c: Binary protocol entries reader
+ *
+ * Copyright (C) 2016 Xamarin Inc
+ *
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <glib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include "sgen-entry-stream.h"
+#include "sgen-grep-binprot.h"
+
+int
+main (int argc, char *argv[])
+{
+ int num_args = argc - 1;
+ int num_nums = 0;
+ int num_vtables = 0;
+ int i;
+ long nums [num_args];
+ long vtables [num_args];
+ gboolean dump_all = FALSE;
+ gboolean color_output = FALSE;
+ gboolean pause_times = FALSE;
+ const char *input_path = NULL;
+ int input_file;
+ EntryStream stream;
+ unsigned long long first_entry_to_consider = 0;
+
+ for (i = 0; i < num_args; ++i) {
+ char *arg = argv [i + 1];
+ char *next_arg = argv [i + 2];
+ if (!strcmp (arg, "--all")) {
+ dump_all = TRUE;
+ } else if (!strcmp (arg, "--pause-times")) {
+ pause_times = TRUE;
+ } else if (!strcmp (arg, "-v") || !strcmp (arg, "--vtable")) {
+ vtables [num_vtables++] = strtoul (next_arg, NULL, 16);
+ ++i;
+ } else if (!strcmp (arg, "-s") || !strcmp (arg, "--start-at")) {
+ first_entry_to_consider = strtoull (next_arg, NULL, 10);
+ ++i;
+ } else if (!strcmp (arg, "-c") || !strcmp (arg, "--color")) {
+ color_output = TRUE;
+ } else if (!strcmp (arg, "-i") || !strcmp (arg, "--input")) {
+ input_path = next_arg;
+ ++i;
+ } else if (!strcmp (arg, "--help")) {
+ printf (
+ "\n"
+ "Usage:\n"
+ "\n"
+ "\tsgen-grep-binprot [options] [pointer...]\n"
+ "\n"
+ "Examples:\n"
+ "\n"
+ "\tsgen-grep-binprot --all </tmp/binprot\n"
+ "\tsgen-grep-binprot --input /tmp/binprot --color 0xdeadbeef\n"
+ "\n"
+ "Options:\n"
+ "\n"
+ "\t--all Print all entries.\n"
+ "\t--color, -c Highlight matches in color.\n"
+ "\t--help You're looking at it.\n"
+ "\t--input FILE, -i FILE Read input from FILE instead of standard input.\n"
+ "\t--pause-times Print GC pause times.\n"
+ "\t--start-at N, -s N Begin filtering at the Nth entry.\n"
+ "\t--vtable PTR, -v PTR Search for vtable pointer PTR.\n"
+ "\n");
+ return 0;
+ } else {
+ nums [num_nums++] = strtoul (arg, NULL, 16);
+ }
+ }
+
+ if (dump_all)
+ assert (!pause_times);
+ if (pause_times)
+ assert (!dump_all);
+
+ input_file = input_path ? open (input_path, O_RDONLY) : STDIN_FILENO;
+ init_stream (&stream, input_file);
+ sgen_binary_protocol_grep_entries (&stream, num_nums, nums, num_vtables, vtables,
+ dump_all, pause_times, color_output, first_entry_to_consider);
+ close_stream (&stream);
+ if (input_path)
+ close (input_file);
+
+ return 0;
+}