FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
PathCchAppend.h
1
2/*
3#define DEFINE_UNICODE FALSE
4#define CUR_PATH_SEPARATOR_CHR '\\'
5#define CUR_PATH_SEPARATOR_STR "\\"
6#define PATH_CCH_APPEND PathCchAppendA
7*/
8
9#if DEFINE_UNICODE
10
11HRESULT PATH_CCH_APPEND(PWSTR pszPath, size_t cchPath, PCWSTR pszMore)
12{
13 BOOL pathBackslash;
14 BOOL moreBackslash;
15 size_t pszMoreLength;
16 size_t pszPathLength;
17
18 if (!pszPath)
19 return E_INVALIDARG;
20
21 if (!pszMore)
22 return E_INVALIDARG;
23
24 if (cchPath == 0 || cchPath > PATHCCH_MAX_CCH)
25 return E_INVALIDARG;
26
27 pszMoreLength = _wcslen(pszMore);
28 pszPathLength = _wcslen(pszPath);
29
30 pathBackslash = (pszPath[pszPathLength - 1] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
31 moreBackslash = (pszMore[0] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
32
33 if (pathBackslash && moreBackslash)
34 {
35 if ((pszPathLength + pszMoreLength - 1) < cchPath)
36 {
37 WCHAR* ptr = &pszPath[pszPathLength];
38 *ptr = '\0';
39 _wcsncat(ptr, &pszMore[1], _wcslen(&pszMore[1]));
40 return S_OK;
41 }
42 }
43 else if ((pathBackslash && !moreBackslash) || (!pathBackslash && moreBackslash))
44 {
45 if ((pszPathLength + pszMoreLength) < cchPath)
46 {
47 WCHAR* ptr = &pszPath[pszPathLength];
48 *ptr = '\0';
49 _wcsncat(ptr, pszMore, _wcslen(pszMore));
50 return S_OK;
51 }
52 }
53 else if (!pathBackslash && !moreBackslash)
54 {
55 if ((pszPathLength + pszMoreLength + 1) < cchPath)
56 {
57 const WCHAR sep[] = CUR_PATH_SEPARATOR_STR;
58 WCHAR* ptr = &pszPath[pszPathLength];
59 *ptr = '\0';
60 _wcsncat(ptr, sep, _wcslen(sep));
61 _wcsncat(ptr, pszMore, _wcslen(pszMore));
62 return S_OK;
63 }
64 }
65
66 return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
67}
68
69#else
70
71HRESULT PATH_CCH_APPEND(PSTR pszPath, size_t cchPath, PCSTR pszMore)
72{
73 BOOL pathBackslash = FALSE;
74 BOOL moreBackslash = FALSE;
75 size_t pszMoreLength;
76 size_t pszPathLength;
77
78 if (!pszPath)
79 return E_INVALIDARG;
80
81 if (!pszMore)
82 return E_INVALIDARG;
83
84 if (cchPath == 0 || cchPath > PATHCCH_MAX_CCH)
85 return E_INVALIDARG;
86
87 pszPathLength = strlen(pszPath);
88 if (pszPathLength > 0)
89 pathBackslash = (pszPath[pszPathLength - 1] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
90
91 pszMoreLength = strlen(pszMore);
92 if (pszMoreLength > 0)
93 moreBackslash = (pszMore[0] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
94
95 if (pathBackslash && moreBackslash)
96 {
97 if ((pszPathLength + pszMoreLength - 1) < cchPath)
98 {
99 sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, "%s", &pszMore[1]);
100 return S_OK;
101 }
102 }
103 else if ((pathBackslash && !moreBackslash) || (!pathBackslash && moreBackslash))
104 {
105 if ((pszPathLength + pszMoreLength) < cchPath)
106 {
107 sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, "%s", pszMore);
108 return S_OK;
109 }
110 }
111 else if (!pathBackslash && !moreBackslash)
112 {
113 if ((pszPathLength + pszMoreLength + 1) < cchPath)
114 {
115 sprintf_s(&pszPath[pszPathLength], cchPath - pszPathLength, CUR_PATH_SEPARATOR_STR "%s",
116 pszMore);
117 return S_OK;
118 }
119 }
120
121 return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
122}
123
124#endif
125
126/*
127#undef DEFINE_UNICODE
128#undef CUR_PATH_SEPARATOR_CHR
129#undef CUR_PATH_SEPARATOR_STR
130#undef PATH_CCH_APPEND
131*/