FreeRDP
Loading...
Searching...
No Matches
PathCchAddSeparatorEx.h
1
2#include <winpr/wtypes.h>
3
4/*
5#define DEFINE_UNICODE FALSE
6#define CUR_PATH_SEPARATOR_CHR '\\'
7#define PATH_CCH_ADD_SEPARATOR_EX PathCchAddBackslashExA
8*/
9
10#if DEFINE_UNICODE
11
12HRESULT PATH_CCH_ADD_SEPARATOR_EX(PWSTR pszPath, size_t cchPath, WINPR_ATTR_UNUSED PWSTR* ppszEnd,
13 WINPR_ATTR_UNUSED size_t* pcchRemaining)
14{
15 WINPR_ASSERT(pszPath || (cchPath == 0));
16 if (!pszPath)
17 return S_OK;
18
19 const size_t pszPathLength = _wcsnlen(pszPath, cchPath);
20
21 if (pszPath[pszPathLength - 1] == CUR_PATH_SEPARATOR_CHR)
22 return S_FALSE;
23
24 if (cchPath > (pszPathLength + 1))
25 {
26 pszPath[pszPathLength] = CUR_PATH_SEPARATOR_CHR;
27 pszPath[pszPathLength + 1] = '\0';
28
29 return S_OK;
30 }
31
32 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
33}
34
35#else
36
37HRESULT PATH_CCH_ADD_SEPARATOR_EX(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED size_t cchPath,
38 WINPR_ATTR_UNUSED PSTR* ppszEnd,
39 WINPR_ATTR_UNUSED size_t* pcchRemaining)
40{
41 WINPR_ASSERT(pszPath || (cchPath == 0));
42 if (!pszPath)
43 return S_OK;
44
45 const size_t pszPathLength = strnlen(pszPath, cchPath);
46
47 if (pszPath[pszPathLength - 1] == CUR_PATH_SEPARATOR_CHR)
48 return S_FALSE;
49
50 if (cchPath > (pszPathLength + 1))
51 {
52 pszPath[pszPathLength] = CUR_PATH_SEPARATOR_CHR;
53 pszPath[pszPathLength + 1] = '\0';
54
55 return S_OK;
56 }
57
58 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
59}
60
61#endif
62
63/*
64#undef DEFINE_UNICODE
65#undef CUR_PATH_SEPARATOR_CHR
66#undef PATH_CCH_ADD_SEPARATOR_EX
67*/