diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/replicant/nu/ByteReader.h | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/replicant/nu/ByteReader.h')
-rw-r--r-- | Src/replicant/nu/ByteReader.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/Src/replicant/nu/ByteReader.h b/Src/replicant/nu/ByteReader.h new file mode 100644 index 00000000..31aa5d12 --- /dev/null +++ b/Src/replicant/nu/ByteReader.h @@ -0,0 +1,83 @@ +#pragma once +#include <stdint.h> +#include "foundation/types.h" + +/* A simple byte-oriented reader. +use this instead of manual parsing as this deals with memory alignment issues +for you. +memory alignment can be critical and annoying on some architectures (e.g. PowerPC) +it also handles little-endian/big-endian issues + +Usually you just make one of these things on the stack, passing in your buffer and length + +S is signed and U is unsigned +Show functions will give you data w/o moving the stream position +Align versions of the functions will assume the stream is properly aligned +LE versions of the functions treat the byte stream as little-endian oriented +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + typedef struct bytereader_struct_t + { + size_t byte_length; + const uint8_t *data_ptr; + const void *data; + } bytereader_value_t, bytereader_s, *bytereader_t; + + void bytereader_init(bytereader_t byte_reader, const void *data, size_t byte_length); + static size_t bytereader_size(bytereader_t byte_reader) /* returns remaining bytes in stream */ + { + return byte_reader->byte_length; + } + void bytereader_advance(bytereader_t byte_reader, size_t bytes); /* advances the byte stream */ + void bytereader_reset(bytereader_t byte_reader); /* reset the data pointer and size back to the original position */ + static const void *bytereader_pointer(bytereader_t byte_reader) /* returns a pointer to the current bitstream position */ + { + return byte_reader->data_ptr; + } + + /* returns the number of bytes to the next 0, or the end of the buffer */ + size_t bytereader_find_zero(bytereader_t byte_reader); + + /* n byte functions (basically memcpy) */ + void bytereader_show_n(bytereader_t byte_reader, void *destination, size_t bytes); + void bytereader_read_n(bytereader_t byte_reader, void *destination, size_t bytes); + + /* 1 byte functions */ + uint8_t bytereader_show_u8(bytereader_t byte_reader); + uint8_t bytereader_read_u8(bytereader_t byte_reader); + int8_t bytereader_show_s8(bytereader_t byte_reader); + int8_t bytereader_read_s8(bytereader_t byte_reader); + + /* 2 byte little endian functions */ + uint16_t bytereader_show_u16_le(bytereader_t byte_reader); + uint16_t bytereader_read_u16_le(bytereader_t byte_reader); + int16_t bytereader_show_s16_le(bytereader_t byte_reader); + int16_t bytereader_read_s16_le(bytereader_t byte_reader); + + /* 2 byte big-endian functions */ + uint16_t bytereader_show_u16_be(bytereader_t byte_reader); + uint16_t bytereader_read_u16_be(bytereader_t byte_reader); + int16_t bytereader_show_s16_be(bytereader_t byte_reader); + int16_t bytereader_read_s16_be(bytereader_t byte_reader); + + /* 4 byte big-endian functions */ + uint32_t bytereader_show_u32_be(bytereader_t byte_reader); + uint32_t bytereader_read_u32_be(bytereader_t byte_reader); + + /* 4 byte little-endian functions */ + uint32_t bytereader_show_u32_le(bytereader_t byte_reader); + uint32_t bytereader_read_u32_le(bytereader_t byte_reader); + + /* float functions */ + float bytereader_show_f32_be(bytereader_t byte_reader); + float bytereader_read_f32_be(bytereader_t byte_reader); + + GUID bytereader_read_uuid_be(bytereader_t byte_reader); + GUID bytereader_read_uuid_le(bytereader_t byte_reader); +#ifdef __cplusplus +} +#endif |