about summary refs log tree commit diff
path: root/src/engine/e_packer.c
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-12-15 10:24:49 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-12-15 10:24:49 +0000
commita2566b3ebd93e0bbc55a920a7be08054a9377f11 (patch)
tree44a4612805d894168fe4b3b4c065fccc1a1686e9 /src/engine/e_packer.c
parentac9873056aa1fe529b098f19ff31e9ffa0e016a2 (diff)
downloadzcatch-a2566b3ebd93e0bbc55a920a7be08054a9377f11.tar.gz
zcatch-a2566b3ebd93e0bbc55a920a7be08054a9377f11.zip
cleaned up code structure a bit
Diffstat (limited to 'src/engine/e_packer.c')
-rw-r--r--src/engine/e_packer.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/engine/e_packer.c b/src/engine/e_packer.c
new file mode 100644
index 00000000..948db4ea
--- /dev/null
+++ b/src/engine/e_packer.c
@@ -0,0 +1,91 @@
+/* copyright (c) 2007 magnus auvinen, see licence.txt for more info */
+
+#include "e_packer.h"
+#include "e_compression.h"
+
+void packer_reset(PACKER *p)
+{
+	p->error = 0;
+	p->current = p->buffer;
+	p->end = p->current + PACKER_BUFFER_SIZE;
+}
+
+void packer_add_int(PACKER *p, int i)
+{
+	p->current = vint_pack(p->current, i);
+}
+
+void packer_add_string(PACKER *p, const char *str, int limit)
+{
+	if(limit > 0)
+	{
+		while(*str && limit != 0)
+		{
+			*p->current++ = *str++;
+			limit--;
+		}
+		*p->current++ = 0;
+	}
+	else
+	{
+		while(*str)
+			*p->current++ = *str++;
+		*p->current++ = 0;
+	}
+}
+
+void packer_add_raw(PACKER *p, const unsigned char *data, int size)
+{
+	while(size)
+	{
+		*p->current++ = *data++;
+		size--;
+	}
+}
+
+int packer_size(PACKER *p)
+{
+	return (const unsigned char *)p->current-(const unsigned char *)p->buffer;
+}
+
+const unsigned char *packer_data(PACKER *p)
+{
+	return (const unsigned char *)p->buffer;
+}
+
+void unpacker_reset(UNPACKER *p, const unsigned char *data, int size)
+{
+	p->error = 0;
+	p->start = data;
+	p->end = p->start + size;
+	p->current = p->start;
+}
+
+int unpacker_get_int(UNPACKER *p)
+{
+	int i;
+	if(p->current >= p->end)
+		return 0;
+	p->current = vint_unpack(p->current, &i);
+	return i;
+}
+
+const char *unpacker_get_string(UNPACKER *p)
+{
+	const char *ptr;
+	if(p->current >= p->end)
+		return "";
+		
+	ptr = (const char *)p->current;
+	while(*p->current) /* skip the string */
+		p->current++;
+	p->current++;
+	return ptr;
+}
+
+const unsigned char *unpacker_get_raw(UNPACKER *p, int size)
+{
+	const unsigned char *ptr = p->current;
+	p->current += size;
+	return ptr;
+}