24#include <winpr/wtypes.h>
25#include <winpr/error.h>
26#include <winpr/wlog.h>
30HRESULT PATH_ALLOC_COMBINE(PCWSTR pszPathIn, PCWSTR pszMore,
31 WINPR_ATTR_UNUSED
unsigned long dwFlags, PWSTR* ppszPathOut)
33 WLog_WARN(
"TODO",
"has known bugs and needs fixing.");
38 if (!pszPathIn && !pszMore)
47 const size_t pszPathInLength = _wcslen(pszPathIn);
48 const size_t pszMoreLength = _wcslen(pszMore);
51 if (pszPathInLength < 3)
54 const BOOL backslashIn =
55 (pszPathIn[pszPathInLength - 1] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
56 const BOOL backslashMore = (pszMore[0] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
60 if ((pszPathIn[1] ==
':') && (pszPathIn[2] == CUR_PATH_SEPARATOR_CHR))
62 const WCHAR colon[] = {
':',
'\0' };
63 const size_t pszPathOutLength =
sizeof(WCHAR) + pszMoreLength;
64 const size_t sizeOfBuffer = (pszPathOutLength + 1) *
sizeof(WCHAR);
65 PWSTR pszPathOut = (PWSTR)calloc(sizeOfBuffer,
sizeof(WCHAR));
70 _wcsncat(pszPathOut, &pszPathIn[0], 1);
71 _wcsncat(pszPathOut, colon, ARRAYSIZE(colon));
72 _wcsncat(pszPathOut, pszMore, pszMoreLength);
73 *ppszPathOut = pszPathOut;
79 const WCHAR sep[] = CUR_PATH_SEPARATOR_STR;
80 const size_t pszPathOutLength = pszPathInLength + pszMoreLength;
81 const size_t sizeOfBuffer = (pszPathOutLength + 1) * 2;
82 PWSTR pszPathOut = (PWSTR)calloc(sizeOfBuffer, 2);
87 _wcsncat(pszPathOut, pszPathIn, pszPathInLength);
89 _wcsncat(pszPathOut, sep, ARRAYSIZE(sep));
90 _wcsncat(pszPathOut, pszMore, pszMoreLength);
92 *ppszPathOut = pszPathOut;
101HRESULT PATH_ALLOC_COMBINE(PCSTR pszPathIn, PCSTR pszMore, WINPR_ATTR_UNUSED
unsigned long dwFlags,
104 WLog_WARN(
"TODO",
"has known bugs and needs fixing.");
109 if (!pszPathIn && !pszMore)
118 const size_t pszPathInLength = strlen(pszPathIn);
119 const size_t pszMoreLength = strlen(pszMore);
122 if (pszPathInLength < 3)
125 const BOOL backslashIn =
126 (pszPathIn[pszPathInLength - 1] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
127 const BOOL backslashMore = (pszMore[0] == CUR_PATH_SEPARATOR_CHR) ? TRUE : FALSE;
131 if ((pszPathIn[1] ==
':') && (pszPathIn[2] == CUR_PATH_SEPARATOR_CHR))
133 const size_t pszPathOutLength = 2 + pszMoreLength;
134 const size_t sizeOfBuffer = (pszPathOutLength + 1) * 2;
135 PSTR pszPathOut = calloc(sizeOfBuffer, 2);
138 return E_OUTOFMEMORY;
140 sprintf_s(pszPathOut, sizeOfBuffer,
"%c:%s", pszPathIn[0], pszMore);
141 *ppszPathOut = pszPathOut;
147 const size_t pszPathOutLength = pszPathInLength + pszMoreLength;
148 const size_t sizeOfBuffer = (pszPathOutLength + 1) * 2;
149 PSTR pszPathOut = calloc(sizeOfBuffer, 2);
152 return E_OUTOFMEMORY;
155 sprintf_s(pszPathOut, sizeOfBuffer,
"%s%s", pszPathIn, pszMore);
157 sprintf_s(pszPathOut, sizeOfBuffer,
"%s" CUR_PATH_SEPARATOR_STR
"%s", pszPathIn,
160 *ppszPathOut = pszPathOut;