summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/miscfuncs.cc
diff options
context:
space:
mode:
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