17ceafbb0c
The HRESULT S_FALSE does not indicate an error: - return E_INVALIDARG instead of S_FALSE - return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) instead of S_FALSE Also extended/fixed the corresponding ctest
101 lines
1.9 KiB
C
101 lines
1.9 KiB
C
|
|
/*
|
|
#define DEFINE_UNICODE FALSE
|
|
#define _PATH_SEPARATOR_CHR '\\'
|
|
#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionA
|
|
*/
|
|
|
|
#if DEFINE_UNICODE
|
|
|
|
HRESULT PATH_CCH_ADD_EXTENSION(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
|
|
{
|
|
#ifdef _WIN32
|
|
LPWSTR pDot;
|
|
BOOL bExtDot;
|
|
LPWSTR pBackslash;
|
|
size_t pszExtLength;
|
|
size_t pszPathLength;
|
|
|
|
if (!pszPath)
|
|
return E_INVALIDARG;
|
|
|
|
if (!pszExt)
|
|
return E_INVALIDARG;
|
|
|
|
pszExtLength = lstrlenW(pszExt);
|
|
pszPathLength = lstrlenW(pszPath);
|
|
bExtDot = (pszExt[0] == '.') ? TRUE : FALSE;
|
|
|
|
pDot = wcsrchr(pszPath, '.');
|
|
pBackslash = wcsrchr(pszPath, _PATH_SEPARATOR_CHR);
|
|
|
|
if (pDot && pBackslash)
|
|
{
|
|
if (pDot > pBackslash)
|
|
return S_FALSE;
|
|
}
|
|
|
|
if (cchPath > pszPathLength + pszExtLength + ((bExtDot) ? 0 : 1))
|
|
{
|
|
if (bExtDot)
|
|
swprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, L"%s", pszExt);
|
|
else
|
|
swprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, L".%s", pszExt);
|
|
|
|
return S_OK;
|
|
}
|
|
#endif
|
|
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
|
}
|
|
|
|
#else
|
|
|
|
HRESULT PATH_CCH_ADD_EXTENSION(PSTR pszPath, size_t cchPath, PCSTR pszExt)
|
|
{
|
|
CHAR* pDot;
|
|
BOOL bExtDot;
|
|
CHAR* pBackslash;
|
|
size_t pszExtLength;
|
|
size_t pszPathLength;
|
|
|
|
if (!pszPath)
|
|
return E_INVALIDARG;
|
|
|
|
if (!pszExt)
|
|
return E_INVALIDARG;
|
|
|
|
pszExtLength = lstrlenA(pszExt);
|
|
pszPathLength = lstrlenA(pszPath);
|
|
bExtDot = (pszExt[0] == '.') ? TRUE : FALSE;
|
|
|
|
pDot = strrchr(pszPath, '.');
|
|
pBackslash = strrchr(pszPath, _PATH_SEPARATOR_CHR);
|
|
|
|
if (pDot && pBackslash)
|
|
{
|
|
if (pDot > pBackslash)
|
|
return S_FALSE;
|
|
}
|
|
|
|
if (cchPath > pszPathLength + pszExtLength + ((bExtDot) ? 0 : 1))
|
|
{
|
|
if (bExtDot)
|
|
sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, "%s", pszExt);
|
|
else
|
|
sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, ".%s", pszExt);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
|
}
|
|
|
|
#endif
|
|
|
|
/*
|
|
#undef DEFINE_UNICODE
|
|
#undef _PATH_SEPARATOR_CHR
|
|
#undef PATH_CCH_ADD_EXTENSION
|
|
*/
|
|
|