objwriter.h

changeset 32
d11a034aabfd
parent 29
b4e09ae24bf1
child 34
0a9a5902beaa
--- a/objwriter.h	Mon Jul 16 04:33:09 2012 +0300
+++ b/objwriter.h	Mon Jul 16 16:15:16 2012 +0300
@@ -45,100 +45,18 @@
 #include <typeinfo>
 #include <string.h>
 #include "common.h"
+#include "databuffer.h"
 #include "str.h"
 
 extern int g_CurMode;
 
-// ============================================================================
-// DataBuffer: A dynamic data buffer.
-class DataBuffer {
-public:
-	// The actual buffer
-	unsigned char* buffer;
-	
-	// How big is the buffer?
-	unsigned int bufsize;
-	
-	// Position in the buffer
-	unsigned int writepos;
-	unsigned int readpos;
-	
-	// METHODS
-	DataBuffer (unsigned int size=128) {
-		writepos = 0;
-		readpos = 0;
-		
-		buffer = new unsigned char[size];
-		bufsize = size;
-	}
-	
-	~DataBuffer () {
-		delete buffer;
-	}
-	
-	template<class T> void Write(T stuff) {
-		if (sizeof (char) != 1) {
-			error ("DataBuffer: sizeof(char) must be 1!\n");
-		}
-		
-		// Out of space, must resize
-		if (writepos + sizeof(T) >= bufsize) {
-			// First, store the old buffer temporarily
-			char* copy = new char[bufsize];
-			printf ("Resizing buffer: copy buffer to safety. %u bytes to copy\n", bufsize);
-			memcpy (copy, buffer, bufsize);
-			
-			// Remake the buffer with the new size.
-			// Have a bit of leeway so we don't have to
-			// resize immediately again.
-			size_t newsize = bufsize + sizeof (T) + 128;
-			delete buffer;
-			buffer = new unsigned char[newsize];
-			bufsize = newsize;
-			
-			// Now, copy the new stuff over.
-			memcpy (buffer, copy, bufsize);
-			
-			// Nuke the copy now as it's no longer needed
-			delete copy;
-		}
-		
-		// Write the new stuff one byte at a time
-		for (unsigned int x = 0; x < sizeof (T); x++) {
-			buffer[writepos] = CharByte<T> (stuff, x);
-			writepos++;
-		}
-	}
-	
-	template<class T> T Read() {
-		T result = buffer[readpos];
-		readpos += sizeof (T);
-		return result;
-	}
-
-private:
-	template <class T> unsigned char CharByte (T a, unsigned int b) {
-		if (b >= sizeof (T))
-			error ("CharByte: tried to get byte %u out of a %u-byte %s\n",
-				b, sizeof (T), typeid(T).name());
-		
-		unsigned long p1 = pow<unsigned long> (256, b);
-		unsigned long p2 = pow<unsigned long> (256, b+1);
-		unsigned long r = (a % p2) / p1;
-		
-		if (r > 256)
-			error ("result %lu too big!", r);
-		
-		unsigned char ur = static_cast<unsigned char> (r);
-		return ur;
-	}
-};
-
 class ObjWriter {
 public:
 	// ====================================================================
 	// MEMBERS
 	FILE* fp;
+	str filepath;
+	DataBuffer* MainBuffer;
 	DataBuffer* OnEnterBuffer;
 	DataBuffer* MainLoopBuffer;
 	unsigned int numWrittenBytes;
@@ -151,18 +69,16 @@
 	void WriteString (const char* s);
 	void WriteString (str s);
 	void WriteBuffers ();
+	void WriteToFile ();
 	
 	template <class T> void Write (T stuff) {
-		// Mainloop and onenter are written into a separate buffer.
-		if (g_CurMode == MODE_MAINLOOP || g_CurMode == MODE_ONENTER) {
-			DataBuffer* buffer = (g_CurMode == MODE_MAINLOOP) ? MainLoopBuffer : OnEnterBuffer;
-			buffer->Write<T> (stuff);
-			return;
-		}
-		
-		fwrite (&stuff, sizeof (T), 1, fp);
-		numWrittenBytes += sizeof (T);
+		DataBuffer* buffer =	(g_CurMode == MODE_MAINLOOP) ? MainLoopBuffer :
+					(g_CurMode == MODE_ONENTER) ? OnEnterBuffer :
+					MainBuffer;
+		buffer->Write<T> (stuff);
+		return;
 	}
+	
 	// Cannot use default arguments in function templates..
 	void Write (long stuff) {Write<long> (stuff);}
 };

mercurial