src/object_writer.h

changeset 73
1ee9b312dc18
child 75
bf8c57437231
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/object_writer.h	Sat Jan 11 22:36:31 2014 +0200
@@ -0,0 +1,110 @@
+/*
+	Copyright (c) 2013-2014, Santeri Piippo
+	All rights reserved.
+
+	Redistribution and use in source and binary forms, with or without
+	modification, are permitted provided that the following conditions are met:
+
+		* Redistributions of source code must retain the above copyright
+		  notice, this list of conditions and the following disclaimer.
+
+		* Redistributions in binary form must reproduce the above copyright
+		  notice, this list of conditions and the following disclaimer in the
+		  documentation and/or other materials provided with the distribution.
+
+		* Neither the name of the <organization> nor the
+		  names of its contributors may be used to endorse or promote products
+		  derived from this software without specific prior written permission.
+
+	THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+	ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+	WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+	DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+	DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+	(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+	LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+	ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+	(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+	SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef BOTC_OBJWRITER_H
+#define BOTC_OBJWRITER_H
+
+#include <stdio.h>
+#include <typeinfo>
+#include <string.h>
+#include "main.h"
+#include "str.h"
+#include "data_buffer.h"
+
+class object_writer
+{
+public:
+	// ====================================================================
+	// MEMBERS
+
+	// Pointer to the file we're writing to
+	FILE* fp;
+
+	// The main buffer - the contents of this is what we
+	// write to file after parsing is complete
+	data_buffer* MainBuffer;
+
+	// onenter buffer - the contents of the onenter{} block
+	// is buffered here and is merged further at the end of state
+	data_buffer* OnEnterBuffer;
+
+	// Mainloop buffer - the contents of the mainloop{} block
+	// is buffered here and is merged further at the end of state
+	data_buffer* MainLoopBuffer;
+
+	// Switch buffer - switch case data is recorded to this
+	// buffer initially, instead of into main buffer.
+	data_buffer* SwitchBuffer;
+
+	// How many bytes have we written to file?
+	int numWrittenBytes;
+
+	// How many references did we resolve in the main buffer?
+	int numWrittenReferences;
+
+	// ====================================================================
+	// METHODS
+	object_writer();
+	void write_string (string s);
+	void write_buffer (data_buffer* buf);
+	void write_member_buffers();
+	void write_string_table();
+	void write_to_file (string filepath);
+	data_buffer* get_current_buffer();
+
+	int add_mark (string name);
+	int find_byte_mark (string name);
+	int add_reference (int mark);
+	void move_mark (int mark);
+	void offset_mark (int mark, int offset);
+	void delete_mark (int mark);
+
+	template <class T> void write (T stuff)
+	{
+		get_current_buffer()->write (stuff);
+	}
+
+private:
+	// Write given data to file.
+	template <class T> void write_data_to_file (T stuff)
+	{
+		// One byte at a time
+		generic_union<T> uni;
+		uni.as_t = stuff;
+
+		for (int x = 0; x < sizeof (T); x++)
+		{
+			fwrite (&uni.as_bytes[x], 1, 1, fp);
+			numWrittenBytes++;
+		}
+	}
+};
+
+#endif // BOTC_OBJWRITER_H

mercurial