diff options
author | Jean-Francois Mauguit <jfmauguit@mac.com> | 2024-09-24 09:03:25 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-24 09:03:25 -0400 |
commit | bab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/replicant/nu/ByteWriter.c | |
parent | 4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff) | |
parent | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff) | |
download | winamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz |
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/replicant/nu/ByteWriter.c')
-rw-r--r-- | Src/replicant/nu/ByteWriter.c | 77 |
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); +} |