diff --git a/src/engine/shared/storage.cpp b/src/engine/shared/storage.cpp index 2c41cadbf..5858a6af5 100644 --- a/src/engine/shared/storage.cpp +++ b/src/engine/shared/storage.cpp @@ -1,5 +1,6 @@ /* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ +#include #include #include #include "linereader.h" @@ -473,6 +474,28 @@ public: } }; +void IStorage::StripPathAndExtension(const char *pFilename, char *pBuffer, int BufferSize) +{ + const char *pFilenameEnd = pFilename + str_length(pFilename); + const char *pExtractedName = pFilename; + const char *pEnd = pFilenameEnd; + for(const char *pIter = pFilename; *pIter; pIter++) + { + if(*pIter == '/' || *pIter == '\\') + { + pExtractedName = pIter + 1; + pEnd = pFilenameEnd; + } + else if(*pIter == '.') + { + pEnd = pIter; + } + } + + int Length = min(BufferSize, (int)(pEnd - pExtractedName + 1)); + str_copy(pBuffer, pExtractedName, Length); +} + IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments) { return CStorage::Create(pApplicationName, StorageType, NumArgs, ppArguments); } IStorage *CreateLocalStorage() diff --git a/src/engine/storage.h b/src/engine/storage.h index 20be34654..86d10ee7d 100644 --- a/src/engine/storage.h +++ b/src/engine/storage.h @@ -32,6 +32,8 @@ public: virtual bool RemoveBinaryFile(const char *pFilename) = 0; virtual bool RenameBinaryFile(const char* pOldFilename, const char* pNewFilename) = 0; virtual const char* GetBinaryPath(const char *pDir, char *pBuffer, unsigned BufferSize) = 0; + + static void StripPathAndExtension(const char *pFilename, char *pBuffer, int BufferSize); }; extern IStorage *CreateStorage(const char *pApplicationName, int StorageType, int NumArgs, const char **ppArguments); diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 9f03228bb..379664c7f 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -3092,7 +3092,7 @@ void CEditor::ReplaceImage(const char *pFileName, int StorageType, void *pUser) } *pImg = ImgInfo; pImg->m_External = External; - pEditor->ExtractName(pFileName, pImg->m_aName, sizeof(pImg->m_aName)); + IStorage::StripPathAndExtension(pFileName, pImg->m_aName, sizeof(pImg->m_aName)); pImg->m_AutoMapper.Load(pImg->m_aName); pImg->m_TexID = pEditor->Graphics()->LoadTextureRaw(ImgInfo.m_Width, ImgInfo.m_Height, ImgInfo.m_Format, ImgInfo.m_pData, CImageInfo::FORMAT_AUTO, 0); ImgInfo.m_pData = 0; @@ -3114,7 +3114,7 @@ void CEditor::AddImage(const char *pFileName, int StorageType, void *pUser) // check if we have that image already char aBuf[128]; - ExtractName(pFileName, aBuf, sizeof(aBuf)); + IStorage::StripPathAndExtension(pFileName, aBuf, sizeof(aBuf)); for(int i = 0; i < pEditor->m_Map.m_lImages.size(); ++i) { if(!str_comp(pEditor->m_Map.m_lImages[i]->m_aName, aBuf)) @@ -3148,7 +3148,7 @@ void CEditor::AddSound(const char *pFileName, int StorageType, void *pUser) // check if we have that sound already char aBuf[128]; - ExtractName(pFileName, aBuf, sizeof(aBuf)); + IStorage::StripPathAndExtension(pFileName, aBuf, sizeof(aBuf)); for(int i = 0; i < pEditor->m_Map.m_lSounds.size(); ++i) { if(!str_comp(pEditor->m_Map.m_lSounds[i]->m_aName, aBuf)) @@ -3243,7 +3243,7 @@ void CEditor::ReplaceSound(const char *pFileName, int StorageType, void *pUser) // replace sound pSound->m_External = External; - pEditor->ExtractName(pFileName, pSound->m_aName, sizeof(pSound->m_aName)); + IStorage::StripPathAndExtension(pFileName, pSound->m_aName, sizeof(pSound->m_aName)); pSound->m_SoundID = pEditor->Sound()->LoadOpusFromMem(pData, (unsigned) DataSize, true); pSound->m_pData = pData; pSound->m_DataSize = DataSize; diff --git a/src/game/editor/editor.h b/src/game/editor/editor.h index 1d444c480..f8a384077 100644 --- a/src/game/editor/editor.h +++ b/src/game/editor/editor.h @@ -1002,21 +1002,6 @@ public: void AddFileDialogEntry(int Index, CUIRect *pView); void SortImages(); - static void ExtractName(const char *pFileName, char *pName, int BufferSize) - { - const char *pExtractedName = pFileName; - const char *pEnd = 0; - for(; *pFileName; ++pFileName) - { - if(*pFileName == '/' || *pFileName == '\\') - pExtractedName = pFileName+1; - else if(*pFileName == '.') - pEnd = pFileName; - } - - int Length = pEnd > pExtractedName ? min(BufferSize, (int)(pEnd-pExtractedName+1)) : BufferSize; - str_copy(pName, pExtractedName, Length); - } int GetLineDistance(); void ZoomMouseTarget(float ZoomFactor); diff --git a/src/game/editor/io.cpp b/src/game/editor/io.cpp index ab52d59c8..5b85da777 100644 --- a/src/game/editor/io.cpp +++ b/src/game/editor/io.cpp @@ -550,7 +550,7 @@ int CEditorMap::Save(class IStorage *pStorage, const char *pFileName) || !mem_comp(CurrentServerInfo.m_NetAddr.ip, ipv6Localhost, sizeof(ipv6Localhost))) { char aMapName[128]; - m_pEditor->ExtractName(pFileName, aMapName, sizeof(aMapName)); + IStorage::StripPathAndExtension(pFileName, aMapName, sizeof(aMapName)); if(!str_comp(aMapName, CurrentServerInfo.m_aMap)) m_pEditor->Client()->Rcon("reload"); } diff --git a/src/tools/map_replace_image.cpp b/src/tools/map_replace_image.cpp index 6a73fc3a4..29aa60743 100644 --- a/src/tools/map_replace_image.cpp +++ b/src/tools/map_replace_image.cpp @@ -60,22 +60,6 @@ int LoadPNG(CImageInfo *pImg, const char *pFilename) return 1; } -void ExtractName(const char *pFileName, char *pName, int BufferSize) -{ - const char *pExtractedName = pFileName; - const char *pEnd = 0; - for(; *pFileName; ++pFileName) - { - if(*pFileName == '/' || *pFileName == '\\') - pExtractedName = pFileName+1; - else if(*pFileName == '.') - pEnd = pFileName; - } - - int Length = pEnd > pExtractedName ? min(BufferSize, (int)(pEnd-pExtractedName+1)) : BufferSize; - str_copy(pName, pExtractedName, Length); -} - void *ReplaceImageItem(void *pItem, int Type, const char *pImgName, const char *pImgFile, CMapItemImage *pNewImgItem) { if(Type != MAPITEMTYPE_IMAGE) @@ -100,7 +84,7 @@ void *ReplaceImageItem(void *pItem, int Type, const char *pImgName, const char * int PixelSize = ImgInfo.m_Format == CImageInfo::FORMAT_RGB ? 3 : 4; g_NewNameID = pImgItem->m_ImageName; - ExtractName(pImgFile, g_aNewName, sizeof(g_aNewName)); + IStorage::StripPathAndExtension(pImgFile, g_aNewName, sizeof(g_aNewName)); g_NewDataID = pImgItem->m_ImageData; g_pNewData = ImgInfo.m_pData; g_NewDataSize = ImgInfo.m_Width * ImgInfo.m_Height * PixelSize;