aboutsummaryrefslogtreecommitdiff
path: root/Src/replicant/nu/ByteWriter.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/replicant/nu/ByteWriter.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/replicant/nu/ByteWriter.h')
-rw-r--r--Src/replicant/nu/ByteWriter.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/Src/replicant/nu/ByteWriter.h b/Src/replicant/nu/ByteWriter.h
new file mode 100644
index 00000000..309bf106
--- /dev/null
+++ b/Src/replicant/nu/ByteWriter.h
@@ -0,0 +1,48 @@
+#pragma once
+#include "foundation/types.h"
+/* A simple byte-oriented writer.
+use this instead of manually writing data 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
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ typedef struct bytewriter_struct_t
+ {
+ size_t byte_length;
+ uint8_t *data_ptr;
+ void *data;
+ } bytewriter_s, *bytewriter_t;
+
+ void bytewriter_init(bytewriter_t byte_writer, void *data, size_t byte_length);
+ static size_t bytewriter_size(bytewriter_t byte_writer) /* returns remaining bytes in stream */
+ {
+ return byte_writer->byte_length;
+ }
+ static void *bytewriter_pointer(bytewriter_t byte_writer) /* returns a pointer to the current bitstream position */
+ {
+ return byte_writer->data_ptr;
+ }
+ static void bytewriter_advance(bytewriter_t byte_writer, size_t bytes) /* advances the byte stream */
+ {
+ byte_writer->byte_length-=bytes;
+ byte_writer->data_ptr+=bytes;
+ }
+
+ void bytewriter_write_n(bytewriter_t byte_writer, const void *source, size_t bytes);
+ void bytewriter_write_zero_n(bytewriter_t byte_writer, size_t bytes);
+ void bytewriter_write_u8(bytewriter_t byte_writer, uint8_t value);
+ void bytewriter_write_u16_le(bytewriter_t byte_writer, uint16_t value);
+ void bytewriter_write_u16_be(bytewriter_t byte_writer, uint16_t value);
+ void bytewriter_write_u32_le(bytewriter_t byte_writer, uint32_t value);
+ void bytewriter_write_u32_be(bytewriter_t byte_writer, uint32_t value);
+ void bytewriter_write_uuid_be(bytewriter_t byte_writer, GUID guid_value);
+#ifdef __cplusplus
+}
+#endif