Skip to content

Commit

Permalink
Use str_startswith, str_endswith, str_truncate
Browse files Browse the repository at this point in the history
Use this instead of ad-hoc implementations which are a bit more
error-prone.
  • Loading branch information
heinrich5991 committed Jan 6, 2019
1 parent 11862b4 commit b3df4ff
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 74 deletions.
27 changes: 12 additions & 15 deletions src/engine/client/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ void CSmoothTime::Update(CGraph *pGraph, int64 Target, int TimeLeft, int AdjustD
UpdateInt(Target);
}

CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta), m_DemoRecorder(&m_SnapshotDelta), m_pConLinkIdentifier("teeworlds:")
CClient::CClient() : m_DemoPlayer(&m_SnapshotDelta), m_DemoRecorder(&m_SnapshotDelta)
{
m_pEditor = 0;
m_pInput = 0;
Expand Down Expand Up @@ -2419,9 +2419,9 @@ static CClient *CreateClient()
return new(pClient) CClient;
}

void CClient::HandleTeeworldsConnectLink(const char *pConLink)
void CClient::ConnectOnStart(const char *pAddress)
{
str_copy(m_aCmdConnect, pConLink, sizeof(m_aCmdConnect));
str_copy(m_aCmdConnect, pAddress, sizeof(m_aCmdConnect));
}

/*
Expand Down Expand Up @@ -2555,22 +2555,19 @@ int main(int argc, const char **argv) // ignore_convention
// parse the command line arguments
if(argc > 1) // ignore_convention
{
switch(argc) // ignore_convention
const char *pAddress = 0;
if(argc == 2)
{
case 2:
pAddress = str_startswith(argv[1], "teeworlds:");
}
if(pAddress)
{
// handle Teeworlds connect link
const int Length = str_length(pClient->m_pConLinkIdentifier);
if(str_comp_num(pClient->m_pConLinkIdentifier, argv[1], Length) == 0) // ignore_convention
{
pClient->HandleTeeworldsConnectLink(argv[1] + Length); // ignore_convention
break;
}
pClient->ConnectOnStart(pAddress);
}
default:
pConsole->ParseArguments(argc - 1, &argv[1]); // ignore_convention
else
{
pConsole->ParseArguments(argc - 1, &argv[1]);
}

}
}

Expand Down
5 changes: 1 addition & 4 deletions src/engine/client/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,7 @@ class CClient : public IClient, public CDemoPlayer::IListner
bool LimitFps();
void Run();

void ConnectOnStart(const char *pAddress);

static void Con_Connect(IConsole::IResult *pResult, void *pUserData);
static void Con_Disconnect(IConsole::IResult *pResult, void *pUserData);
Expand Down Expand Up @@ -318,9 +319,5 @@ class CClient : public IClient, public CDemoPlayer::IListner
void ToggleFullscreen();
void ToggleWindowBordered();
void ToggleWindowVSync();

// Teeworlds connect link
const char * const m_pConLinkIdentifier;
void HandleTeeworldsConnectLink(const char *pConLink);
};
#endif
2 changes: 1 addition & 1 deletion src/engine/shared/mapchecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ bool CMapChecker::ReadAndValidateMap(IStorage *pStorage, const char *pFilename,
int Length = (int)(pEnd - pExtractedName);
if(Length <= 0 || Length >= MAX_MAP_LENGTH)
return true;
str_copy(aMapName, pExtractedName, min((int)MAX_MAP_LENGTH, (int)(pEnd-pExtractedName+1)));
str_truncate(aMapName, MAX_MAP_LENGTH, pExtractedName, pEnd - pExtractedName);
str_format(aMapNameExt, sizeof(aMapNameExt), "%s.map", aMapName);
// check for valid map
Expand Down
7 changes: 5 additions & 2 deletions src/engine/shared/storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,11 @@ class CStorage : public IStorage

while((pLine = LineReader.Get()))
{
if(str_length(pLine) > 9 && !str_comp_num(pLine, "add_path ", 9))
AddPath(pLine+9);
const char *pLineWithoutPrefix = str_startswith(pLine, "add_path ");
if(pLineWithoutPrefix)
{
AddPath(pLineWithoutPrefix);
}
}

io_close(File);
Expand Down
4 changes: 2 additions & 2 deletions src/game/client/components/chat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ bool CChat::OnInput(IInput::CEvent Event)
for(m_PlaceholderLength = 0; *pCursor && *pCursor != ' '; ++pCursor)
++m_PlaceholderLength;

str_copy(m_aCompletionBuffer, m_Input.GetString()+m_PlaceholderOffset, min(static_cast<int>(sizeof(m_aCompletionBuffer)), m_PlaceholderLength+1));
str_truncate(m_aCompletionBuffer, sizeof(m_aCompletionBuffer), m_Input.GetString()+m_PlaceholderOffset, m_PlaceholderLength);
}

// find next possible name
Expand Down Expand Up @@ -280,7 +280,7 @@ bool CChat::OnInput(IInput::CEvent Event)
{
char aBuf[256];
// add part before the name
str_copy(aBuf, m_Input.GetString(), min(static_cast<int>(sizeof(aBuf)), m_PlaceholderOffset+1));
str_truncate(aBuf, sizeof(aBuf), m_Input.GetString(), m_PlaceholderOffset);

// add the name
str_append(aBuf, pCompletionString, sizeof(aBuf));
Expand Down
5 changes: 2 additions & 3 deletions src/game/client/components/menus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1403,8 +1403,7 @@ void CMenus::RenderBackButton(CUIRect MainView)
int CMenus::MenuImageScan(const char *pName, int IsDir, int DirType, void *pUser)
{
CMenus *pSelf = (CMenus *)pUser;
int l = str_length(pName);
if(l < 4 || IsDir || str_comp(pName+l-4, ".png") != 0)
if(IsDir || !str_endswith(pName, ".png"))
return 0;

char aBuf[512];
Expand Down Expand Up @@ -1475,7 +1474,7 @@ int CMenus::MenuImageScan(const char *pName, int IsDir, int DirType, void *pUser
mem_free(Info.m_pData);

// set menu image data
str_copy(MenuImage.m_aName, pName, min((int)sizeof(MenuImage.m_aName),l-3));
str_truncate(MenuImage.m_aName, sizeof(MenuImage.m_aName), pName, str_length(pName) - 4);
str_format(aBuf, sizeof(aBuf), "load menu image %s", MenuImage.m_aName);
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf);
pSelf->m_lMenuImages.add(MenuImage);
Expand Down
11 changes: 6 additions & 5 deletions src/game/client/components/menus_browser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2170,12 +2170,13 @@ void CMenus::DoGameIcon(const char *pName, const CUIRect *pRect, int Type)
int CMenus::GameIconScan(const char *pName, int IsDir, int DirType, void *pUser)
{
CMenus *pSelf = (CMenus *)pUser;
int l = str_length(pName);
if(l < 5 || IsDir || str_comp(pName + l - 4, ".png") != 0)
const char *pSuffix = str_endswith(pName, ".png");
if(IsDir || !pSuffix)
{
return 0;

char aGameIconName[128] = { 0 };
str_copy(aGameIconName, pName, min((int)sizeof(aGameIconName), l - 3));
}
char aGameIconName[128];
str_truncate(aGameIconName, sizeof(aGameIconName), pName, pSuffix - pName);

// add new game icon
char aBuf[512];
Expand Down
11 changes: 6 additions & 5 deletions src/game/client/components/menus_demo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,12 @@ void CMenus::RenderDemoPlayer(CUIRect MainView)
int CMenus::DemolistFetchCallback(const char *pName, int IsDir, int StorageType, void *pUser)
{
CMenus *pSelf = (CMenus *)pUser;
int Length = str_length(pName);
if((pName[0] == '.' && (pName[1] == 0 ||
(pName[1] == '.' && pName[2] == 0 && !str_comp(pSelf->m_aCurrentDemoFolder, "demos")))) ||
(!IsDir && (Length < 5 || str_comp(pName+Length-5, ".demo"))))
if(str_comp(pName, ".") == 0
|| (str_comp(pName, "..") == 0 && str_comp(pSelf->m_aCurrentDemoFolder, "demos") == 0)
|| (!IsDir && str_endswith(pName, ".demo")))
{
return 0;
}

CDemoItem Item;
str_copy(Item.m_aFilename, pName, sizeof(Item.m_aFilename));
Expand All @@ -284,7 +285,7 @@ int CMenus::DemolistFetchCallback(const char *pName, int IsDir, int StorageType,
}
else
{
str_copy(Item.m_aName, pName, min(static_cast<int>(sizeof(Item.m_aName)), Length-4));
str_truncate(Item.m_aName, sizeof(Item.m_aName), pName, str_length(pName) - 5);
Item.m_InfosLoaded = false;
}
Item.m_IsDir = IsDir != 0;
Expand Down
38 changes: 18 additions & 20 deletions src/game/client/components/menus_settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -582,26 +582,24 @@ class CLanguage
int CMenus::ThemeScan(const char *pName, int IsDir, int DirType, void *pUser)
{
CMenus *pSelf = (CMenus *)pUser;
int l = str_length(pName);

if(l < 5 || IsDir || str_comp(pName+l-4, ".map") != 0)
const char *pSuffix = str_endswith(pName, ".map");
if(IsDir || !pSuffix)
return 0;
char aFullName[128];
char aThemeName[128];
str_copy(aFullName, pName, min((int)sizeof(aFullName),l-3));
str_truncate(aFullName, sizeof(aFullName), pName, pSuffix - pName);

l = str_length(aFullName);
bool isDay = false;
bool isNight = false;
if(l > 4 && str_comp(aFullName+l-4, "_day") == 0)
bool IsDay = false;
bool IsNight = false;
if((pSuffix = str_endswith(aFullName, "_day")))
{
str_copy(aThemeName, pName, min((int)sizeof(aThemeName),l-3));
isDay = true;
str_truncate(aThemeName, sizeof(aThemeName), pName, pSuffix - aThemeName);
IsDay = true;
}
else if(l > 6 && str_comp(aFullName+l-6, "_night") == 0)
else if((pSuffix = str_endswith(aFullName, "_night")))
{
str_copy(aThemeName, pName, min((int)sizeof(aThemeName),l-5));
isNight = true;
str_truncate(aThemeName, sizeof(aThemeName), pName, pSuffix - aThemeName);
IsNight = true;
}
else
str_copy(aThemeName, aFullName, sizeof(aThemeName));
Expand All @@ -614,16 +612,16 @@ int CMenus::ThemeScan(const char *pName, int IsDir, int DirType, void *pUser)
{
if(str_comp(pSelf->m_lThemes[i].m_Name, aThemeName) == 0)
{
if(isDay)
if(IsDay)
pSelf->m_lThemes[i].m_HasDay = true;
if(isNight)
if(IsNight)
pSelf->m_lThemes[i].m_HasNight = true;
return 0;
}
}

// make new theme
CTheme Theme(aThemeName, isDay, isNight);
CTheme Theme(aThemeName, IsDay, IsNight);
char aBuf[512];
str_format(aBuf, sizeof(aBuf), "added theme %s from ui/themes/%s", aThemeName, pName);
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf);
Expand All @@ -634,12 +632,12 @@ int CMenus::ThemeScan(const char *pName, int IsDir, int DirType, void *pUser)
int CMenus::ThemeIconScan(const char *pName, int IsDir, int DirType, void *pUser)
{
CMenus *pSelf = (CMenus *)pUser;
int l = str_length(pName);

if(l < 4 || IsDir || str_comp(pName+l-4, ".png") != 0)
const char *pSuffix = str_endswith(pName, ".png");
if(IsDir || !pSuffix)
return 0;

char aThemeName[128];
str_copy(aThemeName, pName, min((int)sizeof(aThemeName),l-3));
str_truncate(aThemeName, sizeof(aThemeName), pName, pSuffix - pName);

// save icon for an existing theme
for(sorted_array<CTheme>::range r = pSelf->m_lThemes.all(); !r.empty(); r.pop_front()) // bit slow but whatever
Expand Down
10 changes: 4 additions & 6 deletions src/game/client/components/skins.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ int *const CSkins::ms_apColorVariables[NUM_SKINPARTS] = {&g_Config.m_PlayerColor
int CSkins::SkinPartScan(const char *pName, int IsDir, int DirType, void *pUser)
{
CSkins *pSelf = (CSkins *)pUser;
int l = str_length(pName);
if(l < 4 || IsDir || str_comp(pName+l-4, ".png") != 0)
if(IsDir || !str_endswith(pName, ".png"))
return 0;

char aBuf[512];
Expand Down Expand Up @@ -93,7 +92,7 @@ int CSkins::SkinPartScan(const char *pName, int IsDir, int DirType, void *pUser)
Part.m_Flags |= SKINFLAG_SPECIAL;
if(DirType != IStorage::TYPE_SAVE)
Part.m_Flags |= SKINFLAG_STANDARD;
str_copy(Part.m_aName, pName, min((int)sizeof(Part.m_aName),l-3));
str_truncate(Part.m_aName, sizeof(Part.m_aName), pName, str_length(pName) - 4);
if(g_Config.m_Debug)
{
str_format(aBuf, sizeof(aBuf), "load skin part %s", Part.m_aName);
Expand All @@ -106,8 +105,7 @@ int CSkins::SkinPartScan(const char *pName, int IsDir, int DirType, void *pUser)

int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser)
{
int l = str_length(pName);
if(l < 5 || IsDir || str_comp(pName+l-5, ".json") != 0)
if(IsDir || !str_endswith(pName, ".json"))
return 0;

CSkins *pSelf = (CSkins *)pUser;
Expand All @@ -125,7 +123,7 @@ int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser)

// init
CSkin Skin = pSelf->m_DummySkin;
str_copy(Skin.m_aName, pName, min((int)sizeof(Skin.m_aName),l-4));
str_truncate(Skin.m_aName, sizeof(Skin.m_aName), pName, str_length(pName) - 5);
if(pSelf->Find(Skin.m_aName, true) != -1)
return 0;
bool SpecialSkin = pName[0] == 'x' && pName[1] == '_';
Expand Down
21 changes: 13 additions & 8 deletions src/game/editor/editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -814,9 +814,8 @@ void CEditor::CallbackSaveMap(const char *pFileName, int StorageType, void *pUse
{
CEditor *pEditor = static_cast<CEditor*>(pUser);
char aBuf[1024];
const int Length = str_length(pFileName);
// add map extension
if(Length <= 4 || pFileName[Length-4] != '.' || str_comp_nocase(pFileName+Length-3, "map"))
if(!str_endswith(pFileName, ".map"))
{
str_format(aBuf, sizeof(aBuf), "%s.map", pFileName);
pFileName = aBuf;
Expand Down Expand Up @@ -3024,19 +3023,25 @@ void CEditor::RenderImages(CUIRect ToolBox, CUIRect ToolBar, CUIRect View)
static int EditorListdirCallback(const char *pName, int IsDir, int StorageType, void *pUser)
{
CEditor *pEditor = (CEditor*)pUser;
int Length = str_length(pName);
if((pName[0] == '.' && (pName[1] == 0 ||
(pName[1] == '.' && pName[2] == 0 && (!str_comp(pEditor->m_pFileDialogPath, "maps") || !str_comp(pEditor->m_pFileDialogPath, "mapres"))))) ||
(!IsDir && ((pEditor->m_FileDialogFileType == CEditor::FILETYPE_MAP && (Length < 4 || str_comp(pName+Length-4, ".map"))) ||
(pEditor->m_FileDialogFileType == CEditor::FILETYPE_IMG && (Length < 4 || str_comp(pName+Length-4, ".png"))))))
const char *pExt = 0;
switch(pEditor->m_FileDialogFileType)
{
case CEditor::FILETYPE_MAP: pExt = ".map"; break;
case CEditor::FILETYPE_IMG: pExt = ".png"; break;
}
if(str_comp(pName, ".") == 0
|| (str_comp(pName, "..") == 0 && (str_comp(pEditor->m_pFileDialogPath, "maps") == 0 || str_comp(pEditor->m_pFileDialogPath, "mapres") == 0))
|| (pExt && !IsDir && str_endswith(pName, pExt)))
{
return 0;
}

CEditor::CFilelistItem Item;
str_copy(Item.m_aFilename, pName, sizeof(Item.m_aFilename));
if(IsDir)
str_format(Item.m_aName, sizeof(Item.m_aName), "%s/", pName);
else
str_copy(Item.m_aName, pName, min(static_cast<int>(sizeof(Item.m_aName)), Length-3));
str_truncate(Item.m_aName, sizeof(Item.m_aName), pName, str_length(pName) - 4);
Item.m_IsDir = IsDir != 0;
Item.m_IsLink = false;
Item.m_StorageType = StorageType;
Expand Down
6 changes: 3 additions & 3 deletions src/game/server/gamecontext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -390,14 +390,14 @@ void CGameContext::SendVoteStatus(int ClientID, int Total, int Yes, int No)

void CGameContext::AbortVoteOnDisconnect(int ClientID)
{
if(m_VoteCloseTime && ClientID == m_VoteClientID && (!str_comp_num(m_aVoteCommand, "kick ", 5) ||
!str_comp_num(m_aVoteCommand, "set_team ", 9) || (!str_comp_num(m_aVoteCommand, "ban ", 4) && Server()->IsBanned(ClientID))))
if(m_VoteCloseTime && ClientID == m_VoteClientID && (str_startswith(m_aVoteCommand, "kick ") ||
str_startswith(m_aVoteCommand, "set_team ") || (str_startswith(m_aVoteCommand, "ban ") && Server()->IsBanned(ClientID))))
m_VoteCloseTime = -1;
}

void CGameContext::AbortVoteOnTeamChange(int ClientID)
{
if(m_VoteCloseTime && ClientID == m_VoteClientID && !str_comp_num(m_aVoteCommand, "set_team ", 9))
if(m_VoteCloseTime && ClientID == m_VoteClientID && str_startswith(m_aVoteCommand, "set_team "))
m_VoteCloseTime = -1;
}

Expand Down

0 comments on commit b3df4ff

Please sign in to comment.