|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/*
|
|
Packit |
1fb8d4 |
#define DEFINE_UNICODE FALSE
|
|
Packit |
1fb8d4 |
#define _PATH_SEPARATOR_CHR '\\'
|
|
Packit |
1fb8d4 |
#define PATH_CCH_ADD_EXTENSION PathCchAddExtensionA
|
|
Packit |
1fb8d4 |
*/
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#if DEFINE_UNICODE
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
HRESULT PATH_CCH_ADD_EXTENSION(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
#ifdef _WIN32
|
|
Packit |
1fb8d4 |
LPWSTR pDot;
|
|
Packit |
1fb8d4 |
BOOL bExtDot;
|
|
Packit |
1fb8d4 |
LPWSTR pBackslash;
|
|
Packit |
1fb8d4 |
size_t pszExtLength;
|
|
Packit |
1fb8d4 |
size_t pszPathLength;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!pszPath)
|
|
Packit |
1fb8d4 |
return E_INVALIDARG;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!pszExt)
|
|
Packit |
1fb8d4 |
return E_INVALIDARG;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
pszExtLength = lstrlenW(pszExt);
|
|
Packit |
1fb8d4 |
pszPathLength = lstrlenW(pszPath);
|
|
Packit |
1fb8d4 |
bExtDot = (pszExt[0] == '.') ? TRUE : FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
pDot = wcsrchr(pszPath, '.');
|
|
Packit |
1fb8d4 |
pBackslash = wcsrchr(pszPath, _PATH_SEPARATOR_CHR);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (pDot && pBackslash)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
if (pDot > pBackslash)
|
|
Packit |
1fb8d4 |
return S_FALSE;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (cchPath > pszPathLength + pszExtLength + ((bExtDot) ? 0 : 1))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
if (bExtDot)
|
|
Packit |
1fb8d4 |
swprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, L"%s", pszExt);
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
swprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, L".%s", pszExt);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
return S_OK;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#else
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
HRESULT PATH_CCH_ADD_EXTENSION(PSTR pszPath, size_t cchPath, PCSTR pszExt)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
CHAR* pDot;
|
|
Packit |
1fb8d4 |
BOOL bExtDot;
|
|
Packit |
1fb8d4 |
CHAR* pBackslash;
|
|
Packit |
1fb8d4 |
size_t pszExtLength;
|
|
Packit |
1fb8d4 |
size_t pszPathLength;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!pszPath)
|
|
Packit |
1fb8d4 |
return E_INVALIDARG;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (!pszExt)
|
|
Packit |
1fb8d4 |
return E_INVALIDARG;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
pszExtLength = lstrlenA(pszExt);
|
|
Packit |
1fb8d4 |
pszPathLength = lstrlenA(pszPath);
|
|
Packit |
1fb8d4 |
bExtDot = (pszExt[0] == '.') ? TRUE : FALSE;
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
pDot = strrchr(pszPath, '.');
|
|
Packit |
1fb8d4 |
pBackslash = strrchr(pszPath, _PATH_SEPARATOR_CHR);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (pDot && pBackslash)
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
if (pDot > pBackslash)
|
|
Packit |
1fb8d4 |
return S_FALSE;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
if (cchPath > pszPathLength + pszExtLength + ((bExtDot) ? 0 : 1))
|
|
Packit |
1fb8d4 |
{
|
|
Packit |
1fb8d4 |
if (bExtDot)
|
|
Packit |
1fb8d4 |
sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, "%s", pszExt);
|
|
Packit |
1fb8d4 |
else
|
|
Packit |
1fb8d4 |
sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, ".%s", pszExt);
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
return S_OK;
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
|
|
Packit |
1fb8d4 |
}
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
#endif
|
|
Packit |
1fb8d4 |
|
|
Packit |
1fb8d4 |
/*
|
|
Packit |
1fb8d4 |
#undef DEFINE_UNICODE
|
|
Packit |
1fb8d4 |
#undef _PATH_SEPARATOR_CHR
|
|
Packit |
1fb8d4 |
#undef PATH_CCH_ADD_EXTENSION
|
|
Packit |
1fb8d4 |
*/
|