Blame winpr/libwinpr/path/path.c

Packit Service fa4841
/**
Packit Service fa4841
 * WinPR: Windows Portable Runtime
Packit Service fa4841
 * Path Functions
Packit Service fa4841
 *
Packit Service fa4841
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit Service fa4841
 *
Packit Service fa4841
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit Service fa4841
 * you may not use this file except in compliance with the License.
Packit Service fa4841
 * You may obtain a copy of the License at
Packit Service fa4841
 *
Packit Service fa4841
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit Service fa4841
 *
Packit Service fa4841
 * Unless required by applicable law or agreed to in writing, software
Packit Service fa4841
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit Service fa4841
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit Service fa4841
 * See the License for the specific language governing permissions and
Packit Service fa4841
 * limitations under the License.
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
#ifdef HAVE_CONFIG_H
Packit Service fa4841
#include "config.h"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include <winpr/crt.h>
Packit Service fa4841
#include <winpr/heap.h>
Packit Service fa4841
#include <winpr/tchar.h>
Packit Service fa4841
Packit Service fa4841
#include <winpr/path.h>
Packit Service fa4841
Packit Service bb5c11
#define PATH_SLASH_CHR			'/'
Packit Service bb5c11
#define PATH_SLASH_STR			"/"
Packit Service fa4841
Packit Service bb5c11
#define PATH_BACKSLASH_CHR		'\\'
Packit Service bb5c11
#define PATH_BACKSLASH_STR		"\\"
Packit Service fa4841
Packit Service fa4841
#ifdef _WIN32
Packit Service bb5c11
#define PATH_SLASH_STR_W		L"/"
Packit Service bb5c11
#define PATH_BACKSLASH_STR_W		L"\\"
Packit Service fa4841
#else
Packit Service bb5c11
#define PATH_SLASH_STR_W		"/"
Packit Service bb5c11
#define PATH_BACKSLASH_STR_W		"\\"
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#ifdef _WIN32
Packit Service bb5c11
#define PATH_SEPARATOR_CHR		PATH_BACKSLASH_CHR
Packit Service bb5c11
#define PATH_SEPARATOR_STR		PATH_BACKSLASH_STR
Packit Service bb5c11
#define PATH_SEPARATOR_STR_W		PATH_BACKSLASH_STR_W
Packit Service fa4841
#else
Packit Service bb5c11
#define PATH_SEPARATOR_CHR		PATH_SLASH_CHR
Packit Service bb5c11
#define PATH_SEPARATOR_STR		PATH_SLASH_STR
Packit Service bb5c11
#define PATH_SEPARATOR_STR_W		PATH_SLASH_STR_W
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service bb5c11
#define SHARED_LIBRARY_EXT_DLL		"dll"
Packit Service bb5c11
#define SHARED_LIBRARY_EXT_SO		"so"
Packit Service bb5c11
#define SHARED_LIBRARY_EXT_DYLIB	"dylib"
Packit Service fa4841
Packit Service fa4841
#ifdef _WIN32
Packit Service bb5c11
#define SHARED_LIBRARY_EXT		SHARED_LIBRARY_EXT_DLL
Packit Service fa4841
#elif defined(__APPLE__)
Packit Service bb5c11
#define SHARED_LIBRARY_EXT		SHARED_LIBRARY_EXT_DYLIB
Packit Service fa4841
#else
Packit Service bb5c11
#define SHARED_LIBRARY_EXT		SHARED_LIBRARY_EXT_SO
Packit Service fa4841
#endif
Packit Service fa4841
Packit Service fa4841
#include "../log.h"
Packit Service fa4841
#define TAG WINPR_TAG("path")
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchAddBackslash
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
/* Windows-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_BACKSLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR		PathCchAddBackslashA
Packit Service fa4841
#include "include/PathCchAddSeparator.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_BACKSLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR		PathCchAddBackslashW
Packit Service fa4841
#include "include/PathCchAddSeparator.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR
Packit Service fa4841
Packit Service fa4841
/* Unix-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR		PathCchAddSlashA
Packit Service fa4841
#include "include/PathCchAddSeparator.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR		PathCchAddSlashW
Packit Service fa4841
#include "include/PathCchAddSeparator.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR
Packit Service fa4841
Packit Service fa4841
/* Native-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SEPARATOR_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR		PathCchAddSeparatorA
Packit Service fa4841
#include "include/PathCchAddSeparator.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SEPARATOR_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR		PathCchAddSeparatorW
Packit Service fa4841
#include "include/PathCchAddSeparator.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchRemoveBackslash
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRemoveBackslashA(PSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRemoveBackslashW(PWSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchAddBackslashEx
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
/* Windows-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_BACKSLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR_EX	PathCchAddBackslashExA
Packit Service fa4841
#include "include/PathCchAddSeparatorEx.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR_EX
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_BACKSLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR_EX	PathCchAddBackslashExW
Packit Service fa4841
#include "include/PathCchAddSeparatorEx.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR_EX
Packit Service fa4841
Packit Service fa4841
/* Unix-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR_EX	PathCchAddSlashExA
Packit Service fa4841
#include "include/PathCchAddSeparatorEx.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR_EX
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR_EX	PathCchAddSlashExW
Packit Service fa4841
#include "include/PathCchAddSeparatorEx.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR_EX
Packit Service fa4841
Packit Service fa4841
/* Native-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SEPARATOR_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR_EX	PathCchAddSeparatorExA
Packit Service fa4841
#include "include/PathCchAddSeparatorEx.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR_EX
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SEPARATOR_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_SEPARATOR_EX	PathCchAddSeparatorExW
Packit Service fa4841
#include "include/PathCchAddSeparatorEx.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_SEPARATOR_EX
Packit Service fa4841
Packit Service bb5c11
HRESULT PathCchRemoveBackslashExA(PSTR pszPath, size_t cchPath, PSTR* ppszEnd, size_t* pcchRemaining)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service bb5c11
HRESULT PathCchRemoveBackslashExW(PWSTR pszPath, size_t cchPath, PWSTR* ppszEnd, size_t* pcchRemaining)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchAddExtension
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
/* Windows-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_BACKSLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_EXTENSION		PathCchAddExtensionA
Packit Service fa4841
#include "include/PathCchAddExtension.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_EXTENSION
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_BACKSLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_EXTENSION		PathCchAddExtensionW
Packit Service fa4841
#include "include/PathCchAddExtension.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_EXTENSION
Packit Service fa4841
Packit Service fa4841
/* Unix-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_EXTENSION		UnixPathCchAddExtensionA
Packit Service fa4841
#include "include/PathCchAddExtension.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_EXTENSION
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SLASH_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_EXTENSION		UnixPathCchAddExtensionW
Packit Service fa4841
#include "include/PathCchAddExtension.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_EXTENSION
Packit Service fa4841
Packit Service fa4841
/* Native-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SEPARATOR_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_EXTENSION		NativePathCchAddExtensionA
Packit Service fa4841
#include "include/PathCchAddExtension.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_EXTENSION
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE			TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR		PATH_SEPARATOR_CHR
Packit Service bb5c11
#define PATH_CCH_ADD_EXTENSION		NativePathCchAddExtensionW
Packit Service fa4841
#include "include/PathCchAddExtension.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef PATH_CCH_ADD_EXTENSION
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchAppend
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
/* Windows-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_BACKSLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_BACKSLASH_STR
Packit Service bb5c11
#define PATH_CCH_APPEND		PathCchAppendA
Packit Service fa4841
#include "include/PathCchAppend.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_CCH_APPEND
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_BACKSLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_BACKSLASH_STR_W
Packit Service bb5c11
#define PATH_CCH_APPEND		PathCchAppendW
Packit Service fa4841
#include "include/PathCchAppend.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_CCH_APPEND
Packit Service fa4841
Packit Service fa4841
/* Unix-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SLASH_STR
Packit Service bb5c11
#define PATH_CCH_APPEND		UnixPathCchAppendA
Packit Service fa4841
#include "include/PathCchAppend.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_CCH_APPEND
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SLASH_STR_W
Packit Service bb5c11
#define PATH_CCH_APPEND		UnixPathCchAppendW
Packit Service fa4841
#include "include/PathCchAppend.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_CCH_APPEND
Packit Service fa4841
Packit Service fa4841
/* Native-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SEPARATOR_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SEPARATOR_STR
Packit Service bb5c11
#define PATH_CCH_APPEND		NativePathCchAppendA
Packit Service fa4841
#include "include/PathCchAppend.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_CCH_APPEND
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SEPARATOR_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SEPARATOR_STR_W
Packit Service bb5c11
#define PATH_CCH_APPEND		NativePathCchAppendW
Packit Service fa4841
#include "include/PathCchAppend.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_CCH_APPEND
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchAppendEx
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchAppendExA(PSTR pszPath, size_t cchPath, PCSTR pszMore, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchAppendExW(PWSTR pszPath, size_t cchPath, PCWSTR pszMore, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchCanonicalize
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchCanonicalizeA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchCanonicalizeW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchCanonicalizeEx
Packit Service fa4841
 */
Packit Service fa4841
Packit Service bb5c11
HRESULT PathCchCanonicalizeExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service bb5c11
HRESULT PathCchCanonicalizeExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathAllocCanonicalize
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathAllocCanonicalizeA(PCSTR pszPathIn, unsigned long dwFlags, PSTR* ppszPathOut)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathAllocCanonicalizeW(PCWSTR pszPathIn, unsigned long dwFlags, PWSTR* ppszPathOut)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchCombine
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchCombineA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, PCSTR pszMore)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchCombineW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, PCWSTR pszMore)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathCchCombineEx
Packit Service fa4841
 */
Packit Service fa4841
Packit Service bb5c11
HRESULT PathCchCombineExA(PSTR pszPathOut, size_t cchPathOut, PCSTR pszPathIn, PCSTR pszMore, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service bb5c11
HRESULT PathCchCombineExW(PWSTR pszPathOut, size_t cchPathOut, PCWSTR pszPathIn, PCWSTR pszMore, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * PathAllocCombine
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
/* Windows-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_BACKSLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_BACKSLASH_STR
Packit Service bb5c11
#define PATH_ALLOC_COMBINE	PathAllocCombineA
Packit Service fa4841
#include "include/PathAllocCombine.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_ALLOC_COMBINE
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_BACKSLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_BACKSLASH_STR_W
Packit Service bb5c11
#define PATH_ALLOC_COMBINE	PathAllocCombineW
Packit Service fa4841
#include "include/PathAllocCombine.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_ALLOC_COMBINE
Packit Service fa4841
Packit Service fa4841
/* Unix-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SLASH_STR
Packit Service bb5c11
#define PATH_ALLOC_COMBINE	UnixPathAllocCombineA
Packit Service fa4841
#include "include/PathAllocCombine.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_ALLOC_COMBINE
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SLASH_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SLASH_STR_W
Packit Service bb5c11
#define PATH_ALLOC_COMBINE	UnixPathAllocCombineW
Packit Service fa4841
#include "include/PathAllocCombine.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_ALLOC_COMBINE
Packit Service fa4841
Packit Service fa4841
/* Native-style Paths */
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		FALSE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SEPARATOR_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SEPARATOR_STR
Packit Service bb5c11
#define PATH_ALLOC_COMBINE	NativePathAllocCombineA
Packit Service fa4841
#include "include/PathAllocCombine.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_ALLOC_COMBINE
Packit Service fa4841
Packit Service bb5c11
#define DEFINE_UNICODE		TRUE
Packit Service bb5c11
#define _PATH_SEPARATOR_CHR	PATH_SEPARATOR_CHR
Packit Service bb5c11
#define _PATH_SEPARATOR_STR	PATH_SEPARATOR_STR_W
Packit Service bb5c11
#define PATH_ALLOC_COMBINE	NativePathAllocCombineW
Packit Service fa4841
#include "include/PathAllocCombine.c"
Packit Service fa4841
#undef DEFINE_UNICODE
Packit Service fa4841
#undef _PATH_SEPARATOR_CHR
Packit Service fa4841
#undef _PATH_SEPARATOR_STR
Packit Service fa4841
#undef PATH_ALLOC_COMBINE
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchFindExtension
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchFindExtensionA(PCSTR pszPath, size_t cchPath, PCSTR* ppszExt)
Packit Service fa4841
{
Packit Service bb5c11
	char* p = (char*) pszPath;
Packit Service fa4841
Packit Service fa4841
	if (!pszPath || !cchPath || !ppszExt)
Packit Service fa4841
		return E_INVALIDARG;
Packit Service fa4841
Packit Service fa4841
	/* find end of string */
Packit Service fa4841
Packit Service fa4841
	while (*p && --cchPath)
Packit Service fa4841
	{
Packit Service fa4841
		p++;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (*p)
Packit Service fa4841
	{
Packit Service fa4841
		/* pszPath is not null terminated within the cchPath range */
Packit Service fa4841
		return E_INVALIDARG;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	/* If no extension is found, ppszExt must point to the string's terminating null */
Packit Service fa4841
	*ppszExt = p;
Packit Service fa4841
Packit Service fa4841
	/* search backwards for '.' */
Packit Service fa4841
Packit Service fa4841
	while (p > pszPath)
Packit Service fa4841
	{
Packit Service fa4841
		if (*p == '.')
Packit Service fa4841
		{
Packit Service bb5c11
			*ppszExt = (PCSTR) p;
Packit Service fa4841
			break;
Packit Service fa4841
		}
Packit Service fa4841
Packit Service fa4841
		if ((*p == '\\') || (*p == '/') || (*p == ':'))
Packit Service fa4841
			break;
Packit Service fa4841
Packit Service fa4841
		p--;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return S_OK;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchFindExtensionW(PCWSTR pszPath, size_t cchPath, PCWSTR* ppszExt)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchRenameExtension
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRenameExtensionA(PSTR pszPath, size_t cchPath, PCSTR pszExt)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRenameExtensionW(PWSTR pszPath, size_t cchPath, PCWSTR pszExt)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchRemoveExtension
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRemoveExtensionA(PSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRemoveExtensionW(PWSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchIsRoot
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
BOOL PathCchIsRootA(PCSTR pszPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL PathCchIsRootW(PCWSTR pszPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathIsUNCEx
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
BOOL PathIsUNCExA(PCSTR pszPath, PCSTR* ppszServer)
Packit Service fa4841
{
Packit Service fa4841
	if (!pszPath)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	if ((pszPath[0] == '\\') && (pszPath[1] == '\\'))
Packit Service fa4841
	{
Packit Service fa4841
		*ppszServer = &pszPath[2];
Packit Service fa4841
		return TRUE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
BOOL PathIsUNCExW(PCWSTR pszPath, PCWSTR* ppszServer)
Packit Service fa4841
{
Packit Service fa4841
	if (!pszPath)
Packit Service fa4841
		return FALSE;
Packit Service fa4841
Packit Service fa4841
	if ((pszPath[0] == '\\') && (pszPath[1] == '\\'))
Packit Service fa4841
	{
Packit Service fa4841
		*ppszServer = &pszPath[2];
Packit Service fa4841
		return TRUE;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchSkipRoot
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchSkipRootA(PCSTR pszPath, PCSTR* ppszRootEnd)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchSkipRootW(PCWSTR pszPath, PCWSTR* ppszRootEnd)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchStripToRoot
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchStripToRootA(PSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchStripToRootW(PWSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchStripPrefix
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchStripPrefixA(PSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	BOOL hasPrefix;
Packit Service fa4841
Packit Service fa4841
	if (!pszPath)
Packit Service fa4841
		return E_INVALIDARG;
Packit Service fa4841
Packit Service fa4841
	if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
Packit Service fa4841
		return E_INVALIDARG;
Packit Service fa4841
Packit Service bb5c11
	hasPrefix = ((pszPath[0] == '\\') && (pszPath[1] == '\\') &&
Packit Service bb5c11
		(pszPath[2] == '?') && (pszPath[3] == '\\')) ? TRUE : FALSE;
Packit Service fa4841
Packit Service fa4841
	if (hasPrefix)
Packit Service fa4841
	{
Packit Service fa4841
		if (cchPath < 6)
Packit Service fa4841
			return S_FALSE;
Packit Service fa4841
Packit Service fa4841
		if (IsCharAlpha(pszPath[4]) && (pszPath[5] == ':')) /* like C: */
Packit Service fa4841
		{
Packit Service fa4841
			memmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
Packit Service fa4841
			/* since the passed pszPath must not necessarily be null terminated
Packit Service fa4841
			 * and we always have enough space after the strip we can always
Packit Service fa4841
			 * ensure the null termination of the stripped result
Packit Service fa4841
			 */
Packit Service fa4841
			pszPath[cchPath - 4] = 0;
Packit Service fa4841
			return S_OK;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return S_FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchStripPrefixW(PWSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	BOOL hasPrefix;
Packit Service fa4841
Packit Service fa4841
	if (!pszPath)
Packit Service fa4841
		return E_INVALIDARG;
Packit Service fa4841
Packit Service fa4841
	if (cchPath < 4 || cchPath > PATHCCH_MAX_CCH)
Packit Service fa4841
		return E_INVALIDARG;
Packit Service fa4841
Packit Service bb5c11
	hasPrefix = ((pszPath[0] == '\\') && (pszPath[1] == '\\') &&
Packit Service bb5c11
		(pszPath[2] == '?') && (pszPath[3] == '\\')) ? TRUE : FALSE;
Packit Service fa4841
Packit Service fa4841
	if (hasPrefix)
Packit Service fa4841
	{
Packit Service fa4841
		if (cchPath < 6)
Packit Service fa4841
			return S_FALSE;
Packit Service fa4841
Packit Service bb5c11
		if (cchPath < (lstrlenW(&pszPath[4]) + 1))
Packit Service fa4841
			return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
Packit Service fa4841
Packit Service bb5c11
		if (IsCharAlpha(pszPath[4]) && (pszPath[5] == ':')) /* like C: */
Packit Service fa4841
		{
Packit Service fa4841
			wmemmove_s(pszPath, cchPath, &pszPath[4], cchPath - 4);
Packit Service fa4841
			/* since the passed pszPath must not necessarily be null terminated
Packit Service fa4841
			 * and we always have enough space after the strip we can always
Packit Service fa4841
			 * ensure the null termination of the stripped result
Packit Service fa4841
			 */
Packit Service fa4841
			pszPath[cchPath - 4] = 0;
Packit Service fa4841
			return S_OK;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return S_FALSE;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchRemoveFileSpec
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRemoveFileSpecA(PSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchRemoveFileSpecW(PWSTR pszPath, size_t cchPath)
Packit Service fa4841
{
Packit Service fa4841
	WLog_ERR(TAG, "%s: not implemented", __FUNCTION__);
Packit Service fa4841
	return E_NOTIMPL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/*
Packit Service fa4841
 * Path Portability Functions
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathCchConvertStyle
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchConvertStyleA(PSTR pszPath, size_t cchPath, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	size_t index;
Packit Service fa4841
Packit Service fa4841
	if (dwFlags == PATH_STYLE_WINDOWS)
Packit Service fa4841
	{
Packit Service fa4841
		for (index = 0; index < cchPath; index++)
Packit Service fa4841
		{
Packit Service fa4841
			if (pszPath[index] == PATH_SLASH_CHR)
Packit Service fa4841
				pszPath[index] = PATH_BACKSLASH_CHR;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_UNIX)
Packit Service fa4841
	{
Packit Service fa4841
		for (index = 0; index < cchPath; index++)
Packit Service fa4841
		{
Packit Service fa4841
			if (pszPath[index] == PATH_BACKSLASH_CHR)
Packit Service fa4841
				pszPath[index] = PATH_SLASH_CHR;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_NATIVE)
Packit Service fa4841
	{
Packit Service fa4841
		if (PATH_SEPARATOR_CHR == PATH_BACKSLASH_CHR)
Packit Service fa4841
		{
Packit Service fa4841
			/* Unix-style to Windows-style */
Packit Service fa4841
Packit Service fa4841
			for (index = 0; index < cchPath; index++)
Packit Service fa4841
			{
Packit Service fa4841
				if (pszPath[index] == PATH_SLASH_CHR)
Packit Service fa4841
					pszPath[index] = PATH_BACKSLASH_CHR;
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
		else if (PATH_SEPARATOR_CHR == PATH_SLASH_CHR)
Packit Service fa4841
		{
Packit Service fa4841
			/* Windows-style to Unix-style */
Packit Service fa4841
Packit Service fa4841
			for (index = 0; index < cchPath; index++)
Packit Service fa4841
			{
Packit Service fa4841
				if (pszPath[index] == PATH_BACKSLASH_CHR)
Packit Service fa4841
					pszPath[index] = PATH_SLASH_CHR;
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
		else
Packit Service fa4841
		{
Packit Service fa4841
			/* Unexpected error */
Packit Service fa4841
			return E_FAIL;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
		/* Gangnam style? */
Packit Service fa4841
		return E_FAIL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return S_OK;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
HRESULT PathCchConvertStyleW(PWSTR pszPath, size_t cchPath, unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	size_t index;
Packit Service fa4841
Packit Service fa4841
	if (dwFlags == PATH_STYLE_WINDOWS)
Packit Service fa4841
	{
Packit Service fa4841
		for (index = 0; index < cchPath; index++)
Packit Service fa4841
		{
Packit Service fa4841
			if (pszPath[index] == PATH_SLASH_CHR)
Packit Service fa4841
				pszPath[index] = PATH_BACKSLASH_CHR;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_UNIX)
Packit Service fa4841
	{
Packit Service fa4841
		for (index = 0; index < cchPath; index++)
Packit Service fa4841
		{
Packit Service fa4841
			if (pszPath[index] == PATH_BACKSLASH_CHR)
Packit Service fa4841
				pszPath[index] = PATH_SLASH_CHR;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_NATIVE)
Packit Service fa4841
	{
Packit Service fa4841
		if (PATH_SEPARATOR_CHR == PATH_BACKSLASH_CHR)
Packit Service fa4841
		{
Packit Service fa4841
			/* Unix-style to Windows-style */
Packit Service fa4841
Packit Service fa4841
			for (index = 0; index < cchPath; index++)
Packit Service fa4841
			{
Packit Service fa4841
				if (pszPath[index] == PATH_SLASH_CHR)
Packit Service fa4841
					pszPath[index] = PATH_BACKSLASH_CHR;
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
		else if (PATH_SEPARATOR_CHR == PATH_SLASH_CHR)
Packit Service fa4841
		{
Packit Service fa4841
			/* Windows-style to Unix-style */
Packit Service fa4841
Packit Service fa4841
			for (index = 0; index < cchPath; index++)
Packit Service fa4841
			{
Packit Service fa4841
				if (pszPath[index] == PATH_BACKSLASH_CHR)
Packit Service fa4841
					pszPath[index] = PATH_SLASH_CHR;
Packit Service fa4841
			}
Packit Service fa4841
		}
Packit Service fa4841
		else
Packit Service fa4841
		{
Packit Service fa4841
			/* Unexpected error */
Packit Service fa4841
			return E_FAIL;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
		/* Gangnam style? */
Packit Service fa4841
		return E_FAIL;
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return S_OK;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathGetSeparator
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
char PathGetSeparatorA(unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	char separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
Packit Service fa4841
	if (!dwFlags)
Packit Service fa4841
		dwFlags = PATH_STYLE_NATIVE;
Packit Service fa4841
Packit Service fa4841
	if (dwFlags == PATH_STYLE_WINDOWS)
Packit Service fa4841
		separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_UNIX)
Packit Service fa4841
		separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_NATIVE)
Packit Service fa4841
		separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
Packit Service fa4841
	return separator;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
WCHAR PathGetSeparatorW(unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	WCHAR separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
Packit Service fa4841
	if (!dwFlags)
Packit Service fa4841
		dwFlags = PATH_STYLE_NATIVE;
Packit Service fa4841
Packit Service fa4841
	if (dwFlags == PATH_STYLE_WINDOWS)
Packit Service fa4841
		separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_UNIX)
Packit Service fa4841
		separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
	else if (dwFlags == PATH_STYLE_NATIVE)
Packit Service fa4841
		separator = PATH_SEPARATOR_CHR;
Packit Service fa4841
Packit Service fa4841
	return separator;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
/**
Packit Service fa4841
 * PathGetSharedLibraryExtension
Packit Service fa4841
 */
Packit Service fa4841
Packit Service fa4841
static const CHAR SharedLibraryExtensionDllA[] = "dll";
Packit Service fa4841
static const CHAR SharedLibraryExtensionSoA[] = "so";
Packit Service fa4841
static const CHAR SharedLibraryExtensionDylibA[] = "dylib";
Packit Service fa4841
Packit Service bb5c11
static const WCHAR SharedLibraryExtensionDllW[] = { 'd','l','l','\0' };
Packit Service bb5c11
static const WCHAR SharedLibraryExtensionSoW[] = { 's','o','\0' };
Packit Service bb5c11
static const WCHAR SharedLibraryExtensionDylibW[] = { 'd','y','l','i','b','\0' };
Packit Service fa4841
Packit Service fa4841
static const CHAR SharedLibraryExtensionDotDllA[] = ".dll";
Packit Service fa4841
static const CHAR SharedLibraryExtensionDotSoA[] = ".so";
Packit Service fa4841
static const CHAR SharedLibraryExtensionDotDylibA[] = ".dylib";
Packit Service fa4841
Packit Service bb5c11
static const WCHAR SharedLibraryExtensionDotDllW[] = { '.','d','l','l','\0' };
Packit Service bb5c11
static const WCHAR SharedLibraryExtensionDotSoW[] = { '.','s','o','\0' };
Packit Service bb5c11
static const WCHAR SharedLibraryExtensionDotDylibW[] = { '.','d','y','l','i','b','\0' };
Packit Service fa4841
Packit Service fa4841
PCSTR PathGetSharedLibraryExtensionA(unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
Packit Service fa4841
	{
Packit Service fa4841
		if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
Packit Service fa4841
		{
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
Packit Service fa4841
				return SharedLibraryExtensionDotDllA;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
Packit Service fa4841
				return SharedLibraryExtensionDotSoA;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
Packit Service fa4841
				return SharedLibraryExtensionDotDylibA;
Packit Service fa4841
		}
Packit Service fa4841
		else
Packit Service fa4841
		{
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
Packit Service fa4841
				return SharedLibraryExtensionDllA;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
Packit Service fa4841
				return SharedLibraryExtensionSoA;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
Packit Service fa4841
				return SharedLibraryExtensionDylibA;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
Packit Service fa4841
	{
Packit Service fa4841
#ifdef _WIN32
Packit Service fa4841
		return SharedLibraryExtensionDotDllA;
Packit Service fa4841
#elif defined(__APPLE__)
Packit Service fa4841
		if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
Packit Service fa4841
			return SharedLibraryExtensionDotSoA;
Packit Service fa4841
		else
Packit Service fa4841
			return SharedLibraryExtensionDotDylibA;
Packit Service fa4841
#else
Packit Service fa4841
		return SharedLibraryExtensionDotSoA;
Packit Service fa4841
#endif
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
#ifdef _WIN32
Packit Service fa4841
		return SharedLibraryExtensionDllA;
Packit Service fa4841
#elif defined(__APPLE__)
Packit Service fa4841
		if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
Packit Service fa4841
			return SharedLibraryExtensionSoA;
Packit Service fa4841
		else
Packit Service fa4841
			return SharedLibraryExtensionDylibA;
Packit Service fa4841
#else
Packit Service fa4841
		return SharedLibraryExtensionSoA;
Packit Service fa4841
#endif
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return NULL;
Packit Service fa4841
}
Packit Service fa4841
Packit Service fa4841
PCWSTR PathGetSharedLibraryExtensionW(unsigned long dwFlags)
Packit Service fa4841
{
Packit Service fa4841
	if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT)
Packit Service fa4841
	{
Packit Service fa4841
		if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
Packit Service fa4841
		{
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
Packit Service fa4841
				return SharedLibraryExtensionDotDllW;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
Packit Service fa4841
				return SharedLibraryExtensionDotSoW;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
Packit Service fa4841
				return SharedLibraryExtensionDotDylibW;
Packit Service fa4841
		}
Packit Service fa4841
		else
Packit Service fa4841
		{
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DLL)
Packit Service fa4841
				return SharedLibraryExtensionDllW;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_SO)
Packit Service fa4841
				return SharedLibraryExtensionSoW;
Packit Service fa4841
Packit Service fa4841
			if (dwFlags & PATH_SHARED_LIB_EXT_EXPLICIT_DYLIB)
Packit Service fa4841
				return SharedLibraryExtensionDylibW;
Packit Service fa4841
		}
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	if (dwFlags & PATH_SHARED_LIB_EXT_WITH_DOT)
Packit Service fa4841
	{
Packit Service fa4841
#ifdef _WIN32
Packit Service fa4841
		return SharedLibraryExtensionDotDllW;
Packit Service fa4841
#elif defined(__APPLE__)
Packit Service fa4841
		if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
Packit Service fa4841
			return SharedLibraryExtensionDotSoW;
Packit Service fa4841
		else
Packit Service fa4841
			return SharedLibraryExtensionDotDylibW;
Packit Service fa4841
#else
Packit Service fa4841
		return SharedLibraryExtensionDotSoW;
Packit Service fa4841
#endif
Packit Service fa4841
	}
Packit Service fa4841
	else
Packit Service fa4841
	{
Packit Service fa4841
#ifdef _WIN32
Packit Service fa4841
		return SharedLibraryExtensionDllW;
Packit Service fa4841
#elif defined(__APPLE__)
Packit Service fa4841
		if (dwFlags & PATH_SHARED_LIB_EXT_APPLE_SO)
Packit Service fa4841
			return SharedLibraryExtensionSoW;
Packit Service fa4841
		else
Packit Service fa4841
			return SharedLibraryExtensionDylibW;
Packit Service fa4841
#else
Packit Service fa4841
		return SharedLibraryExtensionSoW;
Packit Service fa4841
#endif
Packit Service fa4841
	}
Packit Service fa4841
Packit Service fa4841
	return NULL;
Packit Service fa4841
}