Martin Fuchs martin-fuchs@gmx.net writes:
I was not aware of that because I always got WRC error messages like "explorer_intres.rc:337:58: Error: Cannot handle UNICODE filenames" when using IDI_EXPLORER ICON DISCARDABLE "res/explorer.ico"
Now I tried once more and found this works: IDI_EXPLORER ICON DISCARDABLE res/explorer.ico
Why doesn't the standard way with quotation marks work? I think this is a bug and should be corrected in wrc?
Yes that's a bug. I think this should fix it:
Index: tools/wrc/parser.y =================================================================== RCS file: /home/winehq/opt/cvs-commit/wine/tools/wrc/parser.y,v retrieving revision 1.39 diff -u -p -r1.39 parser.y --- tools/wrc/parser.y 18 Sep 2003 04:31:15 -0000 1.39 +++ tools/wrc/parser.y 28 Sep 2003 21:00:02 -0000 @@ -137,6 +137,7 @@ #include "newstruc.h" #include "dumpres.h" #include "wine/wpp.h" +#include "wine/unicode.h" #include "parser.h" #include "windef.h" #include "winbase.h" @@ -202,7 +203,7 @@ static raw_data_t *merge_raw_data(raw_da static raw_data_t *str2raw_data(string_t *str); static raw_data_t *int2raw_data(int i); static raw_data_t *long2raw_data(int i); -static raw_data_t *load_file(string_t *name); +static raw_data_t *load_file(string_t *name, language_t *lang); static itemex_opt_t *new_itemex_opt(int id, int type, int state, int helpid); static event_t *add_string_event(string_t *key, int id, int flags, event_t *prev); static event_t *add_event(int key, int id, int flags, event_t *prev); @@ -1795,10 +1796,7 @@ raw_elements ;
/* File data or raw data */ -file_raw: filename { - $$ = load_file($1); - $$->lvc.language = dup_language(currentlanguage); - } +file_raw: filename { $$ = load_file($1,dup_language(currentlanguage)); } | raw_data { $$ = $1; } ;
@@ -2282,14 +2280,18 @@ static itemex_opt_t *new_itemex_opt(int }
/* Raw data functions */ -static raw_data_t *load_file(string_t *name) +static raw_data_t *load_file(string_t *filename, language_t *lang) { FILE *fp = NULL; char *path; raw_data_t *rd; - if(name->type != str_char) - yyerror("Filename must be ASCII string"); + string_t *name; + int codepage = get_language_codepage(lang->id, lang->sub);
+ /* FIXME: we may want to use utf-8 here */ + if (codepage <= 0 && filename->type != str_char) + yyerror("Cannot convert filename to ASCII string"); + name = convert_string( filename, str_char, codepage ); if (!(path = wpp_find_include(name->str.cstr, 1))) yyerror("Cannot open file %s", name->str.cstr); if (!(fp = fopen( path, "rb" ))) @@ -2302,6 +2304,8 @@ static raw_data_t *load_file(string_t *n rd->data = (char *)xmalloc(rd->size); fread(rd->data, rd->size, 1, fp); fclose(fp); + rd->lvc.language = lang; + free_string(name); return rd; }
@@ -2678,13 +2682,11 @@ static toolbar_item_t *get_tlbr_buttons_
static string_t *make_filename(string_t *str) { + if(str->type == str_char) + { char *cptr;
- if(str->type != str_char) - yyerror("Cannot handle UNICODE filenames"); - /* Remove escaped backslash and convert to forward */ - cptr = str->str.cstr; for(cptr = str->str.cstr; (cptr = strchr(cptr, '\')) != NULL; cptr++) { if(cptr[1] == '\') @@ -2694,8 +2696,23 @@ static string_t *make_filename(string_t } *cptr = '/'; } + } + else + { + WCHAR *wptr;
- return str; + /* Remove escaped backslash and convert to forward */ + for(wptr = str->str.wstr; (wptr = strchrW(wptr, '\')) != NULL; wptr++) + { + if(wptr[1] == '\') + { + memmove(wptr, wptr+1, strlenW(wptr)); + str->size--; + } + *wptr = '/'; + } + } + return str; }
/*