From a1bbc3b6f2707fa808d19ad0baa035c3bac3f641 Mon Sep 17 00:00:00 2001
From: Daniel Friesel <derf@finalrewind.org>
Date: Mon, 15 Oct 2018 16:30:58 +0200
Subject: [PATCH] add preliminary xdr input driver

---
 include/object/xdrinput.h | 22 +++++++++++++++++
 src/os/object/xdrinput.cc | 51 +++++++++++++++++++++++++++++++++++++++
 2 files changed, 73 insertions(+)
 create mode 100644 include/object/xdrinput.h
 create mode 100644 src/os/object/xdrinput.cc

diff --git a/include/object/xdrinput.h b/include/object/xdrinput.h
new file mode 100644
index 0000000..f869a13
--- /dev/null
+++ b/include/object/xdrinput.h
@@ -0,0 +1,22 @@
+#ifndef XDRINPUT_H
+#define XDRINPUT_H
+
+#include <stdint.h>
+
+class XDRInput {
+	private:
+		XDRInput(const XDRInput& copy);
+		char *data;
+		uint32_t pos;
+
+	public:
+		XDRInput(char *d) : pos(0) { data = d; }
+		uint32_t get_uint32();
+		int32_t get_int32();
+		uint64_t get_uint64();
+		int64_t get_int64();
+		uint32_t get_opaque_length();
+		char* get_opaque(uint32_t length);
+};
+
+#endif
diff --git a/src/os/object/xdrinput.cc b/src/os/object/xdrinput.cc
new file mode 100644
index 0000000..561c779
--- /dev/null
+++ b/src/os/object/xdrinput.cc
@@ -0,0 +1,51 @@
+#include "object/xdrinput.h"
+
+uint32_t XDRInput::get_uint32()
+{
+	uint32_t ret = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
+		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
+	pos += 4;
+	return ret;
+}
+
+int32_t XDRInput::get_int32()
+{
+	int32_t ret = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
+	pos += 4;
+	return ret;
+}
+
+uint64_t XDRInput::get_uint64()
+{
+	uint64_t ret0 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
+		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
+	pos += 4;
+	uint64_t ret1 = ((uint8_t)data[pos]<<24) | ((uint8_t)data[pos+1]<<16)
+		| ((uint8_t)data[pos+2]<<8) | (uint8_t)data[pos+3];
+	pos += 4;
+	return (ret0 << 32) | ret1;
+}
+
+int64_t XDRInput::get_int64()
+{
+	int64_t ret0 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
+	pos += 4;
+	int64_t ret1 = (data[pos]<<24) | (data[pos+1]<<16) | (data[pos+2]<<8) | data[pos+3];
+	pos += 4;
+	return (ret0 << 32) | ret1;
+}
+
+uint32_t XDRInput::get_opaque_length()
+{
+	return get_uint32();
+}
+
+char *XDRInput::get_opaque(uint32_t length)
+{
+	char *ret = data + pos;
+	pos += length;
+	if (length % 4) {
+		pos += 4 - (length % 4);
+	}
+	return ret;
+}
-- 
GitLab