kernelbase: Build with msvcrt.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
bdd48b41d3
commit
483de1a8a2
|
@ -1,5 +1,6 @@
|
||||||
MODULE = kernelbase.dll
|
MODULE = kernelbase.dll
|
||||||
IMPORTS = uuid advapi32
|
IMPORTS = uuid advapi32 ntdll winecrt0 kernel32
|
||||||
|
EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -mno-cygwin
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
main.c \
|
main.c \
|
||||||
|
|
|
@ -31,6 +31,16 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(kernelbase);
|
WINE_DEFAULT_DEBUG_CHANNEL(kernelbase);
|
||||||
|
|
||||||
|
|
||||||
|
/*************************************************************
|
||||||
|
* DllMainCRTStartup
|
||||||
|
*/
|
||||||
|
BOOL WINAPI DllMainCRTStartup( HANDLE inst, DWORD reason, LPVOID reserved )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* AppPolicyGetProcessTerminationMethod (KERNELBASE.@)
|
* AppPolicyGetProcessTerminationMethod (KERNELBASE.@)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
|
@ -30,10 +31,14 @@
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "wine/heap.h"
|
#include "wine/heap.h"
|
||||||
#include "wine/unicode.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(path);
|
WINE_DEFAULT_DEBUG_CHANNEL(path);
|
||||||
|
|
||||||
|
#define iswalnum(ch) (iswctype((ch), C1_ALPHA|C1_DIGIT|C1_LOWER|C1_UPPER))
|
||||||
|
#define isxdigit(ch) (((ch) >= '0' && (ch) <= '9') || \
|
||||||
|
((ch) >= 'A' && (ch) <= 'F') || \
|
||||||
|
((ch) >= 'a' && (ch) <= 'f'))
|
||||||
|
|
||||||
static const char hexDigits[] = "0123456789ABCDEF";
|
static const char hexDigits[] = "0123456789ABCDEF";
|
||||||
|
|
||||||
static const unsigned char hashdata_lookup[256] =
|
static const unsigned char hashdata_lookup[256] =
|
||||||
|
@ -108,13 +113,13 @@ static SIZE_T strnlenW(const WCHAR *string, SIZE_T maxlen)
|
||||||
static BOOL is_prefixed_unc(const WCHAR *string)
|
static BOOL is_prefixed_unc(const WCHAR *string)
|
||||||
{
|
{
|
||||||
static const WCHAR prefixed_unc[] = {'\\', '\\', '?', '\\', 'U', 'N', 'C', '\\'};
|
static const WCHAR prefixed_unc[] = {'\\', '\\', '?', '\\', 'U', 'N', 'C', '\\'};
|
||||||
return !strncmpiW(string, prefixed_unc, ARRAY_SIZE(prefixed_unc));
|
return !wcsnicmp(string, prefixed_unc, ARRAY_SIZE(prefixed_unc));
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL is_prefixed_disk(const WCHAR *string)
|
static BOOL is_prefixed_disk(const WCHAR *string)
|
||||||
{
|
{
|
||||||
static const WCHAR prefix[] = {'\\', '\\', '?', '\\'};
|
static const WCHAR prefix[] = {'\\', '\\', '?', '\\'};
|
||||||
return !strncmpW(string, prefix, ARRAY_SIZE(prefix)) && isalphaW(string[4]) && string[5] == ':';
|
return !wcsncmp(string, prefix, ARRAY_SIZE(prefix)) && iswalpha(string[4]) && string[5] == ':';
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL is_prefixed_volume(const WCHAR *string)
|
static BOOL is_prefixed_volume(const WCHAR *string)
|
||||||
|
@ -123,7 +128,7 @@ static BOOL is_prefixed_volume(const WCHAR *string)
|
||||||
const WCHAR *guid;
|
const WCHAR *guid;
|
||||||
INT i = 0;
|
INT i = 0;
|
||||||
|
|
||||||
if (strncmpiW(string, prefixed_volume, ARRAY_SIZE(prefixed_volume))) return FALSE;
|
if (wcsnicmp(string, prefixed_volume, ARRAY_SIZE(prefixed_volume))) return FALSE;
|
||||||
|
|
||||||
guid = string + ARRAY_SIZE(prefixed_volume);
|
guid = string + ARRAY_SIZE(prefixed_volume);
|
||||||
|
|
||||||
|
@ -144,7 +149,7 @@ static BOOL is_prefixed_volume(const WCHAR *string)
|
||||||
if (guid[i] != '}') return FALSE;
|
if (guid[i] != '}') return FALSE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if (!isalnumW(guid[i])) return FALSE;
|
if (!iswxdigit(guid[i])) return FALSE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
@ -187,7 +192,7 @@ static const WCHAR *get_root_end(const WCHAR *path)
|
||||||
else if (path[0] == '\\')
|
else if (path[0] == '\\')
|
||||||
return path;
|
return path;
|
||||||
/* X:\ */
|
/* X:\ */
|
||||||
else if (isalphaW(path[0]) && path[1] == ':')
|
else if (iswalpha(path[0]) && path[1] == ':')
|
||||||
return path[2] == '\\' ? path + 2 : path + 1;
|
return path[2] == '\\' ? path + 2 : path + 1;
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -212,7 +217,7 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
length = strlenW(path_in);
|
length = lstrlenW(path_in);
|
||||||
if ((length + 1 > MAX_PATH && !(flags & (PATHCCH_ALLOW_LONG_PATHS | PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH)))
|
if ((length + 1 > MAX_PATH && !(flags & (PATHCCH_ALLOW_LONG_PATHS | PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH)))
|
||||||
|| (length + 1 > PATHCCH_MAX_CCH))
|
|| (length + 1 > PATHCCH_MAX_CCH))
|
||||||
{
|
{
|
||||||
|
@ -246,12 +251,12 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
|
||||||
if(PathCchStripPrefix(dst, length + 6) == S_OK)
|
if(PathCchStripPrefix(dst, length + 6) == S_OK)
|
||||||
{
|
{
|
||||||
/* Fill in \ in X:\ if the \ is missing */
|
/* Fill in \ in X:\ if the \ is missing */
|
||||||
if(isalphaW(dst[0]) && dst[1] == ':' && dst[2]!= '\\')
|
if(iswalpha(dst[0]) && dst[1] == ':' && dst[2]!= '\\')
|
||||||
{
|
{
|
||||||
dst[2] = '\\';
|
dst[2] = '\\';
|
||||||
dst[3] = 0;
|
dst[3] = 0;
|
||||||
}
|
}
|
||||||
dst = buffer + strlenW(buffer);
|
dst = buffer + lstrlenW(buffer);
|
||||||
root_end = dst;
|
root_end = dst;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -331,7 +336,7 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If X:\ is not complete, then complete it */
|
/* If X:\ is not complete, then complete it */
|
||||||
if (isalphaW(buffer[0]) && buffer[1] == ':' && buffer[2] != '\\')
|
if (iswalpha(buffer[0]) && buffer[1] == ':' && buffer[2] != '\\')
|
||||||
{
|
{
|
||||||
root_end = buffer + 2;
|
root_end = buffer + 2;
|
||||||
dst = buffer + 3;
|
dst = buffer + 3;
|
||||||
|
@ -355,9 +360,9 @@ HRESULT WINAPI PathAllocCanonicalize(const WCHAR *path_in, DWORD flags, WCHAR **
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Extend the path if needed */
|
/* Extend the path if needed */
|
||||||
length = strlenW(buffer);
|
length = lstrlenW(buffer);
|
||||||
if (((length + 1 > MAX_PATH && isalphaW(buffer[0]) && buffer[1] == ':')
|
if (((length + 1 > MAX_PATH && iswalpha(buffer[0]) && buffer[1] == ':')
|
||||||
|| (isalphaW(buffer[0]) && buffer[1] == ':' && flags & PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH))
|
|| (iswalpha(buffer[0]) && buffer[1] == ':' && flags & PATHCCH_ENSURE_IS_EXTENDED_LENGTH_PATH))
|
||||||
&& !(flags & PATHCCH_FORCE_ENABLE_LONG_NAME_PROCESS))
|
&& !(flags & PATHCCH_FORCE_ENABLE_LONG_NAME_PROCESS))
|
||||||
{
|
{
|
||||||
memmove(buffer + 4, buffer, (length + 1) * sizeof(WCHAR));
|
memmove(buffer + 4, buffer, (length + 1) * sizeof(WCHAR));
|
||||||
|
@ -393,16 +398,16 @@ HRESULT WINAPI PathAllocCombine(const WCHAR *path1, const WCHAR *path2, DWORD fl
|
||||||
if (!path1 || !path2) return PathAllocCanonicalize(path1 ? path1 : path2, flags, out);
|
if (!path1 || !path2) return PathAllocCanonicalize(path1 ? path1 : path2, flags, out);
|
||||||
|
|
||||||
/* If path2 is fully qualified, use path2 only */
|
/* If path2 is fully qualified, use path2 only */
|
||||||
if ((isalphaW(path2[0]) && path2[1] == ':') || (path2[0] == '\\' && path2[1] == '\\'))
|
if ((iswalpha(path2[0]) && path2[1] == ':') || (path2[0] == '\\' && path2[1] == '\\'))
|
||||||
{
|
{
|
||||||
path1 = path2;
|
path1 = path2;
|
||||||
path2 = NULL;
|
path2 = NULL;
|
||||||
from_path2 = TRUE;
|
from_path2 = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
length2 = path2 ? strlenW(path2) : 0;
|
length2 = path2 ? lstrlenW(path2) : 0;
|
||||||
/* path1 length + path2 length + possible backslash + NULL */
|
/* path1 length + path2 length + possible backslash + NULL */
|
||||||
combined_length = strlenW(path1) + length2 + 2;
|
combined_length = lstrlenW(path1) + length2 + 2;
|
||||||
|
|
||||||
combined_path = HeapAlloc(GetProcessHeap(), 0, combined_length * sizeof(WCHAR));
|
combined_path = HeapAlloc(GetProcessHeap(), 0, combined_length * sizeof(WCHAR));
|
||||||
if (!combined_path)
|
if (!combined_path)
|
||||||
|
@ -444,7 +449,7 @@ HRESULT WINAPI PathCchAddBackslashEx(WCHAR *path, SIZE_T size, WCHAR **endptr, S
|
||||||
|
|
||||||
TRACE("%s, %lu, %p, %p\n", debugstr_w(path), size, endptr, remaining);
|
TRACE("%s, %lu, %p, %p\n", debugstr_w(path), size, endptr, remaining);
|
||||||
|
|
||||||
length = strlenW(path);
|
length = lstrlenW(path);
|
||||||
needs_termination = size && length && path[length - 1] != '\\';
|
needs_termination = size && length && path[length - 1] != '\\';
|
||||||
|
|
||||||
if (length >= (needs_termination ? size - 1 : size))
|
if (length >= (needs_termination ? size - 1 : size))
|
||||||
|
@ -496,7 +501,7 @@ HRESULT WINAPI PathCchAddExtension(WCHAR *path, SIZE_T size, const WCHAR *extens
|
||||||
|
|
||||||
path_length = strnlenW(path, size);
|
path_length = strnlenW(path, size);
|
||||||
dot_length = has_dot ? 0 : 1;
|
dot_length = has_dot ? 0 : 1;
|
||||||
extension_length = strlenW(extension);
|
extension_length = lstrlenW(extension);
|
||||||
|
|
||||||
if (path_length + dot_length + extension_length + 1 > size) return STRSAFE_E_INSUFFICIENT_BUFFER;
|
if (path_length + dot_length + extension_length + 1 > size) return STRSAFE_E_INSUFFICIENT_BUFFER;
|
||||||
|
|
||||||
|
@ -509,7 +514,7 @@ HRESULT WINAPI PathCchAddExtension(WCHAR *path, SIZE_T size, const WCHAR *extens
|
||||||
path_length++;
|
path_length++;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpyW(path + path_length, extension);
|
lstrcpyW(path + path_length, extension);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,7 +555,7 @@ HRESULT WINAPI PathCchCanonicalize(WCHAR *out, SIZE_T size, const WCHAR *in)
|
||||||
TRACE("%p %lu %s\n", out, size, wine_dbgstr_w(in));
|
TRACE("%p %lu %s\n", out, size, wine_dbgstr_w(in));
|
||||||
|
|
||||||
/* Not X:\ and path > MAX_PATH - 4, return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE) */
|
/* Not X:\ and path > MAX_PATH - 4, return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE) */
|
||||||
if (strlenW(in) > MAX_PATH - 4 && !(isalphaW(in[0]) && in[1] == ':' && in[2] == '\\'))
|
if (lstrlenW(in) > MAX_PATH - 4 && !(iswalpha(in[0]) && in[1] == ':' && in[2] == '\\'))
|
||||||
return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
|
return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
|
||||||
|
|
||||||
return PathCchCanonicalizeEx(out, size, in, PATHCCH_NONE);
|
return PathCchCanonicalizeEx(out, size, in, PATHCCH_NONE);
|
||||||
|
@ -569,11 +574,11 @@ HRESULT WINAPI PathCchCanonicalizeEx(WCHAR *out, SIZE_T size, const WCHAR *in, D
|
||||||
hr = PathAllocCanonicalize(in, flags, &buffer);
|
hr = PathAllocCanonicalize(in, flags, &buffer);
|
||||||
if (FAILED(hr)) return hr;
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
length = strlenW(buffer);
|
length = lstrlenW(buffer);
|
||||||
if (size < length + 1)
|
if (size < length + 1)
|
||||||
{
|
{
|
||||||
/* No root and path > MAX_PATH - 4, return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE) */
|
/* No root and path > MAX_PATH - 4, return HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE) */
|
||||||
if (length > MAX_PATH - 4 && !(in[0] == '\\' || (isalphaW(in[0]) && in[1] == ':' && in[2] == '\\')))
|
if (length > MAX_PATH - 4 && !(in[0] == '\\' || (iswalpha(in[0]) && in[1] == ':' && in[2] == '\\')))
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
|
hr = HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE);
|
||||||
else
|
else
|
||||||
hr = STRSAFE_E_INSUFFICIENT_BUFFER;
|
hr = STRSAFE_E_INSUFFICIENT_BUFFER;
|
||||||
|
@ -584,7 +589,7 @@ HRESULT WINAPI PathCchCanonicalizeEx(WCHAR *out, SIZE_T size, const WCHAR *in, D
|
||||||
memcpy(out, buffer, (length + 1) * sizeof(WCHAR));
|
memcpy(out, buffer, (length + 1) * sizeof(WCHAR));
|
||||||
|
|
||||||
/* Fill a backslash at the end of X: */
|
/* Fill a backslash at the end of X: */
|
||||||
if (isalphaW(out[0]) && out[1] == ':' && !out[2] && size > 3)
|
if (iswalpha(out[0]) && out[1] == ':' && !out[2] && size > 3)
|
||||||
{
|
{
|
||||||
out[2] = '\\';
|
out[2] = '\\';
|
||||||
out[3] = 0;
|
out[3] = 0;
|
||||||
|
@ -619,7 +624,7 @@ HRESULT WINAPI PathCchCombineEx(WCHAR *out, SIZE_T size, const WCHAR *path1, con
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
length = strlenW(buffer);
|
length = lstrlenW(buffer);
|
||||||
if (length + 1 > size)
|
if (length + 1 > size)
|
||||||
{
|
{
|
||||||
out[0] = 0;
|
out[0] = 0;
|
||||||
|
@ -792,7 +797,7 @@ HRESULT WINAPI PathCchRemoveFileSpec(WCHAR *path, SIZE_T size)
|
||||||
&& (is_prefixed_unc(path) || (path[0] == '\\' && path[1] == '\\' && path[2] != '?')))
|
&& (is_prefixed_unc(path) || (path[0] == '\\' && path[1] == '\\' && path[2] != '?')))
|
||||||
root_end--;
|
root_end--;
|
||||||
|
|
||||||
length = strlenW(path);
|
length = lstrlenW(path);
|
||||||
last = path + length - 1;
|
last = path + length - 1;
|
||||||
while (last >= path && (!root_end || last >= root_end))
|
while (last >= path && (!root_end || last >= root_end))
|
||||||
{
|
{
|
||||||
|
@ -830,7 +835,7 @@ HRESULT WINAPI PathCchSkipRoot(const WCHAR *path, const WCHAR **root_end)
|
||||||
TRACE("%s %p\n", debugstr_w(path), root_end);
|
TRACE("%s %p\n", debugstr_w(path), root_end);
|
||||||
|
|
||||||
if (!path || !path[0] || !root_end
|
if (!path || !path[0] || !root_end
|
||||||
|| (!strncmpiW(unc_prefix, path, ARRAY_SIZE(unc_prefix)) && !is_prefixed_volume(path) && !is_prefixed_unc(path)
|
|| (!wcsnicmp(unc_prefix, path, ARRAY_SIZE(unc_prefix)) && !is_prefixed_volume(path) && !is_prefixed_unc(path)
|
||||||
&& !is_prefixed_disk(path)))
|
&& !is_prefixed_disk(path)))
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
@ -864,15 +869,15 @@ HRESULT WINAPI PathCchStripPrefix(WCHAR *path, SIZE_T size)
|
||||||
if (is_prefixed_unc(path))
|
if (is_prefixed_unc(path))
|
||||||
{
|
{
|
||||||
/* \\?\UNC\a -> \\a */
|
/* \\?\UNC\a -> \\a */
|
||||||
if (size < strlenW(path + 8) + 3) return E_INVALIDARG;
|
if (size < lstrlenW(path + 8) + 3) return E_INVALIDARG;
|
||||||
strcpyW(path + 2, path + 8);
|
lstrcpyW(path + 2, path + 8);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
else if (is_prefixed_disk(path))
|
else if (is_prefixed_disk(path))
|
||||||
{
|
{
|
||||||
/* \\?\C:\ -> C:\ */
|
/* \\?\C:\ -> C:\ */
|
||||||
if (size < strlenW(path + 4) + 1) return E_INVALIDARG;
|
if (size < lstrlenW(path + 4) + 1) return E_INVALIDARG;
|
||||||
strcpyW(path, path + 4);
|
lstrcpyW(path, path + 4);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1231,7 +1236,7 @@ LPWSTR WINAPI PathAddBackslashW(WCHAR *path)
|
||||||
|
|
||||||
TRACE("%s\n", wine_dbgstr_w(path));
|
TRACE("%s\n", wine_dbgstr_w(path));
|
||||||
|
|
||||||
if (!path || (len = strlenW(path)) >= MAX_PATH)
|
if (!path || (len = lstrlenW(path)) >= MAX_PATH)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (len)
|
if (len)
|
||||||
|
@ -1315,11 +1320,11 @@ BOOL WINAPI PathAddExtensionW(WCHAR *path, const WCHAR *ext)
|
||||||
if (!path || !ext || *(PathFindExtensionW(path)))
|
if (!path || !ext || *(PathFindExtensionW(path)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
len = strlenW(path);
|
len = lstrlenW(path);
|
||||||
if (len + strlenW(ext) >= MAX_PATH)
|
if (len + lstrlenW(ext) >= MAX_PATH)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
strcpyW(path + len, ext);
|
lstrcpyW(path + len, ext);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1490,13 +1495,13 @@ WCHAR * WINAPI PathCombineW(WCHAR *dst, const WCHAR *dir, const WCHAR *file)
|
||||||
file++; /* Skip '\' */
|
file++; /* Skip '\' */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PathAddBackslashW(tmp) || strlenW(tmp) + strlenW(file) >= MAX_PATH)
|
if (!PathAddBackslashW(tmp) || lstrlenW(tmp) + lstrlenW(file) >= MAX_PATH)
|
||||||
{
|
{
|
||||||
dst[0] = 0;
|
dst[0] = 0;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcatW(tmp, file);
|
lstrcatW(tmp, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
PathCanonicalizeW(dst, tmp);
|
PathCanonicalizeW(dst, tmp);
|
||||||
|
@ -1646,7 +1651,7 @@ int WINAPI PathCommonPrefixW(const WCHAR *file1, const WCHAR *file2, WCHAR *path
|
||||||
if ((!*iter1 || *iter1 == '\\') && (!*iter2 || *iter2 == '\\'))
|
if ((!*iter1 || *iter1 == '\\') && (!*iter2 || *iter2 == '\\'))
|
||||||
len = iter1 - file1; /* Common to this point */
|
len = iter1 - file1; /* Common to this point */
|
||||||
|
|
||||||
if (!*iter1 || (tolowerW(*iter1) != tolowerW(*iter2)))
|
if (!*iter1 || (towlower(*iter1) != towlower(*iter2)))
|
||||||
break; /* Strings differ at this point */
|
break; /* Strings differ at this point */
|
||||||
|
|
||||||
iter1++;
|
iter1++;
|
||||||
|
@ -1676,7 +1681,7 @@ BOOL WINAPI PathIsPrefixW(const WCHAR *prefix, const WCHAR *path)
|
||||||
{
|
{
|
||||||
TRACE("%s, %s\n", wine_dbgstr_w(prefix), wine_dbgstr_w(path));
|
TRACE("%s, %s\n", wine_dbgstr_w(prefix), wine_dbgstr_w(path));
|
||||||
|
|
||||||
return prefix && path && PathCommonPrefixW(path, prefix, NULL) == (int)strlenW(prefix);
|
return prefix && path && PathCommonPrefixW(path, prefix, NULL) == (int)lstrlenW(prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
char * WINAPI PathFindFileNameA(const char *path)
|
char * WINAPI PathFindFileNameA(const char *path)
|
||||||
|
@ -1773,7 +1778,7 @@ UINT WINAPI PathGetCharTypeW(WCHAR ch)
|
||||||
{
|
{
|
||||||
if (ch < 126)
|
if (ch < 126)
|
||||||
{
|
{
|
||||||
if (((ch & 0x1) && ch != ';') || !ch || isalnum(ch) || ch == '$' || ch == '&' || ch == '(' ||
|
if (((ch & 0x1) && ch != ';') || !ch || iswalnum(ch) || ch == '$' || ch == '&' || ch == '(' ||
|
||||||
ch == '.' || ch == '@' || ch == '^' || ch == '\'' || ch == 130 || ch == '`')
|
ch == '.' || ch == '@' || ch == '^' || ch == '\'' || ch == 130 || ch == '`')
|
||||||
{
|
{
|
||||||
flags |= GCT_SHORTCHAR; /* All these are valid for DOS */
|
flags |= GCT_SHORTCHAR; /* All these are valid for DOS */
|
||||||
|
@ -1797,9 +1802,11 @@ int WINAPI PathGetDriveNumberA(const char *path)
|
||||||
{
|
{
|
||||||
TRACE("%s\n", wine_dbgstr_a(path));
|
TRACE("%s\n", wine_dbgstr_a(path));
|
||||||
|
|
||||||
if (path && !IsDBCSLeadByte(*path) && path[1] == ':' && tolower(*path) >= 'a' && tolower(*path) <= 'z')
|
if (path && !IsDBCSLeadByte(*path) && path[1] == ':')
|
||||||
return tolower(*path) - 'a';
|
{
|
||||||
|
if (*path >= 'a' && *path <= 'z') return *path - 'a';
|
||||||
|
if (*path >= 'A' && *path <= 'Z') return *path - 'A';
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1813,10 +1820,10 @@ int WINAPI PathGetDriveNumberW(const WCHAR *path)
|
||||||
if (!path)
|
if (!path)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!strncmpW(path, nt_prefixW, 4))
|
if (!wcsncmp(path, nt_prefixW, 4))
|
||||||
path += 4;
|
path += 4;
|
||||||
|
|
||||||
drive = tolowerW(path[0]);
|
drive = towlower(path[0]);
|
||||||
if (drive < 'a' || drive > 'z' || path[1] != ':')
|
if (drive < 'a' || drive > 'z' || path[1] != ':')
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -1881,7 +1888,7 @@ BOOL WINAPI PathIsUNCServerW(const WCHAR *path)
|
||||||
if (!(path && path[0] == '\\' && path[1] == '\\'))
|
if (!(path && path[0] == '\\' && path[1] == '\\'))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return !strchrW(path + 2, '\\');
|
return !wcschr(path + 2, '\\');
|
||||||
}
|
}
|
||||||
|
|
||||||
void WINAPI PathRemoveBlanksA(char *path)
|
void WINAPI PathRemoveBlanksA(char *path)
|
||||||
|
@ -1977,10 +1984,10 @@ BOOL WINAPI PathRenameExtensionW(WCHAR *path, const WCHAR *ext)
|
||||||
|
|
||||||
extension = PathFindExtensionW(path);
|
extension = PathFindExtensionW(path);
|
||||||
|
|
||||||
if (!extension || (extension - path + strlenW(ext) >= MAX_PATH))
|
if (!extension || (extension - path + lstrlenW(ext) >= MAX_PATH))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
strcpyW(extension, ext);
|
lstrcpyW(extension, ext);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2011,7 +2018,7 @@ void WINAPI PathUnquoteSpacesW(WCHAR *path)
|
||||||
if (!path || *path != '"')
|
if (!path || *path != '"')
|
||||||
return;
|
return;
|
||||||
|
|
||||||
len = strlenW(path) - 1;
|
len = lstrlenW(path) - 1;
|
||||||
if (path[len] == '"')
|
if (path[len] == '"')
|
||||||
{
|
{
|
||||||
path[len] = '\0';
|
path[len] = '\0';
|
||||||
|
@ -2045,7 +2052,7 @@ WCHAR * WINAPI PathRemoveBackslashW(WCHAR *path)
|
||||||
if (!path)
|
if (!path)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ptr = path + strlenW(path);
|
ptr = path + lstrlenW(path);
|
||||||
if (ptr > path) ptr--;
|
if (ptr > path) ptr--;
|
||||||
if (!PathIsRootW(path) && *ptr == '\\')
|
if (!PathIsRootW(path) && *ptr == '\\')
|
||||||
*ptr = '\0';
|
*ptr = '\0';
|
||||||
|
@ -2260,7 +2267,7 @@ WCHAR * WINAPI PathFindNextComponentW(const WCHAR *path)
|
||||||
return slash + 1;
|
return slash + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (WCHAR *)path + strlenW(path);
|
return (WCHAR *)path + lstrlenW(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
char * WINAPI PathSkipRootA(const char *path)
|
char * WINAPI PathSkipRootA(const char *path)
|
||||||
|
@ -2331,7 +2338,7 @@ void WINAPI PathStripPathW(WCHAR *path)
|
||||||
TRACE("%s\n", wine_dbgstr_w(path));
|
TRACE("%s\n", wine_dbgstr_w(path));
|
||||||
filename = PathFindFileNameW(path);
|
filename = PathFindFileNameW(path);
|
||||||
if (filename != path)
|
if (filename != path)
|
||||||
RtlMoveMemory(path, filename, (strlenW(filename) + 1) * sizeof(WCHAR));
|
RtlMoveMemory(path, filename, (lstrlenW(filename) + 1) * sizeof(WCHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI PathSearchAndQualifyA(const char *path, char *buffer, UINT length)
|
BOOL WINAPI PathSearchAndQualifyA(const char *path, char *buffer, UINT length)
|
||||||
|
@ -2411,7 +2418,7 @@ BOOL WINAPI PathRelativePathToW(WCHAR *path, const WCHAR *from, DWORD attributes
|
||||||
while (*from)
|
while (*from)
|
||||||
{
|
{
|
||||||
from = PathFindNextComponentW(from);
|
from = PathFindNextComponentW(from);
|
||||||
strcatW(path, *from ? szPrevDirSlash : szPrevDir);
|
lstrcatW(path, *from ? szPrevDirSlash : szPrevDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* From the root add the components of 'to' */
|
/* From the root add the components of 'to' */
|
||||||
|
@ -2421,74 +2428,34 @@ BOOL WINAPI PathRelativePathToW(WCHAR *path, const WCHAR *from, DWORD attributes
|
||||||
{
|
{
|
||||||
if (*to != '\\')
|
if (*to != '\\')
|
||||||
to--;
|
to--;
|
||||||
len = strlenW(path);
|
len = lstrlenW(path);
|
||||||
if (len + strlenW(to) >= MAX_PATH)
|
if (len + lstrlenW(to) >= MAX_PATH)
|
||||||
{
|
{
|
||||||
*path = '\0';
|
*path = '\0';
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
strcpyW(path + len, to);
|
lstrcpyW(path + len, to);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL path_match_maskA(const char *name, const char *mask)
|
|
||||||
{
|
|
||||||
while (*name && *mask && *mask != ';')
|
|
||||||
{
|
|
||||||
if (*mask == '*')
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (path_match_maskA(name, mask + 1))
|
|
||||||
return TRUE; /* try substrings */
|
|
||||||
} while (*name++);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (toupper(*mask) != toupper(*name) && *mask != '?')
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
name = CharNextA(name);
|
|
||||||
mask = CharNextA(mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!*name)
|
|
||||||
{
|
|
||||||
while (*mask == '*')
|
|
||||||
mask++;
|
|
||||||
if (!*mask || *mask == ';')
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
BOOL WINAPI PathMatchSpecA(const char *path, const char *mask)
|
BOOL WINAPI PathMatchSpecA(const char *path, const char *mask)
|
||||||
{
|
{
|
||||||
|
WCHAR *pathW, *maskW;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
TRACE("%s, %s\n", wine_dbgstr_a(path), wine_dbgstr_a(mask));
|
TRACE("%s, %s\n", wine_dbgstr_a(path), wine_dbgstr_a(mask));
|
||||||
|
|
||||||
if (!lstrcmpA(mask, "*.*"))
|
if (!lstrcmpA(mask, "*.*"))
|
||||||
return TRUE; /* Matches every path */
|
return TRUE; /* Matches every path */
|
||||||
|
|
||||||
while (*mask)
|
pathW = heap_strdupAtoW( path );
|
||||||
{
|
maskW = heap_strdupAtoW( mask );
|
||||||
while (*mask == ' ')
|
ret = PathMatchSpecW( pathW, maskW );
|
||||||
mask++; /* Eat leading spaces */
|
heap_free( pathW );
|
||||||
|
heap_free( maskW );
|
||||||
if (path_match_maskA(path, mask))
|
return ret;
|
||||||
return TRUE; /* Matches the current mask */
|
|
||||||
|
|
||||||
while (*mask && *mask != ';')
|
|
||||||
mask = CharNextA(mask); /* masks separated by ';' */
|
|
||||||
|
|
||||||
if (*mask == ';')
|
|
||||||
mask++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL path_match_maskW(const WCHAR *name, const WCHAR *mask)
|
static BOOL path_match_maskW(const WCHAR *name, const WCHAR *mask)
|
||||||
|
@ -2505,7 +2472,7 @@ static BOOL path_match_maskW(const WCHAR *name, const WCHAR *mask)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (toupperW(*mask) != toupperW(*name) && *mask != '?')
|
if (towupper(*mask) != towupper(*name) && *mask != '?')
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
name++;
|
name++;
|
||||||
|
@ -2574,7 +2541,7 @@ void WINAPI PathQuoteSpacesW(WCHAR *path)
|
||||||
|
|
||||||
if (path && StrChrW(path, ' '))
|
if (path && StrChrW(path, ' '))
|
||||||
{
|
{
|
||||||
int len = strlenW(path) + 1;
|
int len = lstrlenW(path) + 1;
|
||||||
|
|
||||||
if (len + 2 < MAX_PATH)
|
if (len + 2 < MAX_PATH)
|
||||||
{
|
{
|
||||||
|
@ -2756,13 +2723,13 @@ BOOL WINAPI PathUnExpandEnvStringsW(const WCHAR *path, WCHAR *buffer, UINT buf_l
|
||||||
|
|
||||||
TRACE("%s, %p, %d\n", debugstr_w(path), buffer, buf_len);
|
TRACE("%s, %p, %d\n", debugstr_w(path), buffer, buf_len);
|
||||||
|
|
||||||
pathlen = strlenW(path);
|
pathlen = lstrlenW(path);
|
||||||
init_envvars_map(envvars);
|
init_envvars_map(envvars);
|
||||||
cur = envvars;
|
cur = envvars;
|
||||||
while (cur->var)
|
while (cur->var)
|
||||||
{
|
{
|
||||||
/* path can't contain expanded value or value wasn't retrieved */
|
/* path can't contain expanded value or value wasn't retrieved */
|
||||||
if (cur->len == 0 || cur->len > pathlen || strncmpiW(cur->path, path, cur->len))
|
if (cur->len == 0 || cur->len > pathlen || wcsnicmp(cur->path, path, cur->len))
|
||||||
{
|
{
|
||||||
cur++;
|
cur++;
|
||||||
continue;
|
continue;
|
||||||
|
@ -2777,8 +2744,8 @@ BOOL WINAPI PathUnExpandEnvStringsW(const WCHAR *path, WCHAR *buffer, UINT buf_l
|
||||||
needed = match->varlen + pathlen - match->len;
|
needed = match->varlen + pathlen - match->len;
|
||||||
if (match->len == 0 || needed > buf_len) return FALSE;
|
if (match->len == 0 || needed > buf_len) return FALSE;
|
||||||
|
|
||||||
strcpyW(buffer, match->var);
|
lstrcpyW(buffer, match->var);
|
||||||
strcatW(buffer, &path[match->len]);
|
lstrcatW(buffer, &path[match->len]);
|
||||||
TRACE("ret %s\n", debugstr_w(buffer));
|
TRACE("ret %s\n", debugstr_w(buffer));
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -2817,8 +2784,8 @@ static DWORD get_scheme_code(const WCHAR *scheme, DWORD scheme_len)
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(url_schemes); ++i)
|
for (i = 0; i < ARRAY_SIZE(url_schemes); ++i)
|
||||||
{
|
{
|
||||||
if (scheme_len == strlenW(url_schemes[i].scheme_name)
|
if (scheme_len == lstrlenW(url_schemes[i].scheme_name)
|
||||||
&& !strncmpiW(scheme, url_schemes[i].scheme_name, scheme_len))
|
&& !wcsnicmp(scheme, url_schemes[i].scheme_name, scheme_len))
|
||||||
return url_schemes[i].scheme_number;
|
return url_schemes[i].scheme_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2836,7 +2803,8 @@ HRESULT WINAPI ParseURLA(const char *url, PARSEDURLA *result)
|
||||||
if (result->cbSize != sizeof(*result))
|
if (result->cbSize != sizeof(*result))
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
while (*ptr && (isalnum(*ptr) || *ptr == '-' || *ptr == '+' || *ptr == '.'))
|
while (*ptr && ((*ptr >= 'a' && *ptr <= 'z') || (*ptr >= 'A' && *ptr <= 'Z') ||
|
||||||
|
(*ptr >= '0' && *ptr <= '9') || *ptr == '-' || *ptr == '+' || *ptr == '.'))
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
if (*ptr != ':' || ptr <= url + 1)
|
if (*ptr != ':' || ptr <= url + 1)
|
||||||
|
@ -2865,7 +2833,7 @@ HRESULT WINAPI ParseURLW(const WCHAR *url, PARSEDURLW *result)
|
||||||
if (result->cbSize != sizeof(*result))
|
if (result->cbSize != sizeof(*result))
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
while (*ptr && (isalnumW(*ptr) || *ptr == '-' || *ptr == '+' || *ptr == '.'))
|
while (*ptr && (iswalnum(*ptr) || *ptr == '-' || *ptr == '+' || *ptr == '.'))
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
if (*ptr != ':' || ptr <= url + 1)
|
if (*ptr != ':' || ptr <= url + 1)
|
||||||
|
@ -2877,7 +2845,7 @@ HRESULT WINAPI ParseURLW(const WCHAR *url, PARSEDURLW *result)
|
||||||
result->pszProtocol = url;
|
result->pszProtocol = url;
|
||||||
result->cchProtocol = ptr - url;
|
result->cchProtocol = ptr - url;
|
||||||
result->pszSuffix = ptr + 1;
|
result->pszSuffix = ptr + 1;
|
||||||
result->cchSuffix = strlenW(result->pszSuffix);
|
result->cchSuffix = lstrlenW(result->pszSuffix);
|
||||||
result->nScheme = get_scheme_code(url, ptr - url);
|
result->nScheme = get_scheme_code(url, ptr - url);
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -2976,7 +2944,7 @@ HRESULT WINAPI UrlUnescapeW(WCHAR *url, WCHAR *unescaped, DWORD *unescaped_len,
|
||||||
stop_unescaping = TRUE;
|
stop_unescaping = TRUE;
|
||||||
next = *src;
|
next = *src;
|
||||||
}
|
}
|
||||||
else if (*src == '%' && isxdigitW(*(src + 1)) && isxdigitW(*(src + 2)) && !stop_unescaping)
|
else if (*src == '%' && iswxdigit(*(src + 1)) && iswxdigit(*(src + 2)) && !stop_unescaping)
|
||||||
{
|
{
|
||||||
INT ih;
|
INT ih;
|
||||||
WCHAR buf[5] = {'0','x',0};
|
WCHAR buf[5] = {'0','x',0};
|
||||||
|
@ -3100,7 +3068,7 @@ HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case 3:
|
case 3:
|
||||||
/* 'file:///' (implied localhost) + escaped DOS path */
|
/* 'file:///' (implied localhost) + escaped DOS path */
|
||||||
if (!isalphaW(*src) || (src[1] != ':' && src[1] != '|'))
|
if (!iswalpha(*src) || (src[1] != ':' && src[1] != '|'))
|
||||||
src -= 1;
|
src -= 1;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
@ -3110,7 +3078,7 @@ HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath
|
||||||
/* 'file://localhost/' + escaped DOS path */
|
/* 'file://localhost/' + escaped DOS path */
|
||||||
src += 10;
|
src += 10;
|
||||||
}
|
}
|
||||||
else if (isalphaW(*src) && (src[1] == ':' || src[1] == '|'))
|
else if (iswalpha(*src) && (src[1] == ':' || src[1] == '|'))
|
||||||
{
|
{
|
||||||
/* 'file://' + unescaped DOS path */
|
/* 'file://' + unescaped DOS path */
|
||||||
unescape = 0;
|
unescape = 0;
|
||||||
|
@ -3127,7 +3095,7 @@ HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath
|
||||||
len = src - url;
|
len = src - url;
|
||||||
StrCpyNW(dst, url, len + 1);
|
StrCpyNW(dst, url, len + 1);
|
||||||
dst += len;
|
dst += len;
|
||||||
if (*src && isalphaW(src[1]) && (src[2] == ':' || src[2] == '|'))
|
if (*src && iswalpha(src[1]) && (src[2] == ':' || src[2] == '|'))
|
||||||
{
|
{
|
||||||
/* 'Forget' to add a trailing '/', just like Windows */
|
/* 'Forget' to add a trailing '/', just like Windows */
|
||||||
src++;
|
src++;
|
||||||
|
@ -3137,7 +3105,7 @@ HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath
|
||||||
case 4:
|
case 4:
|
||||||
/* 'file://' + unescaped UNC path (\\server\share\path) */
|
/* 'file://' + unescaped UNC path (\\server\share\path) */
|
||||||
unescape = 0;
|
unescape = 0;
|
||||||
if (isalphaW(*src) && (src[1] == ':' || src[1] == '|'))
|
if (iswalpha(*src) && (src[1] == ':' || src[1] == '|'))
|
||||||
break;
|
break;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
default:
|
default:
|
||||||
|
@ -3147,12 +3115,12 @@ HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath
|
||||||
|
|
||||||
/* Copy the remainder of the path */
|
/* Copy the remainder of the path */
|
||||||
len += lstrlenW(src);
|
len += lstrlenW(src);
|
||||||
strcpyW(dst, src);
|
lstrcpyW(dst, src);
|
||||||
|
|
||||||
/* First do the Windows-specific path conversions */
|
/* First do the Windows-specific path conversions */
|
||||||
for (dst = tpath; *dst; dst++)
|
for (dst = tpath; *dst; dst++)
|
||||||
if (*dst == '/') *dst = '\\';
|
if (*dst == '/') *dst = '\\';
|
||||||
if (isalphaW(*tpath) && tpath[1] == '|')
|
if (iswalpha(*tpath) && tpath[1] == '|')
|
||||||
tpath[1] = ':'; /* c| -> c: */
|
tpath[1] = ':'; /* c| -> c: */
|
||||||
|
|
||||||
/* And only then unescape the path (i.e. escaped slashes are left as is) */
|
/* And only then unescape the path (i.e. escaped slashes are left as is) */
|
||||||
|
@ -3175,7 +3143,7 @@ HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath
|
||||||
{
|
{
|
||||||
*pcchPath = len;
|
*pcchPath = len;
|
||||||
if (tpath != path)
|
if (tpath != path)
|
||||||
strcpyW(path, tpath);
|
lstrcpyW(path, tpath);
|
||||||
}
|
}
|
||||||
if (tpath != path)
|
if (tpath != path)
|
||||||
heap_free(tpath);
|
heap_free(tpath);
|
||||||
|
@ -3255,7 +3223,7 @@ static BOOL url_needs_escape(WCHAR ch, DWORD flags, DWORD int_flags)
|
||||||
if (ch <= 31 || (ch >= 127 && ch <= 255) )
|
if (ch <= 31 || (ch >= 127 && ch <= 255) )
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (isalnumW(ch))
|
if (iswalnum(ch))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
|
@ -3421,7 +3389,7 @@ HRESULT WINAPI UrlEscapeW(const WCHAR *url, WCHAR *escaped, DWORD *escaped_len,
|
||||||
slashes++;
|
slashes++;
|
||||||
cur = *++src;
|
cur = *++src;
|
||||||
}
|
}
|
||||||
if (slashes == 2 && !strncmpiW(src, localhost, localhost_len)) { /* file://localhost/ -> file:/// */
|
if (slashes == 2 && !wcsnicmp(src, localhost, localhost_len)) { /* file://localhost/ -> file:/// */
|
||||||
if(*(src + localhost_len) == '/' || *(src + localhost_len) == '\\')
|
if(*(src + localhost_len) == '/' || *(src + localhost_len) == '\\')
|
||||||
src += localhost_len + 1;
|
src += localhost_len + 1;
|
||||||
slashes = 3;
|
slashes = 3;
|
||||||
|
@ -3580,7 +3548,7 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove '\t' characters from URL */
|
/* Remove '\t' characters from URL */
|
||||||
nByteLen = (strlenW(src_url) + 1) * sizeof(WCHAR); /* length in bytes */
|
nByteLen = (lstrlenW(src_url) + 1) * sizeof(WCHAR); /* length in bytes */
|
||||||
url = HeapAlloc(GetProcessHeap(), 0, nByteLen);
|
url = HeapAlloc(GetProcessHeap(), 0, nByteLen);
|
||||||
if(!url)
|
if(!url)
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
|
@ -3603,7 +3571,7 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
is_file_url = !strncmpW(wszFile, url, ARRAY_SIZE(wszFile));
|
is_file_url = !wcsncmp(wszFile, url, ARRAY_SIZE(wszFile));
|
||||||
|
|
||||||
if ((nByteLen >= sizeof(wszHttp) && !memcmp(wszHttp, url, sizeof(wszHttp))) || is_file_url)
|
if ((nByteLen >= sizeof(wszHttp) && !memcmp(wszHttp, url, sizeof(wszHttp))) || is_file_url)
|
||||||
slash = '/';
|
slash = '/';
|
||||||
|
@ -3658,9 +3626,9 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (!isalnumW(*wk1)) {state = 3; break;}
|
if (!iswalnum(*wk1)) {state = 3; break;}
|
||||||
*wk2++ = *wk1++;
|
*wk2++ = *wk1++;
|
||||||
if (!isalnumW(*wk1)) {state = 3; break;}
|
if (!iswalnum(*wk1)) {state = 3; break;}
|
||||||
*wk2++ = *wk1++;
|
*wk2++ = *wk1++;
|
||||||
state = 1;
|
state = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -3689,7 +3657,7 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
while (*body == '/')
|
while (*body == '/')
|
||||||
++body;
|
++body;
|
||||||
|
|
||||||
if (isalnumW(*body) && *(body+1) == ':')
|
if (iswalnum(*body) && *(body+1) == ':')
|
||||||
{
|
{
|
||||||
if (!(flags & (URL_WININET_COMPATIBILITY | URL_FILE_USE_PATHURL)))
|
if (!(flags & (URL_WININET_COMPATIBILITY | URL_FILE_USE_PATHURL)))
|
||||||
{
|
{
|
||||||
|
@ -3729,7 +3697,7 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
state = 4;
|
state = 4;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
nWkLen = strlenW(wk1);
|
nWkLen = lstrlenW(wk1);
|
||||||
memcpy(wk2, wk1, (nWkLen + 1) * sizeof(WCHAR));
|
memcpy(wk2, wk1, (nWkLen + 1) * sizeof(WCHAR));
|
||||||
mp = wk2;
|
mp = wk2;
|
||||||
wk1 += nWkLen;
|
wk1 += nWkLen;
|
||||||
|
@ -3746,12 +3714,12 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (!isalnumW(*wk1) && (*wk1 != '-') && (*wk1 != '.') && (*wk1 != ':'))
|
if (!iswalnum(*wk1) && (*wk1 != '-') && (*wk1 != '.') && (*wk1 != ':'))
|
||||||
{
|
{
|
||||||
state = 3;
|
state = 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
while (isalnumW(*wk1) || (*wk1 == '-') || (*wk1 == '.') || (*wk1 == ':'))
|
while (iswalnum(*wk1) || (*wk1 == '-') || (*wk1 == '.') || (*wk1 == ':'))
|
||||||
*wk2++ = *wk1++;
|
*wk2++ = *wk1++;
|
||||||
state = 5;
|
state = 5;
|
||||||
if (!*wk1)
|
if (!*wk1)
|
||||||
|
@ -3791,13 +3759,13 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
root = wk2-1;
|
root = wk2-1;
|
||||||
while (*wk1)
|
while (*wk1)
|
||||||
{
|
{
|
||||||
mp = strchrW(wk1, '/');
|
mp = wcschr(wk1, '/');
|
||||||
mp2 = strchrW(wk1, '\\');
|
mp2 = wcschr(wk1, '\\');
|
||||||
if (mp2 && (!mp || mp2 < mp))
|
if (mp2 && (!mp || mp2 < mp))
|
||||||
mp = mp2;
|
mp = mp2;
|
||||||
if (!mp)
|
if (!mp)
|
||||||
{
|
{
|
||||||
nWkLen = strlenW(wk1);
|
nWkLen = lstrlenW(wk1);
|
||||||
memcpy(wk2, wk1, (nWkLen + 1) * sizeof(WCHAR));
|
memcpy(wk2, wk1, (nWkLen + 1) * sizeof(WCHAR));
|
||||||
wk1 += nWkLen;
|
wk1 += nWkLen;
|
||||||
wk2 += nWkLen;
|
wk2 += nWkLen;
|
||||||
|
@ -3830,8 +3798,8 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
|
||||||
/* case /../ -> need to backup wk2 */
|
/* case /../ -> need to backup wk2 */
|
||||||
TRACE("found '/../'\n");
|
TRACE("found '/../'\n");
|
||||||
*(wk2-1) = '\0'; /* set end of string */
|
*(wk2-1) = '\0'; /* set end of string */
|
||||||
mp = strrchrW(root, '/');
|
mp = wcsrchr(root, '/');
|
||||||
mp2 = strrchrW(root, '\\');
|
mp2 = wcsrchr(root, '\\');
|
||||||
if (mp2 && (!mp || mp2 < mp))
|
if (mp2 && (!mp || mp2 < mp))
|
||||||
mp = mp2;
|
mp = mp2;
|
||||||
if (mp && (mp >= root))
|
if (mp && (mp >= root))
|
||||||
|
@ -3975,15 +3943,15 @@ static HRESULT url_guess_scheme(const WCHAR *url, WCHAR *out, DWORD *out_len)
|
||||||
}
|
}
|
||||||
if ((i == value_len) && !j)
|
if ((i == value_len) && !j)
|
||||||
{
|
{
|
||||||
if (strlenW(data) + strlenW(url) + 1 > *out_len)
|
if (lstrlenW(data) + lstrlenW(url) + 1 > *out_len)
|
||||||
{
|
{
|
||||||
*out_len = strlenW(data) + strlenW(url) + 1;
|
*out_len = lstrlenW(data) + lstrlenW(url) + 1;
|
||||||
RegCloseKey(newkey);
|
RegCloseKey(newkey);
|
||||||
return E_POINTER;
|
return E_POINTER;
|
||||||
}
|
}
|
||||||
strcpyW(out, data);
|
lstrcpyW(out, data);
|
||||||
strcatW(out, url);
|
lstrcatW(out, url);
|
||||||
*out_len = strlenW(out);
|
*out_len = lstrlenW(out);
|
||||||
TRACE("matched and set to %s\n", wine_dbgstr_w(out));
|
TRACE("matched and set to %s\n", wine_dbgstr_w(out));
|
||||||
RegCloseKey(newkey);
|
RegCloseKey(newkey);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
|
@ -4008,7 +3976,7 @@ static HRESULT url_create_from_path(const WCHAR *path, WCHAR *url, DWORD *url_le
|
||||||
{
|
{
|
||||||
if (parsed_url.nScheme != URL_SCHEME_INVALID && parsed_url.cchProtocol > 1)
|
if (parsed_url.nScheme != URL_SCHEME_INVALID && parsed_url.cchProtocol > 1)
|
||||||
{
|
{
|
||||||
needed = strlenW(path);
|
needed = lstrlenW(path);
|
||||||
if (needed >= *url_len)
|
if (needed >= *url_len)
|
||||||
{
|
{
|
||||||
*url_len = needed + 1;
|
*url_len = needed + 1;
|
||||||
|
@ -4022,11 +3990,11 @@ static HRESULT url_create_from_path(const WCHAR *path, WCHAR *url, DWORD *url_le
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
new_url = heap_alloc((strlenW(path) + 9) * sizeof(WCHAR)); /* "file:///" + path length + 1 */
|
new_url = heap_alloc((lstrlenW(path) + 9) * sizeof(WCHAR)); /* "file:///" + path length + 1 */
|
||||||
strcpyW(new_url, file_colonW);
|
lstrcpyW(new_url, file_colonW);
|
||||||
if (isalphaW(path[0]) && path[1] == ':')
|
if (iswalpha(path[0]) && path[1] == ':')
|
||||||
strcatW(new_url, three_slashesW);
|
lstrcatW(new_url, three_slashesW);
|
||||||
strcatW(new_url, path);
|
lstrcatW(new_url, path);
|
||||||
hr = UrlEscapeW(new_url, url, url_len, URL_ESCAPE_PERCENT);
|
hr = UrlEscapeW(new_url, url, url_len, URL_ESCAPE_PERCENT);
|
||||||
heap_free(new_url);
|
heap_free(new_url);
|
||||||
return hr;
|
return hr;
|
||||||
|
@ -4050,14 +4018,14 @@ static HRESULT url_apply_default_scheme(const WCHAR *url, WCHAR *out, DWORD *len
|
||||||
data_len = sizeof(data);
|
data_len = sizeof(data);
|
||||||
RegQueryValueExW(newkey, NULL, 0, &dwType, (BYTE *)data, &data_len);
|
RegQueryValueExW(newkey, NULL, 0, &dwType, (BYTE *)data, &data_len);
|
||||||
RegCloseKey(newkey);
|
RegCloseKey(newkey);
|
||||||
if (strlenW(data) + strlenW(url) + 1 > *length)
|
if (lstrlenW(data) + lstrlenW(url) + 1 > *length)
|
||||||
{
|
{
|
||||||
*length = strlenW(data) + strlenW(url) + 1;
|
*length = lstrlenW(data) + lstrlenW(url) + 1;
|
||||||
return E_POINTER;
|
return E_POINTER;
|
||||||
}
|
}
|
||||||
strcpyW(out, data);
|
lstrcpyW(out, data);
|
||||||
strcatW(out, url);
|
lstrcatW(out, url);
|
||||||
*length = strlenW(out);
|
*length = lstrlenW(out);
|
||||||
TRACE("used default %s\n", wine_dbgstr_w(out));
|
TRACE("used default %s\n", wine_dbgstr_w(out));
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
@ -4138,15 +4106,15 @@ INT WINAPI UrlCompareW(const WCHAR *url1, const WCHAR *url2, BOOL ignore_slash)
|
||||||
INT ret;
|
INT ret;
|
||||||
|
|
||||||
if (!ignore_slash)
|
if (!ignore_slash)
|
||||||
return strcmpW(url1, url2);
|
return lstrcmpW(url1, url2);
|
||||||
len1 = strlenW(url1);
|
len1 = lstrlenW(url1);
|
||||||
if (url1[len1-1] == '/') len1--;
|
if (url1[len1-1] == '/') len1--;
|
||||||
len2 = strlenW(url2);
|
len2 = lstrlenW(url2);
|
||||||
if (url2[len2-1] == '/') len2--;
|
if (url2[len2-1] == '/') len2--;
|
||||||
if (len1 == len2)
|
if (len1 == len2)
|
||||||
return strncmpW(url1, url2, len1);
|
return wcsncmp(url1, url2, len1);
|
||||||
len = min(len1, len2);
|
len = min(len1, len2);
|
||||||
ret = strncmpW(url1, url2, len);
|
ret = wcsncmp(url1, url2, len);
|
||||||
if (ret) return ret;
|
if (ret) return ret;
|
||||||
if (len1 > len2) return 1;
|
if (len1 > len2) return 1;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -4193,11 +4161,11 @@ const WCHAR * WINAPI UrlGetLocationW(const WCHAR *url)
|
||||||
if (ParseURLW(url, &base) != S_OK) return NULL; /* invalid scheme */
|
if (ParseURLW(url, &base) != S_OK) return NULL; /* invalid scheme */
|
||||||
|
|
||||||
/* if scheme is file: then never return pointer */
|
/* if scheme is file: then never return pointer */
|
||||||
if (!strncmpW(base.pszProtocol, fileW, min(4, base.cchProtocol)))
|
if (!wcsncmp(base.pszProtocol, fileW, min(4, base.cchProtocol)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* Look for '#' and return its addr */
|
/* Look for '#' and return its addr */
|
||||||
return strchrW(base.pszSuffix, '#');
|
return wcschr(base.pszSuffix, '#');
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI UrlGetPartA(const char *url, char *out, DWORD *out_len, DWORD part, DWORD flags)
|
HRESULT WINAPI UrlGetPartA(const char *url, char *out, DWORD *out_len, DWORD part, DWORD flags)
|
||||||
|
@ -4247,8 +4215,8 @@ static const WCHAR * scan_url(const WCHAR *start, DWORD *size, enum url_scan_typ
|
||||||
case SCHEME:
|
case SCHEME:
|
||||||
while (cont)
|
while (cont)
|
||||||
{
|
{
|
||||||
if ((islowerW(*start) && isalphaW(*start)) ||
|
if ((iswlower(*start) && iswalpha(*start)) ||
|
||||||
isdigitW(*start) || *start == '+' || *start == '-' || *start == '.')
|
iswdigit(*start) || *start == '+' || *start == '-' || *start == '.')
|
||||||
{
|
{
|
||||||
start++;
|
start++;
|
||||||
(*size)++;
|
(*size)++;
|
||||||
|
@ -4263,8 +4231,8 @@ static const WCHAR * scan_url(const WCHAR *start, DWORD *size, enum url_scan_typ
|
||||||
case USERPASS:
|
case USERPASS:
|
||||||
while (cont)
|
while (cont)
|
||||||
{
|
{
|
||||||
if (isalphaW(*start) ||
|
if (iswalpha(*start) ||
|
||||||
isdigitW(*start) ||
|
iswdigit(*start) ||
|
||||||
/* user/password only characters */
|
/* user/password only characters */
|
||||||
(*start == ';') ||
|
(*start == ';') ||
|
||||||
(*start == '?') ||
|
(*start == '?') ||
|
||||||
|
@ -4290,7 +4258,7 @@ static const WCHAR * scan_url(const WCHAR *start, DWORD *size, enum url_scan_typ
|
||||||
}
|
}
|
||||||
else if (*start == '%')
|
else if (*start == '%')
|
||||||
{
|
{
|
||||||
if (isxdigitW(*(start + 1)) && isxdigitW(*(start + 2)))
|
if (iswxdigit(*(start + 1)) && iswxdigit(*(start + 2)))
|
||||||
{
|
{
|
||||||
start += 3;
|
start += 3;
|
||||||
*size += 3;
|
*size += 3;
|
||||||
|
@ -4305,7 +4273,7 @@ static const WCHAR * scan_url(const WCHAR *start, DWORD *size, enum url_scan_typ
|
||||||
case PORT:
|
case PORT:
|
||||||
while (cont)
|
while (cont)
|
||||||
{
|
{
|
||||||
if (isdigitW(*start))
|
if (iswdigit(*start))
|
||||||
{
|
{
|
||||||
start++;
|
start++;
|
||||||
(*size)++;
|
(*size)++;
|
||||||
|
@ -4318,7 +4286,7 @@ static const WCHAR * scan_url(const WCHAR *start, DWORD *size, enum url_scan_typ
|
||||||
case HOST:
|
case HOST:
|
||||||
while (cont)
|
while (cont)
|
||||||
{
|
{
|
||||||
if (isalnumW(*start) || *start == '-' || *start == '.' || *start == ' ' || *start == '*')
|
if (iswalnum(*start) || *start == '-' || *start == '.' || *start == ' ' || *start == '*')
|
||||||
{
|
{
|
||||||
start++;
|
start++;
|
||||||
(*size)++;
|
(*size)++;
|
||||||
|
@ -4393,8 +4361,8 @@ static LONG parse_url(const WCHAR *url, struct parsed_url *pl)
|
||||||
if (*work == '/')
|
if (*work == '/')
|
||||||
{
|
{
|
||||||
/* see if query string */
|
/* see if query string */
|
||||||
pl->query = strchrW(work, '?');
|
pl->query = wcschr(work, '?');
|
||||||
if (pl->query) pl->query_len = strlenW(pl->query);
|
if (pl->query) pl->query_len = lstrlenW(pl->query);
|
||||||
}
|
}
|
||||||
SuccessExit:
|
SuccessExit:
|
||||||
TRACE("parse successful: scheme=%p(%d), user=%p(%d), pass=%p(%d), host=%p(%d), port=%p(%d), query=%p(%d)\n",
|
TRACE("parse successful: scheme=%p(%d), user=%p(%d), pass=%p(%d), host=%p(%d), port=%p(%d), query=%p(%d)\n",
|
||||||
|
@ -4422,7 +4390,7 @@ HRESULT WINAPI UrlGetPartW(const WCHAR *url, WCHAR *out, DWORD *out_len, DWORD p
|
||||||
|
|
||||||
*out = '\0';
|
*out = '\0';
|
||||||
|
|
||||||
addr = strchrW(url, ':');
|
addr = wcschr(url, ':');
|
||||||
if (!addr)
|
if (!addr)
|
||||||
scheme = URL_SCHEME_UNKNOWN;
|
scheme = URL_SCHEME_UNKNOWN;
|
||||||
else
|
else
|
||||||
|
@ -4630,7 +4598,7 @@ BOOL WINAPI UrlIsW(const WCHAR *url, URLIS Urlis)
|
||||||
return (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, url, 5, file_colon, 5) == CSTR_EQUAL);
|
return (CompareStringW(LOCALE_INVARIANT, NORM_IGNORECASE, url, 5, file_colon, 5) == CSTR_EQUAL);
|
||||||
|
|
||||||
case URLIS_DIRECTORY:
|
case URLIS_DIRECTORY:
|
||||||
last = url + strlenW(url) - 1;
|
last = url + lstrlenW(url) - 1;
|
||||||
return (last >= url && (*last == '/' || *last == '\\'));
|
return (last >= url && (*last == '/' || *last == '\\'));
|
||||||
|
|
||||||
case URLIS_URL:
|
case URLIS_URL:
|
||||||
|
@ -4715,7 +4683,7 @@ HRESULT WINAPI UrlCreateFromPathW(const WCHAR *path, WCHAR *url, DWORD *url_len,
|
||||||
|
|
||||||
hr = url_create_from_path(path, url, url_len);
|
hr = url_create_from_path(path, url, url_len);
|
||||||
if (hr == S_FALSE)
|
if (hr == S_FALSE)
|
||||||
strcpyW(url, path);
|
lstrcpyW(url, path);
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -4805,13 +4773,13 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
|
|
||||||
work = (LPWSTR)base.pszProtocol;
|
work = (LPWSTR)base.pszProtocol;
|
||||||
for (i = 0; i < base.cchProtocol; ++i)
|
for (i = 0; i < base.cchProtocol; ++i)
|
||||||
work[i] = tolowerW(work[i]);
|
work[i] = towlower(work[i]);
|
||||||
|
|
||||||
/* mk is a special case */
|
/* mk is a special case */
|
||||||
if (base.nScheme == URL_SCHEME_MK)
|
if (base.nScheme == URL_SCHEME_MK)
|
||||||
{
|
{
|
||||||
static const WCHAR wsz[] = {':',':',0};
|
static const WCHAR wsz[] = {':',':',0};
|
||||||
WCHAR *ptr = strstrW(base.pszSuffix, wsz);
|
WCHAR *ptr = wcsstr(base.pszSuffix, wsz);
|
||||||
if (ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
int delta;
|
int delta;
|
||||||
|
@ -4847,7 +4815,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
* immediately preceding it are ".htm[l]", then begin looking for
|
* immediately preceding it are ".htm[l]", then begin looking for
|
||||||
* the last leaf starting from the '#'. Otherwise the '#' is not
|
* the last leaf starting from the '#'. Otherwise the '#' is not
|
||||||
* meaningful and just start looking from the end. */
|
* meaningful and just start looking from the end. */
|
||||||
if ((work = strpbrkW(base.pszSuffix + sizeloc, fragquerystr)))
|
if ((work = wcspbrk(base.pszSuffix + sizeloc, fragquerystr)))
|
||||||
{
|
{
|
||||||
static const WCHAR htmlW[] = {'.','h','t','m','l'};
|
static const WCHAR htmlW[] = {'.','h','t','m','l'};
|
||||||
static const WCHAR htmW[] = {'.','h','t','m'};
|
static const WCHAR htmW[] = {'.','h','t','m'};
|
||||||
|
@ -4857,7 +4825,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
else if (work - base.pszSuffix > ARRAY_SIZE(htmW))
|
else if (work - base.pszSuffix > ARRAY_SIZE(htmW))
|
||||||
{
|
{
|
||||||
work -= ARRAY_SIZE(htmW);
|
work -= ARRAY_SIZE(htmW);
|
||||||
if (!strncmpiW(work, htmW, ARRAY_SIZE(htmW)))
|
if (!wcsnicmp(work, htmW, ARRAY_SIZE(htmW)))
|
||||||
manual_search = TRUE;
|
manual_search = TRUE;
|
||||||
work += ARRAY_SIZE(htmW);
|
work += ARRAY_SIZE(htmW);
|
||||||
}
|
}
|
||||||
|
@ -4865,7 +4833,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
if (!manual_search && work - base.pszSuffix > ARRAY_SIZE(htmlW))
|
if (!manual_search && work - base.pszSuffix > ARRAY_SIZE(htmlW))
|
||||||
{
|
{
|
||||||
work -= ARRAY_SIZE(htmlW);
|
work -= ARRAY_SIZE(htmlW);
|
||||||
if (!strncmpiW(work, htmlW, ARRAY_SIZE(htmlW)))
|
if (!wcsnicmp(work, htmlW, ARRAY_SIZE(htmlW)))
|
||||||
manual_search = TRUE;
|
manual_search = TRUE;
|
||||||
work += ARRAY_SIZE(htmlW);
|
work += ARRAY_SIZE(htmlW);
|
||||||
}
|
}
|
||||||
|
@ -4881,7 +4849,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* search backwards starting from the end of the string */
|
/* search backwards starting from the end of the string */
|
||||||
work = strrchrW((base.pszSuffix+sizeloc), '/');
|
work = wcsrchr((base.pszSuffix+sizeloc), '/');
|
||||||
if (work)
|
if (work)
|
||||||
{
|
{
|
||||||
len = (DWORD)(work - base.pszSuffix + 1);
|
len = (DWORD)(work - base.pszSuffix + 1);
|
||||||
|
@ -4905,7 +4873,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
/* No scheme in relative */
|
/* No scheme in relative */
|
||||||
TRACE("no scheme detected in Relative\n");
|
TRACE("no scheme detected in Relative\n");
|
||||||
relative.pszSuffix = mrelative; /* case 3,4,5 depends on this */
|
relative.pszSuffix = mrelative; /* case 3,4,5 depends on this */
|
||||||
relative.cchSuffix = strlenW(mrelative);
|
relative.cchSuffix = lstrlenW(mrelative);
|
||||||
if (*relativeW == ':')
|
if (*relativeW == ':')
|
||||||
{
|
{
|
||||||
/* Case that is either left alone or uses base. */
|
/* Case that is either left alone or uses base. */
|
||||||
|
@ -4917,10 +4885,10 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
process_case = 1;
|
process_case = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (isalnumW(*mrelative) && *(mrelative + 1) == ':')
|
if (iswalnum(*mrelative) && *(mrelative + 1) == ':')
|
||||||
{
|
{
|
||||||
/* case that becomes "file:///" */
|
/* case that becomes "file:///" */
|
||||||
strcpyW(preliminary, myfilestr);
|
lstrcpyW(preliminary, myfilestr);
|
||||||
process_case = 1;
|
process_case = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4938,8 +4906,8 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
}
|
}
|
||||||
if (*mrelative == '#')
|
if (*mrelative == '#')
|
||||||
{
|
{
|
||||||
if (!(work = strchrW(base.pszSuffix+base.cchSuffix, '#')))
|
if (!(work = wcschr(base.pszSuffix+base.cchSuffix, '#')))
|
||||||
work = (LPWSTR)base.pszSuffix + strlenW(base.pszSuffix);
|
work = (LPWSTR)base.pszSuffix + lstrlenW(base.pszSuffix);
|
||||||
|
|
||||||
memcpy(preliminary, base.pszProtocol, (work-base.pszProtocol)*sizeof(WCHAR));
|
memcpy(preliminary, base.pszProtocol, (work-base.pszProtocol)*sizeof(WCHAR));
|
||||||
preliminary[work-base.pszProtocol] = '\0';
|
preliminary[work-base.pszProtocol] = '\0';
|
||||||
|
@ -4953,11 +4921,11 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
{
|
{
|
||||||
work = (LPWSTR)relative.pszProtocol;
|
work = (LPWSTR)relative.pszProtocol;
|
||||||
for (i = 0; i < relative.cchProtocol; ++i)
|
for (i = 0; i < relative.cchProtocol; ++i)
|
||||||
work[i] = tolowerW(work[i]);
|
work[i] = towlower(work[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle cases where relative has scheme. */
|
/* Handle cases where relative has scheme. */
|
||||||
if ((base.cchProtocol == relative.cchProtocol) && !strncmpW(base.pszProtocol, relative.pszProtocol, base.cchProtocol))
|
if ((base.cchProtocol == relative.cchProtocol) && !wcsncmp(base.pszProtocol, relative.pszProtocol, base.cchProtocol))
|
||||||
{
|
{
|
||||||
/* since the schemes are the same */
|
/* since the schemes are the same */
|
||||||
if (*relative.pszSuffix == '/' && *(relative.pszSuffix+1) == '/')
|
if (*relative.pszSuffix == '/' && *(relative.pszSuffix+1) == '/')
|
||||||
|
@ -4993,19 +4961,19 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
/* Return relative appended to whatever is in combined (which may the string "file:///" */
|
/* Return relative appended to whatever is in combined (which may the string "file:///" */
|
||||||
strcatW(preliminary, mrelative);
|
lstrcatW(preliminary, mrelative);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
/* Relative replaces scheme and location */
|
/* Relative replaces scheme and location */
|
||||||
strcpyW(preliminary, mrelative);
|
lstrcpyW(preliminary, mrelative);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 3:
|
case 3:
|
||||||
/* Return the base scheme with relative. Basically keeps the scheme and replaces the domain and following. */
|
/* Return the base scheme with relative. Basically keeps the scheme and replaces the domain and following. */
|
||||||
memcpy(preliminary, base.pszProtocol, (base.cchProtocol + 1)*sizeof(WCHAR));
|
memcpy(preliminary, base.pszProtocol, (base.cchProtocol + 1)*sizeof(WCHAR));
|
||||||
work = preliminary + base.cchProtocol + 1;
|
work = preliminary + base.cchProtocol + 1;
|
||||||
strcpyW(work, relative.pszSuffix);
|
lstrcpyW(work, relative.pszSuffix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
|
@ -5014,7 +4982,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
work = preliminary + base.cchProtocol + 1 + sizeloc;
|
work = preliminary + base.cchProtocol + 1 + sizeloc;
|
||||||
if (flags & URL_PLUGGABLE_PROTOCOL)
|
if (flags & URL_PLUGGABLE_PROTOCOL)
|
||||||
*(work++) = '/';
|
*(work++) = '/';
|
||||||
strcpyW(work, relative.pszSuffix);
|
lstrcpyW(work, relative.pszSuffix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 5:
|
case 5:
|
||||||
|
@ -5023,7 +4991,7 @@ HRESULT WINAPI UrlCombineW(const WCHAR *baseW, const WCHAR *relativeW, WCHAR *co
|
||||||
work = preliminary + base.cchProtocol + 1 + base.cchSuffix - 1;
|
work = preliminary + base.cchProtocol + 1 + base.cchSuffix - 1;
|
||||||
if (*work++ != '/')
|
if (*work++ != '/')
|
||||||
*(work++) = '/';
|
*(work++) = '/';
|
||||||
strcpyW(work, relative.pszSuffix);
|
lstrcpyW(work, relative.pszSuffix);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -26,10 +26,13 @@
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
#include "wine/exception.h"
|
#include "wine/exception.h"
|
||||||
#include "wine/unicode.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(string);
|
WINE_DEFAULT_DEBUG_CHANNEL(string);
|
||||||
|
|
||||||
|
#define isxdigit(ch) (((ch) >= '0' && (ch) <= '9') || \
|
||||||
|
((ch) >= 'A' && (ch) <= 'F') || \
|
||||||
|
((ch) >= 'a' && (ch) <= 'f'))
|
||||||
|
|
||||||
static WORD get_char_type(WCHAR ch)
|
static WORD get_char_type(WCHAR ch)
|
||||||
{
|
{
|
||||||
WORD type = 0;
|
WORD type = 0;
|
||||||
|
@ -200,7 +203,7 @@ WCHAR * WINAPI StrChrW(const WCHAR *str, WCHAR ch)
|
||||||
if (!str)
|
if (!str)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return strchrW(str, ch);
|
return wcschr(str, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
char * WINAPI StrChrIA(const char *str, WORD ch)
|
char * WINAPI StrChrIA(const char *str, WORD ch)
|
||||||
|
@ -227,10 +230,10 @@ WCHAR * WINAPI StrChrIW(const WCHAR *str, WCHAR ch)
|
||||||
if (!str)
|
if (!str)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ch = toupperW(ch);
|
ch = towupper(ch);
|
||||||
while (*str)
|
while (*str)
|
||||||
{
|
{
|
||||||
if (toupperW(*str) == ch)
|
if (towupper(*str) == ch)
|
||||||
return (WCHAR *)str;
|
return (WCHAR *)str;
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
@ -284,7 +287,7 @@ WCHAR * WINAPI StrDupW(const WCHAR *str)
|
||||||
|
|
||||||
TRACE("%s\n", wine_dbgstr_w(str));
|
TRACE("%s\n", wine_dbgstr_w(str));
|
||||||
|
|
||||||
len = (str ? strlenW(str) + 1 : 1) * sizeof(WCHAR);
|
len = (str ? lstrlenW(str) + 1 : 1) * sizeof(WCHAR);
|
||||||
ret = LocalAlloc(LMEM_FIXED, len);
|
ret = LocalAlloc(LMEM_FIXED, len);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -351,7 +354,7 @@ WCHAR * WINAPI StrStrW(const WCHAR *str, const WCHAR *search)
|
||||||
if (!str || !search || !*search)
|
if (!str || !search || !*search)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return strstrW(str, search);
|
return wcsstr(str, search);
|
||||||
}
|
}
|
||||||
|
|
||||||
WCHAR * WINAPI StrStrNW(const WCHAR *str, const WCHAR *search, UINT max_len)
|
WCHAR * WINAPI StrStrNW(const WCHAR *str, const WCHAR *search, UINT max_len)
|
||||||
|
@ -363,11 +366,11 @@ WCHAR * WINAPI StrStrNW(const WCHAR *str, const WCHAR *search, UINT max_len)
|
||||||
if (!str || !search || !*search || !max_len)
|
if (!str || !search || !*search || !max_len)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
len = strlenW(search);
|
len = lstrlenW(search);
|
||||||
|
|
||||||
for (i = max_len; *str && (i > 0); i--, str++)
|
for (i = max_len; *str && (i > 0); i--, str++)
|
||||||
{
|
{
|
||||||
if (!strncmpW(str, search, len))
|
if (!wcsncmp(str, search, len))
|
||||||
return (WCHAR *)str;
|
return (WCHAR *)str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -389,11 +392,11 @@ WCHAR * WINAPI StrStrNIW(const WCHAR *str, const WCHAR *search, UINT max_len)
|
||||||
if (!str || !search || !*search || !max_len)
|
if (!str || !search || !*search || !max_len)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
len = strlenW(search);
|
len = lstrlenW(search);
|
||||||
|
|
||||||
for (i = max_len; *str && (i > 0); i--, str++)
|
for (i = max_len; *str && (i > 0); i--, str++)
|
||||||
{
|
{
|
||||||
if (!strncmpiW(str, search, len))
|
if (!wcsnicmp(str, search, len))
|
||||||
return (WCHAR *)str;
|
return (WCHAR *)str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,8 +480,8 @@ WCHAR * WINAPI StrStrIW(const WCHAR *str, const WCHAR *search)
|
||||||
if (!str || !search || !*search)
|
if (!str || !search || !*search)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
len = strlenW(search);
|
len = lstrlenW(search);
|
||||||
end = str + strlenW(str);
|
end = str + lstrlenW(str);
|
||||||
|
|
||||||
while (str + len <= end)
|
while (str + len <= end)
|
||||||
{
|
{
|
||||||
|
@ -522,7 +525,7 @@ int WINAPI StrSpnA(const char *str, const char *match)
|
||||||
int WINAPI StrSpnW(const WCHAR *str, const WCHAR *match)
|
int WINAPI StrSpnW(const WCHAR *str, const WCHAR *match)
|
||||||
{
|
{
|
||||||
if (!str || !match) return 0;
|
if (!str || !match) return 0;
|
||||||
return strspnW(str, match);
|
return wcsspn(str, match);
|
||||||
}
|
}
|
||||||
|
|
||||||
int WINAPI StrCSpnA(const char *str, const char *match)
|
int WINAPI StrCSpnA(const char *str, const char *match)
|
||||||
|
@ -537,7 +540,7 @@ int WINAPI StrCSpnW(const WCHAR *str, const WCHAR *match)
|
||||||
if (!str || !match)
|
if (!str || !match)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return strcspnW(str, match);
|
return wcscspn(str, match);
|
||||||
}
|
}
|
||||||
|
|
||||||
int WINAPI StrCSpnIA(const char *str, const char *match)
|
int WINAPI StrCSpnIA(const char *str, const char *match)
|
||||||
|
@ -600,7 +603,7 @@ WCHAR * WINAPI StrRChrW(const WCHAR *str, const WCHAR *end, WORD ch)
|
||||||
WCHAR *ret = NULL;
|
WCHAR *ret = NULL;
|
||||||
|
|
||||||
if (!str) return NULL;
|
if (!str) return NULL;
|
||||||
if (!end) end = str + strlenW(str);
|
if (!end) end = str + lstrlenW(str);
|
||||||
while (str < end)
|
while (str < end)
|
||||||
{
|
{
|
||||||
if (*str == ch) ret = (WCHAR *)str;
|
if (*str == ch) ret = (WCHAR *)str;
|
||||||
|
@ -621,7 +624,7 @@ WCHAR * WINAPI StrRChrIW(const WCHAR *str, const WCHAR *end, WORD ch)
|
||||||
WCHAR *ret = NULL;
|
WCHAR *ret = NULL;
|
||||||
|
|
||||||
if (!str) return NULL;
|
if (!str) return NULL;
|
||||||
if (!end) end = str + strlenW(str);
|
if (!end) end = str + lstrlenW(str);
|
||||||
while (str < end)
|
while (str < end)
|
||||||
{
|
{
|
||||||
if (!ChrCmpIW(*str, ch)) ret = (WCHAR *)str;
|
if (!ChrCmpIW(*str, ch)) ret = (WCHAR *)str;
|
||||||
|
@ -677,10 +680,10 @@ WCHAR * WINAPI StrRStrIW(const WCHAR *str, const WCHAR *end, const WCHAR *search
|
||||||
if (!str || !search || !*search)
|
if (!str || !search || !*search)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
len = strlenW(search);
|
len = lstrlenW(search);
|
||||||
|
|
||||||
if (!end)
|
if (!end)
|
||||||
end = str + strlenW(str);
|
end = str + lstrlenW(str);
|
||||||
else
|
else
|
||||||
end += min(len - 1, lstrlenW(end));
|
end += min(len - 1, lstrlenW(end));
|
||||||
|
|
||||||
|
@ -717,7 +720,7 @@ char * WINAPI StrPBrkA(const char *str, const char *match)
|
||||||
WCHAR * WINAPI StrPBrkW(const WCHAR *str, const WCHAR *match)
|
WCHAR * WINAPI StrPBrkW(const WCHAR *str, const WCHAR *match)
|
||||||
{
|
{
|
||||||
if (!str || !match) return NULL;
|
if (!str || !match) return NULL;
|
||||||
return strpbrkW(str, match);
|
return wcspbrk(str, match);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL WINAPI StrTrimA(char *str, const char *trim)
|
BOOL WINAPI StrTrimA(char *str, const char *trim)
|
||||||
|
@ -772,7 +775,7 @@ BOOL WINAPI StrTrimW(WCHAR *str, const WCHAR *trim)
|
||||||
while (*ptr && StrChrW(trim, *ptr))
|
while (*ptr && StrChrW(trim, *ptr))
|
||||||
ptr++;
|
ptr++;
|
||||||
|
|
||||||
len = strlenW(ptr);
|
len = lstrlenW(ptr);
|
||||||
|
|
||||||
if (ptr != str)
|
if (ptr != str)
|
||||||
{
|
{
|
||||||
|
@ -810,7 +813,7 @@ BOOL WINAPI StrToInt64ExA(const char *str, DWORD flags, LONGLONG *ret)
|
||||||
WARN("Unknown flags %#x\n", flags);
|
WARN("Unknown flags %#x\n", flags);
|
||||||
|
|
||||||
/* Skip leading space, '+', '-' */
|
/* Skip leading space, '+', '-' */
|
||||||
while (isspace(*str))
|
while (*str == ' ' || (*str >= '\t' && *str <= '\r'))
|
||||||
str = CharNextA(str);
|
str = CharNextA(str);
|
||||||
|
|
||||||
if (*str == '-')
|
if (*str == '-')
|
||||||
|
@ -821,7 +824,7 @@ BOOL WINAPI StrToInt64ExA(const char *str, DWORD flags, LONGLONG *ret)
|
||||||
else if (*str == '+')
|
else if (*str == '+')
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
if (flags & STIF_SUPPORT_HEX && *str == '0' && tolower(str[1]) == 'x')
|
if (flags & STIF_SUPPORT_HEX && *str == '0' && (str[1] == 'x' || str[1] == 'X'))
|
||||||
{
|
{
|
||||||
/* Read hex number */
|
/* Read hex number */
|
||||||
str += 2;
|
str += 2;
|
||||||
|
@ -832,10 +835,12 @@ BOOL WINAPI StrToInt64ExA(const char *str, DWORD flags, LONGLONG *ret)
|
||||||
while (isxdigit(*str))
|
while (isxdigit(*str))
|
||||||
{
|
{
|
||||||
value *= 16;
|
value *= 16;
|
||||||
if (isdigit(*str))
|
if (*str >= '0' && *str <= '9')
|
||||||
value += (*str - '0');
|
value += (*str - '0');
|
||||||
|
else if (*str >= 'A' && *str <= 'F')
|
||||||
|
value += 10 + *str - 'A';
|
||||||
else
|
else
|
||||||
value += 10 + (tolower(*str) - 'a');
|
value += 10 + *str - 'a';
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -844,10 +849,10 @@ BOOL WINAPI StrToInt64ExA(const char *str, DWORD flags, LONGLONG *ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read decimal number */
|
/* Read decimal number */
|
||||||
if (!isdigit(*str))
|
if (*str < '0' || *str > '9')
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
while (isdigit(*str))
|
while (*str >= '0' && *str <= '9')
|
||||||
{
|
{
|
||||||
value *= 10;
|
value *= 10;
|
||||||
value += (*str - '0');
|
value += (*str - '0');
|
||||||
|
@ -872,7 +877,7 @@ BOOL WINAPI StrToInt64ExW(const WCHAR *str, DWORD flags, LONGLONG *ret)
|
||||||
WARN("Unknown flags %#x.\n", flags);
|
WARN("Unknown flags %#x.\n", flags);
|
||||||
|
|
||||||
/* Skip leading space, '+', '-' */
|
/* Skip leading space, '+', '-' */
|
||||||
while (isspaceW(*str))
|
while (iswspace(*str))
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
if (*str == '-')
|
if (*str == '-')
|
||||||
|
@ -883,21 +888,21 @@ BOOL WINAPI StrToInt64ExW(const WCHAR *str, DWORD flags, LONGLONG *ret)
|
||||||
else if (*str == '+')
|
else if (*str == '+')
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
if (flags & STIF_SUPPORT_HEX && *str == '0' && tolowerW(str[1]) == 'x')
|
if (flags & STIF_SUPPORT_HEX && *str == '0' && towlower(str[1]) == 'x')
|
||||||
{
|
{
|
||||||
/* Read hex number */
|
/* Read hex number */
|
||||||
str += 2;
|
str += 2;
|
||||||
|
|
||||||
if (!isxdigitW(*str))
|
if (!iswxdigit(*str))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
while (isxdigitW(*str))
|
while (iswxdigit(*str))
|
||||||
{
|
{
|
||||||
value *= 16;
|
value *= 16;
|
||||||
if (isdigitW(*str))
|
if (iswdigit(*str))
|
||||||
value += (*str - '0');
|
value += (*str - '0');
|
||||||
else
|
else
|
||||||
value += 10 + (tolowerW(*str) - 'a');
|
value += 10 + (towlower(*str) - 'a');
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -906,10 +911,10 @@ BOOL WINAPI StrToInt64ExW(const WCHAR *str, DWORD flags, LONGLONG *ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read decimal number */
|
/* Read decimal number */
|
||||||
if (!isdigitW(*str))
|
if (!iswdigit(*str))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
while (isdigitW(*str))
|
while (iswdigit(*str))
|
||||||
{
|
{
|
||||||
value *= 10;
|
value *= 10;
|
||||||
value += (*str - '0');
|
value += (*str - '0');
|
||||||
|
@ -968,7 +973,7 @@ int WINAPI StrToIntW(const WCHAR *str)
|
||||||
if (!str)
|
if (!str)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (*str == '-' || isdigitW(*str))
|
if (*str == '-' || iswdigit(*str))
|
||||||
StrToIntExW(str, 0, &value);
|
StrToIntExW(str, 0, &value);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -1270,11 +1275,11 @@ int WINAPI StrCmpLogicalW(const WCHAR *str, const WCHAR *comp)
|
||||||
{
|
{
|
||||||
if (!*comp)
|
if (!*comp)
|
||||||
return 1;
|
return 1;
|
||||||
else if (isdigitW(*str))
|
else if (iswdigit(*str))
|
||||||
{
|
{
|
||||||
int str_value, comp_value;
|
int str_value, comp_value;
|
||||||
|
|
||||||
if (!isdigitW(*comp))
|
if (!iswdigit(*comp))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* Compare the numbers */
|
/* Compare the numbers */
|
||||||
|
@ -1287,12 +1292,12 @@ int WINAPI StrCmpLogicalW(const WCHAR *str, const WCHAR *comp)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Skip */
|
/* Skip */
|
||||||
while (isdigitW(*str))
|
while (iswdigit(*str))
|
||||||
str++;
|
str++;
|
||||||
while (isdigitW(*comp))
|
while (iswdigit(*comp))
|
||||||
comp++;
|
comp++;
|
||||||
}
|
}
|
||||||
else if (isdigitW(*comp))
|
else if (iswdigit(*comp))
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1371,7 +1376,7 @@ WCHAR * WINAPI StrCatBuffW(WCHAR *str, const WCHAR *cat, INT max_len)
|
||||||
if (!str)
|
if (!str)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
len = strlenW(str);
|
len = lstrlenW(str);
|
||||||
max_len -= len;
|
max_len -= len;
|
||||||
if (max_len > 0)
|
if (max_len > 0)
|
||||||
StrCpyNW(str + len, cat, max_len);
|
StrCpyNW(str + len, cat, max_len);
|
||||||
|
@ -1384,7 +1389,7 @@ DWORD WINAPI StrCatChainW(WCHAR *str, DWORD max_len, DWORD at, const WCHAR *cat)
|
||||||
TRACE("%s, %u, %d, %s\n", wine_dbgstr_w(str), max_len, at, wine_dbgstr_w(cat));
|
TRACE("%s, %u, %d, %s\n", wine_dbgstr_w(str), max_len, at, wine_dbgstr_w(cat));
|
||||||
|
|
||||||
if (at == -1)
|
if (at == -1)
|
||||||
at = strlenW(str);
|
at = lstrlenW(str);
|
||||||
|
|
||||||
if (!max_len)
|
if (!max_len)
|
||||||
return at;
|
return at;
|
||||||
|
@ -1442,13 +1447,13 @@ HRESULT WINAPI SHLoadIndirectString(const WCHAR *src, WCHAR *dst, UINT dst_len,
|
||||||
|
|
||||||
dst[0] = 0;
|
dst[0] = 0;
|
||||||
dllname = StrDupW(src + 1);
|
dllname = StrDupW(src + 1);
|
||||||
index_str = strchrW(dllname, ',');
|
index_str = wcschr(dllname, ',');
|
||||||
|
|
||||||
if(!index_str) goto end;
|
if(!index_str) goto end;
|
||||||
|
|
||||||
*index_str = 0;
|
*index_str = 0;
|
||||||
index_str++;
|
index_str++;
|
||||||
index = atoiW(index_str);
|
index = wcstol(index_str, NULL, 10);
|
||||||
|
|
||||||
hmod = LoadLibraryW(dllname);
|
hmod = LoadLibraryW(dllname);
|
||||||
if (!hmod) goto end;
|
if (!hmod) goto end;
|
||||||
|
|
|
@ -1158,6 +1158,8 @@ static void build(struct options* opts)
|
||||||
strarray_add(link_args, "-lc");
|
strarray_add(link_args, "-lc");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opts->nodefaultlibs && is_pe) strarray_add( link_args, "-lgcc" );
|
||||||
|
|
||||||
spawn(opts->prefix, link_args, 0);
|
spawn(opts->prefix, link_args, 0);
|
||||||
strarray_free (link_args);
|
strarray_free (link_args);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue