Alexandre Julliard : wrc: Use compare_name_id() for resource translations.

Alexandre Julliard julliard at winehq.org
Tue Feb 8 16:11:46 CST 2022


Module: wine
Branch: master
Commit: 78ef8cf44348f99c929679d5ca32c3c70bd42b8d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=78ef8cf44348f99c929679d5ca32c3c70bd42b8d

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Feb  8 18:01:38 2022 +0100

wrc: Use compare_name_id() for resource translations.

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

---

 tools/wrc/translation.c | 26 +++++---------------------
 tools/wrc/utils.c       | 48 ++++++++++++++++++++++++++----------------------
 2 files changed, 31 insertions(+), 43 deletions(-)

diff --git a/tools/wrc/translation.c b/tools/wrc/translation.c
index eb0047c10b5..831daba2b85 100644
--- a/tools/wrc/translation.c
+++ b/tools/wrc/translation.c
@@ -274,18 +274,12 @@ static int compare_cursor_group(cursor_group_t *cursor_group1, cursor_group_t *c
 
 static int compare_control(control_t *control1, control_t *control2) {
 	int different = 0;
-	char *nameid = NULL;
 	int ignore_style;
 	if(((control1 && !control2) || (!control1 && control2)))
 		different = 1;
 	if(different || !control1 || !control2)
 		return different;
-	nameid = strdup(get_nameid_str(control1->ctlclass));
-	if(strcmp(nameid, get_nameid_str(control2->ctlclass)))
-		different = 1;
-	free(nameid);
-        if (different)
-            return different;
+        if (compare_name_id( control1->ctlclass, control2->ctlclass )) return 1;
 
         /* allow the translators to set some styles */
         ignore_style = 0;
@@ -324,7 +318,6 @@ static int compare_control(control_t *control1, control_t *control2) {
 
 static int compare_dialog(dialog_t *dialog1, dialog_t *dialog2) {
 	int different = 0;
-	char *nameid = NULL;
 	control_t *ctrl1, *ctrl2;
 	if(((dialog1->memopt != dialog2->memopt) ||
 	   (dialog1->lvc.version != dialog2->lvc.version) ||
@@ -355,14 +348,9 @@ static int compare_dialog(dialog_t *dialog1, dialog_t *dialog2) {
 		  ((dialog1->gothelpid && !dialog2->gothelpid) ||
 		  (!dialog1->gothelpid && dialog2->gothelpid)))
 			different = 1;
-	nameid = strdup(get_nameid_str(dialog1->menu));
-	if(!different && strcmp(nameid, get_nameid_str(dialog2->menu)))
-		different = 1;
-	free(nameid);
-	nameid = strdup(get_nameid_str(dialog1->dlgclass));
-	if(!different && strcmp(nameid, get_nameid_str(dialog2->dlgclass)))
-		different = 1;
-	free(nameid);
+
+        if (!different && compare_name_id( dialog1->menu, dialog2->menu )) return 1;
+        if (!different && compare_name_id( dialog1->dlgclass, dialog2->dlgclass )) return 1;
 
         ctrl1 = dialog1->controls;
         ctrl2 = dialog2->controls;
@@ -570,15 +558,11 @@ static int compare_stringtable(stringtable_t *stringtable1, stringtable_t *strin
 
 static int compare_user(user_t *user1, user_t *user2) {
 	int different = 0;
-	char *nameid = NULL;
 	if(((user1->memopt != user2->memopt) ||
 	   (user1->data->lvc.version != user2->data->lvc.version) ||
 	   (user1->data->lvc.characts != user2->data->lvc.characts)))
 		different = 1;
-	nameid = strdup(get_nameid_str(user1->type));
-	if(!different && strcmp(nameid, get_nameid_str(user2->type)))
-		different = 1;
-	free(nameid);
+        if (!different) different = compare_name_id( user1->type, user2->type );
 	return different;
 }
 
diff --git a/tools/wrc/utils.c b/tools/wrc/utils.c
index b37bb226319..647505f50f4 100644
--- a/tools/wrc/utils.c
+++ b/tools/wrc/utils.c
@@ -153,6 +153,19 @@ int compare_striW( const WCHAR *str1, const WCHAR *str2 )
     }
 }
 
+int compare_striAW( const char *str1, const WCHAR *str2 )
+{
+    for (;;)
+    {
+        /* only the A-Z range is case-insensitive */
+        WCHAR ch1 = (*str1 >= 'a' && *str1 <= 'z') ? *str1 + 'A' - 'a' : (unsigned char)*str1;
+        WCHAR ch2 = (*str2 >= 'a' && *str2 <= 'z') ? *str2 + 'A' - 'a' : *str2;
+        if (!ch1 || ch1 != ch2) return ch1 - ch2;
+        str1++;
+        str2++;
+    }
+}
+
 /*
  *****************************************************************************
  * Function	: compare_name_id
@@ -165,30 +178,21 @@ int compare_striW( const WCHAR *str1, const WCHAR *str2 )
 */
 int compare_name_id(const name_id_t *n1, const name_id_t *n2)
 {
-    switch (n1->type)
-    {
-    case name_ord:
-	if (n2->type == name_ord) return n1->name.i_name - n2->name.i_name;
-	return 1;
+    if (n1->type != n2->type) return n1->type == name_ord ? 1 : -1;
+    if (n1->type == name_ord) return n1->name.i_name - n2->name.i_name;
 
-    case name_str:
-	if (n2->type == name_str)
-	{
-		if(n1->name.s_name->type == str_char
-		&& n2->name.s_name->type == str_char)
-		{
-			return compare_striA(n1->name.s_name->str.cstr, n2->name.s_name->str.cstr);
-		}
-		else
-		{
-			assert( n1->name.s_name->type == str_unicode );
-			assert( n2->name.s_name->type == str_unicode );
-			return compare_striW(n1->name.s_name->str.wstr, n2->name.s_name->str.wstr);
-		}
-	}
-        return -1;
+    if (n1->name.s_name->type == str_char)
+    {
+        if (n2->name.s_name->type == str_char)
+            return compare_striA(n1->name.s_name->str.cstr, n2->name.s_name->str.cstr);
+        return compare_striAW(n1->name.s_name->str.cstr, n2->name.s_name->str.wstr);
+    }
+    else
+    {
+        if (n2->name.s_name->type == str_char)
+            return -compare_striAW(n2->name.s_name->str.cstr, n1->name.s_name->str.wstr);
+        return compare_striW(n1->name.s_name->str.wstr, n2->name.s_name->str.wstr);
     }
-    return 0; /* Keep the compiler happy */
 }
 
 #ifdef _WIN32




More information about the wine-cvs mailing list