Explorar el Código

Added type checking functions

added some type checking functions to TorqueScript.
Nathan Bowhay hace 10 años
padre
commit
39d5563a8c

+ 200 - 0
Engine/source/console/consoleFunctions.cpp

@@ -25,6 +25,11 @@
 #include "console/consoleInternal.h"
 #include "console/engineAPI.h"
 #include "console/ast.h"
+
+#ifndef _CONSOLFUNCTIONS_H_
+#include "console/consoleFunctions.h"
+#endif
+
 #include "core/strings/findMatch.h"
 #include "core/strings/stringUnit.h"
 #include "core/strings/unicode.h"
@@ -45,6 +50,132 @@ bool LinkConsoleFunctions = false;
 // Buffer for expanding script filenames.
 static char scriptFilenameBuffer[1024];
 
+bool isInt(const char* str)
+{
+	int len = dStrlen(str);
+	if(len <= 0)
+		return false;
+
+	// Ingore whitespace
+	int start = 0;
+	for(int i = start; i < len; i++)
+		if(str[i] != ' ')
+		{
+			start = i;
+			break;
+		}
+
+	for(int i = start; i < len; i++)
+		switch(str[i])
+		{
+		case '+': case '-':
+			if(i != 0)
+				return false;
+			break;
+		case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': 
+			break;
+		case ' ': // ignore whitespace
+			for(int j = i+1; j < len; j++)
+				if(str[j] != ' ')
+					return false;
+			return true;
+			break;
+		default:
+			return false;
+		}
+	return true;
+}
+
+bool isFloat(const char* str, bool sciOk = false)
+{
+	int len = dStrlen(str);
+	if(len <= 0)
+		return false;
+
+	// Ingore whitespace
+	int start = 0;
+	for(int i = start; i < len; i++)
+		if(str[i] != ' ')
+		{
+			start = i;
+			break;
+		}
+
+	bool seenDot = false;
+	int eLoc = -1;
+	for(int i = 0; i < len; i++)
+		switch(str[i])
+		{
+		case '+': case '-':
+			if(sciOk)
+			{
+				//Haven't found e or scientific notation symbol
+				if(eLoc == -1)
+				{
+					//only allowed in beginning
+					if(i != 0)
+						return false;
+				}
+				else
+				{
+					//if not right after the e
+					if(i != (eLoc + 1))
+						return false;
+				}
+			}
+			else
+			{
+				//only allowed in beginning
+				if(i != 0)
+					return false;
+			}
+			break;
+		case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '0': 
+			break;
+		case 'e': case 'E':
+			if(!sciOk)
+				return false;
+			else
+			{
+				//already saw it so can't have 2
+				if(eLoc != -1)
+					return false;
+
+				eLoc = i;
+			}
+			break;
+		case '.':
+			if(seenDot | (sciOk && eLoc != -1))
+				return false;
+			seenDot = true;
+			break;
+		case ' ': // ignore whitespace
+			for(int j = i+1; j < len; j++)
+				if(str[j] != ' ')
+					return false;
+			return true;
+			break;
+		default:
+			return false;
+		}
+	return true;
+}
+
+bool isValidIP(const char* ip)
+{
+    unsigned b1, b2, b3, b4;
+	unsigned char c;
+	int rc = dSscanf(ip, "%3u.%3u.%3u.%3u%c", &b1, &b2, &b3, &b4, &c);
+	if (rc != 4 && rc != 5) return false;
+	if ((b1 | b2 | b3 | b4) > 255) return false;
+	if (dStrspn(ip, "0123456789.") < dStrlen(ip)) return false;
+	return true;
+}
+
+bool isValidPort(U16 port)
+{
+	return (port >= 0 && port <=65535);
+}
 
 //=============================================================================
 //    String Functions.
@@ -815,6 +946,75 @@ DefineConsoleFunction( strrchrpos, S32, ( const char* str, const char* chr, S32
    return index;
 }
 
+//----------------------------------------------------------------
+
+// Warning: isInt and isFloat are very 'strict' and might need to be adjusted to allow other values. //seanmc
+DefineConsoleFunction( isInt, bool, ( const char* str),,
+   "Returns true if the string is an integer.\n"
+   "@param str The string to test.\n"
+   "@return true if @a str is an integer and false if not\n\n"
+   "@tsexample\n"
+   "isInt( \"13\" ) // Returns true.\n"
+   "@endtsexample\n"
+   "@ingroup Strings" )
+{
+	return isInt(str);
+}
+
+//----------------------------------------------------------------
+
+DefineConsoleFunction( isFloat, bool, ( const char* str, bool sciOk), (false),
+   "Returns true if the string is a float.\n"
+   "@param str The string to test.\n"
+   "@param sciOk Test for correct scientific notation and accept it (ex. 1.2e+14)"
+   "@return true if @a str is a float and false if not\n\n"
+   "@tsexample\n"
+   "isFloat( \"13.5\" ) // Returns true.\n"
+   "@endtsexample\n"
+   "@ingroup Strings" )
+{
+	return isFloat(str, sciOk);
+}
+
+//----------------------------------------------------------------
+
+DefineConsoleFunction( isValidPort, bool, ( const char* str),,
+   "Returns true if the string is a valid port number.\n"
+   "@param str The string to test.\n"
+   "@return true if @a str is a port and false if not\n\n"
+   "@tsexample\n"
+   "isValidPort( \"8080\" ) // Returns true.\n"
+   "@endtsexample\n"
+   "@ingroup Strings" )
+{
+	if(isInt(str))
+	{
+		U16 port = dAtous(str);
+		return isValidPort(port);
+	}
+	else
+		return false;
+}
+
+//----------------------------------------------------------------
+
+DefineConsoleFunction( isValidIP, bool, ( const char* str),,
+   "Returns true if the string is a valid ip address, excepts localhost.\n"
+   "@param str The string to test.\n"
+   "@return true if @a str is a valid ip address and false if not\n\n"
+   "@tsexample\n"
+   "isValidIP( \"localhost\" ) // Returns true.\n"
+   "@endtsexample\n"
+   "@ingroup Strings" )
+{
+	if(dStrcmp(str, "localhost") == 0)
+	{
+		return true;
+	}
+	else
+		return isValidIP(str);
+}
+
 //=============================================================================
 //    Field Manipulators.
 //=============================================================================

+ 16 - 0
Engine/source/console/consoleFunctions.h

@@ -0,0 +1,16 @@
+#ifndef _CONSOLFUNCTIONS_H_
+#define _CONSOLFUNCTIONS_H_
+
+#ifndef _STRINGFUNCTIONS_H_
+#include "core/strings/stringFunctions.h"
+#endif
+
+bool isInt(const char* str);
+
+bool isFloat(const char* str);
+
+bool isValidIP(const char* ip);
+
+bool isValidPort(U16 port);
+
+#endif