1
0

Introducing StringUtils - the place to be if you are a generic string routine :) No more sprintf()!

git-svn-id: http://mc-server.googlecode.com/svn/trunk@209 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com 2012-02-01 09:12:54 +00:00
parent 3364ecc284
commit bb49f0e021
19 changed files with 519 additions and 241 deletions

View File

@ -197,18 +197,6 @@
RelativePath="..\source\cAuthenticator.h" RelativePath="..\source\cAuthenticator.h"
> >
</File> </File>
<File
RelativePath="..\source\cBlockEntity.h"
>
</File>
<File
RelativePath="..\source\cBlockToPickup.cpp"
>
</File>
<File
RelativePath="..\source\cBlockToPickup.h"
>
</File>
<File <File
RelativePath="..\source\cChatColor.cpp" RelativePath="..\source\cChatColor.cpp"
> >
@ -277,18 +265,6 @@
RelativePath="..\source\cCuboid.h" RelativePath="..\source\cCuboid.h"
> >
</File> </File>
<File
RelativePath="..\source\cDoors.h"
>
</File>
<File
RelativePath="..\source\cEntity.cpp"
>
</File>
<File
RelativePath="..\source\cEntity.h"
>
</File>
<File <File
RelativePath="..\source\cFileFormatUpdater.cpp" RelativePath="..\source\cFileFormatUpdater.cpp"
> >
@ -297,14 +273,6 @@
RelativePath="..\source\cFileFormatUpdater.h" RelativePath="..\source\cFileFormatUpdater.h"
> >
</File> </File>
<File
RelativePath="..\source\cFurnaceEntity.cpp"
>
</File>
<File
RelativePath="..\source\cFurnaceEntity.h"
>
</File>
<File <File
RelativePath="..\source\cFurnaceRecipe.cpp" RelativePath="..\source\cFurnaceRecipe.cpp"
> >
@ -353,18 +321,6 @@
RelativePath="..\source\cInventory.h" RelativePath="..\source\cInventory.h"
> >
</File> </File>
<File
RelativePath="..\source\cItem.cpp"
>
</File>
<File
RelativePath="..\source\cItem.h"
>
</File>
<File
RelativePath="..\source\cLadder.h"
>
</File>
<File <File
RelativePath="..\source\cLog.cpp" RelativePath="..\source\cLog.cpp"
> >
@ -373,14 +329,6 @@
RelativePath="..\source\cLog.h" RelativePath="..\source\cLog.h"
> >
</File> </File>
<File
RelativePath="..\source\cMakeDir.cpp"
>
</File>
<File
RelativePath="..\source\cMakeDir.h"
>
</File>
<File <File
RelativePath="..\source\cMCLogger.cpp" RelativePath="..\source\cMCLogger.cpp"
> >
@ -431,38 +379,6 @@
RelativePath="..\source\cNoise.inc" RelativePath="..\source\cNoise.inc"
> >
</File> </File>
<File
RelativePath="..\source\cPawn.cpp"
>
</File>
<File
RelativePath="..\source\cPawn.h"
>
</File>
<File
RelativePath="..\source\cPickup.cpp"
>
</File>
<File
RelativePath="..\source\cPickup.h"
>
</File>
<File
RelativePath="..\source\cPiston.cpp"
>
</File>
<File
RelativePath="..\source\cPiston.h"
>
</File>
<File
RelativePath="..\source\cPlayer.cpp"
>
</File>
<File
RelativePath="..\source\cPlayer.h"
>
</File>
<File <File
RelativePath="..\source\cPlugin.cpp" RelativePath="..\source\cPlugin.cpp"
> >
@ -523,14 +439,6 @@
RelativePath="..\source\cSign.h" RelativePath="..\source\cSign.h"
> >
</File> </File>
<File
RelativePath="..\source\cSignEntity.cpp"
>
</File>
<File
RelativePath="..\source\cSignEntity.h"
>
</File>
<File <File
RelativePath="..\source\cSimulator.cpp" RelativePath="..\source\cSimulator.cpp"
> >
@ -555,18 +463,6 @@
RelativePath="..\source\cSocket.h" RelativePath="..\source\cSocket.h"
> >
</File> </File>
<File
RelativePath="..\source\cStairs.h"
>
</File>
<File
RelativePath="..\source\cStringMap.cpp"
>
</File>
<File
RelativePath="..\source\cStringMap.h"
>
</File>
<File <File
RelativePath="..\source\cTCPLink.cpp" RelativePath="..\source\cTCPLink.cpp"
> >
@ -575,14 +471,6 @@
RelativePath="..\source\cTCPLink.h" RelativePath="..\source\cTCPLink.h"
> >
</File> </File>
<File
RelativePath="..\source\cThread.cpp"
>
</File>
<File
RelativePath="..\source\cThread.h"
>
</File>
<File <File
RelativePath="..\source\cTimer.cpp" RelativePath="..\source\cTimer.cpp"
> >
@ -591,10 +479,6 @@
RelativePath="..\source\cTimer.h" RelativePath="..\source\cTimer.h"
> >
</File> </File>
<File
RelativePath="..\source\cTorch.h"
>
</File>
<File <File
RelativePath="..\source\cTracer.cpp" RelativePath="..\source\cTracer.cpp"
> >
@ -715,6 +599,14 @@
RelativePath="..\source\ptr_cChunk.h" RelativePath="..\source\ptr_cChunk.h"
> >
</File> </File>
<File
RelativePath="..\source\StringUtils.cpp"
>
</File>
<File
RelativePath="..\source\StringUtils.h"
>
</File>
<File <File
RelativePath="..\source\Vector3d.cpp" RelativePath="..\source\Vector3d.cpp"
> >
@ -1320,8 +1212,100 @@
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Items" Name="Entities"
> >
<File
RelativePath="..\source\cBlockEntity.h"
>
</File>
<File
RelativePath="..\source\cBlockToPickup.cpp"
>
</File>
<File
RelativePath="..\source\cBlockToPickup.h"
>
</File>
<File
RelativePath="..\source\cDoors.h"
>
</File>
<File
RelativePath="..\source\cEntity.cpp"
>
</File>
<File
RelativePath="..\source\cEntity.h"
>
</File>
<File
RelativePath="..\source\cFurnaceEntity.cpp"
>
</File>
<File
RelativePath="..\source\cFurnaceEntity.h"
>
</File>
<File
RelativePath="..\source\cItem.cpp"
>
</File>
<File
RelativePath="..\source\cItem.h"
>
</File>
<File
RelativePath="..\source\cLadder.h"
>
</File>
<File
RelativePath="..\source\cPawn.cpp"
>
</File>
<File
RelativePath="..\source\cPawn.h"
>
</File>
<File
RelativePath="..\source\cPickup.cpp"
>
</File>
<File
RelativePath="..\source\cPickup.h"
>
</File>
<File
RelativePath="..\source\cPiston.cpp"
>
</File>
<File
RelativePath="..\source\cPiston.h"
>
</File>
<File
RelativePath="..\source\cPlayer.cpp"
>
</File>
<File
RelativePath="..\source\cPlayer.h"
>
</File>
<File
RelativePath="..\source\cSignEntity.cpp"
>
</File>
<File
RelativePath="..\source\cSignEntity.h"
>
</File>
<File
RelativePath="..\source\cStairs.h"
>
</File>
<File
RelativePath="..\source\cTorch.h"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="UI" Name="UI"
@ -1450,6 +1434,14 @@
RelativePath="..\source\cFile.h" RelativePath="..\source\cFile.h"
> >
</File> </File>
<File
RelativePath="..\source\cMakeDir.cpp"
>
</File>
<File
RelativePath="..\source\cMakeDir.h"
>
</File>
<File <File
RelativePath="..\source\cSemaphore.cpp" RelativePath="..\source\cSemaphore.cpp"
> >
@ -1466,6 +1458,14 @@
RelativePath="..\source\cSleep.h" RelativePath="..\source\cSleep.h"
> >
</File> </File>
<File
RelativePath="..\source\cThread.cpp"
>
</File>
<File
RelativePath="..\source\cThread.h"
>
</File>
</Filter> </Filter>
<Filter <Filter
Name="Bindings" Name="Bindings"
@ -1502,6 +1502,14 @@
RelativePath="..\source\cPlugin_NewLua.h" RelativePath="..\source\cPlugin_NewLua.h"
> >
</File> </File>
<File
RelativePath="..\source\cStringMap.cpp"
>
</File>
<File
RelativePath="..\source\cStringMap.h"
>
</File>
<File <File
RelativePath="..\source\cWebPlugin_Lua.cpp" RelativePath="..\source\cWebPlugin_Lua.cpp"
> >

View File

@ -463,6 +463,7 @@
<ClCompile Include="..\source\packets\cPacket_WindowClose.cpp" /> <ClCompile Include="..\source\packets\cPacket_WindowClose.cpp" />
<ClCompile Include="..\source\packets\cPacket_WindowOpen.cpp" /> <ClCompile Include="..\source\packets\cPacket_WindowOpen.cpp" />
<ClCompile Include="..\source\SquirrelBindings.cpp" /> <ClCompile Include="..\source\SquirrelBindings.cpp" />
<ClCompile Include="..\source\StringUtils.cpp" />
<ClCompile Include="..\source\Vector3d.cpp" /> <ClCompile Include="..\source\Vector3d.cpp" />
<ClCompile Include="..\source\Vector3f.cpp" /> <ClCompile Include="..\source\Vector3f.cpp" />
<ClCompile Include="..\source\Vector3i.cpp" /> <ClCompile Include="..\source\Vector3i.cpp" />
@ -632,6 +633,7 @@
<ClInclude Include="..\source\packets\cPacket_WindowOpen.h" /> <ClInclude Include="..\source\packets\cPacket_WindowOpen.h" />
<ClInclude Include="..\source\ptr_cChunk.h" /> <ClInclude Include="..\source\ptr_cChunk.h" />
<ClInclude Include="..\source\SquirrelBindings.h" /> <ClInclude Include="..\source\SquirrelBindings.h" />
<ClInclude Include="..\source\StringUtils.h" />
<ClInclude Include="..\source\Vector3d.h" /> <ClInclude Include="..\source\Vector3d.h" />
<ClInclude Include="..\source\Vector3f.h" /> <ClInclude Include="..\source\Vector3f.h" />
<ClInclude Include="..\source\Vector3i.h" /> <ClInclude Include="..\source\Vector3i.h" />

View File

@ -909,6 +909,7 @@
</ClCompile> </ClCompile>
<ClCompile Include="..\source\Globals.cpp" /> <ClCompile Include="..\source\Globals.cpp" />
<ClCompile Include="..\source\cFile.cpp" /> <ClCompile Include="..\source\cFile.cpp" />
<ClCompile Include="..\source\StringUtils.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\source\cServer.h"> <ClInclude Include="..\source\cServer.h">
@ -1399,6 +1400,7 @@
</ClInclude> </ClInclude>
<ClInclude Include="..\source\Globals.h" /> <ClInclude Include="..\source\Globals.h" />
<ClInclude Include="..\source\cFile.h" /> <ClInclude Include="..\source\cFile.h" />
<ClInclude Include="..\source\StringUtils.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\source\AllToLua.pkg"> <None Include="..\source\AllToLua.pkg">

View File

@ -54,6 +54,7 @@
// Common headers: // Common headers:
#include "../source/StringUtils.h"
#include "../source/cCriticalSection.h" #include "../source/cCriticalSection.h"
#include "../source/cMCLogger.h" #include "../source/cMCLogger.h"

View File

@ -49,25 +49,6 @@
webserver::request_func webserver::request_func_=0; webserver::request_func webserver::request_func_=0;
static std::vector< std::string > StringSplit(std::string str, std::string delim)
{
std::vector< std::string > results;
size_t cutAt;
while( (cutAt = str.find_first_of(delim)) != str.npos )
{
if(cutAt > 0)
{
results.push_back(str.substr(0,cutAt));
}
str = str.substr(cutAt+1);
}
if(str.length() > 0)
{
results.push_back(str);
}
return results;
}
static std::string EatLine( std::string& a_String ) static std::string EatLine( std::string& a_String )
{ {
std::string RetVal = ""; std::string RetVal = "";
@ -140,8 +121,7 @@ void ParseMultipartFormData( webserver::http_request& req, Socket* s)
static const std::string multipart_form_data = "multipart/form-data"; static const std::string multipart_form_data = "multipart/form-data";
if(req.content_type_.substr(0, multipart_form_data.size()) == multipart_form_data) // Difficult data... :( if(req.content_type_.substr(0, multipart_form_data.size()) == multipart_form_data) // Difficult data... :(
{ {
typedef std::vector< std::string > StringVector; AStringVector ContentTypeData = StringSplit( req.content_type_, "; " );
StringVector ContentTypeData = StringSplit( req.content_type_, "; " );
std::string boundary; std::string boundary;
// Find boundary // Find boundary
@ -208,7 +188,7 @@ void ParseMultipartFormData( webserver::http_request& req, Socket* s)
static const std::string disp_filename = "filename="; static const std::string disp_filename = "filename=";
// Parse the disposition // Parse the disposition
StringVector DispositionData = StringSplit( f_disposition, "; " ); AStringVector DispositionData = StringSplit( f_disposition, "; " );
for( unsigned int i = 0; i < DispositionData.size(); ++i ) for( unsigned int i = 0; i < DispositionData.size(); ++i )
{ {
if( DispositionData[i].substr(0, disp_name.size()) == disp_name ) if( DispositionData[i].substr(0, disp_name.size()) == disp_name )

View File

@ -247,7 +247,8 @@ MCServer : \
build/cFileFormatUpdater.o\ build/cFileFormatUpdater.o\
build/cItem.o\ build/cItem.o\
build/cPlugin_NewLua.o\ build/cPlugin_NewLua.o\
build/cWebPlugin_Lua.o build/cWebPlugin_Lua.o\
build/StringUtils.o
$(CC) $(LNK_OPTIONS) \ $(CC) $(LNK_OPTIONS) \
build/json_reader.o\ build/json_reader.o\
build/json_value.o\ build/json_value.o\
@ -458,6 +459,7 @@ MCServer : \
build/cItem.o\ build/cItem.o\
build/cPlugin_NewLua.o\ build/cPlugin_NewLua.o\
build/cWebPlugin_Lua.o\ build/cWebPlugin_Lua.o\
build/StringUtils.o\
-o MCServer -o MCServer
clean : clean :
@ -671,6 +673,7 @@ clean :
build/cItem.o\ build/cItem.o\
build/cPlugin_NewLua.o\ build/cPlugin_NewLua.o\
build/cWebPlugin_Lua.o\ build/cWebPlugin_Lua.o\
build/StringUtils.o\
MCServer MCServer
install : MCServer install : MCServer
@ -1528,4 +1531,7 @@ build/cPlugin_NewLua.o : source/cPlugin_NewLua.cpp
build/cWebPlugin_Lua.o : source/cWebPlugin_Lua.cpp build/cWebPlugin_Lua.o : source/cWebPlugin_Lua.cpp
$(CC) $(CC_OPTIONS) source/cWebPlugin_Lua.cpp -c $(INCLUDE) -o build/cWebPlugin_Lua.o $(CC) $(CC_OPTIONS) source/cWebPlugin_Lua.cpp -c $(INCLUDE) -o build/cWebPlugin_Lua.o
build/StringUtils.o : source/StringUtils.cpp
$(CC) $(CC_OPTIONS) source/StringUtils.cpp -c $(INCLUDE) -o build/StringUtils.o
##### END RUN #### ##### END RUN ####

View File

@ -28,6 +28,7 @@
#include <semaphore.h> #include <semaphore.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <memory.h>
#endif #endif
@ -42,6 +43,13 @@
// Compatibility:
#define ASSERT assert
// STL stuff: // STL stuff:
#include <vector> #include <vector>
#include <list> #include <list>
@ -54,6 +62,7 @@
// Common headers: // Common headers:
#include "StringUtils.h"
#include "cSleep.h" #include "cSleep.h"
#include "cCriticalSection.h" #include "cCriticalSection.h"
#include "cSemaphore.h" #include "cSemaphore.h"

View File

@ -15,7 +15,9 @@
#include "cStringMap.h" #include "cStringMap.h"
#include "md5/md5.h" #include "md5/md5.h"
extern std::vector<std::string> StringSplit(std::string str, std::string delim);
/**************************** /****************************
* Lua bound functions with special return types * Lua bound functions with special return types
@ -26,7 +28,7 @@ static int tolua_StringSplit(lua_State* tolua_S)
std::string str = ((std::string) tolua_tocppstring(tolua_S,1,0)); std::string str = ((std::string) tolua_tocppstring(tolua_S,1,0));
std::string delim = ((std::string) tolua_tocppstring(tolua_S,2,0)); std::string delim = ((std::string) tolua_tocppstring(tolua_S,2,0));
std::vector<std::string> Split = StringSplit( str, delim ); AStringVector Split = StringSplit( str, delim );
lua_createtable(tolua_S, Split.size(), 0); lua_createtable(tolua_S, Split.size(), 0);
int newTable = lua_gettop(tolua_S); int newTable = lua_gettop(tolua_S);
@ -41,6 +43,10 @@ static int tolua_StringSplit(lua_State* tolua_S)
return 1; return 1;
} }
static int tolua_LOG(lua_State* tolua_S) static int tolua_LOG(lua_State* tolua_S)
{ {
const char* str = tolua_tocppstring(tolua_S,1,0); const char* str = tolua_tocppstring(tolua_S,1,0);
@ -48,6 +54,10 @@ static int tolua_LOG(lua_State* tolua_S)
return 0; return 0;
} }
static int tolua_LOGINFO(lua_State* tolua_S) static int tolua_LOGINFO(lua_State* tolua_S)
{ {
const char* str = tolua_tocppstring(tolua_S,1,0); const char* str = tolua_tocppstring(tolua_S,1,0);
@ -55,6 +65,10 @@ static int tolua_LOGINFO(lua_State* tolua_S)
return 0; return 0;
} }
static int tolua_LOGWARN(lua_State* tolua_S) static int tolua_LOGWARN(lua_State* tolua_S)
{ {
const char* str = tolua_tocppstring(tolua_S,1,0); const char* str = tolua_tocppstring(tolua_S,1,0);
@ -62,6 +76,10 @@ static int tolua_LOGWARN(lua_State* tolua_S)
return 0; return 0;
} }
static int tolua_LOGERROR(lua_State* tolua_S) static int tolua_LOGERROR(lua_State* tolua_S)
{ {
const char* str = tolua_tocppstring(tolua_S,1,0); const char* str = tolua_tocppstring(tolua_S,1,0);
@ -69,6 +87,10 @@ static int tolua_LOGERROR(lua_State* tolua_S)
return 0; return 0;
} }
static int tolua_cWorld_GetAllPlayers(lua_State* tolua_S) static int tolua_cWorld_GetAllPlayers(lua_State* tolua_S)
{ {
cWorld* self = (cWorld*) tolua_tousertype(tolua_S,1,0); cWorld* self = (cWorld*) tolua_tousertype(tolua_S,1,0);
@ -79,6 +101,10 @@ static int tolua_cWorld_GetAllPlayers(lua_State* tolua_S)
return 1; return 1;
} }
static int tolua_cPlugin_GetCommands(lua_State* tolua_S) static int tolua_cPlugin_GetCommands(lua_State* tolua_S)
{ {
cPlugin* self = (cPlugin*) tolua_tousertype(tolua_S,1,0); cPlugin* self = (cPlugin*) tolua_tousertype(tolua_S,1,0);
@ -100,6 +126,10 @@ static int tolua_cPlugin_GetCommands(lua_State* tolua_S)
return 1; return 1;
} }
static int tolua_cPluginManager_GetAllPlugins(lua_State* tolua_S) static int tolua_cPluginManager_GetAllPlugins(lua_State* tolua_S)
{ {
cPluginManager* self = (cPluginManager*) tolua_tousertype(tolua_S,1,0); cPluginManager* self = (cPluginManager*) tolua_tousertype(tolua_S,1,0);
@ -121,6 +151,10 @@ static int tolua_cPluginManager_GetAllPlugins(lua_State* tolua_S)
return 1; return 1;
} }
static int tolua_cPlayer_GetGroups(lua_State* tolua_S) static int tolua_cPlayer_GetGroups(lua_State* tolua_S)
{ {
cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0);
@ -142,6 +176,10 @@ static int tolua_cPlayer_GetGroups(lua_State* tolua_S)
return 1; return 1;
} }
static int tolua_cPlayer_GetResolvedPermissions(lua_State* tolua_S) static int tolua_cPlayer_GetResolvedPermissions(lua_State* tolua_S)
{ {
cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0); cPlayer* self = (cPlayer*) tolua_tousertype(tolua_S,1,0);
@ -163,6 +201,10 @@ static int tolua_cPlayer_GetResolvedPermissions(lua_State* tolua_S)
return 1; return 1;
} }
static int tolua_cPlugin_BindCommand(lua_State* tolua_S) static int tolua_cPlugin_BindCommand(lua_State* tolua_S)
{ {
cPlugin* self = (cPlugin*) tolua_tousertype(tolua_S,1,0); cPlugin* self = (cPlugin*) tolua_tousertype(tolua_S,1,0);
@ -217,6 +259,10 @@ static int tolua_cPlugin_BindCommand(lua_State* tolua_S)
return 0; return 0;
} }
static int tolua_cWebPlugin_Lua_AddTab(lua_State* tolua_S) static int tolua_cWebPlugin_Lua_AddTab(lua_State* tolua_S)
{ {
cWebPlugin_Lua* self = (cWebPlugin_Lua*) tolua_tousertype(tolua_S,1,0); cWebPlugin_Lua* self = (cWebPlugin_Lua*) tolua_tousertype(tolua_S,1,0);
@ -260,6 +306,10 @@ static int tolua_cWebPlugin_Lua_AddTab(lua_State* tolua_S)
return 0; return 0;
} }
static int tolua_md5(lua_State* tolua_S) static int tolua_md5(lua_State* tolua_S)
{ {
std::string SourceString = tolua_tostring(tolua_S, 1, 0); std::string SourceString = tolua_tostring(tolua_S, 1, 0);
@ -268,6 +318,10 @@ static int tolua_md5(lua_State* tolua_S)
return 1; return 1;
} }
static int tolua_push_StringStringMap(lua_State* tolua_S, std::map< std::string, std::string >& a_StringStringMap ) static int tolua_push_StringStringMap(lua_State* tolua_S, std::map< std::string, std::string >& a_StringStringMap )
{ {
lua_newtable(tolua_S); lua_newtable(tolua_S);
@ -285,18 +339,30 @@ static int tolua_push_StringStringMap(lua_State* tolua_S, std::map< std::string,
return 1; return 1;
} }
static int tolua_get_HTTPRequest_Params(lua_State* tolua_S) static int tolua_get_HTTPRequest_Params(lua_State* tolua_S)
{ {
HTTPRequest* self = (HTTPRequest*) tolua_tousertype(tolua_S,1,0); HTTPRequest* self = (HTTPRequest*) tolua_tousertype(tolua_S,1,0);
return tolua_push_StringStringMap(tolua_S, self->Params); return tolua_push_StringStringMap(tolua_S, self->Params);
} }
static int tolua_get_HTTPRequest_PostParams(lua_State* tolua_S) static int tolua_get_HTTPRequest_PostParams(lua_State* tolua_S)
{ {
HTTPRequest* self = (HTTPRequest*) tolua_tousertype(tolua_S,1,0); HTTPRequest* self = (HTTPRequest*) tolua_tousertype(tolua_S,1,0);
return tolua_push_StringStringMap(tolua_S, self->PostParams); return tolua_push_StringStringMap(tolua_S, self->PostParams);
} }
static int tolua_get_HTTPRequest_FormData(lua_State* tolua_S) static int tolua_get_HTTPRequest_FormData(lua_State* tolua_S)
{ {
HTTPRequest* self = (HTTPRequest*) tolua_tousertype(tolua_S,1,0); HTTPRequest* self = (HTTPRequest*) tolua_tousertype(tolua_S,1,0);
@ -316,6 +382,10 @@ static int tolua_get_HTTPRequest_FormData(lua_State* tolua_S)
return 1; return 1;
} }
void ManualBindings::Bind( lua_State* tolua_S ) void ManualBindings::Bind( lua_State* tolua_S )
{ {
tolua_beginmodule(tolua_S,NULL); tolua_beginmodule(tolua_S,NULL);
@ -357,3 +427,7 @@ void ManualBindings::Bind( lua_State* tolua_S )
tolua_endmodule(tolua_S); tolua_endmodule(tolua_S);
} }

129
source/StringUtils.cpp Normal file
View File

@ -0,0 +1,129 @@
// StringUtils.cpp
// Implements the various string helper functions:
#include "Globals.h"
AString & AppendVPrintf(AString & str, const char *format, va_list args)
{
ASSERT(format != NULL);
char buffer[2048];
size_t len;
if ((len = _vsnprintf_s(buffer, ARRAYCOUNT(buffer), _TRUNCATE, format, args)) != -1)
{
str.append(buffer, len);
return str;
}
len = _vscprintf(format, args);
if (len == -1)
{
return str;
}
std::auto_ptr<char> tmp(new char[len + 1]);
ASSERT(tmp.get() != NULL); // Why not alloced? Is the length reasonable?
if (tmp.get() == NULL)
{
throw std::bad_alloc();
}
if ((len = vsprintf_s(tmp.get(), len + 1, format, args)) != -1)
{
str.append(tmp.get(), len);
}
ASSERT(len != -1);
return str;
}
AString & Printf(AString & str, const char *format, ...)
{
str.clear();
va_list args;
va_start(args, format);
std::string &retval = AppendVPrintf(str, format, args);
va_end(args);
return retval;
}
AString & AppendPrintf(AString &str, const char *format, ...)
{
va_list args;
va_start(args, format);
std::string &retval = AppendVPrintf(str, format, args);
va_end(args);
return retval;
}
AStringVector StringSplit(const AString & str, const AString & delim)
{
AStringVector results;
size_t cutAt = 0;
size_t Prev = 0;
while ((cutAt = str.find_first_of(delim, Prev)) != str.npos)
{
if (cutAt > 0)
{
results.push_back(str.substr(0, cutAt));
}
Prev = cutAt + delim.length();
}
if (Prev < str.length())
{
results.push_back(str.substr(Prev));
}
return results;
}
AString & StrToUpper(AString & s)
{
AString::iterator i = s.begin();
AString::iterator end = s.end();
while (i != end)
{
*i = (char)toupper(*i);
++i;
}
return s;
}
int NoCaseCompare(const AString & s1, const AString & s2)
{
#ifdef _MSC_VER
// MSVC has stricmp that compares case-insensitive:
return stricmp(s1.c_str(), s2.c_str());
#else
// Do it the hard way:
AString s1Copy(s1);
AString s2Copy(s2);
return StrToUpper(s1Copy).compare(StrToUpper(s2Copy));
#endif // else _MSC_VER
}

51
source/StringUtils.h Normal file
View File

@ -0,0 +1,51 @@
// StringUtils.h
// Interfaces to various string helper functions
#ifndef STRINGUTILS_H_INCLUDED
#define STRINGUTILS_H_INCLUDED
typedef std::string AString;
typedef std::vector<AString> AStringVector;
/// Add the formated string to the existing data in the string
extern AString & AppendVPrintf(AString & str, const char * format, va_list args);
/// Output the formatted text into the string
extern AString & Printf (AString & str, const char * format, ...);
/// Add the formatted string to the existing data in the string
extern AString & AppendPrintf (AString & str, const char * format, ...);
/// Split the string at delimiters, return as a stringvector
extern AStringVector StringSplit(const AString & str, const AString & delim);
/// In-place string conversion to uppercase; returns the same string
extern AString & StrToUpper(AString & s);
/// Case-insensitive string comparison; returns 0 if the strings are the same
extern int NoCaseCompare(const AString & s1, const AString & s2);
// If you have any other string helper functions, declare them here
#endif // STRINGUTILS_H_INCLUDED

View File

@ -7,7 +7,9 @@
#include "cChatColor.h" #include "cChatColor.h"
#include "cRoot.h" #include "cRoot.h"
extern std::vector< std::string > StringSplit( std::string str, std::string delim);
typedef std::map< std::string, cGroup* > GroupMap; typedef std::map< std::string, cGroup* > GroupMap;
struct cGroupManager::sGroupManagerState struct cGroupManager::sGroupManagerState
@ -57,7 +59,7 @@ cGroupManager::cGroupManager()
std::string Commands = IniFile.GetValue( KeyName, "Commands", "" ); std::string Commands = IniFile.GetValue( KeyName, "Commands", "" );
if( Commands.size() > 0 ) if( Commands.size() > 0 )
{ {
std::vector< std::string > Split = StringSplit( Commands, "," ); AStringVector Split = StringSplit( Commands, "," );
for( unsigned int i = 0; i < Split.size(); i++) for( unsigned int i = 0; i < Split.size(); i++)
{ {
Group->AddCommand( Split[i] ); Group->AddCommand( Split[i] );
@ -68,7 +70,7 @@ cGroupManager::cGroupManager()
std::string Permissions = IniFile.GetValue( KeyName, "Permissions", "" ); std::string Permissions = IniFile.GetValue( KeyName, "Permissions", "" );
if( Permissions.size() > 0 ) if( Permissions.size() > 0 )
{ {
std::vector< std::string > Split = StringSplit( Permissions, "," ); AStringVector Split = StringSplit( Permissions, "," );
for( unsigned int i = 0; i < Split.size(); i++) for( unsigned int i = 0; i < Split.size(); i++)
{ {
Group->AddPermission( Split[i] ); Group->AddPermission( Split[i] );
@ -79,7 +81,7 @@ cGroupManager::cGroupManager()
std::string Groups = IniFile.GetValue( KeyName, "Inherits", "" ); std::string Groups = IniFile.GetValue( KeyName, "Inherits", "" );
if( Groups.size() > 0 ) if( Groups.size() > 0 )
{ {
std::vector< std::string > Split = StringSplit( Groups, "," ); AStringVector Split = StringSplit( Groups, "," );
for( unsigned int i = 0; i < Split.size(); i++) for( unsigned int i = 0; i < Split.size(); i++)
{ {
Group->InheritFrom( GetGroup( Split[i].c_str() ) ); Group->InheritFrom( GetGroup( Split[i].c_str() ) );

View File

@ -11,7 +11,6 @@
extern std::vector<std::string> StringSplit(std::string str, std::string delim);
extern bool report_errors(lua_State* lua, int status); extern bool report_errors(lua_State* lua, int status);
cLuaCommandBinder::cLuaCommandBinder() cLuaCommandBinder::cLuaCommandBinder()
@ -58,8 +57,11 @@ bool cLuaCommandBinder::BindCommand( const std::string & a_Command, const std::s
bool cLuaCommandBinder::HandleCommand( const std::string & a_Command, cPlayer* a_Player ) bool cLuaCommandBinder::HandleCommand( const std::string & a_Command, cPlayer* a_Player )
{ {
std::vector<std::string> Split = StringSplit( a_Command, " "); AStringVector Split = StringSplit(a_Command, " ");
if( Split.size() == 0 ) return false; if (Split.size() == 0)
{
return false;
}
CommandMap::iterator FoundCommand = m_BoundCommands.find( Split[0] ); CommandMap::iterator FoundCommand = m_BoundCommands.find( Split[0] );
if( FoundCommand != m_BoundCommands.end() ) if( FoundCommand != m_BoundCommands.end() )

View File

@ -13,7 +13,9 @@
using namespace std; using namespace std;
extern std::vector<std::string> StringSplit(std::string str, std::string delim);
struct cMonsterConfig::sAttributesStruct struct cMonsterConfig::sAttributesStruct
{ {
@ -61,7 +63,7 @@ void cMonsterConfig::Initialize() {
return; return;
} }
vector<string> SplitList = StringSplit(m_pState->MonsterTypes,","); AStringVector SplitList = StringSplit(m_pState->MonsterTypes,",");
for(unsigned int i = 0; i < SplitList.size(); ++i) { for(unsigned int i = 0; i < SplitList.size(); ++i) {
if(!SplitList[i].empty()) { if(!SplitList[i].empty()) {
printf("Getting Attributes for: %s \n",SplitList[i].c_str()); printf("Getting Attributes for: %s \n",SplitList[i].c_str());

View File

@ -1,14 +1,25 @@
#pragma once #pragma once
#include <cstdio>
// fwd: "cWorld.h"
class cWorld; class cWorld;
class cPiston class cPiston
{ {
public: public:
cPiston( cWorld* a_World ); cPiston( cWorld* a_World );
static char RotationPitchToMetaData( float a_Rotation, float a_Pitch ) static char RotationPitchToMetaData( float a_Rotation, float a_Pitch )
{ {
std::printf("pre:a_Rotation %f \n",a_Rotation); std::printf("pre:a_Rotation %f \n",a_Rotation);
std::printf("a_Pitch %f \n",a_Pitch); std::printf("a_Pitch %f \n",a_Pitch);
@ -31,15 +42,19 @@ static char RotationPitchToMetaData( float a_Rotation, float a_Pitch )
else else
{ std::printf("4444\n");return 0x3;} { std::printf("4444\n");return 0x3;}
} }
} }
void ExtendPiston( int, int, int ); void ExtendPiston( int, int, int );
void RetractPiston( int, int, int ); void RetractPiston( int, int, int );
cWorld* m_World; cWorld* m_World;
private: private:
void ChainMove( int, int, int, char, unsigned short * ); void ChainMove( int, int, int, char, unsigned short * );
unsigned short FirstPassthroughBlock( int, int, int, char ); unsigned short FirstPassthroughBlock( int, int, int, char );
}; };

View File

@ -43,13 +43,11 @@
#include "../iniFile/iniFile.h" #include "../iniFile/iniFile.h"
#include <json/json.h> #include <json/json.h>
#ifndef _WIN32 // for mkdir
#include <sys/stat.h>
#include <sys/types.h>
#define sprintf_s(dst, size, format, ...) sprintf(dst, format, __VA_ARGS__ )
#endif
#define float2int(x) ((x)<0 ? ((int)(x))-1 : (int)(x)) #define float2int(x) ((x)<0 ? ((int)(x))-1 : (int)(x))
extern std::vector< std::string > StringSplit( std::string str, std::string delim);
CLASS_DEFINITION( cPlayer, cPawn ); CLASS_DEFINITION( cPlayer, cPawn );
@ -557,9 +555,13 @@ bool cPlayer::CanUseCommand( const char* a_Command )
return false; return false;
} }
bool cPlayer::HasPermission( const char* a_Permission ) bool cPlayer::HasPermission( const char* a_Permission )
{ {
std::vector< std::string > Split = StringSplit( a_Permission, "." ); AStringVector Split = StringSplit( a_Permission, "." );
PermissionMap Possibilities = m_pState->ResolvedPermissions; PermissionMap Possibilities = m_pState->ResolvedPermissions;
// Now search the namespaces // Now search the namespaces
while( Possibilities.begin() != Possibilities.end() ) while( Possibilities.begin() != Possibilities.end() )
@ -567,7 +569,7 @@ bool cPlayer::HasPermission( const char* a_Permission )
PermissionMap::iterator itr = Possibilities.begin(); PermissionMap::iterator itr = Possibilities.begin();
if( itr->second ) if( itr->second )
{ {
std::vector< std::string > OtherSplit = StringSplit( itr->first, "." ); AStringVector OtherSplit = StringSplit( itr->first, "." );
if( OtherSplit.size() <= Split.size() ) if( OtherSplit.size() <= Split.size() )
{ {
unsigned int i; unsigned int i;
@ -589,6 +591,10 @@ bool cPlayer::HasPermission( const char* a_Permission )
return false; return false;
} }
bool cPlayer::IsInGroup( const char* a_Group ) bool cPlayer::IsInGroup( const char* a_Group )
{ {
for( GroupList::iterator itr = m_pState->ResolvedGroups.begin(); itr != m_pState->ResolvedGroups.end(); ++itr ) for( GroupList::iterator itr = m_pState->ResolvedGroups.begin(); itr != m_pState->ResolvedGroups.end(); ++itr )
@ -743,7 +749,7 @@ void cPlayer::LoadPermissionsFromDisk()
std::string Groups = IniFile.GetValue(m_pState->PlayerName, "Groups", ""); std::string Groups = IniFile.GetValue(m_pState->PlayerName, "Groups", "");
if( Groups.size() > 0 ) if( Groups.size() > 0 )
{ {
std::vector< std::string > Split = StringSplit( Groups, "," ); AStringVector Split = StringSplit( Groups, "," );
for( unsigned int i = 0; i < Split.size(); i++ ) for( unsigned int i = 0; i < Split.size(); i++ )
{ {
AddToGroup( Split[i].c_str() ); AddToGroup( Split[i].c_str() );

View File

@ -5,7 +5,6 @@
#include "cPlugin.h" #include "cPlugin.h"
#include "cPlugin_Lua.h" #include "cPlugin_Lua.h"
#include "cPlugin_NewLua.h" #include "cPlugin_NewLua.h"
#include "cMCLogger.h"
#include "cWebAdmin.h" #include "cWebAdmin.h"
#include "cItem.h" #include "cItem.h"
#include "cRoot.h" #include "cRoot.h"
@ -15,17 +14,15 @@
#include "SquirrelBindings.h" #include "SquirrelBindings.h"
#if USE_SQUIRREL #if USE_SQUIRREL
#pragma warning(disable:4100;disable:4127;disable:4510;disable:4610;disable:4244;disable:4512) // Getting A LOT of these warnings from SqPlus #pragma warning(disable:4100;disable:4127;disable:4510;disable:4610;disable:4244;disable:4512) // Getting A LOT of these warnings from SqPlus
#include <sqplus/sqplus.h> #include <sqplus/sqplus.h>
#pragma warning(default:4100;default:4127;default:4510;default:4610;default:4244;default:4512) #pragma warning(default:4100;default:4127;default:4510;default:4610;default:4244;default:4512)
#endif #endif
extern std::vector<std::string> StringSplit(std::string str, std::string delim);
typedef std::list< cPlugin_Lua* > LuaPluginList; typedef std::list< cPlugin_Lua* > LuaPluginList;
typedef std::map< cPluginManager::PluginHook, cPluginManager::PluginList > HookMap; typedef std::map< cPluginManager::PluginHook, cPluginManager::PluginList > HookMap;
@ -96,7 +93,7 @@ void cPluginManager::ReloadPluginsNow()
// allow for comma separated plugin list // allow for comma separated plugin list
// degrades and works fine for the plugin // degrades and works fine for the plugin
// per line // per line
std::vector< std::string > split = StringSplit( PluginFile, "," ); AStringVector split = StringSplit( PluginFile, "," );
for (unsigned int j = 0; j < split.size(); j++) { for (unsigned int j = 0; j < split.size(); j++) {
cPlugin_Lua* Plugin = new cPlugin_Lua( (split[j] + std::string(".lua") ).c_str() ); cPlugin_Lua* Plugin = new cPlugin_Lua( (split[j] + std::string(".lua") ).c_str() );
if( !AddLuaPlugin( Plugin ) ) if( !AddLuaPlugin( Plugin ) )

View File

@ -347,6 +347,10 @@ void ServerTickThread( void * a_Param )
LOG("TICK THREAD STOPPED"); LOG("TICK THREAD STOPPED");
} }
void cServer::StartListenThread() void cServer::StartListenThread()
{ {
m_pState->pListenThread = new cThread( ServerListenThread, this, "cServer::ServerListenThread" ); m_pState->pListenThread = new cThread( ServerListenThread, this, "cServer::ServerListenThread" );
@ -355,50 +359,24 @@ void cServer::StartListenThread()
m_pState->pTickThread->Start( true ); m_pState->pTickThread->Start( true );
} }
std::vector< std::string > StringSplit(std::string str, std::string delim)
{
std::vector< std::string > results;
size_t cutAt;
while( (cutAt = str.find_first_of(delim)) != str.npos )
{
if(cutAt > 0)
{
results.push_back(str.substr(0,cutAt));
}
str = str.substr(cutAt+1);
}
if(str.length() > 0)
{
results.push_back(str);
}
return results;
}
template <class T> template <class T>
bool from_string(T& t, bool from_string(
T& t,
const std::string& s, const std::string& s,
std::ios_base& (*f)(std::ios_base&)) std::ios_base& (*f)(std::ios_base&)
)
{ {
std::istringstream iss(s); std::istringstream iss(s);
return !(iss >> f >> t).fail(); return !(iss >> f >> t).fail();
} }
std::string & StrToUpper(std::string& s)
{
std::string::iterator i = s.begin();
std::string::iterator end = s.end();
while (i != end) {
*i = (char)toupper(*i);
++i;
}
return s;
}
int NoCaseCompare( std::string s1, std::string s2 )
{
return StrToUpper( s1 ).compare( StrToUpper( s2 ) );
}
bool cServer::Command( cClientHandle & a_Client, const char* a_Cmd ) bool cServer::Command( cClientHandle & a_Client, const char* a_Cmd )
{ {
@ -410,11 +388,11 @@ bool cServer::Command( cClientHandle & a_Client, const char* a_Cmd )
if( Command.length() <= 0 ) return false; if( Command.length() <= 0 ) return false;
if( Command[0] != '/' ) return false; if( Command[0] != '/' ) return false;
std::vector< std::string > split = StringSplit( Command, " " ); AStringVector split = StringSplit( Command, " " );
if( split.size() == 0 ) if( split.size() == 0 )
return false; return false;
if( split[0].compare("/coords") == 0 ) if (split[0].compare("/coords") == 0)
{ {
char c_Str[128]; char c_Str[128];
sprintf_s( c_Str, 128, "[X:%0.2f] [Y:%0.2f] [Z:%0.2f]", a_Client.GetPlayer()->GetPosX(), a_Client.GetPlayer()->GetPosY(), a_Client.GetPlayer()->GetPosZ() ); sprintf_s( c_Str, 128, "[X:%0.2f] [Y:%0.2f] [Z:%0.2f]", a_Client.GetPlayer()->GetPosX(), a_Client.GetPlayer()->GetPosY(), a_Client.GetPlayer()->GetPosZ() );
@ -426,8 +404,8 @@ bool cServer::Command( cClientHandle & a_Client, const char* a_Cmd )
void cServer::ServerCommand( const char* a_Cmd ) void cServer::ServerCommand( const char* a_Cmd )
{ {
std::string Command( a_Cmd ); AString Command( a_Cmd );
std::vector< std::string > split = StringSplit( Command, " " ); AStringVector split = StringSplit( Command, " " );
if( split.size() > 0 ) if( split.size() > 0 )
{ {
if( split[0].compare( "help" ) == 0 ) if( split[0].compare( "help" ) == 0 )

View File

@ -21,16 +21,17 @@
#include <psapi.h> #include <psapi.h>
#else #else
#include <sys/resource.h> #include <sys/resource.h>
#include <memory> // auto_ptr
#endif #endif
extern std::vector<std::string> StringSplit(std::string str, std::string delim); cWebAdmin * WebAdmin = 0;
cWebAdmin* WebAdmin = 0;
cWebAdmin::cWebAdmin( int a_Port /* = 8080 */ ) cWebAdmin::cWebAdmin( int a_Port /* = 8080 */ )
: m_Port( a_Port ) : m_Port( a_Port )
@ -75,12 +76,16 @@ void cWebAdmin::RemovePlugin( cWebPlugin* a_Plugin )
m_Plugins.remove( a_Plugin ); m_Plugins.remove( a_Plugin );
} }
void cWebAdmin::Request_Handler(webserver::http_request* r) void cWebAdmin::Request_Handler(webserver::http_request* r)
{ {
if( WebAdmin == 0 ) return; if( WebAdmin == 0 ) return;
LOG("Path: %s", r->path_.c_str() ); LOG("Path: %s", r->path_.c_str() );
std::vector< std::string > Split = StringSplit( r->path_, "/" ); AStringVector Split = StringSplit( r->path_, "/" );
if(r->path_ == "/") if(r->path_ == "/")
{ {

View File

@ -8,6 +8,15 @@
#include "cWebAdmin.h" #include "cWebAdmin.h"
extern bool report_errors(lua_State* lua, int status);
static std::string SafeString( const std::string& a_String ) static std::string SafeString( const std::string& a_String )
{ {
std::string RetVal; std::string RetVal;
@ -24,8 +33,8 @@ static std::string SafeString( const std::string& a_String )
} }
extern bool report_errors(lua_State* lua, int status);
extern std::vector<std::string> StringSplit(std::string str, std::string delim);
struct cWebPlugin_Lua::sWebPluginTab struct cWebPlugin_Lua::sWebPluginTab
{ {
@ -130,7 +139,7 @@ void cWebPlugin_Lua::Initialize()
std::pair< std::string, std::string > cWebPlugin_Lua::GetTabNameForRequest( HTTPRequest* a_Request ) std::pair< std::string, std::string > cWebPlugin_Lua::GetTabNameForRequest( HTTPRequest* a_Request )
{ {
std::pair< std::string, std::string > Names; std::pair< std::string, std::string > Names;
std::vector<std::string> Split = StringSplit( a_Request->Path, "/" ); AStringVector Split = StringSplit(a_Request->Path, "/");
if( Split.size() > 1 ) if( Split.size() > 1 )
{ {