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/ByteReader.c | 203 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 Src/replicant/nu/ByteReader.c (limited to 'Src/replicant/nu/ByteReader.c') diff --git a/Src/replicant/nu/ByteReader.c b/Src/replicant/nu/ByteReader.c new file mode 100644 index 00000000..76266356 --- /dev/null +++ b/Src/replicant/nu/ByteReader.c @@ -0,0 +1,203 @@ +#include "ByteReader.h" +#include +/* generic LITTLE ENDIAN implementation */ +void bytereader_init(bytereader_t byte_reader, const void *data, size_t byte_length) +{ + byte_reader->data = data; + byte_reader->byte_length = byte_length; + byte_reader->data_ptr = (const uint8_t *)data; +} + + +void bytereader_advance(bytereader_t byte_reader, size_t bytes) +{ + byte_reader->byte_length -= bytes; + byte_reader->data_ptr += bytes; +} + +void bytereader_reset(bytereader_t byte_reader) +{ + size_t diff = byte_reader->data_ptr - (const uint8_t *)byte_reader->data; + byte_reader->byte_length += diff; + byte_reader->data_ptr = (const uint8_t *)byte_reader->data; +} + +size_t bytereader_find_zero(bytereader_t byte_reader) +{ + size_t i=0; + + for (i=0;ibyte_length && byte_reader->data_ptr[i];i++) + { + // empty loop + } + return i; +} + +/* n byte functions */ +void bytereader_show_n(bytereader_t byte_reader, void *destination, size_t bytes) +{ + memcpy(destination, byte_reader->data_ptr, bytes); +} + +void bytereader_read_n(bytereader_t byte_reader, void *destination, size_t bytes) +{ + memcpy(destination, byte_reader->data_ptr, bytes); + bytereader_advance(byte_reader, bytes); +} + +/* 1 byte functions */ +uint8_t bytereader_show_u8(bytereader_t byte_reader) +{ + return byte_reader->data_ptr[0]; +} + +uint8_t bytereader_read_u8(bytereader_t byte_reader) +{ + uint8_t ret = byte_reader->data_ptr[0]; + bytereader_advance(byte_reader, 1); + return ret; +} + +int8_t bytereader_show_s8(bytereader_t byte_reader) +{ + return *(const int8_t *)(byte_reader->data_ptr); +} + +int8_t bytereader_read_s8(bytereader_t byte_reader) +{ + int8_t ret = *(const int8_t *)(byte_reader->data_ptr); + bytereader_advance(byte_reader, 1); + return ret; +} + +/* 2 byte little-endian functions */ + +uint16_t bytereader_show_u16_le(bytereader_t byte_reader) +{ + return (uint16_t)byte_reader->data_ptr[0] | ((uint16_t)byte_reader->data_ptr[1] << 8); +} + +uint16_t bytereader_read_u16_le(bytereader_t byte_reader) +{ + uint16_t ret = bytereader_show_u16_le(byte_reader); + bytereader_advance(byte_reader, 2); + return ret; +} + +int16_t bytereader_show_s16_le(bytereader_t byte_reader) +{ + return (int16_t)byte_reader->data_ptr[0] | ((int16_t)byte_reader->data_ptr[1] << 8); +} + +int16_t bytereader_read_s16_le(bytereader_t byte_reader) +{ + int16_t ret = bytereader_show_s16_le(byte_reader); + bytereader_advance(byte_reader, 2); + return ret; +} + +/* 2 byte big-endian functions */ +uint16_t bytereader_show_u16_be(bytereader_t byte_reader) +{ + return (uint16_t)byte_reader->data_ptr[1] | ((uint16_t)byte_reader->data_ptr[0] << 8); +} + +uint16_t bytereader_read_u16_be(bytereader_t byte_reader) +{ + uint16_t ret = bytereader_show_u16_be(byte_reader); + bytereader_advance(byte_reader, 2); + return ret; +} + +int16_t bytereader_show_s16_be(bytereader_t byte_reader) +{ + return (int16_t)byte_reader->data_ptr[1] | ((int16_t)byte_reader->data_ptr[0] << 8); +} + +int16_t bytereader_read_s16_be(bytereader_t byte_reader) +{ + int16_t ret = bytereader_show_s16_be(byte_reader); + bytereader_advance(byte_reader, 2); + return ret; +} + +/* 4 byte functions */ + +uint32_t bytereader_show_u32_be(bytereader_t byte_reader) +{ + uint32_t x; + // big endian extract + + x = byte_reader->data_ptr[0]; + x <<= 8; + x |= byte_reader->data_ptr[1]; + x <<= 8; + x |= byte_reader->data_ptr[2]; + x <<= 8; + x |= byte_reader->data_ptr[3]; + return x; + +} + +uint32_t bytereader_read_u32_be(bytereader_t byte_reader) +{ + uint32_t ret = bytereader_show_u32_be(byte_reader); + bytereader_advance(byte_reader, 4); + return ret; +} + +/* 4 byte little-endian functions */ +uint32_t bytereader_show_u32_le(bytereader_t byte_reader) +{ + uint32_t x; + // little endian extract + + x = byte_reader->data_ptr[3]; + x <<= 8; + x |= byte_reader->data_ptr[2]; + x <<= 8; + x |= byte_reader->data_ptr[1]; + x <<= 8; + x |= byte_reader->data_ptr[0]; + return x; +} + +uint32_t bytereader_read_u32_le(bytereader_t byte_reader) +{ + uint32_t ret = bytereader_show_u32_le(byte_reader); + bytereader_advance(byte_reader, 4); + return ret; +} + +/* float functions */ +float bytereader_show_f32_be(bytereader_t byte_reader) +{ + uint32_t ret = bytereader_show_u32_be(byte_reader); + return *(float *)(&ret); +} + +float bytereader_read_f32_be(bytereader_t byte_reader) +{ + uint32_t ret = bytereader_read_u32_be(byte_reader); + return *(float *)(&ret); +} + +GUID bytereader_read_uuid_be(bytereader_t byte_reader) +{ + GUID guid_value; + guid_value.Data1 = bytereader_read_u32_be(byte_reader); + guid_value.Data2 = bytereader_read_u16_be(byte_reader); + guid_value.Data3 = bytereader_read_u16_be(byte_reader); + bytereader_read_n(byte_reader, guid_value.Data4, 8); + return guid_value; +} + +GUID bytereader_read_uuid_le(bytereader_t byte_reader) +{ + GUID guid_value; + guid_value.Data1 = bytereader_read_u32_le(byte_reader); + guid_value.Data2 = bytereader_read_u16_le(byte_reader); + guid_value.Data3 = bytereader_read_u16_le(byte_reader); + bytereader_read_n(byte_reader, guid_value.Data4, 8); + return guid_value; +} -- cgit