aboutsummaryrefslogtreecommitdiff
path: root/tests/freealut/src/alutOutputStream.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/freealut/src/alutOutputStream.c')
-rw-r--r--tests/freealut/src/alutOutputStream.c89
1 files changed, 89 insertions, 0 deletions
diff --git a/tests/freealut/src/alutOutputStream.c b/tests/freealut/src/alutOutputStream.c
new file mode 100644
index 00000000..fc8eca03
--- /dev/null
+++ b/tests/freealut/src/alutOutputStream.c
@@ -0,0 +1,89 @@
+#include "alutInternal.h"
+#include <string.h>
+
+struct OutputStream_struct
+{
+ char *data;
+ char *current;
+ size_t maximumLength;
+};
+
+/****************************************************************************
+ * The functions below know the internal OutputStream representation.
+ ****************************************************************************/
+
+OutputStream *_alutOutputStreamConstruct(size_t maximumLength)
+{
+ OutputStream *stream = (OutputStream *) _alutMalloc(sizeof(OutputStream));
+
+ if (stream == NULL)
+ {
+ return NULL;
+ }
+ stream->data = _alutMalloc(maximumLength);
+ if (stream->data == NULL)
+ {
+ free(stream);
+ return NULL;
+ }
+ stream->current = stream->data;
+ stream->maximumLength = maximumLength;
+ return stream;
+}
+
+ALboolean _alutOutputStreamDestroy(OutputStream * stream)
+{
+ free(stream->data);
+ free(stream);
+ return AL_TRUE;
+}
+
+void *_alutOutputStreamGetData(OutputStream * stream)
+{
+ return stream->data;
+}
+
+size_t _alutOutputStreamGetLength(OutputStream * stream)
+{
+ return stream->current - stream->data;
+}
+
+static ALboolean streamWrite(OutputStream * stream, const void *ptr, size_t numBytesToWrite)
+{
+ size_t remainingLength = stream->maximumLength - _alutOutputStreamGetLength(stream);
+
+ if (remainingLength < numBytesToWrite)
+ {
+ /* this should never happen within our library */
+ _alutSetError(ALUT_ERROR_IO_ERROR);
+ return AL_FALSE;
+ }
+ memcpy(stream->current, ptr, numBytesToWrite);
+ stream->current += numBytesToWrite;
+ return AL_TRUE;
+}
+
+/****************************************************************************
+ * The utility functions below do not know the internal OutputStream
+ * representation.
+ ****************************************************************************/
+
+ALboolean _alutOutputStreamWriteInt16BE(OutputStream * stream, Int16BigEndian value)
+{
+ unsigned char buf[2];
+
+ buf[0] = (unsigned char)(value >> 8);
+ buf[1] = (unsigned char)value;
+ return streamWrite(stream, buf, 2);
+}
+
+ALboolean _alutOutputStreamWriteInt32BE(OutputStream * stream, Int32BigEndian value)
+{
+ unsigned char buf[4];
+
+ buf[0] = (unsigned char)(value >> 24);
+ buf[1] = (unsigned char)(value >> 16);
+ buf[2] = (unsigned char)(value >> 8);
+ buf[3] = (unsigned char)value;
+ return streamWrite(stream, buf, 4);
+}