Alexandre Julliard : wrc: Avoid locale- or Unicode-dependent case conversions.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Feb 22 08:57:38 CST 2016


Module: wine
Branch: master
Commit: 865f23b5032171cdcd7221fce381c98f5ce6dd36
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=865f23b5032171cdcd7221fce381c98f5ce6dd36

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat Feb 20 13:32:33 2016 +0900

wrc: Avoid locale- or Unicode-dependent case conversions.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 tools/wrc/genres.c |  6 ++++--
 tools/wrc/parser.l |  2 +-
 tools/wrc/parser.y | 38 ++++++++++++--------------------------
 tools/wrc/utils.c  | 29 +++++++++++++++++++++++++++--
 tools/wrc/utils.h  |  2 ++
 5 files changed, 46 insertions(+), 31 deletions(-)

diff --git a/tools/wrc/genres.c b/tools/wrc/genres.c
index 336e64e..5b7e24c 100644
--- a/tools/wrc/genres.c
+++ b/tools/wrc/genres.c
@@ -263,11 +263,13 @@ static void string_to_upper(string_t *str)
 
     if(str->type == str_char)
     {
-        for (i = 0; i < str->size; i++) str->str.cstr[i] = toupper((unsigned char)str->str.cstr[i]);
+        for (i = 0; i < str->size; i++)
+            if (str->str.cstr[i] >= 'a' && str->str.cstr[i] <= 'z') str->str.cstr[i] -= 32;
     }
     else if(str->type == str_unicode)
     {
-        for (i = 0; i < str->size; i++) str->str.wstr[i] = toupperW(str->str.wstr[i]);
+        for (i = 0; i < str->size; i++)
+            if (str->str.wstr[i] >= 'a' && str->str.wstr[i] <= 'z') str->str.wstr[i] -= 32;
     }
     else
     {
diff --git a/tools/wrc/parser.l b/tools/wrc/parser.l
index 80072b2..32a231b 100644
--- a/tools/wrc/parser.l
+++ b/tools/wrc/parser.l
@@ -250,7 +250,7 @@ static struct keyword keywords[] = {
 static int kw_cmp_func(const void *s1, const void *s2)
 {
 	int ret;
-	ret = strcasecmp(KWP(s1)->keyword, KWP(s2)->keyword);
+	ret = compare_striA(KWP(s1)->keyword, KWP(s2)->keyword);
 	if(!ret && (KWP(s1)->needcase || KWP(s2)->needcase))
 		return strcmp(KWP(s1)->keyword, KWP(s2)->keyword);
 	else
diff --git a/tools/wrc/parser.y b/tools/wrc/parser.y
index b41e7d7..0f73f90 100644
--- a/tools/wrc/parser.y
+++ b/tools/wrc/parser.y
@@ -2072,37 +2072,23 @@ static int get_class_idW(const WCHAR *cc)
         static const WCHAR szSTATIC[]    = {'S','T','A','T','I','C',0};
         static const WCHAR szSCROLLBAR[] = {'S','C','R','O','L','L','B','A','R',0};
 
-        if(!strcmpiW(szBUTTON, cc))
-                return CT_BUTTON;
-        if(!strcmpiW(szCOMBOBOX, cc))
-                return CT_COMBOBOX;
-        if(!strcmpiW(szLISTBOX, cc))
-                return CT_LISTBOX;
-        if(!strcmpiW(szEDIT, cc))
-                return CT_EDIT;
-        if(!strcmpiW(szSTATIC, cc))
-                return CT_STATIC;
-        if(!strcmpiW(szSCROLLBAR, cc))
-                return CT_SCROLLBAR;
-
+        if(!compare_striW(szBUTTON, cc)) return CT_BUTTON;
+        if(!compare_striW(szCOMBOBOX, cc)) return CT_COMBOBOX;
+        if(!compare_striW(szLISTBOX, cc)) return CT_LISTBOX;
+        if(!compare_striW(szEDIT, cc)) return CT_EDIT;
+        if(!compare_striW(szSTATIC, cc)) return CT_STATIC;
+        if(!compare_striW(szSCROLLBAR, cc)) return CT_SCROLLBAR;
         return -1;
 }
 
 static int get_class_idA(const char *cc)
 {
-        if(!strcasecmp("BUTTON", cc))
-                return CT_BUTTON;
-        if(!strcasecmp("COMBOBOX", cc))
-                return CT_COMBOBOX;
-        if(!strcasecmp("LISTBOX", cc))
-                return CT_LISTBOX;
-        if(!strcasecmp("EDIT", cc))
-                return CT_EDIT;
-        if(!strcasecmp("STATIC", cc))
-                return CT_STATIC;
-        if(!strcasecmp("SCROLLBAR", cc))
-                return CT_SCROLLBAR;
-
+        if(!compare_striA("BUTTON", cc)) return CT_BUTTON;
+        if(!compare_striA("COMBOBOX", cc)) return CT_COMBOBOX;
+        if(!compare_striA("LISTBOX", cc)) return CT_LISTBOX;
+        if(!compare_striA("EDIT", cc)) return CT_EDIT;
+        if(!compare_striA("STATIC", cc)) return CT_STATIC;
+        if(!compare_striA("SCROLLBAR", cc)) return CT_SCROLLBAR;
         return -1;
 }
 
diff --git a/tools/wrc/utils.c b/tools/wrc/utils.c
index 5360b95..800692a 100644
--- a/tools/wrc/utils.c
+++ b/tools/wrc/utils.c
@@ -219,6 +219,31 @@ char *xstrdup(const char *str)
 	return strcpy(s, str);
 }
 
+int compare_striA( const char *str1, const char *str2 )
+{
+    for (;;)
+    {
+        /* only the A-Z range is case-insensitive */
+        char ch1 = (*str1 >= 'a' && *str1 <= 'z') ? *str1 + 'A' - 'a' : *str1;
+        char ch2 = (*str2 >= 'a' && *str2 <= 'z') ? *str2 + 'A' - 'a' : *str2;
+        if (!ch1 || ch1 != ch2) return ch1 - ch2;
+        str1++;
+        str2++;
+    }
+}
+
+int compare_striW( const WCHAR *str1, const WCHAR *str2 )
+{
+    for (;;)
+    {
+        /* only the A-Z range is case-insensitive */
+        WCHAR ch1 = (*str1 >= 'a' && *str1 <= 'z') ? *str1 + 'A' - 'a' : *str1;
+        WCHAR ch2 = (*str2 >= 'a' && *str2 <= 'z') ? *str2 + 'A' - 'a' : *str2;
+        if (!ch1 || ch1 != ch2) return ch1 - ch2;
+        str1++;
+        str2++;
+    }
+}
 
 /*
  *****************************************************************************
@@ -241,12 +266,12 @@ int compare_name_id(const name_id_t *n1, const name_id_t *n2)
 		if(n1->name.s_name->type == str_char
 		&& n2->name.s_name->type == str_char)
 		{
-			return strcasecmp(n1->name.s_name->str.cstr, n2->name.s_name->str.cstr);
+			return compare_striA(n1->name.s_name->str.cstr, n2->name.s_name->str.cstr);
 		}
 		else if(n1->name.s_name->type == str_unicode
 		&& n2->name.s_name->type == str_unicode)
 		{
-			return strcmpiW(n1->name.s_name->str.wstr, n2->name.s_name->str.wstr);
+			return compare_striW(n1->name.s_name->str.wstr, n2->name.s_name->str.wstr);
 		}
 		else
 		{
diff --git a/tools/wrc/utils.h b/tools/wrc/utils.h
index 19daa09..f0e8cd6 100644
--- a/tools/wrc/utils.h
+++ b/tools/wrc/utils.h
@@ -33,6 +33,8 @@ char *xstrdup(const char *str);
 #define __attribute__(X)
 #endif
 
+int compare_striA( const char *str1, const char *str2 );
+int compare_striW( const WCHAR *str1, const WCHAR *str2 );
 char *strmake(const char* fmt, ...) __attribute__((__format__ (__printf__, 1, 2 )));
 int parser_error(const char *s, ...) __attribute__((format (printf, 1, 2)));
 int parser_warning(const char *s, ...) __attribute__((format (printf, 1, 2)));




More information about the wine-cvs mailing list