📄 consolefunctions.cc
字号:
//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#include "platform/platform.h"
#include "console/console.h"
#include "console/consoleInternal.h"
#include "console/ast.h"
#include "core/resManager.h"
#include "core/fileStream.h"
#include "console/compiler.h"
#include "platform/event.h"
#include "platform/gameInterface.h"
#include "platform/platformInput.h"
// This is a temporary hack to get tools using the library to
// link in this module which contains no other references.
bool LinkConsoleFunctions = false;
// Buffer for expanding script filenames.
static char scriptFilenameBuffer[1024];
//----------------------------------------------------------------
ConsoleFunction(expandFilename, const char*, 2, 2, "(string filename)")
{
argc;
char* ret = Con::getReturnBuffer( 1024 );
Con::expandScriptFilename(ret, 1024, argv[1]);
return ret;
}
ConsoleFunctionGroupBegin(StringFunctions, "General string manipulation functions.");
#ifdef TGE_RPG
ConsoleFunction(strIsBlank, bool, 2, 2, "(string)")
{
argc;
return dIsBlank(argv[1]);
}
#endif
ConsoleFunction(strcmp, S32, 3, 3, "(string one, string two)"
"Case sensitive string compare.")
{
argc;
return dStrcmp(argv[1], argv[2]);
}
ConsoleFunction(stricmp, S32, 3, 3, "(string one, string two)"
"Case insensitive string compare.")
{
argc;
return dStricmp(argv[1], argv[2]);
}
ConsoleFunction(strlen, S32, 2, 2, "(string str)"
"Calculate the length of a string in characters.")
{
argc;
return dStrlen(argv[1]);
}
ConsoleFunction(strstr, S32 , 3, 3, "(string one, string two) "
"Returns the start of the sub string two in one or"
" -1 if not found.")
{
argc;
// returns the start of the sub string argv[2] in argv[1]
// or -1 if not found.
const char *retpos = dStrstr(argv[1], argv[2]);
if(!retpos)
return -1;
return retpos - argv[1];
}
ConsoleFunction(strpos, S32, 3, 4, "(string hay, string needle, int offset=0) "
"Find needle in hay, starting offset bytes in.")
{
S32 ret = -1;
S32 start = 0;
if(argc == 4)
start = dAtoi(argv[3]);
U32 sublen = dStrlen(argv[2]);
U32 strlen = dStrlen(argv[1]);
if(start < 0)
return -1;
if(sublen + start > strlen)
return -1;
for(; start + sublen <= strlen; start++)
if(!dStrncmp(argv[1] + start, argv[2], sublen))
return start;
return -1;
}
ConsoleFunction(ltrim, const char *,2,2,"(string value)")
{
argc;
const char *ret = argv[1];
while(*ret == ' ' || *ret == '\n' || *ret == '\t')
ret++;
return ret;
}
ConsoleFunction(rtrim, const char *,2,2,"(string value)")
{
argc;
S32 firstWhitespace = 0;
S32 pos = 0;
const char *str = argv[1];
while(str[pos])
{
if(str[pos] != ' ' && str[pos] != '\n' && str[pos] != '\t')
firstWhitespace = pos + 1;
pos++;
}
char *ret = Con::getReturnBuffer(firstWhitespace + 1);
dStrncpy(ret, argv[1], firstWhitespace);
ret[firstWhitespace] = 0;
return ret;
}
ConsoleFunction(trim, const char *,2,2,"(string)")
{
argc;
const char *ptr = argv[1];
while(*ptr == ' ' || *ptr == '\n' || *ptr == '\t')
ptr++;
S32 firstWhitespace = 0;
S32 pos = 0;
const char *str = ptr;
while(str[pos])
{
if(str[pos] != ' ' && str[pos] != '\n' && str[pos] != '\t')
firstWhitespace = pos + 1;
pos++;
}
char *ret = Con::getReturnBuffer(firstWhitespace + 1);
dStrncpy(ret, ptr, firstWhitespace);
ret[firstWhitespace] = 0;
return ret;
}
ConsoleFunction(stripChars, const char*, 3, 3, "(string value, string chars) "
"Remove all the characters in chars from value." )
{
argc;
char* ret = Con::getReturnBuffer( dStrlen( argv[1] ) + 1 );
dStrcpy( ret, argv[1] );
U32 pos = dStrcspn( ret, argv[2] );
while ( pos < dStrlen( ret ) )
{
dStrcpy( ret + pos, ret + pos + 1 );
pos = dStrcspn( ret, argv[2] );
}
return( ret );
}
ConsoleFunction(stripColorCodes, const char*, 2,2, "(stringtoStrip) - "
"remove TorqueML color codes from the string.")
{
char* ret = Con::getReturnBuffer( dStrlen( argv[1] ) + 1 );
dStrcpy(ret, argv[1]);
Con::stripColorChars(ret);
return ret;
}
ConsoleFunction(strlwr,const char *,2,2,"(string) "
"Convert string to lower case.")
{
argc;
char *ret = Con::getReturnBuffer(dStrlen(argv[1]) + 1);
dStrcpy(ret, argv[1]);
return dStrlwr(ret);
}
ConsoleFunction(strupr,const char *,2,2,"(string) "
"Convert string to upper case.")
{
argc;
char *ret = Con::getReturnBuffer(dStrlen(argv[1]) + 1);
dStrcpy(ret, argv[1]);
return dStrupr(ret);
}
ConsoleFunction(strchr,const char *,3,3,"(string,char)")
{
argc;
const char *ret = dStrchr(argv[1], argv[2][0]);
return ret ? ret : "";
}
ConsoleFunction(strreplace, const char *, 4, 4, "(string source, string from, string to)")
{
argc;
S32 fromLen = dStrlen(argv[2]);
if(!fromLen)
return argv[1];
S32 toLen = dStrlen(argv[3]);
S32 count = 0;
const char *scan = argv[1];
while(scan)
{
scan = dStrstr(scan, argv[2]);
if(scan)
{
scan += fromLen;
count++;
}
}
char *ret = Con::getReturnBuffer(dStrlen(argv[1]) + 1 + (toLen - fromLen) * count);
U32 scanp = 0;
U32 dstp = 0;
for(;;)
{
const char *scan = dStrstr(argv[1] + scanp, argv[2]);
if(!scan)
{
dStrcpy(ret + dstp, argv[1] + scanp);
return ret;
}
U32 len = scan - (argv[1] + scanp);
dStrncpy(ret + dstp, argv[1] + scanp, len);
dstp += len;
dStrcpy(ret + dstp, argv[3]);
dstp += toLen;
scanp += len + fromLen;
}
return ret;
}
ConsoleFunction(getSubStr, const char *, 4, 4, "getSubStr(string str, int start, int numChars) "
"Returns the substring of str, starting at start, and continuing "
"to either the end of the string, or numChars characters, whichever "
"comes first.")
{
argc;
// Returns the substring of argv[1], starting at argv[2], and continuing
// to either the end of the string, or argv[3] characters, whichever
// comes first.
//
S32 startPos = dAtoi(argv[2]);
S32 desiredLen = dAtoi(argv[3]);
if (startPos < 0 || desiredLen < 0) {
Con::errorf(ConsoleLogEntry::Script, "getSubStr(...): error, starting position and desired length must be >= 0: (%d, %d)", startPos, desiredLen);
return "";
}
S32 baseLen = dStrlen(argv[1]);
if (baseLen < startPos)
return "";
U32 actualLen = desiredLen;
if (startPos + desiredLen > baseLen)
actualLen = baseLen - startPos;
char *ret = Con::getReturnBuffer(actualLen + 1);
dStrncpy(ret, argv[1] + startPos, actualLen);
ret[actualLen] = '\0';
return ret;
}
// Used?
ConsoleFunction( stripTrailingSpaces, const char*, 2, 2, "stripTrailingSpaces( string )" )
{
argc;
S32 temp = S32(dStrlen( argv[1] ));
if ( temp )
{
while ( ( argv[1][temp - 1] == ' ' || argv[1][temp - 1] == '_' ) && temp >= 1 )
temp--;
if ( temp )
{
char* returnString = Con::getReturnBuffer( temp + 1 );
dStrncpy( returnString, argv[1], U32(temp) );
returnString[temp] = '\0';
return( returnString );
}
}
return( "" );
}
ConsoleFunctionGroupEnd(StringFunctions);
//--------------------------------------
static const char *getUnit(const char *string, U32 index, const char *set)
{
U32 sz;
while(index--)
{
if(!*string)
return "";
sz = dStrcspn(string, set);
if (string[sz] == 0)
return "";
string += (sz + 1);
}
sz = dStrcspn(string, set);
if (sz == 0)
return "";
char *ret = Con::getReturnBuffer(sz+1);
dStrncpy(ret, string, sz);
ret[sz] = '\0';
return ret;
}
static const char *getUnits(const char *string, S32 startIndex, S32 endIndex, const char *set)
{
S32 sz;
S32 index = startIndex;
while(index--)
{
if(!*string)
return "";
sz = dStrcspn(string, set);
if (string[sz] == 0)
return "";
string += (sz + 1);
}
const char *startString = string;
while(startIndex <= endIndex--)
{
sz = dStrcspn(string, set);
string += sz;
if (*string == 0)
break;
string++;
}
if(!*string)
string++;
U32 totalSize = (U32(string - startString));
char *ret = Con::getReturnBuffer(totalSize);
dStrncpy(ret, startString, totalSize - 1);
ret[totalSize-1] = '\0';
return ret;
}
static U32 getUnitCount(const char *string, const char *set)
{
U32 count = 0;
U8 last = 0;
while(*string)
{
last = *string++;
for(U32 i =0; set[i]; i++)
{
if(last == set[i])
{
count++;
last = 0;
break;
}
}
}
if(last)
count++;
return count;
}
static const char* setUnit(const char *string, U32 index, const char *replace, const char *set)
{
U32 sz;
const char *start = string;
char *ret = Con::getReturnBuffer(dStrlen(string) + dStrlen(replace) + 1);
ret[0] = '\0';
U32 padCount = 0;
while(index--)
{
sz = dStrcspn(string, set);
if(string[sz] == 0)
{
string += sz;
padCount = index + 1;
break;
}
else
string += (sz + 1);
}
// copy first chunk
sz = string-start;
dStrncpy(ret, start, sz);
for(U32 i = 0; i < padCount; i++)
ret[sz++] = set[0];
// replace this unit
ret[sz] = '\0';
dStrcat(ret, replace);
// copy remaining chunks
sz = dStrcspn(string, set); // skip chunk we're replacing
if(!sz && !string[sz])
return ret;
string += sz;
dStrcat(ret, string);
return ret;
}
static const char* removeUnit(const char *string, U32 index, const char *set)
{
U32 sz;
const char *start = string;
char *ret = Con::getReturnBuffer(dStrlen(string) + 1);
ret[0] = '\0';
U32 padCount = 0;
while(index--)
{
sz = dStrcspn(string, set);
// if there was no unit out there... return the original string
if(string[sz] == 0)
return start;
else
string += (sz + 1);
}
// copy first chunk
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -