aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nu/ByteWriter.c
diff options
context:
space:
mode:
Diffstat (limited to 'Src/replicant/nu/ByteWriter.c')
-rw-r--r--Src/replicant/nu/ByteWriter.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/Src/replicant/nu/ByteWriter.c b/Src/replicant/nu/ByteWriter.c
new file mode 100644
index 00000000..ab375a3f
--- /dev/null
+++ b/Src/replicant/nu/ByteWriter.c
@@ -0,0 +1,77 @@
+#include "ByteWriter.h"
+#include <string.h>
+
+/* generic endian-agnostic implementation. this code assumes that unaligned accesses are illegal */
+void bytewriter_init(bytewriter_t byte_writer, void *data, size_t byte_length)
+{
+ byte_writer->data = data;
+ byte_writer->byte_length = byte_length;
+ byte_writer->data_ptr = (uint8_t *)data;
+}
+
+/* n byte functions */
+void bytewriter_write_n(bytewriter_t byte_writer, const void *source, size_t bytes)
+{
+ memcpy(byte_writer->data_ptr, source, bytes);
+ byte_writer->data_ptr += bytes;
+}
+
+void bytewriter_write_u8(bytewriter_t byte_writer, uint8_t value)
+{
+ *byte_writer->data_ptr++ = value;
+ byte_writer->byte_length--;
+}
+
+void bytewriter_write_u16_le(bytewriter_t byte_writer, uint16_t value)
+{
+ *byte_writer->data_ptr++ = value & 0xFF;
+ value >>= 8;
+ *byte_writer->data_ptr++ = value & 0xFF;
+ byte_writer->byte_length -= 2;
+}
+
+void bytewriter_write_u16_be(bytewriter_t byte_writer, uint16_t value)
+{
+ *byte_writer->data_ptr++ = (value >> 8) & 0xFF;
+ *byte_writer->data_ptr++ = value & 0xFF;
+ byte_writer->byte_length -= 2;
+}
+
+void bytewriter_write_u32_le(bytewriter_t byte_writer, uint32_t value)
+{
+ *byte_writer->data_ptr++ = value & 0xFF;
+ value >>= 8;
+ *byte_writer->data_ptr++ = value & 0xFF;
+ value >>= 8;
+ *byte_writer->data_ptr++ = value & 0xFF;
+ value >>= 8;
+ *byte_writer->data_ptr++ = value & 0xFF;
+ byte_writer->byte_length -= 4;
+}
+
+void bytewriter_write_u32_be(bytewriter_t byte_writer, uint32_t value)
+{
+ *byte_writer->data_ptr++ = (value >> 24) & 0xFF;
+ *byte_writer->data_ptr++ = (value >> 16) & 0xFF;
+ *byte_writer->data_ptr++ = (value >> 8) & 0xFF;
+ *byte_writer->data_ptr++ = value & 0xFF;
+ byte_writer->byte_length -= 4;
+}
+
+void bytewriter_write_zero_n(bytewriter_t byte_writer, size_t bytes)
+{
+ size_t i;
+ for (i=0;i<bytes;i++)
+ {
+ *byte_writer->data_ptr++ = 0;
+ }
+ byte_writer->byte_length -= bytes;
+}
+
+void bytewriter_write_uuid_be(bytewriter_t byte_writer, GUID guid_value)
+{
+ bytewriter_write_u32_be(byte_writer, guid_value.Data1);
+ bytewriter_write_u16_be(byte_writer, guid_value.Data2);
+ bytewriter_write_u16_be(byte_writer, guid_value.Data3);
+ bytewriter_write_n(byte_writer, guid_value.Data4, 8);
+}