Skip to content

Commit

Permalink
Merge 90b70c0 into 67131ff
Browse files Browse the repository at this point in the history
  • Loading branch information
berryzplus authored Feb 12, 2022
2 parents 67131ff + 90b70c0 commit 1b51dbc
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 18 deletions.
40 changes: 22 additions & 18 deletions sakura_core/util/file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -996,27 +996,31 @@ void my_splitpath_w (
// -----------------------------------------------------------------------------
int FileMatchScore( const WCHAR *file1, const WCHAR *file2 );

// フルパスからファイル名の.以降を分離する
// 2014.06.15 フォルダ名に.が含まれた場合、フォルダが分離されたのを修正
static void FileNameSepExt( const WCHAR *file, WCHAR* pszFile, WCHAR* pszExt )
// フルパスからファイル名と拡張子(ファイル名の.以降)を分離する
// @date 2014/06/15 moca_skr フォルダ名に.が含まれた場合、フォルダが分離されたのを修正した対応で新規作成
template<size_t cchFile, size_t cchExt>
void FileNameSepExt( std::wstring_view file, WCHAR (&szFile)[cchFile], WCHAR (&szExt)[cchExt] )
{
const WCHAR* folderPos = file;
const WCHAR* x = folderPos;
while( x ){
x = wcschr(folderPos, L'\\');
if( x ){
x++;
folderPos = x;
}
const WCHAR* folderPos;
folderPos = ::wcsrchr(file.data(), L'\\');
if( folderPos ){
folderPos++;
}else{
folderPos = file.data();
}
const WCHAR* p = wcschr(folderPos, L'.');
if( p ){
wmemcpy(pszFile, file, p - file);
pszFile[p - file] = L'\0';
wcscpy(pszExt, p);

if (const auto p = ::wcschr(folderPos, L'.');
p && p - folderPos < cchFile)
{
::wcsncpy_s(szFile, folderPos, p - folderPos);
if (STRUNCATE == ::wcsncpy_s(szExt, p, _TRUNCATE)) {
::wcscpy_s(szExt, L"");
}
}else{
wcscpy(pszFile, file);
pszExt[0] = L'\0';
if (STRUNCATE == ::wcsncpy_s(szFile, folderPos, _TRUNCATE)) {
::wcscpy_s(szFile, L"");
}
::wcscpy_s(szExt, L"");
}
}

Expand Down
64 changes: 64 additions & 0 deletions tests/unittests/test-file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,70 @@ TEST(file, CalcDirectoryDepth)
EXPECT_DEATH({ CalcDirectoryDepth(nullptr); }, ".*");
}


template<size_t cchFile, size_t cchExt>
void FileNameSepExt(std::wstring_view file, WCHAR(&szFile)[cchFile], WCHAR(&szExt)[cchExt]);

/*!
FileNameSepExtのテスト
*/
TEST(file, FileNameSepExt)
{
// バッファ
WCHAR szFile[_MAX_PATH]{};
WCHAR szExt[_MAX_PATH]{};

// 標準的なパターン(ファイル名+拡張子)
FileNameSepExt(LR"(C:\TEMP\test.txt)", szFile, szExt);
ASSERT_STREQ(LR"(test)", szFile);
ASSERT_STREQ(LR"(.txt)", szExt);

// テストパターン(フォルダ名が拡張子っぽいものを含む)
FileNameSepExt(LR"(C:\TEMP.NET\test.txt)", szFile, szExt);
ASSERT_STREQ(LR"(test)", szFile);
ASSERT_STREQ(LR"(.txt)", szExt);

// テストパターン(拡張子がない)
FileNameSepExt(LR"(C:\TEMP.NET\test)", szFile, szExt);
ASSERT_STREQ(LR"(test)", szFile);
ASSERT_STREQ(LR"()", szExt);

// テストパターン(フォルダがない)
FileNameSepExt(LR"(test.txt)", szFile, szExt);
ASSERT_STREQ(LR"(test)", szFile);
ASSERT_STREQ(LR"(.txt)", szExt);

// テストパターン(ファイル名がない)
FileNameSepExt(LR"(C:\TEMP.NET\.txt)", szFile, szExt);
ASSERT_STREQ(LR"()", szFile);
ASSERT_STREQ(LR"(.txt)", szExt);

// テストパターン(ファイル名も拡張子もない)
FileNameSepExt(LR"(C:\TEMP.NET\)", szFile, szExt);
ASSERT_STREQ(LR"()", szFile);
ASSERT_STREQ(LR"()", szExt);

// テストパターン(パスが空文字)
FileNameSepExt(LR"()", szFile, szExt);
ASSERT_STREQ(LR"()", szFile);
ASSERT_STREQ(LR"()", szExt);

// 異常パターンのパス構築用バッファ
WCHAR szLongPath[1024]{};

// 異常パターン(ファイル名のバッファが足りない)
::swprintf_s(szLongPath, LR"(C:\TEMP\%-*s.txt)", _countof(szFile), L"test");
FileNameSepExt(szLongPath, szFile, szExt);
ASSERT_STREQ(LR"()", szFile);
ASSERT_STREQ(LR"()", szExt);

// 異常パターン(拡張子のバッファが足りない)
::swprintf_s(szLongPath, LR"(C:\TEMP\test%-*s)", _countof(szExt), L".txt");
FileNameSepExt(szLongPath, szFile, szExt);
ASSERT_STREQ(LR"(test)", szFile);
ASSERT_STREQ(LR"()", szExt);
}

/*!
GetExtのテスト
*/
Expand Down

0 comments on commit 1b51dbc

Please sign in to comment.