diff -r ad027ea58097 -r d11a034aabfd objwriter.h --- 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 #include #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 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 (stuff, x); - writepos++; - } - } - - template T Read() { - T result = buffer[readpos]; - readpos += sizeof (T); - return result; - } - -private: - template 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 (256, b); - unsigned long p2 = pow (256, b+1); - unsigned long r = (a % p2) / p1; - - if (r > 256) - error ("result %lu too big!", r); - - unsigned char ur = static_cast (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 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 (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 (stuff); + return; } + // Cannot use default arguments in function templates.. void Write (long stuff) {Write (stuff);} };