(svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script. noai
authorrubidium
Sun, 25 Mar 2007 17:43:40 +0000
branchnoai
changeset 9532 539c48d64eea
parent 9531 6a2e35738593
child 9533 2c692ffdf5e4
(svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
src/ai/api/ai_accounting.hpp
src/ai/api/ai_base.hpp
src/ai/api/ai_cargo.hpp
src/ai/api/ai_company.hpp
src/ai/api/ai_execmode.hpp
src/ai/api/ai_industry.hpp
src/ai/api/ai_map.hpp
src/ai/api/ai_order.hpp
src/ai/api/ai_road.hpp
src/ai/api/ai_settings.hpp
src/ai/api/ai_sign.hpp
src/ai/api/ai_testmode.hpp
src/ai/api/ai_town.hpp
src/ai/api/ai_transactionmode.hpp
src/ai/api/ai_vehicle.hpp
src/ai/api/squirrel_export.awk
src/squirrel_helper.hpp
--- a/src/ai/api/ai_accounting.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_accounting.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -62,6 +62,8 @@
 	SQAIAccounting.PreRegister(engine);
 	SQAIAccounting.AddConstructor(engine);
 
+	SQAIAccounting.DefSQStaticMethod(engine, &AIAccounting::GetClassName, "GetClassName");
+
 	SQAIAccounting.DefSQMethod(engine, &AIAccounting::GetCosts,   "GetCosts");
 	SQAIAccounting.DefSQMethod(engine, &AIAccounting::ResetCosts, "ResetCosts");
 
--- a/src/ai/api/ai_base.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_base.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -57,6 +57,8 @@
 	SQAIBase.PreRegister(engine);
 	SQAIBase.AddConstructor(engine);
 
+	SQAIBase.DefSQStaticMethod(engine, &AIBase::GetClassName, "GetClassName");
+
 	SQAIBase.DefSQMethod(engine, &AIBase::Rand,      "Rand");
 	SQAIBase.DefSQMethod(engine, &AIBase::RandRange, "RandRange");
 	SQAIBase.DefSQMethod(engine, &AIBase::Chance,    "Chance");
--- a/src/ai/api/ai_cargo.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_cargo.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -61,7 +61,9 @@
 	SQAICargo.PreRegister(engine);
 	SQAICargo.AddConstructor(engine);
 
-	SQAICargo.DefSQMethod(engine, &AICargo::IsValidCargo,   "IsValidCargo");
+	SQAICargo.DefSQStaticMethod(engine, &AICargo::GetClassName, "GetClassName");
+	SQAICargo.DefSQStaticMethod(engine, &AICargo::IsValidCargo, "IsValidCargo");
+
 	SQAICargo.DefSQMethod(engine, &AICargo::GetCargoLabel,  "GetCargoLabel");
 	SQAICargo.DefSQMethod(engine, &AICargo::IsFreight,      "IsFreight");
 	SQAICargo.DefSQMethod(engine, &AICargo::GetCargoIncome, "GetCargoIncome");
--- a/src/ai/api/ai_company.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_company.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -90,6 +90,8 @@
 	SQAICompany.PreRegister(engine);
 	SQAICompany.AddConstructor(engine);
 
+	SQAICompany.DefSQStaticMethod(engine, &AICompany::GetClassName, "GetClassName");
+
 	SQAICompany.DefSQMethod(engine, &AICompany::SetCompanyName,   "SetCompanyName");
 	SQAICompany.DefSQMethod(engine, &AICompany::GetCompanyName,   "GetCompanyName");
 	SQAICompany.DefSQMethod(engine, &AICompany::GetCompanyValue,  "GetCompanyValue");
--- a/src/ai/api/ai_execmode.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_execmode.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -56,6 +56,7 @@
 	SQAIExecMode.PreRegister(engine);
 	SQAIExecMode.AddConstructor(engine);
 
+	SQAIExecMode.DefSQStaticMethod(engine, &AIExecMode::GetClassName, "GetClassName");
 
 	SQAIExecMode.PostRegister(engine);
 }
--- a/src/ai/api/ai_industry.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_industry.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -70,9 +70,11 @@
 	SQAIIndustry.PreRegister(engine);
 	SQAIIndustry.AddConstructor(engine);
 
+	SQAIIndustry.DefSQStaticMethod(engine, &AIIndustry::GetClassName,    "GetClassName");
+	SQAIIndustry.DefSQStaticMethod(engine, &AIIndustry::IsValidIndustry, "IsValidIndustry");
+
 	SQAIIndustry.DefSQMethod(engine, &AIIndustry::GetMaxIndustryID, "GetMaxIndustryID");
 	SQAIIndustry.DefSQMethod(engine, &AIIndustry::GetIndustryCount, "GetIndustryCount");
-	SQAIIndustry.DefSQMethod(engine, &AIIndustry::IsValidIndustry,  "IsValidIndustry");
 	SQAIIndustry.DefSQMethod(engine, &AIIndustry::GetName,          "GetName");
 	SQAIIndustry.DefSQMethod(engine, &AIIndustry::GetLocation,      "GetLocation");
 
--- a/src/ai/api/ai_map.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_map.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -136,6 +136,8 @@
 	SQAIMap.PreRegister(engine);
 	SQAIMap.AddConstructor(engine);
 
+	SQAIMap.DefSQStaticMethod(engine, &AIMap::GetClassName, "GetClassName");
+
 	SQAIMap.DefSQMethod(engine, &AIMap::IsValidTile,       "IsValidTile");
 	SQAIMap.DefSQMethod(engine, &AIMap::GetMapSize,        "GetMapSize");
 	SQAIMap.DefSQMethod(engine, &AIMap::GetMapSizeX,       "GetMapSizeX");
--- a/src/ai/api/ai_order.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_order.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -175,26 +175,28 @@
 	SQAIOrder.PreRegister(engine);
 	SQAIOrder.AddConstructor(engine);
 
-	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_NONE,               "AIOF_NONE");
-	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_TRANSFER,           "AIOF_TRANSFER");
-	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_UNLOAD,             "AIOF_UNLOAD");
-	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_FULL_LOAD,          "AIOF_FULL_LOAD");
-	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_SERVICE_IF_NEEDED,  "AIOF_SERVICE_IF_NEEDED");
-	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_NON_STOP,           "AIOF_NON_STOP");
-	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_INVALID,            "AIOF_INVALID");
+	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_NONE,              "AIOF_NONE");
+	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_TRANSFER,          "AIOF_TRANSFER");
+	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_UNLOAD,            "AIOF_UNLOAD");
+	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_FULL_LOAD,         "AIOF_FULL_LOAD");
+	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_SERVICE_IF_NEEDED, "AIOF_SERVICE_IF_NEEDED");
+	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_NON_STOP,          "AIOF_NON_STOP");
+	SQAIOrder.DefSQConst   (engine, AIOrder::AIOF_INVALID,           "AIOF_INVALID");
 
-	SQAIOrder.DefSQMethod(engine, &AIOrder::IsValidVehicleOrder,    "IsValidVehicleOrder");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::AreOrderFlagsValid,     "AreOrderFlagsValid");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::GetNumberOfOrders,      "GetNumberOfOrders");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::GetOrderDestination,    "GetOrderDestination");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::GetOrderFlags,          "GetOrderFlags");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::AppendOrder,            "AppendOrder");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::InsertOrder,            "InsertOrder");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::RemoveOrder,            "RemoveOrder");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::ChangeOrder,            "ChangeOrder");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::CopyOrders,             "CopyOrders");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::ShareOrders,            "ShareOrders");
-	SQAIOrder.DefSQMethod(engine, &AIOrder::UnshareOrders,          "UnshareOrders");
+	SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetClassName,        "GetClassName");
+	SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidVehicleOrder, "IsValidVehicleOrder");
+	SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AreOrderFlagsValid,  "AreOrderFlagsValid");
+
+	SQAIOrder.DefSQMethod(engine, &AIOrder::GetNumberOfOrders,   "GetNumberOfOrders");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::GetOrderDestination, "GetOrderDestination");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::GetOrderFlags,       "GetOrderFlags");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::AppendOrder,         "AppendOrder");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::InsertOrder,         "InsertOrder");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::RemoveOrder,         "RemoveOrder");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::ChangeOrder,         "ChangeOrder");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::CopyOrders,          "CopyOrders");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::ShareOrders,         "ShareOrders");
+	SQAIOrder.DefSQMethod(engine, &AIOrder::UnshareOrders,       "UnshareOrders");
 
 	SQAIOrder.PostRegister(engine);
 }
--- a/src/ai/api/ai_road.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_road.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -119,6 +119,8 @@
 	SQAIRoad.PreRegister(engine);
 	SQAIRoad.AddConstructor(engine);
 
+	SQAIRoad.DefSQStaticMethod(engine, &AIRoad::GetClassName, "GetClassName");
+
 	SQAIRoad.DefSQMethod(engine, &AIRoad::IsRoadTile,        "IsRoadTile");
 	SQAIRoad.DefSQMethod(engine, &AIRoad::BuildRoad,         "BuildRoad");
 	SQAIRoad.DefSQMethod(engine, &AIRoad::BuildRoadDepot,    "BuildRoadDepot");
--- a/src/ai/api/ai_settings.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_settings.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -41,6 +41,8 @@
 	SQAISettings.PreRegister(engine);
 	SQAISettings.AddConstructor(engine);
 
+	SQAISettings.DefSQStaticMethod(engine, &AISettings::GetClassName, "GetClassName");
+
 	SQAISettings.DefSQMethod(engine, &AISettings::SetCommandDelay, "SetCommandDelay");
 
 	SQAISettings.PostRegister(engine);
--- a/src/ai/api/ai_sign.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_sign.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -87,9 +87,11 @@
 	SQAISign.PreRegister(engine);
 	SQAISign.AddConstructor(engine);
 
+	SQAISign.DefSQStaticMethod(engine, &AISign::GetClassName, "GetClassName");
+	SQAISign.DefSQStaticMethod(engine, &AISign::IsValidSign,  "IsValidSign");
+
 	SQAISign.DefSQMethod(engine, &AISign::GetMaxSignID, "GetMaxSignID");
 	SQAISign.DefSQMethod(engine, &AISign::GetSignCount, "GetSignCount");
-	SQAISign.DefSQMethod(engine, &AISign::IsValidSign,  "IsValidSign");
 	SQAISign.DefSQMethod(engine, &AISign::GetText,      "GetText");
 	SQAISign.DefSQMethod(engine, &AISign::GetLocation,  "GetLocation");
 	SQAISign.DefSQMethod(engine, &AISign::RemoveSign,   "RemoveSign");
--- a/src/ai/api/ai_testmode.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_testmode.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -58,6 +58,7 @@
 	SQAITestMode.PreRegister(engine);
 	SQAITestMode.AddConstructor(engine);
 
+	SQAITestMode.DefSQStaticMethod(engine, &AITestMode::GetClassName, "GetClassName");
 
 	SQAITestMode.PostRegister(engine);
 }
--- a/src/ai/api/ai_town.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_town.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -78,9 +78,11 @@
 	SQAITown.PreRegister(engine);
 	SQAITown.AddConstructor(engine);
 
+	SQAITown.DefSQStaticMethod(engine, &AITown::GetClassName, "GetClassName");
+	SQAITown.DefSQStaticMethod(engine, &AITown::IsValidTown,  "IsValidTown");
+
 	SQAITown.DefSQMethod(engine, &AITown::GetMaxTownID,  "GetMaxTownID");
 	SQAITown.DefSQMethod(engine, &AITown::GetTownCount,  "GetTownCount");
-	SQAITown.DefSQMethod(engine, &AITown::IsValidTown,   "IsValidTown");
 	SQAITown.DefSQMethod(engine, &AITown::GetName,       "GetName");
 	SQAITown.DefSQMethod(engine, &AITown::GetPopulation, "GetPopulation");
 	SQAITown.DefSQMethod(engine, &AITown::GetLocation,   "GetLocation");
--- a/src/ai/api/ai_transactionmode.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_transactionmode.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -117,6 +117,8 @@
 	SQAITransactionMode.PreRegister(engine);
 	SQAITransactionMode.AddConstructor(engine);
 
+	SQAITransactionMode.DefSQStaticMethod(engine, &AITransactionMode::GetClassName, "GetClassName");
+
 	SQAITransactionMode.DefSQMethod(engine, &AITransactionMode::Execute,  "Execute");
 	SQAITransactionMode.DefSQMethod(engine, &AITransactionMode::Stop,     "Stop");
 	SQAITransactionMode.DefSQMethod(engine, &AITransactionMode::Rollback, "Rollback");
--- a/src/ai/api/ai_vehicle.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/ai_vehicle.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -130,8 +130,10 @@
 	SQAIVehicle.PreRegister(engine);
 	SQAIVehicle.AddConstructor(engine);
 
-	SQAIVehicle.DefSQMethod(engine, &AIVehicle::IsValidEngine,       "IsValidEngine");
-	SQAIVehicle.DefSQMethod(engine, &AIVehicle::IsValidVehicle,      "IsValidVehicle");
+	SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetClassName,   "GetClassName");
+	SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidEngine,  "IsValidEngine");
+	SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidVehicle, "IsValidVehicle");
+
 	SQAIVehicle.DefSQMethod(engine, &AIVehicle::FindBestRoadVehicle, "FindBestRoadVehicle");
 	SQAIVehicle.DefSQMethod(engine, &AIVehicle::BuildVehicle,        "BuildVehicle");
 	SQAIVehicle.DefSQMethod(engine, &AIVehicle::CloneVehicle,        "CloneVehicle");
--- a/src/ai/api/squirrel_export.awk	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/ai/api/squirrel_export.awk	Sun Mar 25 17:43:40 2007 +0000
@@ -18,9 +18,10 @@
 
 BEGIN {
 	enum_size = 0
+	enum_value_size = 0
 	struct_size = 0
 	method_size = 0
-	enum_value_size = 0
+	static_method_size = 0
 	cls = ""
 	start_squirrel_define_on_next_line = "false"
 	cls_level = 0
@@ -120,36 +121,53 @@
 	print "	SQ" cls ".PreRegister(engine);"
 	print "	SQ" cls ".AddConstructor(engine);"
 	print ""
+
+	# Enum values
 	mlen = 0
 	for (i = 1; i <= enum_value_size; i++) {
-		if (mlen <= length(enum_value[i])) mlen = length(enum_value[i])
+		if (mlen <= length(enum_value[i])) mlen = length(enum_value[i]) + 1
 	}
-	for (i = 1; i <= method_size; i++) {
-		if (mlen <= length(methods[i])) mlen = length(methods[i]) + 1 #one character (&) longer
-	}
-
 	for (i = 1; i <= enum_value_size; i++) {
-		print "	SQ" cls ".DefSQConst   (engine, " cls "::" enum_value[i] ", " substr(spaces, 0, mlen - length(enum_value[i]) + 1) "\""  enum_value[i] "\");"
+		print "	SQ" cls ".DefSQConst   (engine, " cls "::" enum_value[i] ", " substr(spaces, 0, mlen - length(enum_value[i])) "\""  enum_value[i] "\");"
 		delete enum_value[i]
 	}
 	if (enum_value_size != 0) print ""
 
+	# Static methods
+	mlen = 0
+	for (i = 1; i <= static_method_size; i++) {
+		if (mlen <= length(static_methods[i])) mlen = length(static_methods[i]) + 1
+	}
+	for (i = 1; i <= static_method_size; i++) {
+		print "	SQ" cls ".DefSQStaticMethod(engine, &" cls "::" static_methods[i] ", " substr(spaces, 0, mlen - length(static_methods[i])) "\""  static_methods[i] "\");"
+		delete static_methods[i]
+	}
+	if (static_method_size != 0) print ""
 
+	# Non-static methods
+	mlen = 0
 	for (i = 1; i <= method_size; i++) {
-		print "	SQ" cls ".DefSQFunction(engine, &" cls "::" methods[i] ", " substr(spaces, 0, mlen - length(methods[i])) "\""  methods[i] "\");"
+		if (mlen <= length(methods[i])) mlen = length(methods[i]) + 1
+	}
+	for (i = 1; i <= method_size; i++) {
+		print "	SQ" cls ".DefSQMethod(engine, &" cls "::" methods[i] ", " substr(spaces, 0, mlen - length(methods[i])) "\""  methods[i] "\");"
 		delete methods[i]
 	}
-	print ""
+	if (method_size != 0) print ""
+
 	print "	SQ" cls ".PostRegister(engine);"
 	print "}"
 
 	print "#endif /* DEFINE_SQUIRREL_CLASS */"
 
+	enum_size = 0
+	enum_value_size = 0
+	struct_size = 0
+	method_size = 0
+	static_method_size = 0
 	cls = ""
 	start_squirrel_define_on_next_line = "false"
-	enum_size = 0
-	struct_size = 0
-	method_size = 0
+	cls_level = 0
 }
 
 # Skip non-public functions
@@ -167,12 +185,20 @@
 # Add a method to the list
 /^.*$/ {
 	if (cls_level != 1) next
+
+	is_static = match($0, "static")
 	gsub("virtual", "", $0)
 	gsub("static", "", $0)
+	gsub("const", "", $0)
 	gsub("\*", "", $0)
 	gsub("\(.*", "", $0)
 	if ($2 == "") next
-	method_size++
-	methods[method_size] = $2
+	if (is_static) {
+		static_method_size++
+		static_methods[static_method_size] = $2
+	} else {
+		method_size++
+		methods[method_size] = $2
+	}
 	next
 }
--- a/src/squirrel_helper.hpp	Sun Mar 25 16:46:57 2007 +0000
+++ b/src/squirrel_helper.hpp	Sun Mar 25 17:43:40 2007 +0000
@@ -51,14 +51,15 @@
 	 */
 	template <typename T> static int Return(HSQUIRRELVM vm, T t);
 
-	template <> inline int Return<uint8> (HSQUIRRELVM vm, uint8 res)  { sq_pushinteger(vm, (int32)res); return 1; }
-	template <> inline int Return<uint16>(HSQUIRRELVM vm, uint16 res) { sq_pushinteger(vm, (int32)res); return 1; }
-	template <> inline int Return<uint32>(HSQUIRRELVM vm, uint32 res) { sq_pushinteger(vm, (int32)res); return 1; }
-	template <> inline int Return<int8>  (HSQUIRRELVM vm, int8 res)   { sq_pushinteger(vm, res); return 1; }
-	template <> inline int Return<int16> (HSQUIRRELVM vm, int16 res)  { sq_pushinteger(vm, res); return 1; }
-	template <> inline int Return<int32> (HSQUIRRELVM vm, int32 res)  { sq_pushinteger(vm, res); return 1; }
-	template <> inline int Return<bool>  (HSQUIRRELVM vm, bool res)   { sq_pushbool   (vm, res); return 1; }
-	template <> inline int Return<char *>(HSQUIRRELVM vm, char *res)  { if (res == NULL) sq_pushnull(vm); else sq_pushstring (vm, OTTD2FS(res), strlen(res)); free(res); return 1; }
+	template <> inline int Return<uint8>       (HSQUIRRELVM vm, uint8 res)       { sq_pushinteger(vm, (int32)res); return 1; }
+	template <> inline int Return<uint16>      (HSQUIRRELVM vm, uint16 res)      { sq_pushinteger(vm, (int32)res); return 1; }
+	template <> inline int Return<uint32>      (HSQUIRRELVM vm, uint32 res)      { sq_pushinteger(vm, (int32)res); return 1; }
+	template <> inline int Return<int8>        (HSQUIRRELVM vm, int8 res)        { sq_pushinteger(vm, res); return 1; }
+	template <> inline int Return<int16>       (HSQUIRRELVM vm, int16 res)       { sq_pushinteger(vm, res); return 1; }
+	template <> inline int Return<int32>       (HSQUIRRELVM vm, int32 res)       { sq_pushinteger(vm, res); return 1; }
+	template <> inline int Return<bool>        (HSQUIRRELVM vm, bool res)        { sq_pushbool   (vm, res); return 1; }
+	template <> inline int Return<char *>      (HSQUIRRELVM vm, char *res)       { if (res == NULL) sq_pushnull(vm); else sq_pushstring (vm, OTTD2FS(res), strlen(res)); free(res); return 1; }
+	template <> inline int Return<const char *>(HSQUIRRELVM vm, const char *res) { if (res == NULL) sq_pushnull(vm); else sq_pushstring (vm, OTTD2FS(res), strlen(res)); return 1; }
 
 	/**
 	 * To get a param from squirrel, we call this function. It converts to the right format.