Blame winpr/libwinpr/path/include/PathCchAddExtension.c

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
*/