Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2007-12-12 15:12:24 +0300
committerCorinna Vinschen <corinna@vinschen.de>2007-12-12 15:12:24 +0300
commit1feea0bfd74d260dcd52618edec238808ada47ac (patch)
tree557b28e8036ca44a53ffd481e14d8033a64a9f6d /winsup/cygwin/miscfuncs.cc
parent5c80ea02302e031225003689df63eb206d248a35 (diff)
* 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.cc141
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