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 if (pszPathLength < 1)
21 return S_OK;
22
23 if (pszPath[pszPathLength - 1] == CUR_PATH_SEPARATOR_CHR)
24 return S_FALSE;
25
26 if (cchPath > (pszPathLength + 1))
27 {
28 pszPath[pszPathLength] = CUR_PATH_SEPARATOR_CHR;
29 pszPath[pszPathLength + 1] = '\0';
30
31 return S_OK;
32 }
33
34 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
35}
36
37#else
38
39HRESULT PATH_CCH_ADD_SEPARATOR_EX(WINPR_ATTR_UNUSED PSTR pszPath, WINPR_ATTR_UNUSED size_t cchPath,
40 WINPR_ATTR_UNUSED PSTR* ppszEnd,
41 WINPR_ATTR_UNUSED size_t* pcchRemaining)
42{
43 WINPR_ASSERT(pszPath || (cchPath == 0));
44 if (!pszPath)
45 return S_OK;
46
47 const size_t pszPathLength = strnlen(pszPath, cchPath);
48 if (pszPathLength < 1)
49 return S_OK;
50
51 if (pszPath[pszPathLength - 1] == CUR_PATH_SEPARATOR_CHR)
52 return S_FALSE;
53
54 if (cchPath > (pszPathLength + 1))
55 {
56 pszPath[pszPathLength] = CUR_PATH_SEPARATOR_CHR;
57 pszPath[pszPathLength + 1] = '\0';
58
59 return S_OK;
60 }
61
62 return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
63}
64
65#endif
66
67/*
68#undef DEFINE_UNICODE
69#undef CUR_PATH_SEPARATOR_CHR
70#undef PATH_CCH_ADD_SEPARATOR_EX
71*/