diff --git a/tools/wrc/Makefile.in b/tools/wrc/Makefile.in index 29529a2d71e..9aa383b6340 100644 --- a/tools/wrc/Makefile.in +++ b/tools/wrc/Makefile.in @@ -6,7 +6,6 @@ C_SRCS = \ genres.c \ newstruc.c \ po.c \ - translation.c \ utils.c \ wpp.c \ wrc.c diff --git a/tools/wrc/translation.c b/tools/wrc/translation.c deleted file mode 100644 index 831daba2b85..00000000000 --- a/tools/wrc/translation.c +++ /dev/null @@ -1,998 +0,0 @@ -/* - * Copyright 2003 Vincent BĂ©ron - * Copyright 2007, 2008 Mikolaj Zalewski - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include -#include - -#include "../tools.h" -#include "dumpres.h" -#include "utils.h" -#include "wrc.h" - -#define MASTER_LANGUAGE LANG_ENGLISH -#define MASTER_SUBLANGUAGE SUBLANG_ENGLISH_US -#define NB_LANG 0x94 - -enum lang_type_e { - lang_type_master = 0, - lang_type_neutral, - lang_type_normal -}; - -static language_t get_language(resource_t *resource) { - switch(resource->type) { - case res_acc: - return *resource->res.acc->lvc.language; - case res_bmp: - return *resource->res.bmp->data->lvc.language; - case res_cur: - return *resource->res.cur->lvc.language; - case res_curg: - return *resource->res.curg->lvc.language; - case res_dlg: - return *resource->res.dlg->lvc.language; - case res_fnt: - return *resource->res.fnt->data->lvc.language; - case res_fntdir: - return *resource->res.fnd->data->lvc.language; - case res_ico: - return *resource->res.ico->lvc.language; - case res_icog: - return *resource->res.icog->lvc.language; - case res_men: - return *resource->res.men->lvc.language; - case res_rdt: - return *resource->res.rdt->data->lvc.language; - case res_stt: - return *resource->res.stt->lvc.language; - case res_usr: - return *resource->res.usr->data->lvc.language; - case res_msg: - return *resource->res.msg->data->lvc.language; - case res_ver: - return *resource->res.ver->lvc.language; - case res_dlginit: - return *resource->res.dlgi->data->lvc.language; - case res_toolbar: - return *resource->res.tbt->lvc.language; - case res_anicur: - case res_aniico: - return *resource->res.ani->data->lvc.language; - case res_html: - return *resource->res.html->data->lvc.language; - default: - /* Not supposed to reach here */ - fprintf(stderr, "Not supposed to reach here (get_language_id())\n"); - abort(); - } -} - -static int get_language_id(resource_t *resource) { - return get_language(resource).id; -} - -static int compare_lang(language_t lang1, language_t lang2) -{ - return memcmp(&lang1, &lang2, sizeof(language_t)); -} - -#if 0 - -#define PRETTYPRINTLANG(langid) \ - if(LANG_##langid == lid) { \ - return #langid; \ - } - -static const char *get_language_name(int lid) { - PRETTYPRINTLANG(NEUTRAL) - PRETTYPRINTLANG(AFRIKAANS) - PRETTYPRINTLANG(ALBANIAN) - PRETTYPRINTLANG(ARABIC) - PRETTYPRINTLANG(ARMENIAN) - PRETTYPRINTLANG(ASSAMESE) - PRETTYPRINTLANG(AZERI) - PRETTYPRINTLANG(BASQUE) - PRETTYPRINTLANG(BELARUSIAN) - PRETTYPRINTLANG(BENGALI) - PRETTYPRINTLANG(BULGARIAN) - PRETTYPRINTLANG(CATALAN) - PRETTYPRINTLANG(CHINESE) - PRETTYPRINTLANG(CROATIAN) - PRETTYPRINTLANG(CZECH) - PRETTYPRINTLANG(DANISH) - PRETTYPRINTLANG(DIVEHI) - PRETTYPRINTLANG(DUTCH) - PRETTYPRINTLANG(ENGLISH) - PRETTYPRINTLANG(ESTONIAN) - PRETTYPRINTLANG(FAEROESE) - PRETTYPRINTLANG(FARSI) - PRETTYPRINTLANG(FINNISH) - PRETTYPRINTLANG(FRENCH) - PRETTYPRINTLANG(GALICIAN) - PRETTYPRINTLANG(GEORGIAN) - PRETTYPRINTLANG(GERMAN) - PRETTYPRINTLANG(GREEK) - PRETTYPRINTLANG(GUJARATI) - PRETTYPRINTLANG(HEBREW) - PRETTYPRINTLANG(HINDI) - PRETTYPRINTLANG(HUNGARIAN) - PRETTYPRINTLANG(ICELANDIC) - PRETTYPRINTLANG(INDONESIAN) - PRETTYPRINTLANG(IRISH) - PRETTYPRINTLANG(ITALIAN) - PRETTYPRINTLANG(JAPANESE) - PRETTYPRINTLANG(KANNADA) - PRETTYPRINTLANG(KASHMIRI) - PRETTYPRINTLANG(KAZAK) - PRETTYPRINTLANG(KONKANI) - PRETTYPRINTLANG(KOREAN) - PRETTYPRINTLANG(KYRGYZ) - PRETTYPRINTLANG(LATVIAN) - PRETTYPRINTLANG(LITHUANIAN) - PRETTYPRINTLANG(MACEDONIAN) - PRETTYPRINTLANG(MALAY) - PRETTYPRINTLANG(MALAYALAM) - PRETTYPRINTLANG(MANIPURI) - PRETTYPRINTLANG(MARATHI) - PRETTYPRINTLANG(MONGOLIAN) - PRETTYPRINTLANG(NEPALI) - PRETTYPRINTLANG(NORWEGIAN) - PRETTYPRINTLANG(ORIYA) - PRETTYPRINTLANG(POLISH) - PRETTYPRINTLANG(PORTUGUESE) - PRETTYPRINTLANG(PUNJABI) - PRETTYPRINTLANG(ROMANIAN) - PRETTYPRINTLANG(RUSSIAN) - PRETTYPRINTLANG(SANSKRIT) - PRETTYPRINTLANG(SERBIAN) - PRETTYPRINTLANG(SINDHI) - PRETTYPRINTLANG(SLOVAK) - PRETTYPRINTLANG(SLOVENIAN) - PRETTYPRINTLANG(SPANISH) - PRETTYPRINTLANG(SWAHILI) - PRETTYPRINTLANG(SWEDISH) - PRETTYPRINTLANG(SYRIAC) - PRETTYPRINTLANG(TAMIL) - PRETTYPRINTLANG(TATAR) - PRETTYPRINTLANG(TELUGU) - PRETTYPRINTLANG(THAI) - PRETTYPRINTLANG(TURKISH) - PRETTYPRINTLANG(UKRAINIAN) - PRETTYPRINTLANG(URDU) - PRETTYPRINTLANG(UZBEK) - PRETTYPRINTLANG(VIETNAMESE) - PRETTYPRINTLANG(SCOTTISH_GAELIC) - PRETTYPRINTLANG(MALTESE) - PRETTYPRINTLANG(MAORI) - PRETTYPRINTLANG(RHAETO_ROMANCE) - PRETTYPRINTLANG(SAAMI) - PRETTYPRINTLANG(SORBIAN) - PRETTYPRINTLANG(SUTU) - PRETTYPRINTLANG(TSONGA) - PRETTYPRINTLANG(TSWANA) - PRETTYPRINTLANG(VENDA) - PRETTYPRINTLANG(XHOSA) - PRETTYPRINTLANG(ZULU) - PRETTYPRINTLANG(ESPERANTO) - PRETTYPRINTLANG(WALON) - PRETTYPRINTLANG(CORNISH) - PRETTYPRINTLANG(WELSH) - PRETTYPRINTLANG(BRETON) - return "Unknown language"; -} -#endif - -static int compare_accelerator(accelerator_t *accelerator1, accelerator_t *accelerator2) { - int different = 0; - event_t *ev1 = NULL, *ev2 = NULL; - if(((accelerator1->memopt != accelerator2->memopt) || - (accelerator1->lvc.version != accelerator2->lvc.version) || - (accelerator1->lvc.characts != accelerator2->lvc.characts))) - different = 1; - ev1 = accelerator1->events; - ev2 = accelerator2->events; - while(!different && ev1 && ev2) { - if(!different && - ((ev1->id != ev2->id) || - (ev1->flags != ev2->flags))) - different = 1; - ev1 = ev1->next; - ev2 = ev2->next; - } - if(!different && - ((ev1 && !ev2) || (!ev1 && ev2))) - different = 1; - return different; -} - -static int compare_bitmap(bitmap_t *bitmap1, bitmap_t *bitmap2) { - int different = 0; - if(((bitmap1->memopt != bitmap2->memopt) || - (bitmap1->data->lvc.version != bitmap2->data->lvc.version) || - (bitmap1->data->lvc.characts != bitmap2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare_cursor(cursor_t *cursor1, cursor_t *cursor2) { - int different = 0; - if(((cursor1->id != cursor2->id) || - (cursor1->width != cursor2->width) || - (cursor1->height != cursor2->height) || - (cursor1->xhot != cursor2->xhot) || - (cursor1->yhot != cursor2->yhot))) - different = 1; - if(!different && - ((cursor1->lvc.version != cursor2->lvc.version) || - (cursor1->lvc.characts != cursor2->lvc.characts))) - different = 1; - return different; -} - -static int compare_cursor_group(cursor_group_t *cursor_group1, cursor_group_t *cursor_group2) { - int different = 0; - cursor_t *cursor1 = NULL, *cursor2 = NULL; - if(((cursor_group1->memopt != cursor_group2->memopt) || - (cursor_group1->lvc.version != cursor_group2->lvc.version) || - (cursor_group1->lvc.characts != cursor_group2->lvc.characts))) - different = 1; - if(!different && - (cursor_group1->ncursor != cursor_group2->ncursor)) - different = 1; - if(!different) { - cursor1 = cursor_group1->cursorlist; - cursor2 = cursor_group2->cursorlist; - while(!different && cursor1 && cursor2) { - different = compare_cursor(cursor1, cursor2); - cursor1 = cursor1->next; - cursor2 = cursor2->next; - } - if(!different && - ((cursor1 && !cursor2) || - (!cursor1 && cursor2))) - different = 1; - } - return different; -} - -static int compare_control(control_t *control1, control_t *control2) { - int different = 0; - int ignore_style; - if(((control1 && !control2) || (!control1 && control2))) - different = 1; - if(different || !control1 || !control2) - return different; - if (compare_name_id( control1->ctlclass, control2->ctlclass )) return 1; - - /* allow the translators to set some styles */ - ignore_style = 0; - if (control1->ctlclass->type == name_ord && control1->ctlclass->name.i_name == CT_BUTTON) - ignore_style = 0x2000; /* BS_MULTILINE*/ - - if((control1->id != control2->id)) - different = 1; - if(!different && control1->gotstyle && control2->gotstyle) { - if((!control1->style || !control2->style) || - (control1->style->and_mask || control2->style->and_mask) || - ((control1->style->or_mask & ~ignore_style) != (control2->style->or_mask & ~ignore_style))) - different = 1; - } else if(!different && - ((control1->gotstyle && !control2->gotstyle) || - (!control1->gotstyle && control2->gotstyle))) - different = 1; - if(!different && control1->gotexstyle && control2->gotexstyle) { - if((!control1->exstyle || !control2->exstyle) || - (control1->exstyle->and_mask || control2->exstyle->and_mask) || - (control1->exstyle->or_mask != control2->exstyle->or_mask)) - different = 1; - } else if(!different && - ((control1->gotexstyle && !control2->gotexstyle) || - (!control1->gotexstyle && control2->gotexstyle))) - different = 1; - if(!different && control1->gothelpid && control2->gothelpid) { - if(control1->helpid != control2->helpid) - different = 1; - } else if(!different && - ((control1->gothelpid && !control2->gothelpid) || - (!control1->gothelpid && control2->gothelpid))) - different = 1; - return different; -} - -static int compare_dialog(dialog_t *dialog1, dialog_t *dialog2) { - int different = 0; - control_t *ctrl1, *ctrl2; - if(((dialog1->memopt != dialog2->memopt) || - (dialog1->lvc.version != dialog2->lvc.version) || - (dialog1->lvc.characts != dialog2->lvc.characts))) - different = 1; - if(!different && dialog1->gotstyle && dialog2->gotstyle) { - if((!dialog1->style || !dialog2->style) || - (dialog1->style->and_mask || dialog2->style->and_mask) || - (dialog1->style->or_mask != dialog2->style->or_mask)) - different = 1; - } else if(!different && - ((dialog1->gotstyle && !dialog2->gotstyle) || - (!dialog1->gotstyle && dialog2->gotstyle))) - different = 1; - if(!different && dialog1->gotexstyle && dialog2->gotexstyle) { - if((!dialog1->exstyle || !dialog2->exstyle) || - (dialog1->exstyle->and_mask || dialog2->exstyle->and_mask) || - (dialog1->exstyle->or_mask != dialog2->exstyle->or_mask)) - different = 1; - } else if(!different && - ((dialog1->gotexstyle && !dialog2->gotexstyle) || - (!dialog1->gotexstyle && dialog2->gotexstyle))) - different = 1; - if(!different && dialog1->gothelpid && dialog2->gothelpid) { - if(dialog1->helpid != dialog2->helpid) - different = 1; - } else if(!different && - ((dialog1->gothelpid && !dialog2->gothelpid) || - (!dialog1->gothelpid && dialog2->gothelpid))) - different = 1; - - 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; - while(!different && (ctrl1 || ctrl2)) - { - different = compare_control(ctrl1, ctrl2); - if (ctrl1) ctrl1 = ctrl1->next; - if (ctrl2) ctrl2 = ctrl2->next; - } - return different; -} - -static int compare_font(font_t *font1, font_t *font2) { - int different = 0; - if(((font1->memopt != font2->memopt) || - (font1->data->lvc.version != font2->data->lvc.version) || - (font1->data->lvc.characts != font2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare_fontdir(fontdir_t *fontdir1, fontdir_t *fontdir2) { - int different = 0; - if(((fontdir1->memopt != fontdir2->memopt) || - (fontdir1->data->lvc.version != fontdir2->data->lvc.version) || - (fontdir1->data->lvc.characts != fontdir2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare_icon(icon_t *icon1, icon_t *icon2) { - int different = 0; - if(((icon1->id != icon2->id) || - (icon1->width != icon2->width) || - (icon1->height != icon2->height))) - different = 1; - if(!different && - ((icon1->lvc.version != icon2->lvc.version) || - (icon1->lvc.characts != icon2->lvc.characts))) - different = 1; - return different; -} - -static int compare_icon_group(icon_group_t *icon_group1, icon_group_t *icon_group2) { - int different = 0; - icon_t *icon1 = NULL, *icon2 = NULL; - if(((icon_group1->memopt != icon_group2->memopt) || - (icon_group1->lvc.version != icon_group2->lvc.version) || - (icon_group1->lvc.characts != icon_group2->lvc.characts))) - different = 1; - if(!different && - (icon_group1->nicon != icon_group2->nicon)) - different = 1; - if(!different) { - icon1 = icon_group1->iconlist; - icon2 = icon_group2->iconlist; - while(!different && icon1 && icon2) { - different = compare_icon(icon1, icon2); - icon1 = icon1->next; - icon2 = icon2->next; - } - if(!different && - ((icon1 && !icon2) || - (!icon1 && icon2))) - different = 1; - } - return different; -} - -static int compare_menu_item(menu_item_t *menu_item1, menu_item_t *menu_item2) { - int different = 0; - while(!different && menu_item1 && menu_item2) { - if(menu_item1->popup && menu_item2->popup) { - if(!different && menu_item1->gotid && menu_item2->gotid) { - if(menu_item1->id != menu_item2->id) - different = 1; - } else if(!different && - ((menu_item1->gotid && !menu_item2->gotid) || - (!menu_item1->gotid && menu_item2->gotid))) - different = 1; - if(!different && menu_item1->gottype && menu_item2->gottype) { - if(menu_item1->type != menu_item2->type) - different = 1; - } else if(!different && - ((menu_item1->gottype && !menu_item2->gottype) || - (!menu_item1->gottype && menu_item2->gottype))) - different = 1; - if(!different && menu_item1->gotstate && menu_item2->gotstate) { - if(menu_item1->state != menu_item2->state) - different = 1; - } else if(!different && - ((menu_item1->gotstate && !menu_item2->gotstate) || - (!menu_item1->gotstate && menu_item2->gotstate))) - different = 1; - if(!different && menu_item1->gothelpid && menu_item2->gothelpid) { - if(menu_item1->helpid != menu_item2->helpid) - different = 1; - } else if(!different && - ((menu_item1->gothelpid && !menu_item2->gothelpid) || - (!menu_item1->gothelpid && menu_item2->gothelpid))) - different = 1; - if(!different) - different = compare_menu_item(menu_item1->popup, menu_item2->popup); - } else if(!menu_item1->popup && !menu_item2->popup) { - if(menu_item1->name && menu_item2->name) { - if(!different && menu_item1->gotid && menu_item2->gotid) { - if(menu_item1->id != menu_item2->id) - different = 1; - } else if(!different && - ((menu_item1->gotid && !menu_item2->gotid) || - (!menu_item1->gotid && menu_item2->gotid))) - different = 1; - if(!different && menu_item1->gottype && menu_item2->gottype) { - if(menu_item1->type != menu_item2->type) - different = 1; - } else if(!different && - ((menu_item1->gottype && !menu_item2->gottype) || - (!menu_item1->gottype && menu_item2->gottype))) - different = 1; - if(!different && menu_item1->gotstate && menu_item2->gotstate) { - if(menu_item1->state != menu_item2->state) - different = 1; - } else if(!different && - ((menu_item1->gotstate && !menu_item2->gotstate) || - (!menu_item1->gotstate && menu_item2->gotstate))) - different = 1; - if(!different && menu_item1->gothelpid && menu_item2->gothelpid) { - if(menu_item1->helpid != menu_item2->helpid) - different = 1; - } else if(!different && - ((menu_item1->gothelpid && !menu_item2->gothelpid) || - (!menu_item1->gothelpid && menu_item2->gothelpid))) - different = 1; - } else if((menu_item1->name && !menu_item2->name) || - (!menu_item1->name && menu_item2->name)) - different = 1; - } else - different = 1; - menu_item1 = menu_item1->next; - menu_item2 = menu_item2->next; - } - if(!different && - ((menu_item1 && !menu_item2) || - (!menu_item1 && menu_item2))) - different = 1; - return different; -} - -static int compare_menu(menu_t *menu1, menu_t *menu2) { - int different = 0; - if(((menu1->memopt != menu2->memopt) || - (menu1->lvc.version != menu2->lvc.version) || - (menu1->lvc.characts != menu2->lvc.characts))) - different = 1; - if(!different) - different = compare_menu_item(menu1->items, menu2->items); - return different; -} - -static int compare_rcdata(rcdata_t *rcdata1, rcdata_t *rcdata2) { - int different = 0; - if(((rcdata1->memopt != rcdata2->memopt) || - (rcdata1->data->lvc.version != rcdata2->data->lvc.version) || - (rcdata1->data->lvc.characts != rcdata2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare_html(html_t *rcdata1, html_t *rcdata2) { - int different = 0; - if(((rcdata1->memopt != rcdata2->memopt) || - (rcdata1->data->lvc.version != rcdata2->data->lvc.version) || - (rcdata1->data->lvc.characts != rcdata2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare_stringtable(stringtable_t *stringtable1, stringtable_t *stringtable2) { - int different = 0; - int i; - while(!different && stringtable1 && stringtable2) { - if((stringtable1->memopt != stringtable2->memopt) || - (stringtable1->lvc.version != stringtable2->lvc.version) || - (stringtable1->lvc.characts != stringtable2->lvc.characts)) - different = 1; - if(!different) { - if((stringtable1->nentries != stringtable2->nentries) || - (stringtable1->idbase != stringtable2->idbase)) - different = 1; - else - for(i = 0 ; i < stringtable1->nentries; i++) - if((stringtable1->entries[i].id != stringtable2->entries[i].id) || - (stringtable1->entries[i].memopt != stringtable2->entries[i].memopt) || - (stringtable1->entries[i].str && !stringtable2->entries[i].str) || - (!stringtable1->entries[i].str && stringtable2->entries[i].str)) { - different = 1; - break; - } - } - stringtable1 = stringtable1->next; - stringtable2 = stringtable2->next; - } - return different; -} - -static int compare_user(user_t *user1, user_t *user2) { - int different = 0; - if(((user1->memopt != user2->memopt) || - (user1->data->lvc.version != user2->data->lvc.version) || - (user1->data->lvc.characts != user2->data->lvc.characts))) - different = 1; - if (!different) different = compare_name_id( user1->type, user2->type ); - return different; -} - -static int compare_messagetable(messagetable_t *messagetable1, messagetable_t *messagetable2) { - int different = 0; - if(((messagetable1->memopt != messagetable2->memopt) || - (messagetable1->data->lvc.version != messagetable2->data->lvc.version) || - (messagetable1->data->lvc.characts != messagetable2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare_string(string_t *string1, string_t *string2) { - int different = 0; - if(((string1->size != string2->size) || - (string1->type != string2->type))) - different = 1; - if(!different) { - if(string1->type == str_char) - different = memcmp(string1->str.cstr, string2->str.cstr, string1->size); - else if(string1->type == str_unicode) - different = memcmp(string1->str.wstr, string2->str.wstr, string1->size*sizeof(WCHAR)); - else - different = 1; - } - return different; -} - -static int compare_ver_block(ver_block_t *ver_block1, ver_block_t *ver_block2); - -static int compare_ver_value(ver_value_t *ver_value1, ver_value_t *ver_value2) { - int different = 0; - int i = 0; - if (ver_value1->type == ver_value2->type) { - switch(ver_value1->type) { - case val_str: - if(ver_value1->key && ver_value2->key) - different = compare_string(ver_value1->key, ver_value2->key); - else if(((ver_value1->key && !ver_value2->key) || - (!ver_value1->key && ver_value2->key))) - different = 1; - break; - case val_words: - if(ver_value1->key && ver_value2->key) - different = compare_string(ver_value1->key, ver_value2->key); - else if(((ver_value1->key && !ver_value2->key) || - (!ver_value1->key && ver_value2->key))) - different = 1; - if(!different && ver_value1->value.words && ver_value2->value.words) { - if(ver_value1->value.words->nwords != ver_value2->value.words->nwords) - different = 1; - if(!different) - for(i = 0; i < ver_value1->value.words->nwords; i++) { - if(ver_value1->value.words->words[i] != ver_value2->value.words->words[i]) { - different = 1; - break; - } - } - } else if(!different && - ((ver_value1->value.words && !ver_value2->value.words) || - (!ver_value1->value.words && ver_value2->value.words))) - different = 1; - break; - case val_block: - if(ver_value1->value.block && ver_value2->value.block) - different = compare_ver_block(ver_value1->value.block, ver_value2->value.block); - else if(((ver_value1->value.block && !ver_value2->value.block) || - (!ver_value1->value.block && ver_value2->value.block))) - different = 1; - break; - default: - different = 1; - } - } else - different = 1; - return different; -} - -static int compare_ver_block(ver_block_t *ver_block1, ver_block_t *ver_block2) { - int different = 0; - ver_value_t *ver_value1 = ver_block1->values, *ver_value2 = ver_block2->values; - - while(!different && ver_value1 && ver_value2) { - different = compare_ver_value(ver_value1, ver_value2); - ver_value1 = ver_value1->next; - ver_value2 = ver_value2->next; - } - if(!different && - ((ver_value1 && !ver_value2) || - (!ver_value1 && ver_value2))) - different = 1; - - return different; -} - -static int compare_versioninfo(versioninfo_t *versioninfo1, versioninfo_t *versioninfo2) { - int different = 0; - ver_block_t *ver_block1 = NULL, *ver_block2 = NULL; - if(((versioninfo1->memopt != versioninfo2->memopt) || - (versioninfo1->lvc.version != versioninfo2->lvc.version) || - (versioninfo1->lvc.characts != versioninfo2->lvc.characts))) - different = 1; - if(!different && versioninfo1->gotit.fv && versioninfo2->gotit.fv) { - if((versioninfo1->filever_maj1 != versioninfo2->filever_maj1) || - (versioninfo1->filever_maj2 != versioninfo2->filever_maj2) || - (versioninfo1->filever_min1 != versioninfo2->filever_min1) || - (versioninfo1->filever_min2 != versioninfo2->filever_min2)) - different = 1; - } else if(!different && - ((versioninfo1->gotit.fv && !versioninfo2->gotit.fv) || - (!versioninfo1->gotit.fv && versioninfo2->gotit.fv))) - different = 1; - if(!different && versioninfo1->gotit.pv && versioninfo2->gotit.pv) { - if((versioninfo1->prodver_maj1 != versioninfo2->prodver_maj1) || - (versioninfo1->prodver_maj2 != versioninfo2->prodver_maj2) || - (versioninfo1->prodver_min1 != versioninfo2->prodver_min1) || - (versioninfo1->prodver_min2 != versioninfo2->prodver_min2)) - different = 1; - } else if(!different && - ((versioninfo1->gotit.pv && !versioninfo2->gotit.pv) || - (!versioninfo1->gotit.pv && versioninfo2->gotit.pv))) - different = 1; - if(!different && versioninfo1->gotit.fo && versioninfo2->gotit.fo) { - if(versioninfo1->fileos != versioninfo2->fileos) - different = 1; - } else if(!different && - ((versioninfo1->gotit.fo && !versioninfo2->gotit.fo) || - (!versioninfo1->gotit.fo && versioninfo2->gotit.fo))) - different = 1; - if(!different && versioninfo1->gotit.ff && versioninfo2->gotit.ff) { - if(versioninfo1->fileflags != versioninfo2->fileflags) - different = 1; - } else if(!different && - ((versioninfo1->gotit.ff && !versioninfo2->gotit.ff) || - (!versioninfo1->gotit.ff && versioninfo2->gotit.ff))) - different = 1; - if(!different && versioninfo1->gotit.ffm && versioninfo2->gotit.ffm) { - if(versioninfo1->fileflagsmask != versioninfo2->fileflagsmask) - different = 1; - } else if(!different && - ((versioninfo1->gotit.ffm && !versioninfo2->gotit.ffm) || - (!versioninfo1->gotit.ffm && versioninfo2->gotit.ffm))) - different = 1; - if(!different && versioninfo1->gotit.ft && versioninfo2->gotit.ft) { - if(versioninfo1->filetype != versioninfo2->filetype) - different = 1; - } else if(!different && - ((versioninfo1->gotit.ft && !versioninfo2->gotit.ft) || - (!versioninfo1->gotit.ft && versioninfo2->gotit.ft))) - different = 1; - if(!different && versioninfo1->gotit.fst && versioninfo2->gotit.fst) { - if(versioninfo1->filesubtype != versioninfo2->filesubtype) - different = 1; - } else if(!different && - ((versioninfo1->gotit.fst && !versioninfo2->gotit.fst) || - (!versioninfo1->gotit.fst && versioninfo2->gotit.fst))) - different = 1; - if(!different) { - ver_block1 = versioninfo1->blocks; - ver_block2 = versioninfo2->blocks; - while(!different && ver_block1 && ver_block2) { - different = compare_ver_block(ver_block1, ver_block2); - ver_block1 = ver_block1->next; - ver_block2 = ver_block2->next; - } - if(!different && - ((ver_block1 && !ver_block2) || - (!ver_block1 && ver_block2))) - different = 1; - } - return different; -} - -static int compare_dlginit(dlginit_t *dlginit1, dlginit_t *dlginit2) { - int different = 0; - if(((dlginit1->memopt != dlginit2->memopt) || - (dlginit1->data->lvc.version != dlginit2->data->lvc.version) || - (dlginit1->data->lvc.characts != dlginit2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare_toolbar_item(toolbar_item_t *toolbar_item1, toolbar_item_t *toolbar_item2) { - int different = 0; - while(!different && toolbar_item1 && toolbar_item2) { - if((toolbar_item1->id && !toolbar_item2->id) || - (!toolbar_item1->id && toolbar_item2->id)) - different = 1; - toolbar_item1 = toolbar_item1->next; - toolbar_item2 = toolbar_item2->next; - } - if(!different && - ((toolbar_item1 && !toolbar_item2) || - (!toolbar_item1 && toolbar_item2))) - different = 1; - return different; -} - -static int compare_toolbar(toolbar_t *toolbar1, toolbar_t *toolbar2) { - int different = 0; - if(((toolbar1->memopt != toolbar2->memopt) || - (toolbar1->lvc.version != toolbar2->lvc.version) || - (toolbar1->lvc.characts != toolbar2->lvc.characts))) - different = 1; - if(!different) - different = compare_toolbar_item(toolbar1->items, toolbar2->items); - return different; -} - -static int compare_ani_curico(ani_curico_t *ani_curico1, ani_curico_t *ani_curico2) { - int different = 0; - if(((ani_curico1->memopt != ani_curico2->memopt) || - (ani_curico1->data->lvc.version != ani_curico2->data->lvc.version) || - (ani_curico1->data->lvc.characts != ani_curico2->data->lvc.characts))) - different = 1; - return different; -} - -static int compare(resource_t *resource1, resource_t *resource2) { - switch(resource1->type) { - case res_acc: - return compare_accelerator(resource1->res.acc, resource2->res.acc); - case res_bmp: - return compare_bitmap(resource1->res.bmp, resource2->res.bmp); - case res_cur: - return compare_cursor(resource1->res.cur, resource2->res.cur); - case res_curg: - return compare_cursor_group(resource1->res.curg, resource2->res.curg); - case res_dlg: - return compare_dialog(resource1->res.dlg, resource2->res.dlg); - case res_fnt: - return compare_font(resource1->res.fnt, resource2->res.fnt); - case res_fntdir: - return compare_fontdir(resource1->res.fnd, resource2->res.fnd); - case res_ico: - return compare_icon(resource1->res.ico, resource2->res.ico); - case res_icog: - return compare_icon_group(resource1->res.icog, resource2->res.icog); - case res_men: - return compare_menu(resource1->res.men, resource2->res.men); - case res_rdt: - return compare_rcdata(resource1->res.rdt, resource2->res.rdt); - case res_stt: - return compare_stringtable(resource1->res.stt, resource2->res.stt); - case res_usr: - return compare_user(resource1->res.usr, resource2->res.usr); - case res_html: - return compare_html(resource1->res.html, resource2->res.html); - case res_msg: - return compare_messagetable(resource1->res.msg, resource2->res.msg); - case res_ver: - return compare_versioninfo(resource1->res.ver, resource2->res.ver); - case res_dlginit: - return compare_dlginit(resource1->res.dlgi, resource2->res.dlgi); - case res_toolbar: - return compare_toolbar(resource1->res.tbt, resource2->res.tbt); - case res_anicur: - case res_aniico: - return compare_ani_curico(resource1->res.ani, resource2->res.ani); - default: - /* Not supposed to reach here */ - fprintf(stderr, "Not supposed to reach here (compare())\n"); - abort(); - return -1; - } -} - -typedef struct resource_lang_node -{ - language_t lang; - resource_t *res; - struct resource_lang_node *next; -} resource_lang_node_t; - -typedef struct resource_id_node -{ - name_id_t *id; - resource_lang_node_t *langs; - struct resource_id_node *next; -} resource_id_node_t; - -static struct -{ - int enabled; - struct resource_id_node *ids; -} verify_tab[res_usr+1]; - -static void add_resource(resource_t *res) -{ - resource_id_node_t *idnode; - resource_lang_node_t *langnode; - if (!verify_tab[res->type].enabled) - { - fprintf(stderr, "ERR: Report this: unknown resource type parsed %08x\n", res->type); - return; - } - - for (idnode = verify_tab[res->type].ids; idnode; idnode = idnode->next) - if (compare_name_id(idnode->id, res->name) == 0) - break; - - if (idnode == NULL) - { - idnode = xmalloc(sizeof(resource_id_node_t)); - idnode->id = res->name; - idnode->langs = NULL; - idnode->next = verify_tab[res->type].ids; - verify_tab[res->type].ids = idnode; - } - - for (langnode = idnode->langs; langnode; langnode = langnode->next) - if (compare_lang(langnode->lang, get_language(res)) == 0) - { - fprintf(stderr, "ERR: resource %s [type %x] language %03x:%02x duplicated!\n", - get_nameid_str(res->name), res->type, langnode->lang.id, langnode->lang.sub); - return; - } - - langnode = xmalloc(sizeof(resource_lang_node_t)); - langnode->res = res; - langnode->lang = get_language(res); - langnode->next = idnode->langs; - idnode->langs = langnode; -} - -static void setup_tabs(void) -{ - int i; - - for (i = 0; i <= res_usr; i++) - switch(i) { - case res_acc: - case res_bmp: - case res_cur: - case res_curg: - case res_dlg: - case res_fnt: - case res_fntdir: - case res_ico: - case res_icog: - case res_men: - case res_rdt: - case res_stt: - case res_usr: - case res_msg: - case res_ver: - case res_dlginit: - case res_toolbar: - case res_anicur: - case res_aniico: - case res_html: - verify_tab[i].enabled = 1; - break; - } -} - -static const char *get_typename_for_int(int type) { - resource_t res; - res.type = type; - return get_typename(&res); -} - -static resource_t *find_main(int type, name_id_t *id, resource_lang_node_t *langnode) -{ - resource_t *neutral = NULL, *en = NULL, *en_US = NULL; - for (; langnode; langnode = langnode->next) - { - if (langnode->lang.id == LANG_NEUTRAL && langnode->lang.sub == SUBLANG_NEUTRAL) - neutral = langnode->res; - if (langnode->lang.id == MASTER_LANGUAGE && langnode->lang.sub == SUBLANG_NEUTRAL) - en = langnode->res; - if (langnode->lang.id == MASTER_LANGUAGE && langnode->lang.sub == MASTER_SUBLANGUAGE) - en_US = langnode->res; - } - - if (neutral != NULL && (en != NULL || en_US != NULL)) - { - fprintf(stderr, "INFO: Resource %04x/%s has both NEUTRAL and MASTER language translation\n", - type, get_nameid_str(id)); - } - - if (en_US != NULL) return en_US; - if (en != NULL) return en; - return neutral; -} - -void verify_translations(resource_t *top) { - resource_t *curr = top; - resource_id_node_t *idnode; - resource_lang_node_t *langnode; - int type; - - setup_tabs(); - while (curr) - { - add_resource(curr); - curr = curr->next; - } - - for (type = 0; type <= res_usr; type++) - { - printf("TYPE NEXT [%s]\n", get_typename_for_int(type)); - for (idnode = verify_tab[type].ids; idnode; idnode = idnode->next) - { - resource_t *mainres; - printf("RESOURCE [%s]\n", get_nameid_str(idnode->id)); - - mainres = find_main(type, idnode->id, idnode->langs); - if (!mainres) - { - fprintf(stderr, "ERR: resource %04x/%s has translation(s) but not available in NEUTRAL or MASTER language\n", - type, get_nameid_str(idnode->id)); - for (langnode = idnode->langs; langnode; langnode = langnode->next) - printf("EXTRA %03x:%02x\n", langnode->lang.id, langnode->lang.sub); - continue; - } - - if (get_language_id(mainres) == LANG_NEUTRAL && idnode->langs->next == NULL) { - printf("NOTRANSL\n"); - continue; - } - - for (langnode = idnode->langs; langnode; langnode = langnode->next) - { - printf("EXIST %03x:%02x\n", langnode->lang.id, langnode->lang.sub); - if (compare(langnode->res, mainres)) - { - printf("DIFF %03x:%02x\n", langnode->lang.id, langnode->lang.sub); - } - } - } - } -} diff --git a/tools/wrc/wrc.c b/tools/wrc/wrc.c index c80827127fe..be2613db785 100644 --- a/tools/wrc/wrc.c +++ b/tools/wrc/wrc.c @@ -132,8 +132,6 @@ int utf8_input = 0; int check_utf8 = 1; /* whether to check for valid utf8 */ -static int verify_translations_mode; - static char *output_name; /* The name given by the -o option */ const char *input_name = NULL; /* The name given on the command-line */ static char *temp_name = NULL; /* Temporary file for preprocess pipe */ @@ -167,7 +165,6 @@ enum long_options_values LONG_OPT_VERSION, LONG_OPT_DEBUG, LONG_OPT_PEDANTIC, - LONG_OPT_VERIFY_TRANSL }; static const char short_options[] = @@ -194,7 +191,6 @@ static const struct long_option long_options[] = { { "undefine", 1, 'U' }, { "use-temp-file", 0, LONG_OPT_TMPFILE }, { "verbose", 0, 'v' }, - { "verify-translations", 0, LONG_OPT_VERIFY_TRANSL }, { "version", 0, LONG_OPT_VERSION }, { NULL } }; @@ -358,9 +354,6 @@ static void option_callback( int optc, char *optarg ) case LONG_OPT_PEDANTIC: pedantic = 1; break; - case LONG_OPT_VERIFY_TRANSL: - verify_translations_mode = 1; - break; case 'D': wpp_add_cmdline_define(optarg); break; @@ -499,11 +492,6 @@ int main(int argc,char *argv[]) if(debuglevel & DEBUGLEVEL_DUMP) dump_resources(resource_top); - if(verify_translations_mode) - { - verify_translations(resource_top); - exit(0); - } if (!po_mode && output_name) { if (strendswith( output_name, ".po" )) po_mode = 1; diff --git a/tools/wrc/wrc.h b/tools/wrc/wrc.h index 55d410b761b..63b0295d07b 100644 --- a/tools/wrc/wrc.h +++ b/tools/wrc/wrc.h @@ -50,7 +50,6 @@ extern int char_number; extern resource_t *resource_top; extern language_t *currentlanguage; -void verify_translations(resource_t *top); void write_pot_file( const char *outname ); void write_po_files( const char *outname ); void add_translations( const char *po_dir );