src/main.cxx

changeset 75
bf8c57437231
parent 74
007fbadfa7f9
child 76
c8058716070a
--- a/src/main.cxx	Mon Jan 13 00:15:38 2014 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,278 +0,0 @@
-/*
-	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.
-*/
-
-#include "main.h"
-#include "scriptreader.h"
-#include "object_writer.h"
-#include "events.h"
-#include "commands.h"
-#include "stringtable.h"
-#include "variables.h"
-#include "containers.h"
-#include "data_buffer.h"
-#include "bots.h"
-#include "object_writer.h"
-#include "parser.h"
-
-// List of keywords
-const string_list g_Keywords =
-{
-	"bool",
-	"break",
-	"case",
-	"continue",
-	"const",
-	"default",
-	"do",
-	"else",
-	"event",
-	"for",
-	"goto",
-	"if",
-	"int",
-	"mainloop",
-	"onenter",
-	"onexit",
-	"state",
-	"switch",
-	"str"
-	"void",
-	"while",
-
-	// These ones aren't implemented yet but I plan to do so, thus they are
-	// reserved. Also serves as a to-do list of sorts for me. >:F
-	"enum", // Would enum actually be useful? I think so.
-	"func", // Would function support need external support from zandronum?
-	"return",
-};
-
-// databuffer global variable
-int g_NextMark = 0;
-
-int main (int argc, char** argv)
-{
-	// Intepret command-line parameters:
-	// -l: list commands
-	// I guess there should be a better way to do this.
-	if (argc == 2 && !strcmp (argv[1], "-l"))
-	{
-		ReadCommands();
-		printf ("Begin list of commands:\n");
-		printf ("------------------------------------------------------\n");
-
-		CommandDef* comm;
-		ITERATE_COMMANDS (comm)
-			print ("%1\n", GetCommandPrototype (comm));
-
-		printf ("------------------------------------------------------\n");
-		printf ("End of command list\n");
-		exit (0);
-	}
-
-	// Print header
-	string header;
-	string headerline;
-	header = format ("%1 version %2.%3", APPNAME, VERSION_MAJOR, VERSION_MINOR);
-
-	for (int i = 0; i < (header.len() / 2) - 1; ++i)
-		headerline += "-=";
-
-	headerline += '-';
-	print ("%1\n%2\n", header, headerline);
-
-	if (argc < 2)
-	{
-		fprintf (stderr, "usage: %s <infile> [outfile] # compiles botscript\n", argv[0]);
-		fprintf (stderr, "       %s -l                 # lists commands\n", argv[0]);
-		exit (1);
-	}
-
-	string outfile;
-
-	if (argc < 3)
-		outfile = ObjectFileName (argv[1]);
-	else
-		outfile = argv[2];
-
-	// If we'd end up writing into an existing file,
-	// ask the user if we want to overwrite it
-	if (fexists (outfile))
-	{
-		// Additional warning if the paths are the same
-		string warning;
-#ifdef FILE_CASEINSENSITIVE
-
-		if (+outfile == +string (argv[1]))
-#else
-		if (outfile == argv[1])
-#endif
-		{
-			warning = "\nWARNING: Output file is the same as the input file. ";
-			warning += "Answering yes here will destroy the source!\n";
-			warning += "Continue nevertheless?";
-		}
-
-		printf ("output file `%s` already exists! overwrite?%s (y/n) ", outfile.chars(), warning.chars());
-
-		char ans;
-		fgets (&ans, 1, stdin);
-
-		if (ans != 'y')
-		{
-			printf ("abort\n");
-			exit (1);
-		}
-	}
-
-	// Read definitions
-	printf ("Reading definitions...\n");
-	ReadEvents();
-	ReadCommands();
-
-	// Prepare reader and writer
-	botscript_parser* r = new botscript_parser;
-	object_writer* w = new object_writer;
-
-	// We're set, begin parsing :)
-	printf ("Parsing script...\n");
-	r->parse_botscript (argv[1], w);
-	printf ("Script parsed successfully.\n");
-
-	// Parse done, print statistics and write to file
-	int globalcount = g_GlobalVariables.size();
-	int stringcount = num_strings_in_table();
-	int NumMarks = w->MainBuffer->count_marks();
-	int NumRefs = w->MainBuffer->count_references();
-	print ("%1 / %2 strings written\n", stringcount, MAX_LIST_STRINGS);
-	print ("%1 / %2 global variables\n", globalcount, MAX_SCRIPT_VARIABLES);
-	print ("%1 / %2 bytecode marks\n", NumMarks, MAX_MARKS); // TODO: nuke
-	print ("%1 / %2 bytecode references\n", NumRefs, MAX_MARKS); // TODO: nuke
-	print ("%1 / %2 events\n", g_NumEvents, MAX_NUM_EVENTS);
-	print ("%1 state%s1\n", g_NumStates);
-
-	w->write_to_file (outfile);
-
-	// Clear out the junk
-	delete r;
-	delete w;
-
-	// Done!
-	exit (0);
-}
-
-// ============================================================================
-// Utility functions
-
-// ============================================================================
-// Does the given file exist?
-bool fexists (string path)
-{
-	if (FILE* test = fopen (path, "r"))
-	{
-		fclose (test);
-		return true;
-	}
-
-	return false;
-}
-
-// ============================================================================
-// Generic error
-void error (const char* text, ...)
-{
-	va_list va;
-	va_start (va, text);
-	fprintf (stderr, "error: ");
-	vfprintf (stderr, text, va);
-	va_end (va);
-	exit (1);
-}
-
-// ============================================================================
-// Mutates given filename to an object filename
-string ObjectFileName (string s)
-{
-	// Locate the extension and chop it out
-	int extdot = s.last (".");
-
-	if (extdot >= s.len() - 4)
-		s -= (s.len() - extdot);
-
-	s += ".o";
-	return s;
-}
-
-// ============================================================================
-// Is the given argument a reserved keyword?
-bool IsKeyword (string s)
-{
-	for (int u = 0; u < NumKeywords(); u++)
-		if (s.to_uppercase() == g_Keywords[u].to_uppercase())
-			return true;
-
-	return false;
-}
-
-int NumKeywords()
-{
-	return sizeof (g_Keywords) / sizeof (const char*);
-}
-
-// ============================================================================
-type_e GetTypeByName (string t)
-{
-	t = t.to_lowercase();
-	return	(t == "int") ? TYPE_INT :
-			(t == "str") ? TYPE_STRING :
-			(t == "void") ? TYPE_VOID :
-			(t == "bool") ? TYPE_BOOL :
-			TYPE_UNKNOWN;
-}
-
-
-// ============================================================================
-// Inverse operation - type name by value
-string GetTypeName (type_e type)
-{
-	switch (type)
-	{
-	case TYPE_INT: return "int"; break;
-
-	case TYPE_STRING: return "str"; break;
-
-	case TYPE_VOID: return "void"; break;
-
-	case TYPE_BOOL: return "bool"; break;
-
-	case TYPE_UNKNOWN: return "???"; break;
-	}
-
-	return "";
-}

mercurial