FreeRDP
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 
11 HRESULT 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 
71 HRESULT 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 */