diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2007-12-12 12:12:24 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2007-12-12 12:12:24 +0000 |
commit | 1feea0bfd74d260dcd52618edec238808ada47ac (patch) | |
tree | 557b28e8036ca44a53ffd481e14d8033a64a9f6d /winsup/cygwin/miscfuncs.cc | |
parent | 5c80ea02302e031225003689df63eb206d248a35 (diff) | |
download | cygnal-1feea0bfd74d260dcd52618edec238808ada47ac.tar.gz cygnal-1feea0bfd74d260dcd52618edec238808ada47ac.tar.bz2 cygnal-1feea0bfd74d260dcd52618edec238808ada47ac.zip |
* dcrt0.cc: Include string.h.
(initial_env): Use small_printf's %P specifier.
* dll_init.cc (dll_list::alloc): Use PATH_MAX instead of CYG_MAX_PATH
for path name buffer size.
* dll_init.h (struct dll): Ditto.
* environ.cc: Include string.h.
(win_env::add_cache): Use temporary local buffer for path conversion.
(posify): Ditto.
* exceptions.cc (try_to_debug): Use CreateProcessW to allow long path
names.
* miscfuncs.cc: Drop unused implementations of strcasematch and
strncasematch.
(ch_case_eq): Drop.
(strcasestr): Drop.
(cygwin_wcscasecmp): New function.
(cygwin_wcsncasecmp): New function.
(cygwin_strcasecmp): New function.
(cygwin_strncasecmp): New function.
(cygwin_wcslwr): New function.
(cygwin_wcsupr): New function.
(cygwin_strlwr): New function.
(cygwin_strupr): New function.
* ntdll.h (RtlDowncaseUnicodeString): Declare.
(RtlUpcaseUnicodeString): Declare.
(RtlInt64ToHexUnicodeString): Fix typo in comment.
* string.h: Disable not NLS aware implementations of strcasematch
and strncasematch.
(cygwin_strcasecmp): Declare.
(strcasecmp): Define as cygwin_strcasecmp.
(cygwin_strncasecmp): Declare.
(strncasecmp): Define as cygwin_strncasecmp.
(strcasematch):Define using cygwin_strcasecmp.
(strncasematch):Define using cygwin_strncasecmp.
(cygwin_strlwr): Declare.
(strlwr): Define as cygwin_strlwr.
(cygwin_strupr): Declare.
(strupr): Define as cygwin_strupr.
* wchar.h: New file.
* wincap.cc (wincapc::init): Use "NT" as fix OS string.
* winsup.h (strcasematch): Drop declaration.
(strncasematch): Ditto.
(strcasestr): Ditto.
Diffstat (limited to 'winsup/cygwin/miscfuncs.cc')
-rw-r--r-- | winsup/cygwin/miscfuncs.cc | 141 |
1 files changed, 93 insertions, 48 deletions
diff --git a/winsup/cygwin/miscfuncs.cc b/winsup/cygwin/miscfuncs.cc index bbbcd59e9..c6328cb18 100644 --- a/winsup/cygwin/miscfuncs.cc +++ b/winsup/cygwin/miscfuncs.cc @@ -14,9 +14,12 @@ details. */ #include <sys/errno.h> #include <sys/uio.h> #include <assert.h> +#include <alloca.h> #include <limits.h> +#include <wchar.h> #include "cygthread.h" #include "cygtls.h" +#include "ntdll.h" long tls_ix = -1; @@ -77,70 +80,112 @@ const char isalpha_array[] NO_COPY = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -#define ch_case_eq(ch1, ch2) (cyg_tolower(ch1) == cyg_tolower(ch2)) +extern "C" int __stdcall +cygwin_wcscasecmp (const wchar_t *ws, const wchar_t *wt) +{ + UNICODE_STRING us, ut; -#if 0 + RtlInitUnicodeString (&us, ws); + RtlInitUnicodeString (&ut, wt); + return RtlCompareUnicodeString (&us, &ut, TRUE); +} -/* Return TRUE if two strings match up to length n */ extern "C" int __stdcall -strncasematch (const char *s1, const char *s2, size_t n) +cygwin_wcsncasecmp (const wchar_t *ws, const wchar_t *wt, size_t n) { - if (s1 == s2) - return 1; + UNICODE_STRING us, ut; + + n *= sizeof (WCHAR); + RtlInitUnicodeString (&us, ws); + if (us.Length > n) + us.Length = n; + RtlInitUnicodeString (&ut, wt); + if (ut.Length > n) + ut.Length = n; + return RtlCompareUnicodeString (&us, &ut, TRUE); +} - n++; - while (--n && *s1) - { - if (!ch_case_eq (*s1, *s2)) - return 0; - s1++; s2++; - } - return !n || *s2 == '\0'; +extern "C" int __stdcall +cygwin_strcasecmp (const char *cs, const char *ct) +{ + UNICODE_STRING us, ut; + ULONG len; + + len = (strlen (cs) + 1) * sizeof (WCHAR); + RtlInitEmptyUnicodeString (&us, (PWCHAR) alloca (len), len); + us.Length = sys_mbstowcs (us.Buffer, cs, us.MaximumLength) * sizeof (WCHAR); + len = (strlen (ct) + 1) * sizeof (WCHAR); + RtlInitEmptyUnicodeString (&ut, (PWCHAR) alloca (len), len); + ut.Length = sys_mbstowcs (ut.Buffer, ct, ut.MaximumLength) * sizeof (WCHAR); + return RtlCompareUnicodeString (&us, &ut, TRUE); } -/* Return TRUE if two strings match */ extern "C" int __stdcall -strcasematch (const char *s1, const char *s2) +cygwin_strncasecmp (const char *cs, const char *ct, size_t n) { - if (s1 == s2) - return 1; + UNICODE_STRING us, ut; + ULONG len; + + n *= sizeof (WCHAR); + len = (strlen (cs) + 1) * sizeof (WCHAR); + RtlInitEmptyUnicodeString (&us, (PWCHAR) alloca (len), len); + us.Length = sys_mbstowcs (us.Buffer, cs, us.MaximumLength) * sizeof (WCHAR); + if (us.Length > n) + us.Length = n; + len = (strlen (ct) + 1) * sizeof (WCHAR); + RtlInitEmptyUnicodeString (&ut, (PWCHAR) alloca (len), len); + ut.Length = sys_mbstowcs (ut.Buffer, ct, ut.MaximumLength) * sizeof (WCHAR); + if (ut.Length > n) + ut.Length = n; + return RtlCompareUnicodeString (&us, &ut, TRUE); +} - while (*s1) - { - if (!ch_case_eq (*s1, *s2)) - return 0; - s1++; s2++; - } - return *s2 == '\0'; +extern "C" wchar_t * __stdcall +cygwin_wcslwr (wchar_t *string) +{ + UNICODE_STRING us; + + RtlInitUnicodeString (&us, string); + RtlDowncaseUnicodeString (&us, &us, FALSE); + return string; } -#endif -extern "C" char * __stdcall -strcasestr (const char *searchee, const char *lookfor) +extern "C" wchar_t * __stdcall +cygwin_wcsupr (wchar_t *string) { - if (*searchee == 0) - { - if (*lookfor) - return NULL; - return (char *) searchee; - } + UNICODE_STRING us; - while (*searchee) - { - int i = 0; - while (1) - { - if (lookfor[i] == 0) - return (char *) searchee; + RtlInitUnicodeString (&us, string); + RtlUpcaseUnicodeString (&us, &us, FALSE); + return string; +} - if (!ch_case_eq (lookfor[i], searchee[i])) - break; - lookfor++; - } - searchee++; - } +extern "C" char * __stdcall +cygwin_strlwr (char *string) +{ + UNICODE_STRING us; + size_t len = (strlen (string) + 1) * sizeof (WCHAR); + + us.MaximumLength = len; us.Buffer = (PWCHAR) alloca (len); + us.Length = sys_mbstowcs (us.Buffer, string, len) * sizeof (WCHAR) + - sizeof (WCHAR); + RtlDowncaseUnicodeString (&us, &us, FALSE); + sys_wcstombs (string, len / sizeof (WCHAR), us.Buffer); + return string; +} - return NULL; +extern "C" char * __stdcall +cygwin_strupr (char *string) +{ + UNICODE_STRING us; + size_t len = (strlen (string) + 1) * sizeof (WCHAR); + + us.MaximumLength = len; us.Buffer = (PWCHAR) alloca (len); + us.Length = sys_mbstowcs (us.Buffer, string, len) * sizeof (WCHAR) + - sizeof (WCHAR); + RtlUpcaseUnicodeString (&us, &us, FALSE); + sys_wcstombs (string, len / sizeof (WCHAR), us.Buffer); + return string; } int __stdcall |