summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/object/xdrinput.h22
-rw-r--r--src/os/object/xdrinput.cc51
2 files changed, 73 insertions, 0 deletions
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;
+}