Browse Source

Throwing exceptions

Panagiotis Christopoulos Charitos 15 years ago
parent
commit
ca8da9bc76

+ 2 - 2
blenderscripts/mesh.py

@@ -346,8 +346,8 @@ def export(meshInit):
 			raise RuntimeError("The given func param is not a \"Armature\" class but a \"" + skeleton.__class__.__name__ + "\"")
 	
 	print("Trying to export mesh \"" + mesh.name + "\"")
-	filename = os.path.abspath(meshInit.saveDir + mesh.name)
+	filename = os.path.abspath(meshInit.saveDir + "/" + mesh.name + ".mesh")
 	file = open(filename, "wb")
-	file.write(getAnkiMeshScript(mesh, skeleton, meshInit.mtlName, mesh.name, meshInit.flipYZ))
+	file.write(getAnkiMeshScript(mesh, skeleton, meshInit.saveDir + "/" + mesh.name + ".mtl", mesh.name + ".mesh", meshInit.flipYZ))
 	print("Mesh exported!! \"" + filename + "\"")	
 	

File diff suppressed because it is too large
+ 389 - 391
build/debug/Makefile


+ 1 - 1
build/debug/gen.cfg.py

@@ -1,4 +1,4 @@
-sourcePaths = ["../../src/Scripting/", "../../src/Math/", "../../src/Util/Tokenizer/", "../../src/Misc/", "../../src/", "../../src/Renderer/", "../../src/Scene/", "../../src/Ui/", "../../src/Resources/", "../../src/Util/", "../../src/Scene/Controllers/", "../../src/Physics/", "../../src/Renderer/BufferObjects/", "../../src/Resources/Helpers/", "../../src/Resources/Core/", "../../src/Core/", "../../src/Scripting/Math", "../../src/Scripting/Util", "../../src/Scripting/Core", "../../src/Scripting/Scene", "../../src/Scripting/Renderer", "../../src/Input"]
+sourcePaths = ["../../src/Scripting/", "../../src/Math/", "../../src/Misc/", "../../src/", "../../src/Renderer/", "../../src/Scene/", "../../src/Ui/", "../../src/Resources/", "../../src/Util/", "../../src/Scene/Controllers/", "../../src/Physics/", "../../src/Renderer/BufferObjects/", "../../src/Resources/Helpers/", "../../src/Resources/Core/", "../../src/Core/", "../../src/Scripting/Math", "../../src/Scripting/Util", "../../src/Scripting/Core", "../../src/Scripting/Scene", "../../src/Scripting/Renderer", "../../src/Input"]
 
 includePaths = []
 includePaths.append("./")

+ 2 - 2
src/Main.cpp

@@ -194,8 +194,6 @@ void init()
 	ctrl->skelAnim.loadRsrc("models/imp/walk.imp.anim");
 	ctrl->step = 0.8;
 
-	return;
-
 	// cave map
 	/*for(int i=1; i<21; i++)
 	{
@@ -215,6 +213,8 @@ void init()
 	node->init("maps/sponza/dark-marbles.mesh");
 	//node->setLocalTransform(Transform(Vec3(0.0, -0.0, 0.0), Mat3::getIdentity(), 0.01));
 
+	return;
+
 	// particle emitter
 	partEmitter = new ParticleEmitter;
 	partEmitter->init("asdf");

+ 17 - 7
src/Util/Tokenizer/Parser.h → src/Misc/Parser.h

@@ -1,12 +1,13 @@
 #ifndef PARSER_H
 #define PARSER_H
 
+#include <boost/lexical_cast.hpp>
 #include "Common.h"
+#include "Exception.h"
 #include "Scanner.h"
 
-/**
- * @brief It contains some functions and macros that include code commonly used in parsing
- */
+
+/// @brief It contains some functions and macros that include code commonly used in parsing
 namespace Parser {
 
 
@@ -16,6 +17,16 @@ namespace Parser {
 #define PARSE_ERR(x) ERROR("Parse Error (" << scanner.getScriptName() << ':' << scanner.getLineNumber() << "): " << x)
 #define PARSE_WARN(x) WARNING("Parse Warning (" << scanner.getScriptName() << ':' << scanner.getLineNumber() << "): " << x)
 
+#define PARSER_THROW_EXCEPTION(x) \
+	THROW_EXCEPTION("Parser failed (" + scanner.getScriptName() + ':' + \
+	                lexical_cast<string>(scanner.getLineNumber()) + "): " + x)
+
+#define PARSER_THROW_EXCEPTION_EXPECTED(x) \
+	PARSER_THROW_EXCEPTION("Expected " + x + " and not " + scanner.getCrntToken().getInfoStr())
+
+#define PARSER_THROW_EXCEPTION_UNEXPECTED(x) \
+	PARSER_THROW_EXCEPTION("Unexpected token " + scanner.getCrntToken().getInfoStr())
+
 // common parser errors
 #define PARSE_ERR_EXPECTED(x) PARSE_ERR("Expected " << x << " and not " << scanner.getCrntToken().getInfoStr());
 #define PARSE_ERR_UNEXPECTED() PARSE_ERR("Unexpected token " << scanner.getCrntToken().getInfoStr());
@@ -112,14 +123,13 @@ bool parseArrOfNumbers(Scanner& scanner, bool bracket, bool signs, uint size, Ty
 /// @param scanner The scanner that we will use
 /// @param sign If true expect sign or not
 /// @param out The output number
-/// @return True on success
 template <typename Type>
-bool parseNumber(Scanner& scanner, bool sign, Type& out);
+void parseNumber(Scanner& scanner, bool sign, Type& out);
 
 
-///
+/// Parses a math structure (Vec3, Vec4, Mat3 etc) with leading and following brackets
 template <typename Type>
-bool parseMathVector(Scanner& scanner, Type& out);
+void parseMathVector(Scanner& scanner, Type& out);
 
 
 } // end namespace Parser

+ 102 - 0
src/Misc/Parser.inl.h

@@ -0,0 +1,102 @@
+#include "Parser.h"
+#include "Exception.h"
+
+
+namespace Parser {
+
+
+//======================================================================================================================
+// parseNumber                                                                                                         =
+//======================================================================================================================
+template <typename Type>
+void parseNumber(Scanner& scanner, bool sign, Type& out)
+{
+	try
+	{
+		const Scanner::Token* token = &scanner.getNextToken();
+		bool negative = false;
+
+		// check the sign if any
+		if(sign)
+		{
+			if(token->getCode() == Scanner::TC_PLUS)
+			{
+				negative = false;
+				token = &scanner.getNextToken();
+			}
+			else if(token->getCode() == Scanner::TC_MINUS)
+			{
+				negative = true;
+				token = &scanner.getNextToken();
+			}
+			else if(token->getCode() != Scanner::TC_NUMBER)
+			{
+				PARSER_THROW_EXCEPTION_EXPECTED("number or sign");
+			}
+		}
+
+		// check the number
+		if(token->getCode() != Scanner::TC_NUMBER)
+		{
+			PARSER_THROW_EXCEPTION_EXPECTED("number");
+		}
+
+		if(token->getDataType() == Scanner::DT_FLOAT)
+		{
+			double d = negative ? -token->getValue().getFloat() : token->getValue().getFloat();
+			out = static_cast<Type>(d);
+		}
+		else
+		{
+			ulong l = negative ? -token->getValue().getInt() : token->getValue().getInt();
+			out = static_cast<Type>(l);
+		}
+	}
+	catch(std::exception& e)
+	{
+		THROW_EXCEPTION(e.what());
+	}
+}
+
+
+//======================================================================================================================
+// parseMathVector                                                                                                     =
+//======================================================================================================================
+template <typename Type>
+void parseMathVector(Scanner& scanner, Type& out)
+{
+	try
+	{
+		const Scanner::Token* token = &scanner.getNextToken();
+		uint elementsNum = sizeof(Type) / sizeof(float);
+
+		// {
+		if(token->getCode() != Scanner::TC_LBRACKET)
+		{
+			PARSER_THROW_EXCEPTION_EXPECTED("{");
+		}
+
+		// numbers
+		for(uint i=0; i<elementsNum; i++)
+		{
+			double d;
+			parseNumber(scanner, true, d);
+			out[i] = d;
+		}
+
+		// }
+		token = &scanner.getNextToken();
+		if(token->getCode() != Scanner::TC_RBRACKET)
+		{
+			PARSER_THROW_EXCEPTION_EXPECTED("}");
+		}
+	}
+	catch(std::exception& e)
+	{
+		THROW_EXCEPTION(e.what());
+	}
+}
+
+
+
+} // End namespace Parser

+ 250 - 224
src/Resources/Helpers/ShaderPrePreprocessor.cpp

@@ -70,294 +70,317 @@ bool ShaderPrePreprocessor::parseFileForPragmas(const string& filename, int dept
 	}
 
 	// scanner
-	Scanner scanner(false);
-	if(!scanner.loadFile(filename.c_str())) return false;
-	const Scanner::Token* token;
-
-	
-	do
+	try
 	{
-		token = &scanner.getNextToken();
+		Scanner scanner(filename.c_str(), false);
+		const Scanner::Token* token;
 
-		if(token->getCode() == Scanner::TC_SHARP)
+		while(true)
 		{
 			token = &scanner.getNextToken();
-			if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "pragma") == 0)
+
+			if(token->getCode() == Scanner::TC_SHARP)
 			{
 				token = &scanner.getNextToken();
-				if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "anki") == 0)
+				if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "pragma") == 0)
 				{
 					token = &scanner.getNextToken();
-/* vertShaderBegins */
-					if(token->getCode() == Scanner::TC_IDENTIFIER &&
-					   strcmp(token->getValue().getString(), "vertShaderBegins") == 0)
+					if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "anki") == 0)
 					{
-						// play
-
-						// its defined in same place so there is probable circular includance
-						if(vertShaderBegins.definedInLine==scanner.getLineNumber() && vertShaderBegins.definedInFile==filename)
-						{
-							PARSE_ERR("vertShaderBegins" << MULTIPLE_DEF_MSG);
-							return false;
-						}
-
-						// already defined elsewhere => error
-						if(vertShaderBegins.definedInLine != -1)
+						token = &scanner.getNextToken();
+						//
+						// vertShaderBegins
+						//
+						if(token->getCode() == Scanner::TC_IDENTIFIER &&
+							 strcmp(token->getValue().getString(), "vertShaderBegins") == 0)
 						{
-							PARSE_ERR("vertShaderBegins already defined at " << vertShaderBegins.definedInFile << ":" <<
-							           vertShaderBegins.definedInLine);
-							return false;
-						}
+							// play
 
-						// vert shader should be before frag
-						if(fragShaderBegins.definedInLine != -1)
-						{
-							PARSE_ERR("vertShaderBegins must precede fragShaderBegins defined at " <<
-							          fragShaderBegins.definedInFile << ":" << fragShaderBegins.definedInLine);
-							return false;
-						}
-						
-						// vert shader should be before geom
-						if(geomShaderBegins.definedInLine != -1)
-						{
-							PARSE_ERR("vertShaderBegins must precede geomShaderBegins defined at " <<
-							          geomShaderBegins.definedInFile << ":" << geomShaderBegins.definedInLine);
-							return false;
-						}
+							// its defined in same place so there is probable circular includance
+							if(vertShaderBegins.definedInLine==scanner.getLineNumber() && vertShaderBegins.definedInFile==filename)
+							{
+								PARSE_ERR("vertShaderBegins" << MULTIPLE_DEF_MSG);
+								return false;
+							}
 
-						vertShaderBegins.definedInFile = filename;
-						vertShaderBegins.definedInLine = scanner.getLineNumber();
-						vertShaderBegins.globalLine = sourceLines.size() + 1;
-						sourceLines.push_back("#line " + lexical_cast<string>(scanner.getLineNumber()) + ' ' +
-						                      lexical_cast<string>(depth) + " // " + lines[scanner.getLineNumber()-1]);
-						// stop play
-					}
-/* geomShaderBegins */
-					else if(token->getCode() == Scanner::TC_IDENTIFIER &&
-					        strcmp(token->getValue().getString(), "geomShaderBegins") == 0)
-					{
-						// play
+							// already defined elsewhere => error
+							if(vertShaderBegins.definedInLine != -1)
+							{
+								PARSE_ERR("vertShaderBegins already defined at " << vertShaderBegins.definedInFile << ":" <<
+													 vertShaderBegins.definedInLine);
+								return false;
+							}
 
-						// its defined in same place so there is probable circular includance
-						if(geomShaderBegins.definedInLine==scanner.getLineNumber() && geomShaderBegins.definedInFile==filename)
-						{
-							PARSE_ERR("geomShaderBegins" << MULTIPLE_DEF_MSG);
-							return false;
-						}
+							// vert shader should be before frag
+							if(fragShaderBegins.definedInLine != -1)
+							{
+								PARSE_ERR("vertShaderBegins must precede fragShaderBegins defined at " <<
+													fragShaderBegins.definedInFile << ":" << fragShaderBegins.definedInLine);
+								return false;
+							}
 
-						// already defined elsewhere => error
-						if(geomShaderBegins.definedInLine != -1)
-						{
-							PARSE_ERR("geomShaderBegins already defined at " << geomShaderBegins.definedInFile << ":" <<
-							           geomShaderBegins.definedInLine);
-							return false;
-						}
+							// vert shader should be before geom
+							if(geomShaderBegins.definedInLine != -1)
+							{
+								PARSE_ERR("vertShaderBegins must precede geomShaderBegins defined at " <<
+													geomShaderBegins.definedInFile << ":" << geomShaderBegins.definedInLine);
+								return false;
+							}
 
-						// vert shader entry point not defined => error
-						if(vertShaderBegins.definedInLine == -1)
-						{
-							PARSE_ERR("geomShaderBegins must follow vertShaderBegins");
-							return false;
+							vertShaderBegins.definedInFile = filename;
+							vertShaderBegins.definedInLine = scanner.getLineNumber();
+							vertShaderBegins.globalLine = sourceLines.size() + 1;
+							sourceLines.push_back("#line " + lexical_cast<string>(scanner.getLineNumber()) + ' ' +
+																		lexical_cast<string>(depth) + " // " + lines[scanner.getLineNumber()-1]);
+							// stop play
 						}
-
-						// frag shader entry point defined => error
-						if(fragShaderBegins.definedInLine != -1)
+						//
+						// geomShaderBegins
+						//
+						else if(token->getCode() == Scanner::TC_IDENTIFIER &&
+										strcmp(token->getValue().getString(), "geomShaderBegins") == 0)
 						{
-							PARSE_ERR("geomShaderBegins must precede fragShaderBegins defined at " <<
-							          fragShaderBegins.definedInFile << ":" << fragShaderBegins.definedInLine);
-							return false;
-						}
+							// play
 
-						geomShaderBegins.definedInFile = filename;
-						geomShaderBegins.definedInLine = scanner.getLineNumber();
-						geomShaderBegins.globalLine = sourceLines.size() + 1;
-						sourceLines.push_back("#line " + lexical_cast<string>(scanner.getLineNumber()) + ' ' +
-						                      lexical_cast<string>(depth) + " // " + lines[scanner.getLineNumber()-1]);
-						// stop play
-					}
-/* fragShaderBegins */
-					else if(token->getCode() == Scanner::TC_IDENTIFIER &&
-					        strcmp(token->getValue().getString(), "fragShaderBegins") == 0)
-					{
-						// play
+							// its defined in same place so there is probable circular includance
+							if(geomShaderBegins.definedInLine==scanner.getLineNumber() && geomShaderBegins.definedInFile==filename)
+							{
+								PARSE_ERR("geomShaderBegins" << MULTIPLE_DEF_MSG);
+								return false;
+							}
 
-						// its defined in same place so there is probable circular includance
-						if(fragShaderBegins.definedInLine==scanner.getLineNumber() && fragShaderBegins.definedInFile==filename)
-						{
-							PARSE_ERR("fragShaderBegins" << MULTIPLE_DEF_MSG);
-							return false;
-						}
+							// already defined elsewhere => error
+							if(geomShaderBegins.definedInLine != -1)
+							{
+								PARSE_ERR("geomShaderBegins already defined at " << geomShaderBegins.definedInFile << ":" <<
+													 geomShaderBegins.definedInLine);
+								return false;
+							}
 
-						if(fragShaderBegins.definedInLine != -1) // if already defined elsewhere throw error
-						{
-							PARSE_ERR("fragShaderBegins already defined at " << fragShaderBegins.definedInFile << ":" <<
-							           fragShaderBegins.definedInLine);
-							return false;
-						}
-						
-						// vert shader entry point not defined
-						if(vertShaderBegins.definedInLine == -1)
-						{
-							PARSE_ERR("fragShaderBegins must follow vertShaderBegins");
-							return false;
-						}
+							// vert shader entry point not defined => error
+							if(vertShaderBegins.definedInLine == -1)
+							{
+								PARSE_ERR("geomShaderBegins must follow vertShaderBegins");
+								return false;
+							}
 
-						fragShaderBegins.definedInFile = filename;
-						fragShaderBegins.definedInLine = scanner.getLineNumber();
-						fragShaderBegins.globalLine = sourceLines.size() + 1;
-						sourceLines.push_back("#line " + lexical_cast<string>(scanner.getLineNumber()) + ' ' +
-						                      lexical_cast<string>(depth) + " // " + lines[scanner.getLineNumber()-1]);
-						// stop play
-					}
-/* include */
-					else if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "include") == 0)
-					{
-						token = &scanner.getNextToken();
-						if(token->getCode() == Scanner::TC_STRING)
-						{
-							// play
-							//int line = sourceLines.size();
-							sourceLines.push_back("#line 0 " + lexical_cast<string>(depth+1) + " // " +
-							                      lines[scanner.getLineNumber()-1]);
-							if(!parseFileForPragmas(token->getValue().getString(), depth+1))
+							// frag shader entry point defined => error
+							if(fragShaderBegins.definedInLine != -1)
+							{
+								PARSE_ERR("geomShaderBegins must precede fragShaderBegins defined at " <<
+													fragShaderBegins.definedInFile << ":" << fragShaderBegins.definedInLine);
 								return false;
+							}
+
+							geomShaderBegins.definedInFile = filename;
+							geomShaderBegins.definedInLine = scanner.getLineNumber();
+							geomShaderBegins.globalLine = sourceLines.size() + 1;
 							sourceLines.push_back("#line " + lexical_cast<string>(scanner.getLineNumber()) + ' ' +
-							                      lexical_cast<string>(depth) +  " // end of " + lines[scanner.getLineNumber()-1]);
+																		lexical_cast<string>(depth) + " // " + lines[scanner.getLineNumber()-1]);
 							// stop play
 						}
-						else
+						//
+						// fragShaderBegins
+						//
+						else if(token->getCode() == Scanner::TC_IDENTIFIER &&
+										strcmp(token->getValue().getString(), "fragShaderBegins") == 0)
 						{
-							PARSE_ERR_EXPECTED("string");
-							return false;
-						}
-					}
-/* transformFeedbackVarying */
-					else if(token->getCode() == Scanner::TC_IDENTIFIER &&
-					        strcmp(token->getValue().getString(), "transformFeedbackVarying") == 0)
-					{
-						token = &scanner.getNextToken();
-						if(token->getCode() == Scanner::TC_IDENTIFIER)
-						{
-							string varName = token->getValue().getString();
-							// check if already defined and for circular includance
-							Vec<TrffbVaryingPragma>::const_iterator var = findNamed(output.trffbVaryings, varName);
-							if(var != output.trffbVaryings.end())
+							// play
+
+							// its defined in same place so there is probable circular includance
+							if(fragShaderBegins.definedInLine==scanner.getLineNumber() && fragShaderBegins.definedInFile==filename)
 							{
-								if(var->definedInLine==scanner.getLineNumber() && var->definedInFile==filename)
-								{
-									PARSE_ERR("\"" << varName << "\"" << MULTIPLE_DEF_MSG);
-								}
-								else
-								{
-									PARSE_ERR("Varying \"" << varName << "\" already defined at " << var->definedInFile << ":" <<
-														var->definedInLine);
-								}
+								PARSE_ERR("fragShaderBegins" << MULTIPLE_DEF_MSG);
+								return false;
+							}
+
+							if(fragShaderBegins.definedInLine != -1) // if already defined elsewhere throw error
+							{
+								PARSE_ERR("fragShaderBegins already defined at " << fragShaderBegins.definedInFile << ":" <<
+													 fragShaderBegins.definedInLine);
+								return false;
+							}
+
+							// vert shader entry point not defined
+							if(vertShaderBegins.definedInLine == -1)
+							{
+								PARSE_ERR("fragShaderBegins must follow vertShaderBegins");
 								return false;
 							}
 
-							// all ok, push it back
-							output.trffbVaryings.push_back(TrffbVaryingPragma(filename, scanner.getLineNumber(), varName));
-							sourceLines.push_back(lines[scanner.getLineNumber()-1]);
+							fragShaderBegins.definedInFile = filename;
+							fragShaderBegins.definedInLine = scanner.getLineNumber();
+							fragShaderBegins.globalLine = sourceLines.size() + 1;
+							sourceLines.push_back("#line " + lexical_cast<string>(scanner.getLineNumber()) + ' ' +
+																		lexical_cast<string>(depth) + " // " + lines[scanner.getLineNumber()-1]);
+							// stop play
 						}
-						else
+						//
+						// include
+						//
+						else if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "include") == 0)
 						{
-							PARSE_ERR_EXPECTED("identifier");
-							return false;
+							token = &scanner.getNextToken();
+							if(token->getCode() == Scanner::TC_STRING)
+							{
+								// play
+								//int line = sourceLines.size();
+								sourceLines.push_back("#line 0 " + lexical_cast<string>(depth+1) + " // " +
+																			lines[scanner.getLineNumber()-1]);
+								if(!parseFileForPragmas(token->getValue().getString(), depth+1))
+									return false;
+								sourceLines.push_back("#line " + lexical_cast<string>(scanner.getLineNumber()) + ' ' +
+																			lexical_cast<string>(depth) +  " // end of " + lines[scanner.getLineNumber()-1]);
+								// stop play
+							}
+							else
+							{
+								PARSE_ERR_EXPECTED("string");
+								return false;
+							}
 						}
-					}
-/* attribute */
-					else if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "attribute") == 0)
-					{
-						token = &scanner.getNextToken();
-						if(token->getCode() == Scanner::TC_IDENTIFIER)
+						//
+						// transformFeedbackVarying
+						//
+						else if(token->getCode() == Scanner::TC_IDENTIFIER &&
+										strcmp(token->getValue().getString(), "transformFeedbackVarying") == 0)
 						{
-							string varName = token->getValue().getString();
 							token = &scanner.getNextToken();
-							if(token->getCode() == Scanner::TC_NUMBER && token->getDataType() == Scanner::DT_INT)
+							if(token->getCode() == Scanner::TC_IDENTIFIER)
 							{
-								uint loc = token->getValue().getInt();
-
+								string varName = token->getValue().getString();
 								// check if already defined and for circular includance
-								Vec<ShaderVarPragma>::const_iterator attrib = findNamed(output.attributes, varName);
-								if(attrib != output.attributes.end())
+								Vec<TrffbVaryingPragma>::const_iterator var = findNamed(output.trffbVaryings, varName);
+								if(var != output.trffbVaryings.end())
 								{
-									if(attrib->definedInLine==scanner.getLineNumber() && attrib->definedInFile==filename)
+									if(var->definedInLine==scanner.getLineNumber() && var->definedInFile==filename)
 									{
 										PARSE_ERR("\"" << varName << "\"" << MULTIPLE_DEF_MSG);
 									}
 									else
 									{
-										PARSE_ERR("Attribute \"" << varName << "\" already defined at " << attrib->definedInFile << ":" <<
-										          attrib->definedInLine);
+										PARSE_ERR("Varying \"" << varName << "\" already defined at " << var->definedInFile << ":" <<
+															var->definedInLine);
 									}
 									return false;
 								}
-								// search if another var has the same loc
-								for(attrib = output.attributes.begin(); attrib!=output.attributes.end(); ++attrib)
+
+								// all ok, push it back
+								output.trffbVaryings.push_back(TrffbVaryingPragma(filename, scanner.getLineNumber(), varName));
+								sourceLines.push_back(lines[scanner.getLineNumber()-1]);
+							}
+							else
+							{
+								PARSE_ERR_EXPECTED("identifier");
+								return false;
+							}
+						}
+						//
+						// attribute
+						//
+						else if(token->getCode() == Scanner::TC_IDENTIFIER && strcmp(token->getValue().getString(), "attribute") == 0)
+						{
+							token = &scanner.getNextToken();
+							if(token->getCode() == Scanner::TC_IDENTIFIER)
+							{
+								string varName = token->getValue().getString();
+								token = &scanner.getNextToken();
+								if(token->getCode() == Scanner::TC_NUMBER && token->getDataType() == Scanner::DT_INT)
 								{
-									if(attrib->customLoc == loc)
+									uint loc = token->getValue().getInt();
+
+									// check if already defined and for circular includance
+									Vec<ShaderVarPragma>::const_iterator attrib = findNamed(output.attributes, varName);
+									if(attrib != output.attributes.end())
 									{
-										PARSE_ERR("The attributes \"" << attrib->name << "\" (" << attrib->definedInFile << ":" <<
-										          attrib->definedInLine << ") and \"" << varName << "\" share the same location");
+										if(attrib->definedInLine==scanner.getLineNumber() && attrib->definedInFile==filename)
+										{
+											PARSE_ERR("\"" << varName << "\"" << MULTIPLE_DEF_MSG);
+										}
+										else
+										{
+											PARSE_ERR("Attribute \"" << varName << "\" already defined at " << attrib->definedInFile << ":" <<
+																attrib->definedInLine);
+										}
 										return false;
 									}
+									// search if another var has the same loc
+									for(attrib = output.attributes.begin(); attrib!=output.attributes.end(); ++attrib)
+									{
+										if(attrib->customLoc == loc)
+										{
+											PARSE_ERR("The attributes \"" << attrib->name << "\" (" << attrib->definedInFile << ":" <<
+																attrib->definedInLine << ") and \"" << varName << "\" share the same location");
+											return false;
+										}
+									}
+
+									// all ok, push it back
+									output.attributes.push_back(ShaderVarPragma(filename, scanner.getLineNumber(), varName, loc));
+									sourceLines.push_back(lines[scanner.getLineNumber()-1]);
+								}
+								else
+								{
+									PARSE_ERR_EXPECTED("integer");
+									return false;
 								}
-								
-								// all ok, push it back
-								output.attributes.push_back(ShaderVarPragma(filename, scanner.getLineNumber(), varName, loc));
-								sourceLines.push_back(lines[scanner.getLineNumber()-1]);
 							}
 							else
 							{
-								PARSE_ERR_EXPECTED("integer");
+								PARSE_ERR_EXPECTED("identifier");
 								return false;
 							}
 						}
 						else
 						{
-							PARSE_ERR_EXPECTED("identifier");
+							PARSE_ERR("#pragma anki followed by incorrect " << token->getInfoStr());
 							return false;
 						}
-					}
-					else
+					} // end if anki
+
+					token = &scanner.getNextToken();
+					if(token->getCode()!=Scanner::TC_NEWLINE && token->getCode()!=Scanner::TC_EOF)
 					{
-						PARSE_ERR("#pragma anki followed by incorrect " << token->getInfoStr());
+						PARSE_ERR_EXPECTED("newline or end of file");
 						return false;
 					}
-				} // end if anki
-				
-				token = &scanner.getNextToken();
-				if(token->getCode()!=Scanner::TC_NEWLINE && token->getCode()!=Scanner::TC_EOF)
-				{
-					PARSE_ERR_EXPECTED("newline or end of file");
-					return false;
-				}
-				
-				if(token->getCode() == Scanner::TC_EOF)
-					break;
-				
-			} // end if pragma
-		} // end if #
-/* newline */		
-		else if(token->getCode() == Scanner::TC_NEWLINE)
-		{
-			sourceLines.push_back(lines[scanner.getLineNumber() - 2]);
-			//PRINT(lines[scanner.getLineNmbr() - 2])
-		}
-/* EOF */
-		else if(token->getCode() == Scanner::TC_EOF)
-		{
-			sourceLines.push_back(lines[scanner.getLineNumber() - 1]);
-			//PRINT(lines[scanner.getLineNmbr() - 1])
-			break;
-		}
-/* error */
-		else if(token->getCode() == Scanner::TC_ERROR)
-		{
-			return false;
-		}
 
-	} while(true);
+					if(token->getCode() == Scanner::TC_EOF)
+						break;
+
+				} // end if pragma
+			} // end if #
+			//
+			// newline
+			//
+			else if(token->getCode() == Scanner::TC_NEWLINE)
+			{
+				sourceLines.push_back(lines[scanner.getLineNumber() - 2]);
+				//PRINT(lines[scanner.getLineNmbr() - 2])
+			}
+			//
+			// EOF
+			//
+			else if(token->getCode() == Scanner::TC_EOF)
+			{
+				sourceLines.push_back(lines[scanner.getLineNumber() - 1]);
+				//PRINT(lines[scanner.getLineNmbr() - 1])
+				break;
+			}
+			//
+			// error
+			//
+			else if(token->getCode() == Scanner::TC_ERROR)
+			{
+				return false;
+			}
+		} // end while
+	}
+	catch(Exception& e)
+	{
+		ERROR(e.what());
+		return false;
+	}
 	
 	return true;
 }
@@ -369,7 +392,10 @@ bool ShaderPrePreprocessor::parseFileForPragmas(const string& filename, int dept
 bool ShaderPrePreprocessor::parseFile(const char* filename)
 {
 	// parse master file
-	if(!parseFileForPragmas(filename)) return false;
+	if(!parseFileForPragmas(filename))
+	{
+		return false;
+	}
 
 	// rearrange the trffbVaryings
 

+ 118 - 98
src/Resources/LightData.cpp

@@ -1,5 +1,4 @@
 #include <cstring>
-#include <GL/glew.h>
 #include "LightData.h"
 #include "Parser.h"
 #include "Texture.h"
@@ -12,8 +11,8 @@ LightData::LightData():
 	Resource(RT_LIGHT_PROPS),
 	diffuseCol(0.5),
 	specularCol(0.5),
-	radius(1.0),
 	castsShadow_(false),
+	radius(1.0),
 	distance(3.0),
 	fovX(M::PI/4.0),
 	fovY(M::PI/4.0)
@@ -25,131 +24,152 @@ LightData::LightData():
 //======================================================================================================================
 bool LightData::load(const char* filename)
 {
-	Scanner scanner;
-	if(!scanner.loadFile(filename))
+	try
 	{
-		return false;
-	}
+		Scanner scanner(filename);
+		const Scanner::Token* token;
 
-	const Scanner::Token* token;
-
-	type = LT_POINT;
-
-	while(true)
-	{
+		// First of all get the type
 		token = &scanner.getNextToken();
+		if(token->getCode() != Scanner::TC_IDENTIFIER || strcmp(token->getValue().getString(), "type"))
+		{
+			PARSE_ERR_EXPECTED("type");
+			return false;
+		}
 
-		// DIFFUSE_COL
-		if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "DIFFUSE_COLOR"))
+		token = &scanner.getNextToken();
+		if(token->getCode() != Scanner::TC_IDENTIFIER)
 		{
-			if(!Parser::parseMathVector(scanner, diffuseCol))
+			if(!strcmp(token->getValue().getString(), "LT_SPOT"))
 			{
-				return false;
+				type = LT_SPOT;
 			}
-		}
-		// SPECULAR_COL
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "SPECULAR_COLOR"))
-		{
-			if(!Parser::parseMathVector(scanner, specularCol))
+			else if(!strcmp(token->getValue().getString(), "LT_POINT"))
 			{
-				return false;
+				type = LT_POINT;
 			}
-		}
-		// RADIUS
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "RADIUS"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
+			else
 			{
-				PARSE_ERR_EXPECTED("number");
+				PARSE_ERR_EXPECTED("LT_SPOT or LT_POINT");
 				return false;
 			}
-
-			radius = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
-			                                                       float(token->getValue().getInt());
 		}
-		// CASTS_SHADOW
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "CASTS_SHADOW"))
+
+
+		while(true)
 		{
 			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
+
+			// diffuseCol
+			if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "diffuseCol"))
 			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+				Parser::parseMathVector(scanner, diffuseCol);
 			}
-
-			castsShadow_ = token->getValue().getInt();
-		}
-		// DISTANCE
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "DISTANCE"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
+			// SPECULAR_COL
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "SPECULAR_COLOR"))
 			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+				Parser::parseMathVector(scanner, specularCol);
 			}
+			// RADIUS
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "RADIUS"))
+			{
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
 
-			distance = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
-			                                                         float(token->getValue().getInt());
-			type = LT_SPOT;
-		}
-		// FOV_X
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "FOV_X"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
+				radius = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
+																															 float(token->getValue().getInt());
+			}
+			// CASTS_SHADOW
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "CASTS_SHADOW"))
 			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
+
+				castsShadow_ = token->getValue().getInt();
 			}
+			// DISTANCE
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "DISTANCE"))
+			{
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
 
-			fovX = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
-			                                                     float(token->getValue().getInt());
-			type = LT_SPOT;
-		}
-		// FOV_Y
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "FOV_Y"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
+				distance = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
+																																 float(token->getValue().getInt());
+				type = LT_SPOT;
+			}
+			// FOV_X
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "FOV_X"))
 			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
+
+				fovX = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
+																														 float(token->getValue().getInt());
+				type = LT_SPOT;
 			}
+			// FOV_Y
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "FOV_Y"))
+			{
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
 
-			fovY = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
-			                                                     float(token->getValue().getInt());
-			type = LT_SPOT;
-		}
-		// TEXTURE
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "TEXTURE"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_STRING)
+				fovY = (token->getDataType() == Scanner::DT_FLOAT) ? token->getValue().getFloat() :
+																														 float(token->getValue().getInt());
+				type = LT_SPOT;
+			}
+			// TEXTURE
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "TEXTURE"))
+			{
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_STRING)
+				{
+					PARSE_ERR_EXPECTED("string");
+					return false;
+				}
+
+				texture.loadRsrc(token->getValue().getString());
+				texture->setRepeat(false);
+				texture->setAnisotropy(0);
+				texture->setFiltering(Texture::TFT_LINEAR);
+				type = LT_SPOT;
+			}
+			// end of file
+			else if(token->getCode() == Scanner::TC_EOF)
 			{
-				PARSE_ERR_EXPECTED("string");
+				break;
+			}
+			// other crap
+			else
+			{
+				PARSE_ERR_UNEXPECTED();
 				return false;
 			}
-				
-			texture.loadRsrc(token->getValue().getString());
-			texture->setRepeat(false);
-			texture->setAnisotropy(0);
-			texture->setTexParameter(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-			texture->setTexParameter(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-			type = LT_SPOT;
-		}
-		// end of file
-		else if(token->getCode() == Scanner::TC_EOF)
-		{
-			break;
-		}
-		// other crap
-		else
-		{
-			PARSE_ERR_UNEXPECTED();
-			return false;
-		}
+		} // end while
+	}
+	catch(std::exception& e)
+	{
+		ERROR(e.what());
+		return false;
 	}
 	
 	// sanity checks

+ 237 - 241
src/Resources/Material.cpp

@@ -122,304 +122,300 @@ static bool searchBlendEnum(const char* str, int& gl_enum)
 //======================================================================================================================
 bool Material::load(const char* filename)
 {
-	Scanner scanner;
-	if(!scanner.loadFile(filename)) return false;
-
-	const Scanner::Token* token;
-
-	while(true)
+	try
 	{
-		token = &scanner.getNextToken();
+		Scanner scanner(filename);
+		const Scanner::Token* token;
 
-		//** SHADER_PROG **
-		if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "SHADER_PROG"))
+		while(true)
 		{
-			if(shaderProg.get())
-			{
-				ERROR("Shader program already loaded");
-				return false;
-			}
-
 			token = &scanner.getNextToken();
-			string shaderFilename;
-			if(token->getCode() == Scanner::TC_STRING)
-			{
-				shaderFilename = token->getValue().getString();
-			}
-			// build custom shader
-			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getString(), "buildMsSProg"))
+
+			//** SHADER_PROG **
+			if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "SHADER_PROG"))
 			{
-				// (
-				token = &scanner.getNextToken();
-				if(token->getCode() != Scanner::TC_LPAREN)
+				if(shaderProg.get())
 				{
-					PARSE_ERR_EXPECTED("(");
+					ERROR("Shader program already loaded");
 					return false;
 				}
 
-				// shader prog
 				token = &scanner.getNextToken();
-				if(token->getCode() != Scanner::TC_STRING)
+				string shaderFilename;
+				if(token->getCode() == Scanner::TC_STRING)
 				{
-					PARSE_ERR_EXPECTED("string");
-					return false;
+					shaderFilename = token->getValue().getString();
 				}
-				string sProgFilename = token->getValue().getString();
-
-				// get the switches
-				string source;
-				string prefix;
-				while(true)
+				// build custom shader
+				else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getString(), "buildMsSProg"))
 				{
+					// (
 					token = &scanner.getNextToken();
+					if(token->getCode() != Scanner::TC_LPAREN)
+					{
+						PARSE_ERR_EXPECTED("(");
+						return false;
+					}
 
-					if(token->getCode() == Scanner::TC_RPAREN)
-						break;
-
-					if(token->getCode() != Scanner::TC_IDENTIFIER)
+					// shader prog
+					token = &scanner.getNextToken();
+					if(token->getCode() != Scanner::TC_STRING)
 					{
-						PARSE_ERR_EXPECTED("identifier");
+						PARSE_ERR_EXPECTED("string");
 						return false;
 					}
+					string sProgFilename = token->getValue().getString();
 
-					// check if acceptable value
-					MsSwitch* mss = msSwitches;
-					while(mss->switchName != NULL)
+					// get the switches
+					string source;
+					string prefix;
+					while(true)
 					{
-						if(!strcmp(mss->switchName, token->getString()))
+						token = &scanner.getNextToken();
+
+						if(token->getCode() == Scanner::TC_RPAREN)
 							break;
 
-						++mss;
-					}
+						if(token->getCode() != Scanner::TC_IDENTIFIER)
+						{
+							PARSE_ERR_EXPECTED("identifier");
+							return false;
+						}
 
-					if(mss->switchName == NULL)
-					{
-						PARSE_ERR("Incorrect switch " << token->getString());
-						return false;
-					}
+						// check if acceptable value
+						MsSwitch* mss = msSwitches;
+						while(mss->switchName != NULL)
+						{
+							if(!strcmp(mss->switchName, token->getString()))
+								break;
 
-					source += string("#define ") + token->getString() + "\n";
-					prefix.push_back(mss->prefix);
-				} // end get the switches
+							++mss;
+						}
 
-				std::sort(prefix.begin(), prefix.end());
+						if(mss->switchName == NULL)
+						{
+							PARSE_ERR("Incorrect switch " << token->getString());
+							return false;
+						}
 
-				shaderFilename = ShaderProg::createSrcCodeToCache(sProgFilename.c_str(), source.c_str(), prefix.c_str());
-			}
-			else
-			{
-				PARSE_ERR_EXPECTED("string or buildMsSProg");
-				return false;
-			}
+						source += string("#define ") + token->getString() + "\n";
+						prefix.push_back(mss->prefix);
+					} // end get the switches
 
-			shaderProg.loadRsrc(shaderFilename.c_str());
-		}
-		//** DEPTH_MATERIAL **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "DEPTH_PASS_MATERIAL"))
-		{
-			if(dpMtl.get())
-				ERROR("Depth material already loaded");
+					std::sort(prefix.begin(), prefix.end());
 
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_STRING)
-			{
-				PARSE_ERR_EXPECTED("string");
-				return false;
-			}
-			dpMtl.loadRsrc(token->getValue().getString());
-		}
-		//** BLENDS **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "BLENDS"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
-			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+					shaderFilename = ShaderProg::createSrcCodeToCache(sProgFilename.c_str(), source.c_str(), prefix.c_str());
+				}
+				else
+				{
+					PARSE_ERR_EXPECTED("string or buildMsSProg");
+					return false;
+				}
+
+				shaderProg.loadRsrc(shaderFilename.c_str());
 			}
-			blends = token->getValue().getInt();
-		}
-		//** BLENDING_SFACTOR **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "BLENDING_SFACTOR"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_IDENTIFIER)
+			//** DEPTH_MATERIAL **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "DEPTH_PASS_MATERIAL"))
 			{
-				PARSE_ERR_EXPECTED("identifier");
-				return false;
+				if(dpMtl.get())
+					ERROR("Depth material already loaded");
+
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_STRING)
+				{
+					PARSE_ERR_EXPECTED("string");
+					return false;
+				}
+				dpMtl.loadRsrc(token->getValue().getString());
 			}
-			int gl_enum;
-			if(!searchBlendEnum(token->getValue().getString(), gl_enum))
+			//** BLENDS **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "BLENDS"))
 			{
-				PARSE_ERR("Incorrect blending factor \"" << token->getValue().getString() << "\"");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
+				blends = token->getValue().getInt();
 			}
-			blendingSfactor = gl_enum;
-		}
-		//** BLENDING_DFACTOR **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "BLENDING_DFACTOR"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_IDENTIFIER)
+			//** BLENDING_SFACTOR **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "BLENDING_SFACTOR"))
 			{
-				PARSE_ERR_EXPECTED("identifier");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_IDENTIFIER)
+				{
+					PARSE_ERR_EXPECTED("identifier");
+					return false;
+				}
+				int gl_enum;
+				if(!searchBlendEnum(token->getValue().getString(), gl_enum))
+				{
+					PARSE_ERR("Incorrect blending factor \"" << token->getValue().getString() << "\"");
+					return false;
+				}
+				blendingSfactor = gl_enum;
 			}
-			int gl_enum;
-			if(!searchBlendEnum(token->getValue().getString(), gl_enum))
+			//** BLENDING_DFACTOR **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "BLENDING_DFACTOR"))
 			{
-				PARSE_ERR("Incorrect blending factor \"" << token->getValue().getString() << "\"");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_IDENTIFIER)
+				{
+					PARSE_ERR_EXPECTED("identifier");
+					return false;
+				}
+				int gl_enum;
+				if(!searchBlendEnum(token->getValue().getString(), gl_enum))
+				{
+					PARSE_ERR("Incorrect blending factor \"" << token->getValue().getString() << "\"");
+					return false;
+				}
+				blendingDfactor = gl_enum;
 			}
-			blendingDfactor = gl_enum;
-		}
-		//** DEPTH_TESTING **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "DEPTH_TESTING"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
+			//** DEPTH_TESTING **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "DEPTH_TESTING"))
 			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
+				depthTesting = token->getValue().getInt();
 			}
-			depthTesting = token->getValue().getInt();
-		}
-		//** WIREFRAME **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "WIREFRAME"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
+			//** WIREFRAME **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "WIREFRAME"))
 			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
+				wireframe = token->getValue().getInt();
 			}
-			wireframe = token->getValue().getInt();
-		}
-		//** CASTS_SHADOW **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "CASTS_SHADOW"))
-		{
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_NUMBER)
+			//** CASTS_SHADOW **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "CASTS_SHADOW"))
 			{
-				PARSE_ERR_EXPECTED("number");
-				return false;
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER)
+				{
+					PARSE_ERR_EXPECTED("number");
+					return false;
+				}
+				castsShadow = token->getValue().getInt();
 			}
-			castsShadow = token->getValue().getInt();
-		}
-		//** USER_DEFINED_VARS **
-		else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "USER_DEFINED_VARS"))
-		{
-			// first check if the shader is defined
-			if(shaderProg.get() == NULL)
+			//** USER_DEFINED_VARS **
+			else if(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "USER_DEFINED_VARS"))
 			{
-				PARSE_ERR("You have to define the shader program before the user defined vars");
-				return false;
-			}
+				// first check if the shader is defined
+				if(shaderProg.get() == NULL)
+				{
+					PARSE_ERR("You have to define the shader program before the user defined vars");
+					return false;
+				}
 
-			// read {
-			token = &scanner.getNextToken();
-			if(token->getCode() != Scanner::TC_LBRACKET)
-			{
-				PARSE_ERR_EXPECTED("{");
-				return false;
-			}
-			// loop all the vars
-			do
-			{
-				// read the name
+				// read {
 				token = &scanner.getNextToken();
-				if(token->getCode() == Scanner::TC_RBRACKET) break;
-
-				if(token->getCode() != Scanner::TC_IDENTIFIER)
+				if(token->getCode() != Scanner::TC_LBRACKET)
 				{
-					PARSE_ERR_EXPECTED("identifier");
+					PARSE_ERR_EXPECTED("{");
 					return false;
 				}
+				// loop all the vars
+				do
+				{
+					// read the name
+					token = &scanner.getNextToken();
+					if(token->getCode() == Scanner::TC_RBRACKET) break;
 
-				string varName;
-				varName = token->getValue().getString();
+					if(token->getCode() != Scanner::TC_IDENTIFIER)
+					{
+						PARSE_ERR_EXPECTED("identifier");
+						return false;
+					}
 
-				userDefinedVars.push_back(new UserDefinedUniVar); // create new var
-				UserDefinedUniVar& var = userDefinedVars.back();
+					string varName;
+					varName = token->getValue().getString();
 
-				// check if the uniform exists
-				if(!shaderProg->uniVarExists(varName.c_str()))
-				{
-					PARSE_ERR("The variable \"" << varName << "\" is not an active uniform");
-					return false;
-				}
+					userDefinedVars.push_back(new UserDefinedUniVar); // create new var
+					UserDefinedUniVar& var = userDefinedVars.back();
 
-				var.sProgVar = shaderProg->findUniVar(varName.c_str());
+					// check if the uniform exists
+					if(!shaderProg->uniVarExists(varName.c_str()))
+					{
+						PARSE_ERR("The variable \"" << varName << "\" is not an active uniform");
+						return false;
+					}
 
-				// read the values
-				switch(var.sProgVar->getGlDataType())
-				{
-					// texture
-					case GL_SAMPLER_2D:
-						token = &scanner.getNextToken();
-						if(token->getCode() == Scanner::TC_STRING)
-						{
-							var.value.texture.loadRsrc(token->getValue().getString());
-							if(var.value.texture.get() == NULL)
-								return false;
-						}
-						else
-						{
-							PARSE_ERR_EXPECTED("string");
-							return false;
-						}
-						break;
-					// float
-					case GL_FLOAT:
-						token = &scanner.getNextToken();
-						if(token->getCode() == Scanner::TC_NUMBER && token->getDataType() == Scanner::DT_FLOAT)
-						{
-							var.value.float_ = token->getValue().getFloat();
-						}
-						else
-						{
-							PARSE_ERR_EXPECTED("float");
-							return false;
-						}
-						break;
-					// vec2
-					case GL_FLOAT_VEC2:
-						if(!Parser::parseMathVector(scanner, var.value.vec2))
-						{
-							return false;
-						}
-						break;
-					// vec3
-					case GL_FLOAT_VEC3:
-						if(!Parser::parseMathVector(scanner, var.value.vec3))
-						{
-							return false;
-						}
-						break;
-					// vec4
-					case GL_FLOAT_VEC4:
-						if(!Parser::parseMathVector(scanner, var.value.vec4))
-						{
-							return false;
-						}
-						break;
-				};
+					var.sProgVar = shaderProg->findUniVar(varName.c_str());
 
-			}while(true); // end loop for all the vars
+					// read the values
+					switch(var.sProgVar->getGlDataType())
+					{
+						// texture
+						case GL_SAMPLER_2D:
+							token = &scanner.getNextToken();
+							if(token->getCode() == Scanner::TC_STRING)
+							{
+								var.value.texture.loadRsrc(token->getValue().getString());
+								if(var.value.texture.get() == NULL)
+									return false;
+							}
+							else
+							{
+								PARSE_ERR_EXPECTED("string");
+								return false;
+							}
+							break;
+						// float
+						case GL_FLOAT:
+							token = &scanner.getNextToken();
+							if(token->getCode() == Scanner::TC_NUMBER && token->getDataType() == Scanner::DT_FLOAT)
+							{
+								var.value.float_ = token->getValue().getFloat();
+							}
+							else
+							{
+								PARSE_ERR_EXPECTED("float");
+								return false;
+							}
+							break;
+						// vec2
+						case GL_FLOAT_VEC2:
+							Parser::parseMathVector(scanner, var.value.vec2);
+							break;
+						// vec3
+						case GL_FLOAT_VEC3:
+							Parser::parseMathVector(scanner, var.value.vec3);
+							break;
+						// vec4
+						case GL_FLOAT_VEC4:
+							Parser::parseMathVector(scanner, var.value.vec4);
+							break;
+					};
 
-		}
-		// end of file
-		else if(token->getCode() == Scanner::TC_EOF)
-		{
-			break;
-		}
-		// other crap
-		else
-		{
-			PARSE_ERR_UNEXPECTED();
-			return false;
-		}
+				}while(true); // end loop for all the vars
 
+			}
+			// end of file
+			else if(token->getCode() == Scanner::TC_EOF)
+			{
+				break;
+			}
+			// other crap
+			else
+			{
+				PARSE_ERR_UNEXPECTED();
+				return false;
+			}
+		} // end while
+	}
+	catch(std::exception& e)
+	{
+		ERROR(e.what());
+		return false;
 	}
 
 	return initStdShaderVars();

+ 46 - 42
src/Resources/SkelAnim.cpp

@@ -8,64 +8,68 @@
 //======================================================================================================================
 bool SkelAnim::load(const char* filename)
 {
-	Scanner scanner;
-	if(!scanner.loadFile(filename))
-		return false;
-
-	const Scanner::Token* token;
-
-	// keyframes
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
+	try
 	{
-		PARSE_ERR_EXPECTED("integer");
-		return false;
-	}
-	keyframes.resize(token->getValue().getInt());
+		Scanner scanner(filename);
+		const Scanner::Token* token;
 
-	if(!Parser::parseArrOfNumbers(scanner, false, false, keyframes.size(), &keyframes[0]))
-		return false;
+		// keyframes
+		token = &scanner.getNextToken();
+		if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
+		{
+			PARSE_ERR_EXPECTED("integer");
+			return false;
+		}
+		keyframes.resize(token->getValue().getInt());
 
-	// bones num
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
-	{
-		PARSE_ERR_EXPECTED("integer");
-		return false;
-	}
-	bones.resize(token->getValue().getInt());
+		if(!Parser::parseArrOfNumbers(scanner, false, false, keyframes.size(), &keyframes[0]))
+			return false;
 
-	// poses
-	for(uint i=0; i<bones.size(); i++)
-	{
-		// has anim?
+		// bones num
 		token = &scanner.getNextToken();
 		if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
 		{
 			PARSE_ERR_EXPECTED("integer");
 			return false;
 		}
+		bones.resize(token->getValue().getInt());
 
-		// it has
-		if(token->getValue().getInt() == 1)
+		// poses
+		for(uint i=0; i<bones.size(); i++)
 		{
-			bones[i].keyframes.resize(keyframes.size());
+			// has anim?
+			token = &scanner.getNextToken();
+			if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
+			{
+				PARSE_ERR_EXPECTED("integer");
+				return false;
+			}
 
-			for(uint j=0; j<keyframes.size(); ++j)
+			// it has
+			if(token->getValue().getInt() == 1)
 			{
-				// parse the quat
-				float tmp[4];
-				if(!Parser::parseArrOfNumbers(scanner, false, true, 4, &tmp[0]))
-					return false;
-				bones[i].keyframes[j].rotation = Quat(tmp[1], tmp[2], tmp[3], tmp[0]);
+				bones[i].keyframes.resize(keyframes.size());
 
-				// parse the vec3
-				if(!Parser::parseArrOfNumbers(scanner, false, true, 3, &bones[i].keyframes[j].translation[0]))
-					return false;
-			}
-		}
-	} // end for all bones
+				for(uint j=0; j<keyframes.size(); ++j)
+				{
+					// parse the quat
+					float tmp[4];
+					if(!Parser::parseArrOfNumbers(scanner, false, true, 4, &tmp[0]))
+						return false;
+					bones[i].keyframes[j].rotation = Quat(tmp[1], tmp[2], tmp[3], tmp[0]);
 
+					// parse the vec3
+					if(!Parser::parseArrOfNumbers(scanner, false, true, 3, &bones[i].keyframes[j].translation[0]))
+						return false;
+				}
+			}
+		} // end for all bones
+	}
+	catch(Exception& e)
+	{
+		ERROR(e.what());
+		return false;
+	}
 
 	framesNum = keyframes[keyframes.size()-1] + 1;
 

+ 80 - 75
src/Resources/Skeleton.cpp

@@ -9,103 +9,108 @@
 //======================================================================================================================
 bool Skeleton::load(const char* filename)
 {
-	Scanner scanner;
-	if(!scanner.loadFile(filename)) return false;
-
-	const Scanner::Token* token;
-
-
-	//** BONES NUM **
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
-	{
-		PARSE_ERR_EXPECTED("integer");
-		return false;
-	}
-	bones.resize(token->getValue().getInt(), Bone());
-
-	for(uint i=0; i<bones.size(); i++)
+	try
 	{
-		Bone& bone = bones[i];
-		bone.id = i;
+		Scanner scanner(filename);
+		const Scanner::Token* token;
 
-		///@todo clean
-		/*Mat3 m3_(Axisang(-PI/2, Vec3(1,0,0)));
-		Mat4 m4_(Vec3(0), m3_, 1.0);*/
-
-		// NAME
+		//** BONES NUM **
 		token = &scanner.getNextToken();
-		if(token->getCode() != Scanner::TC_STRING)
+		if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
 		{
-			PARSE_ERR_EXPECTED("string");
+			PARSE_ERR_EXPECTED("integer");
 			return false;
 		}
-		bone.name = token->getValue().getString();
+		bones.resize(token->getValue().getInt(), Bone());
 
-		// head
-		if(!Parser::parseArrOfNumbers<float>(scanner, false, true, 3, &bone.head[0]))
-			return false;
+		for(uint i=0; i<bones.size(); i++)
+		{
+			Bone& bone = bones[i];
+			bone.id = i;
 
-		//bone.head = m3_ * bone.head;
+			///@todo clean
+			/*Mat3 m3_(Axisang(-PI/2, Vec3(1,0,0)));
+			Mat4 m4_(Vec3(0), m3_, 1.0);*/
 
-		// tail
-		if(!Parser::parseArrOfNumbers<float>(scanner, false, true, 3, &bone.tail[0]))
-			return false;
+			// NAME
+			token = &scanner.getNextToken();
+			if(token->getCode() != Scanner::TC_STRING)
+			{
+				PARSE_ERR_EXPECTED("string");
+				return false;
+			}
+			bone.name = token->getValue().getString();
 
-		//bone.tail = m3_ * bone.tail;
+			// head
+			if(!Parser::parseArrOfNumbers<float>(scanner, false, true, 3, &bone.head[0]))
+				return false;
 
-		// matrix
-		Mat4 m4;
-		if(!Parser::parseArrOfNumbers<float>(scanner, false, true, 16, &m4[0]))
-			return false;
+			//bone.head = m3_ * bone.head;
 
-		//m4 = m4_ * m4;
+			// tail
+			if(!Parser::parseArrOfNumbers<float>(scanner, false, true, 3, &bone.tail[0]))
+				return false;
 
-		// matrix for real
-		bone.rotSkelSpace = m4.getRotationPart();
-		bone.tslSkelSpace = m4.getTranslationPart();
-		Mat4 MAi(m4.getInverse());
-		bone.rotSkelSpaceInv = MAi.getRotationPart();
-		bone.tslSkelSpaceInv = MAi.getTranslationPart();
+			//bone.tail = m3_ * bone.tail;
 
-		// parent
-		token = &scanner.getNextToken();
-		if((token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT) &&
-		   (token->getCode() != Scanner::TC_IDENTIFIER || strcmp(token->getValue().getString(), "NULL") != 0))
-		{
-			PARSE_ERR_EXPECTED("integer or NULL");
-			return false;
-		}
+			// matrix
+			Mat4 m4;
+			if(!Parser::parseArrOfNumbers<float>(scanner, false, true, 16, &m4[0]))
+				return false;
 
-		if(token->getCode() == Scanner::TC_IDENTIFIER)
-			bone.parent = NULL;
-		else
-			bone.parent = &bones[token->getValue().getInt()];
+			//m4 = m4_ * m4;
 
-		// childs
-		token = &scanner.getNextToken();
-		if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
-		{
-			PARSE_ERR_EXPECTED("integer");
-			return false;
-		}
-		if(token->getValue().getInt() > Bone::MAX_CHILDS_PER_BONE)
-		{
-			ERROR("Childs for bone \"" << bone.getName() << "\" exceed the max");
-			return false;
-		}
-		bone.childsNum = token->getValue().getInt();
-		for(int j=0; j<bone.childsNum; j++)
-		{
+			// matrix for real
+			bone.rotSkelSpace = m4.getRotationPart();
+			bone.tslSkelSpace = m4.getTranslationPart();
+			Mat4 MAi(m4.getInverse());
+			bone.rotSkelSpaceInv = MAi.getRotationPart();
+			bone.tslSkelSpaceInv = MAi.getTranslationPart();
+
+			// parent
+			token = &scanner.getNextToken();
+			if((token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT) &&
+				 (token->getCode() != Scanner::TC_IDENTIFIER || strcmp(token->getValue().getString(), "NULL") != 0))
+			{
+				PARSE_ERR_EXPECTED("integer or NULL");
+				return false;
+			}
+
+			if(token->getCode() == Scanner::TC_IDENTIFIER)
+				bone.parent = NULL;
+			else
+				bone.parent = &bones[token->getValue().getInt()];
+
+			// childs
 			token = &scanner.getNextToken();
 			if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
 			{
 				PARSE_ERR_EXPECTED("integer");
 				return false;
 			}
-			bone.childs[j] = &bones[token->getValue().getInt()];
-		}
-	} // for all bones
+			if(token->getValue().getInt() > Bone::MAX_CHILDS_PER_BONE)
+			{
+				ERROR("Childs for bone \"" << bone.getName() << "\" exceed the max");
+				return false;
+			}
+			bone.childsNum = token->getValue().getInt();
+			for(int j=0; j<bone.childsNum; j++)
+			{
+				token = &scanner.getNextToken();
+				if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
+				{
+					PARSE_ERR_EXPECTED("integer");
+					return false;
+				}
+				bone.childs[j] = &bones[token->getValue().getInt()];
+			}
+		} // for all bones
+	}
+	catch(Exception& e)
+	{
+		ERROR(e.what());
+		return false;
+	}
 
 	return true;
 }

+ 22 - 0
src/Resources/Texture.cpp

@@ -299,3 +299,25 @@ void Texture::genMipmap()
 	bind(LAST_TEX_UNIT);
 	glGenerateMipmap(target);
 }
+
+
+//======================================================================================================================
+// setFiltering                                                                                                        =
+//======================================================================================================================
+void Texture::setFiltering(TextureFilteringType filterType)
+{
+	switch(filterType)
+	{
+		case TFT_NEAREST:
+			glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+			glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+			break;
+		case TFT_LINEAR:
+			glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+			glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+			break;
+		case TFT_TRILINEAR:
+			glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+			glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+	}
+}

+ 49 - 43
src/Scene/SkelModelNode.cpp

@@ -7,59 +7,65 @@
 /// Create a skelNode and N meshNodes that have a meshSkelCtrl
 void SkelModelNode::init(const char* filename)
 {
-	Scanner scanner;
-	if(!scanner.loadFile(filename)) return;
-	const Scanner::Token* token;
-
-
-	//** SKELETON **
-	token = &scanner.getNextToken();
-	if(!(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "SKELETON")))
-	{
-		PARSE_ERR_EXPECTED("identifier SKELETON");
-		return;
-	}
-	
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_STRING)
+	try
 	{
-		PARSE_ERR_EXPECTED("string");
-		return;
-	}
+		Scanner scanner(filename);
+		const Scanner::Token* token;
 	
-	skelNode = new SkelNode;
-	skelNode->init(token->getValue().getString());
-	addChild(skelNode);
 	
-	//** MESHES **
-	token = &scanner.getNextToken();
-	if(!(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "MESHES_NUM")))
-	{
-		PARSE_ERR_EXPECTED("identifier MESHES_NUM");
-		return;
-	}
+		//** SKELETON **
+		token = &scanner.getNextToken();
+		if(!(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "SKELETON")))
+		{
+			PARSE_ERR_EXPECTED("identifier SKELETON");
+			return;
+		}
 		
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
-	{
-		PARSE_ERR_EXPECTED("integer");
-		return;
-	}
-			
-	meshNodes.resize(token->getValue().getInt());
-			
-	for(uint i=0; i<meshNodes.size(); ++i)
-	{
 		token = &scanner.getNextToken();
 		if(token->getCode() != Scanner::TC_STRING)
 		{
 			PARSE_ERR_EXPECTED("string");
 			return;
 		}
+
+		skelNode = new SkelNode;
+		skelNode->init(token->getValue().getString());
+		addChild(skelNode);
+
+		//** MESHES **
+		token = &scanner.getNextToken();
+		if(!(token->getCode() == Scanner::TC_IDENTIFIER && !strcmp(token->getValue().getString(), "MESHES_NUM")))
+		{
+			PARSE_ERR_EXPECTED("identifier MESHES_NUM");
+			return;
+		}
+
+		token = &scanner.getNextToken();
+		if(token->getCode() != Scanner::TC_NUMBER || token->getDataType() != Scanner::DT_INT)
+		{
+			PARSE_ERR_EXPECTED("integer");
+			return;
+		}
 				
-		meshNodes[i] = new MeshNode;
-		meshNodes[i]->init(token->getValue().getString());
-		skelNode->addChild(meshNodes[i]);
-		meshNodes[i]->meshSkelCtrl = new MeshSkelNodeCtrl(skelNode, meshNodes[i]);
+		meshNodes.resize(token->getValue().getInt());
+
+		for(uint i=0; i<meshNodes.size(); ++i)
+		{
+			token = &scanner.getNextToken();
+			if(token->getCode() != Scanner::TC_STRING)
+			{
+				PARSE_ERR_EXPECTED("string");
+				return;
+			}
+
+			meshNodes[i] = new MeshNode;
+			meshNodes[i]->init(token->getValue().getString());
+			skelNode->addChild(meshNodes[i]);
+			meshNodes[i]->meshSkelCtrl = new MeshSkelNodeCtrl(skelNode, meshNodes[i]);
+		}
+	}
+	catch(Exception& e)
+	{
+		ERROR(e.what());
 	}
 }

+ 8 - 7
src/Util/Exception.h

@@ -9,25 +9,26 @@
 class Exception: public std::exception
 {
 	public:
-		Exception(const char* err_, const char* file, int line, const char* func);
+		Exception(const char* err_, const char* file, int line, const char* func) {init(err_, file, line, func);}
+		Exception(const std::string& err_, const char* file, int line, const char* func);
 		~Exception() throw() {}
 		const char* what() const throw() {return err.c_str();}
 
 	private:
 		std::string err;
+
+		/// Common construction code
+		void init(const char* err_, const char* file, int line, const char* func);
 };
 
 
-inline Exception::Exception(const char* err_, const char* file, int line, const char* func)
+inline Exception::Exception(const std::string& err_, const char* file, int line, const char* func)
 {
-	using namespace std;
-	stringstream ss;
-	ss << "Exception (" << file << ":" << line << " " << func << "): " << err_;
-	err = ss.str();
+	init(err_.c_str(), file, line, func);
 }
 
 
-#define THROW_EXCEPTION(x) throw Exception((x), __FILE__, __LINE__, __func__)
+#define THROW_EXCEPTION(x) throw Exception(std::string() + x, __FILE__, __LINE__, __func__)
 
 #if DEBUG_ENABLED == 1
 	#define RASSERT_THROW_EXCEPTION(x) \

+ 54 - 55
src/Util/Tokenizer/Scanner.cpp → src/Util/Scanner.cpp

@@ -5,9 +5,16 @@
 #include <sstream>
 #include <iomanip>
 #include "Scanner.h"
+#include "Exception.h"
+#include <boost/lexical_cast.hpp>
 
 
-#define SERROR(x) ERROR("Scanning Error (" << scriptName << ':' << lineNmbr << "): " << x)
+using namespace std;
+using namespace boost;
+
+
+#define SCANNER_THROW_EXCEPTION(x) \
+	THROW_EXCEPTION(string("Scanner failed (") + scriptName + ':' + lexical_cast<string>(lineNmbr) + "): " + x)
 
 
 //======================================================================================================================
@@ -167,18 +174,21 @@ void Scanner::initAsciiMap()
 
 
 //======================================================================================================================
-// Constructor                                                                                                         =
+// init                                                                                                                =
 //======================================================================================================================
-Scanner::Scanner(bool newlinesAsWhitespace_):
-	newlinesAsWhitespace(newlinesAsWhitespace_), commentedLines(0), inStream(NULL)
+void Scanner::init(bool newlinesAsWhitespace_)
 {
+	newlinesAsWhitespace = newlinesAsWhitespace_;
+	commentedLines = 0;
+	inStream = NULL;
+
 	if(asciiLookupTable['a'] != AC_LETTER)
 	{
 		initAsciiMap();
 	}
 
 	lineNmbr = 0;
-	memset(line, eofChar, sizeof(char)*MAX_SCRIPT_LINE_LEN);
+	memset(line, eofChar, sizeof(char) * MAX_SCRIPT_LINE_LEN);
 }
 
 
@@ -197,7 +207,7 @@ void Scanner::getLine()
 		++lineNmbr;
 	}
 
-	DEBUG_ERR(inStream->gcount() > MAX_SCRIPT_LINE_LEN - 10); // too big line
+	RASSERT_THROW_EXCEPTION(inStream->gcount() > MAX_SCRIPT_LINE_LEN - 10); // too big line
 }
 
 
@@ -221,7 +231,7 @@ char Scanner::getNextChar()
 	}
 	else if(lookupAscii(*pchar) == AC_ERROR)
 	{
-		SERROR("Unacceptable char '" << *pchar << "' 0x" << uint(*pchar));
+		SCANNER_THROW_EXCEPTION("Unacceptable char '" + *pchar + "' 0x" + lexical_cast<string>(static_cast<uint>(*pchar)));
 	}
 
 	return *pchar;
@@ -234,7 +244,9 @@ char Scanner::getNextChar()
 char Scanner::putBackChar()
 {
 	if(pchar != line && *pchar != eofChar)
+	{
 		--pchar;
+	}
 
 	return *pchar;
 }
@@ -256,41 +268,37 @@ void Scanner::getAllPrintAll()
 //======================================================================================================================
 // loadFile                                                                                                            =
 //======================================================================================================================
-bool Scanner::loadFile(const char* filename_)
+void Scanner::loadFile(const char* filename_)
 {	
 	inFstream.open(filename_);
 	if(!inFstream.good())
 	{
-		ERROR("Cannot open file \"" << filename_ << '\"');
-		return false;
+		THROW_EXCEPTION("Cannot open file \"" + filename_ + '\"');
 	}
 	
-	return loadIstream(inFstream, filename_);
+	loadIstream(inFstream, filename_);
 }
 
 
 //======================================================================================================================
 // loadIstream                                                                                                        =
 //======================================================================================================================
-bool Scanner::loadIstream(istream& istream_, const char* scriptName_)
+void Scanner::loadIstream(istream& istream_, const char* scriptName_)
 {
 	if(inStream != NULL)
 	{
-		ERROR("Tokenizer already initialized");
-		return false;
+		THROW_EXCEPTION("Tokenizer already initialized");
 	}
 
 	inStream = &istream_;
 
 	// init globals
-	DEBUG_ERR(strlen(scriptName_) > sizeof(scriptName)/sizeof(char) - 1); // Too big name
+	RASSERT_THROW_EXCEPTION(strlen(scriptName_) > sizeof(scriptName)/sizeof(char) - 1); // Too big name
 	crntToken.code = TC_ERROR;
 	lineNmbr = 0;
 	strcpy(scriptName, scriptName_);
 
-
 	getLine();
-	return true;
 }
 
 
@@ -388,7 +396,7 @@ const Scanner::Token& Scanner::getNextToken()
 				break;
 			case AC_ERROR:
 			default:
-				SERROR("Unexpected character \'" << *pchar << '\'');
+				SCANNER_THROW_EXCEPTION("Unexpected character \'" + *pchar + '\'');
 				getNextChar();
 				goto start;
 		}
@@ -411,7 +419,7 @@ const Scanner::Token& Scanner::getNextToken()
 //======================================================================================================================
 // checkWord                                                                                                           =
 //======================================================================================================================
-bool Scanner::checkWord()
+void Scanner::checkWord()
 {
 	char* tmpStr = crntToken.asString;
 	char ch = *pchar;
@@ -449,15 +457,13 @@ bool Scanner::checkWord()
 			++x;
 		}
 	}
-
-	return true;
 }
 
 
 //======================================================================================================================
 // checkComment                                                                                                        =
 //======================================================================================================================
-bool Scanner::checkComment()
+void Scanner::checkComment()
 {
 	// Beginning
 	if(getNextChar()=='*')
@@ -473,7 +479,7 @@ bool Scanner::checkComment()
 			if(ch == '\0')
 			{
 				crntToken.code = TC_COMMENT;
-				return true;
+				return;
 			}
 			else if(ch == '\\')
 			{
@@ -510,7 +516,7 @@ bool Scanner::checkComment()
 		{
 			crntToken.code = TC_COMMENT;
 			getNextChar();
-			return true;
+			return;
 		}
 		else
 		{
@@ -520,19 +526,18 @@ bool Scanner::checkComment()
 	//error
 	error:
 		crntToken.code = TC_ERROR;
-		SERROR("Incorrect comment ending");
-		return false;
+		SCANNER_THROW_EXCEPTION("Incorrect comment ending");
 }
 
 
 //======================================================================================================================
 // checkNumber                                                                                                         =
 //======================================================================================================================
-bool Scanner::checkNumber()
+void Scanner::checkNumber()
 {
 	// This func is working great, dont try to understand it and dont even think to try touching it.
 
-	//DEBUG_ERR(sizeof(long) != 8); // ulong must be 64bit
+	//RASSERT_THROW_EXCEPTION(sizeof(long) != 8); // ulong must be 64bit
 	long num = 0;     // value of the number & part of the float num before '.'
 	long fnum = 0;    // part of the float num after '.'
 	long dad = 0;     // digits after dot (for floats)
@@ -812,7 +817,7 @@ bool Scanner::checkNumber()
 			crntToken.value.float_ = dbl;
 		}
 		*tmpStr = '\0';
-		return true;
+		return;
 
 	//error
 	error:
@@ -827,16 +832,14 @@ bool Scanner::checkNumber()
 		}
 
 		*tmpStr = '\0';
-		SERROR("Bad number suffix \"" << crntToken.asString << '\"');
-
-	return false;
+		SCANNER_THROW_EXCEPTION("Bad number suffix \"" + crntToken.asString + '\"');
 }
 
 
 //======================================================================================================================
 // checkString                                                                                                         =
 //======================================================================================================================
-bool Scanner::checkString()
+void Scanner::checkString()
 {
 	char* tmpStr = crntToken.asString;
 	char ch = getNextChar();
@@ -848,8 +851,8 @@ bool Scanner::checkString()
 		{
 			crntToken.code = TC_ERROR;
 			*tmpStr = '\0';
-			SERROR("Incorrect string ending \"" << crntToken.asString << '\"');
-			return false;
+			SCANNER_THROW_EXCEPTION("Incorrect string ending \"" + crntToken.asString + '\"');
+			return;
 		}
 		// Escape Codes
 		else if(ch == '\\')
@@ -859,8 +862,8 @@ bool Scanner::checkString()
 			{
 				crntToken.code = TC_ERROR;
 				*tmpStr = '\0';
-				SERROR("Incorrect string ending \"" << crntToken.asString << '\"');
-				return false;
+				SCANNER_THROW_EXCEPTION("Incorrect string ending \"" + crntToken.asString + '\"');
+				return;
 			}
 
 			switch(ch)
@@ -898,7 +901,7 @@ bool Scanner::checkString()
 				case '\0':
 					break; // not an escape char but works almost the same
 				default:
-					SERROR("Unrecognized escape character \'\\" << ch << '\'');
+					SCANNER_THROW_EXCEPTION("Unrecognized escape character \'\\" + ch + '\'');
 					*tmpStr++ = ch;
 			}
 		}
@@ -909,7 +912,7 @@ bool Scanner::checkString()
 			crntToken.code = TC_STRING;
 			crntToken.value.string = crntToken.asString;
 			getNextChar();
-			return true;
+			return;
 		}
 		// Build str(main loop)
 		else
@@ -919,15 +922,13 @@ bool Scanner::checkString()
 
 		ch = getNextChar();
 	}
-
-	return false;
 }
 
 
 //======================================================================================================================
 // checkChar                                                                                                           =
 //======================================================================================================================
-bool Scanner::checkChar()
+void Scanner::checkChar()
 {
 	char ch = getNextChar();
 	char ch0 = ch;
@@ -938,15 +939,15 @@ bool Scanner::checkChar()
 
 	if(ch=='\0' || ch==eofChar) // check char after '
 	{
-		SERROR("Newline in constant");
-		return false;
+		SCANNER_THROW_EXCEPTION("Newline in constant");
+		return;
 	}
 
 	if (ch=='\'') // if '
 	{
-		SERROR("Empty constant");
+		SCANNER_THROW_EXCEPTION("Empty constant");
 		getNextChar();
-		return false;
+		return;
 	}
 
 	if (ch=='\\')                // if \ then maybe escape char
@@ -955,8 +956,8 @@ bool Scanner::checkChar()
 		*tmpStr++ = ch;
 		if(ch=='\0' || ch==eofChar) //check again after the \.
 		{
-			SERROR("Newline in constant");
-			return false;
+			SCANNER_THROW_EXCEPTION("Newline in constant");
+			return;
 		}
 
 		switch (ch)
@@ -993,7 +994,7 @@ bool Scanner::checkChar()
 				break;
 			default:
 				ch0 = ch;
-				SERROR("Unrecognized escape character \'\\" << ch << '\'');
+				SCANNER_THROW_EXCEPTION("Unrecognized escape character \'\\" + ch + '\'');
 		}
 		crntToken.value.char_ = ch0;
 	}
@@ -1008,18 +1009,18 @@ bool Scanner::checkChar()
 		*tmpStr = '\0';
 		crntToken.code = TC_CHAR;
 		getNextChar();
-		return true;
+		return;
 	}
 
-	SERROR("Expected \'");
-	return false;
+	SCANNER_THROW_EXCEPTION("Expected \'");
+	return;
 }
 
 
 //======================================================================================================================
 // checkSpecial                                                                                                        =
 //======================================================================================================================
-bool Scanner::checkSpecial()
+void Scanner::checkSpecial()
 {
 	char ch = *pchar;
 	TokenCode code = TC_ERROR;
@@ -1283,6 +1284,4 @@ bool Scanner::checkSpecial()
 
 	getNextChar();
 	crntToken.code = code;
-
-	return true;
 }

+ 90 - 127
src/Util/Tokenizer/Scanner.h → src/Util/Scanner.h

@@ -1,17 +1,14 @@
 #ifndef SCANNER_H
 #define SCANNER_H
 
-#include <sstream>
 #include <fstream>
-#include "Common.h"
+#include "StdTypes.h"
 
 
-/**
- * C++ Tokenizer
- *
- * The Scanner loads a file or an already loaded iostream and extracts the tokens. The script must be in C++ format. The
- * class does not make any kind of memory allocations so it can be fast.
- */
+/// C++ Tokenizer
+///
+/// The Scanner loads a file or an already loaded iostream and extracts the tokens. The script must be in C++ format.
+/// The class does not make any kind of memory allocations so it can be fast.
 class Scanner
 {
 	//====================================================================================================================
@@ -24,9 +21,7 @@ class Scanner
 	// Nested                                                                                                            =
 	//====================================================================================================================
 	public:
-		/**
-		 * The TokenCode is an enum that defines the Token type
-		 */
+		/// The TokenCode is an enum that defines the Token type
 		enum TokenCode
 		{
 			// general codes
@@ -54,9 +49,7 @@ class Scanner
 		}; // end enum TokenCode
 
 
-		/**
-		 * The value of @ref Token::dataType
-		 */
+		/// The value of @ref Token::dataType
 		enum TokenDataType
 		{
 			DT_FLOAT,
@@ -65,18 +58,14 @@ class Scanner
 			DT_STR
 		};
 
-		/**
-		 * Used inside the @ref Token, its a variant that holds the data of the Token
-		 */
+		/// Used inside the @ref Token, its a variant that holds the data of the Token
 		class TokenDataVal
 		{
 			friend class Scanner;
 			friend class Token;
 
 			private:
-				/**
-				 * The data as unamed union
-				 */
+				/// The data as unamed union
 				union
 				{
 					char   char_;
@@ -86,21 +75,17 @@ class Scanner
 				};
 
 			public:
-				/**
-				 * @name Accessors
-				 */
-				/**@{*/
+				/// @name Accessors
+				/// @{
 				char getChar() const {return char_;} ///< Access the data as C char
 				ulong getInt() const {return int_;} ///< Access the data as unsigned int
 				double getFloat() const {return float_;} ///< Access the data as double
 				const char* getString() const {return string;} ///< Access the data as C string
-				/**@}*/
+				/// @}
 		}; // end class TokenDataVal
 
 
-		/**
-		 * The Token class
-		 */
+		/// The Token class
 		struct Token
 		{
 			friend class Scanner;
@@ -112,7 +97,7 @@ class Scanner
 				TokenCode getCode() const {return code;}
 				TokenDataType getDataType() const {return dataType;}
 				const TokenDataVal& getValue() const {return value;}
-				string getInfoStr() const; ///< Get a string with the info of the token
+				std::string getInfoStr() const; ///< Get a string with the info of the token
 				void print() const; ///< Print info of the token
 
 			private:
@@ -124,9 +109,7 @@ class Scanner
 
 
 	protected:
-		/**
-		 * Every char in the Ascii table is binded with one characteristic code type. This helps the scanning
-		 */
+		/// Every char in the Ascii table is binded with one characteristic code type. This helps the scanning
 		enum AsciiFlag
 		{
 			AC_ERROR = 0,
@@ -140,9 +123,7 @@ class Scanner
 			AC_ACCEPTABLE_IN_COMMENTS = 128 ///< Only accepted in comments
 		};
 
-		/**
-		 * Reserved words like "int" "const" etc. Currently the reserved words list is being populated with dummy data
-		 */
+		/// Reserved words like "int" "const" etc. Currently the reserved words list is being populated with dummy data
 		struct ResWord
 		{
 			const char* string;
@@ -153,53 +134,32 @@ class Scanner
 	// Public                                                                                                            =
 	//====================================================================================================================
 	public:
-		/**
-		 * The one and only constructor
-		 * @param newlinesAsWhitespace If false the Scanner will return a newline @ref Token every time if finds a newline.
-		 * True is the default behavior
-		 */
-		Scanner(bool newlinesAsWhitespace = true);
-
-		~Scanner() { /* The destructor does NOTHING. The class does not make any mem allocations */ }
-
-		bool loadFile(const char* filename); ///< Load a file to extract tokens
-
-		/**
-		 * Load a STL istream to extract tokens
-		 * @param istream_ The stream from where to read
-		 * @param scriptName_ The name of the stream. For error reporting
-		 * @return True on success
-		 */
-		bool loadIstream(istream& istream_, const char* scriptName_ = "unamed-istream");
-
-		/**
-		 * Unloads the file
-		 */
-		void unload();
+		/// @param newlinesAsWhitespace @see newlinesAsWhitespace
+		Scanner(bool newlinesAsWhitespace = true) {init(newlinesAsWhitespace);}
+
+		/// @see loadFile
+		/// @param newlinesAsWhitespace @see newlinesAsWhitespace
+		Scanner(const char* filename, bool newlinesAsWhitespace = true);
+
+		/// @see loadIstream
+		/// @param newlinesAsWhitespace @see newlinesAsWhitespace
+		Scanner(std::istream& istream_, const char* scriptName_ = "unamed-istream", bool newlinesAsWhitespace = true);
+
+		~Scanner() {void unload();}
 
-		/**
-		 * Extracts all tokens and prints them. Used for debugging
-		 */
+		/// Extracts all tokens and prints them. Used for debugging
 		void getAllPrintAll();
 
-		/**
-		 * Get the next token from the stream
-		 */
+		/// Get the next token from the stream
 		const Token& getNextToken();
 
-		/**
-		 * Accessor for the current token
-		 */
+		/// Accessor for the current token
 		const Token& getCrntToken() const {return crntToken;}
 
-		/**
-		 * Get the name of the input stream
-		 */
+		/// Get the name of the input stream
 		const char* getScriptName() const {return scriptName;}
 
-		/**
-		 * Get the current line the Scanner is processing
-		 */
+		/// Get the current line the Scanner is processing
 		int getLineNumber() const {return lineNmbr;}
 
 
@@ -211,13 +171,11 @@ class Scanner
 
 		static AsciiFlag asciiLookupTable[]; ///< The array contains one AsciiFlag for every symbol of the ASCII table
 
-		/**
-		 * @name Reserved words
-		 * Groups of ResWord grouped by the length of the ResWord::string
-		 */
-		/**@{*/
+		/// @name Reserved words
+		/// Groups of ResWord grouped by the length of the ResWord::string
+		/// @{
 		static ResWord rw2[], rw3[], rw4[], rw5[], rw6[], rw7[];
-		/**@}*/
+		/// @}
 
 		static ResWord* rwTable[]; ///< The array contains all the groups of ResWord
 
@@ -226,71 +184,76 @@ class Scanner
 		char* pchar; ///< Points somewhere to @ref line
 		int   lineNmbr; ///< The number of the current line
 
-		/**
-		 * Treat newlines as whitespace. If false means that the Scanner returns (among others) newline tokens
-		 */
+		/// Treat newlines as whitespace. If false means that the Scanner returns (among others) newline tokens
 		bool newlinesAsWhitespace;
 
-		/**
-		 * Commented lines number
-		 *
-		 * Used to keep track of the newlines in multiline comments so we can then return the correct number of newlines in
-		 * case of newlinesAsWhitespace is false
-		 */
+		/// Commented lines number
+		/// Used to keep track of the newlines in multiline comments so we can then return the correct number of newlines in
+		/// case of newlinesAsWhitespace is false
 		int commentedLines;
 
-		/**
-		 * @name Input
-		 */
-		/**@{*/
-		ifstream inFstream; ///< The file stream. Used if the @ref Scanner is initiated using @ref loadFile
-		istream* inStream; ///< Points to either @ref inFstream or an external std::istream
+		/// @name Input
+		/// @{
+		std::ifstream inFstream; ///< The file stream. Used if the @ref Scanner is initiated using @ref loadFile
+		std::istream* inStream; ///< Points to either @ref inFstream or an external std::istream
 		char scriptName[512]; ///< The name of the input stream. Mainly used for error messaging
-		/**@}*/
-
-		/**
-		 * @name Checkers
-		 */
-		/**@{*/
-		bool checkWord();
-		bool checkComment();
-		bool checkNumber();
-		bool checkString();
-		bool checkChar();
-		bool checkSpecial();
-		/**@}*/
-
-		/**
-		 * It reads a new line from the iostream and it points @ref pchar to the beginning of that line
-		 */
+		/// @}
+
+		/// @name Checkers
+		/// @{
+		void checkWord();
+		void checkComment();
+		void checkNumber();
+		void checkString();
+		void checkChar();
+		void checkSpecial();
+		/// @}
+
+		/// It reads a new line from the iostream and it points @ref pchar to the beginning of that line
 		void getLine();
 
-		/**
-		 * Get the next char from the @ref line. If @ref line empty then get new line. It returns '\\0' if we are in the
-		 * end of the line
-		 */
+		/// Get the next char from the @ref line. If @ref line empty then get new line. It returns '\\0' if we are in the
+		/// end of the line
 		char getNextChar();
 
-		/**
-		 * Put the char that Scanner::GetNextChar got back to the current line
-		 */
+		/// Put the char that Scanner::GetNextChar got back to the current line
 		char putBackChar();
 
-		/**
-		 * Initializes the asciiLookupTable. It runs only once in the construction of the first Scanner @see Scanner()
-		 */
+		/// Initializes the asciiLookupTable. It runs only once in the construction of the first Scanner @see Scanner()
 		static void initAsciiMap();
 
-		/**
-		 * To save us from typing for example asciiLookupTable[(int)'a']
-		 */
-		AsciiFlag lookupAscii(char ch_);
+		/// To save us from typing
+		AsciiFlag lookupAscii(char ch_) {return asciiLookupTable[(int)ch_];}
+
+		/// Common initialization code
+		void init(bool newlinesAsWhitespace_);
+
+		/// Load a file to extract tokens
+		/// @param filename The filename of the file to read
+		void loadFile(const char* filename);
+
+		/// Load a STL istream to extract tokens
+		/// @param istream_ The stream from where to read
+		/// @param scriptName_ The name of the stream. For error reporting
+		void loadIstream(std::istream& istream_, const char* scriptName_);
+
+		/// Unloads the file
+		void unload();
 }; // end class Scanner
 
 
-inline Scanner::AsciiFlag Scanner::lookupAscii(char ch_)
+inline Scanner::Scanner(const char* filename, bool newlinesAsWhitespace)
 {
-	return asciiLookupTable[(int)ch_];
+	init(newlinesAsWhitespace);
+	loadFile(filename);
 }
 
+
+inline Scanner::Scanner(std::istream& istream_, const char* scriptName_, bool newlinesAsWhitespace)
+{
+	init(newlinesAsWhitespace);
+	loadIstream(istream_, scriptName_);
+}
+
+
 #endif

+ 0 - 98
src/Util/Tokenizer/Parser.inl.h

@@ -1,98 +0,0 @@
-#include "Parser.h"
-
-namespace Parser {
-
-
-//======================================================================================================================
-// parseNumber                                                                                                         =
-//======================================================================================================================
-template <typename Type>
-bool parseNumber(Scanner& scanner, bool sign, Type& out)
-{
-	const Scanner::Token* token = &scanner.getNextToken();
-	bool negative = false;
-
-	// check the sign if any
-	if(sign)
-	{
-		if(token->getCode() == Scanner::TC_PLUS)
-		{
-			negative = false;
-			token = &scanner.getNextToken();
-		}
-		else if(token->getCode() == Scanner::TC_MINUS)
-		{
-			negative = true;
-			token = &scanner.getNextToken();
-		}
-		else if(token->getCode() != Scanner::TC_NUMBER)
-		{
-			PARSE_ERR_EXPECTED("number or sign");
-			return false;
-		}
-	}
-
-	// check the number
-	if(token->getCode() != Scanner::TC_NUMBER)
-	{
-		PARSE_ERR_EXPECTED("number");
-		return false;
-	}
-
-	if(token->getDataType() == Scanner::DT_FLOAT)
-	{
-		double d = negative ? -token->getValue().getFloat() : token->getValue().getFloat();
-		out = static_cast<Type>(d);
-	}
-	else
-	{
-		ulong l = negative ? -token->getValue().getInt() : token->getValue().getInt();
-		out = static_cast<Type>(l);
-	}
-
-	return true;
-}
-
-
-//======================================================================================================================
-// parseMathVector                                                                                                     =
-//======================================================================================================================
-template <typename Type>
-bool parseMathVector(Scanner& scanner, Type& out)
-{
-	const Scanner::Token* token = &scanner.getNextToken();
-	uint elementsNum = sizeof(Type) / sizeof(float);
-
-	// {
-	if(token->getCode() != Scanner::TC_LBRACKET)
-	{
-		PARSE_ERR_EXPECTED("{");
-		return false;
-	}
-
-	// numbers
-	for(uint i=0; i<elementsNum; i++)
-	{
-		double d;
-		if(!parseNumber(scanner, true, d))
-		{
-			return false;
-		}
-		out[i] = d;
-	}
-
-
-	// }
-	token = &scanner.getNextToken();
-	if(token->getCode() != Scanner::TC_RBRACKET)
-	{
-		PARSE_ERR_EXPECTED("}");
-		return false;
-	}
-
-	return true;
-}
-
-
-
-} // End namespace Parser

+ 7 - 4
src/Util/Util.cpp

@@ -3,10 +3,15 @@
 #include <cstring>
 #include <fstream>
 #include "Util.h"
+#include "Exception.h"
+
+
+using namespace std;
 
 
 namespace Util {
 
+
 //======================================================================================================================
 // randRange                                                                                                           =
 //======================================================================================================================
@@ -41,8 +46,7 @@ string readFile(const char* filename)
 	ifstream file(filename);
 	if (!file.is_open())
 	{
-		ERROR("Cannot open file \"" << filename << "\"");
-		return string();
+		THROW_EXCEPTION(string("Cannot open file \"") + filename + "\"");
 	}
 
 	return string((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
@@ -58,8 +62,7 @@ Vec<string> getFileLines(const char* filename)
 	ifstream ifs(filename);
 	if(!ifs.is_open())
 	{
-		ERROR("Cannot open file \"" << filename << "\"");
-		return lines;
+		THROW_EXCEPTION(string("Cannot open file \"") + filename + "\"");
 	}
 
   string temp;

+ 9 - 8
src/Util/Util.h

@@ -1,20 +1,21 @@
-#ifndef _UTIL_H_
-#define _UTIL_H_
+#ifndef UTIL_H
+#define UTIL_H
 
-#include "Common.h"
+#include <string>
 #include "Vec.h"
 
+
 /// The namespace contains a few useful functions
 namespace Util {
 
-extern int    randRange(int min, int max); ///< Pick a random number from min to max
-extern uint   randRange(uint min, uint max); ///< Pick a random number from min to max
-extern float  randRange(float min, float max); ///< Pick a random number from min to max
+extern int randRange(int min, int max); ///< Pick a random number from min to max
+extern uint randRange(uint min, uint max); ///< Pick a random number from min to max
+extern float randRange(float min, float max); ///< Pick a random number from min to max
 extern double randRange(double min, double max); ///< Pick a random number from min to max
 extern float randFloat(float max);
 
-extern string      readFile(const char* filename); ///< Open a text file and return its contents into a string
-extern Vec<string> getFileLines(const char* filename); ///< Open a text file and return its lines into a string vector
+extern std::string readFile(const char* filename); ///< Open a text file and return its contents into a string
+extern Vec<std::string> getFileLines(const char* filename); ///< Open a text file and return its lines into a string vector
 
 }
 

Some files were not shown because too many files changed in this diff