From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/replicant/nu/ByteWriter.c | 77 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 Src/replicant/nu/ByteWriter.c (limited to 'Src/replicant/nu/ByteWriter.c') 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 + +/* 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;idata_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); +} -- cgit