- Generalized the distinction between 2 and 4 byte integers slightly through

a new parser state. The is now a warning when a 2 byte integer is larger
  than 16 bit (and is truncated).
- Fixed a couple of cosmetic things in the DLGINIT stuff so that dumping of
  this type will work as expected.
- Added generalized language/version/characteristics support to the DLGINIT
  resource type.

Ulrich Czekalla <ulrichc@corel.ca>
- Added support for DLGINIT resource-type.
- Added string continuation and embedded quoting.
- Added numeric IDs for icons in controls.

Eric Pouech <Eric.Pouech@wanadoo.fr>
- Bugfix: Distinguish between 2 and 4 byte integers in RCDATA.
This commit is contained in:
Bertho Stultiens 1999-07-20 14:54:54 +00:00 committed by Alexandre Julliard
parent 3dc0421938
commit 62451da52c
10 changed files with 241 additions and 39 deletions

View File

@ -1,3 +1,23 @@
---------------------------------------------------------------------------
Version 1.0.12 (18-Jul-1999)
Bertho Stultiens <bertho@akhphd.au.dk>
- Generalized the distinction between 2 and 4 byte integers slightly through
a new parser state. The is now a warning when a 2 byte integer is larger
than 16 bit (and is truncated).
- Fixed a couple of cosmetic things in the DLGINIT stuff so that dumping of
this type will work as expected.
- Added generalized language/version/characteristics support to the DLGINIT
resource type.
Ulrich Czekalla <ulrichc@corel.ca>
- Added support for DLGINIT resource-type.
- Added string continuation and embedded quoting.
- Added numeric IDs for icons in controls.
Eric Pouech <Eric.Pouech@wanadoo.fr>
- Bugfix: Distinguish between 2 and 4 byte integers in RCDATA.
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
Version 1.0.11 (22-Apr-1999) Version 1.0.11 (22-Apr-1999)

View File

@ -43,6 +43,7 @@ char *get_typename(resource_t* r)
case res_usr: return "UserResource"; case res_usr: return "UserResource";
case res_msg: return "MESSAGETABLE"; case res_msg: return "MESSAGETABLE";
case res_ver: return "VERSIONINFO"; case res_ver: return "VERSIONINFO";
case res_dlginit: return "DLGINIT";
case res_toolbar: return "TOOLBAR"; case res_toolbar: return "TOOLBAR";
default: return "Unknown"; default: return "Unknown";
} }
@ -492,7 +493,7 @@ void dump_stringtable(stringtable_t *stt)
void dump_control(control_t *ctrl) void dump_control(control_t *ctrl)
{ {
printf("Control {\n\tClass: %s\n", get_nameid_str(ctrl->ctlclass)); printf("Control {\n\tClass: %s\n", get_nameid_str(ctrl->ctlclass));
printf("\tText: "); print_string(ctrl->title); printf("\n"); printf("\tText: "); get_nameid_str(ctrl->title); printf("\n");
printf("\tId: %d\n", ctrl->id); printf("\tId: %d\n", ctrl->id);
printf("\tx, y, w, h: %d, %d, %d, %d\n", ctrl->x, ctrl->y, ctrl->width, ctrl->height); printf("\tx, y, w, h: %d, %d, %d, %d\n", ctrl->x, ctrl->y, ctrl->width, ctrl->height);
if(ctrl->gotstyle) if(ctrl->gotstyle)
@ -850,7 +851,7 @@ void dump_toolbar_items(toolbar_item_t *items)
/* /*
***************************************************************************** *****************************************************************************
* Function : dump_toolbar * Function : dump_toolbar
* Syntax : void dump_toolbar(dialogex_t *toolbar) * Syntax : void dump_toolbar(toolbar_t *toolbar)
* Input : * Input :
* toolbar - Toolbar resource descriptor * toolbar - Toolbar resource descriptor
* Output : * Output :
@ -865,6 +866,24 @@ void dump_toolbar(toolbar_t *toolbar)
dump_toolbar_items(toolbar->items); dump_toolbar_items(toolbar->items);
} }
/*
*****************************************************************************
* Function : dump_dlginit
* Syntax : void dump_dlginit(dlginit_t *dit)
* Input :
* dit - DlgInit resource descriptor
* Output :
* Description :
* Remarks :
*****************************************************************************
*/
void dump_dlginit(dlginit_t *dit)
{
dump_memopt(dit->memopt);
dump_lvc(&(dit->lvc));
dump_raw_data(dit->data);
}
/* /*
***************************************************************************** *****************************************************************************
* Function : * Function :
@ -945,6 +964,9 @@ void dump_resources(resource_t *top)
case res_ver: case res_ver:
dump_versioninfo(top->res.ver); dump_versioninfo(top->res.ver);
break; break;
case res_dlginit:
dump_dlginit(top->res.dlgi);
break;
case res_toolbar: case res_toolbar:
dump_toolbar(top->res.tbt); dump_toolbar(top->res.tbt);
break; break;

View File

@ -457,7 +457,7 @@ res_t *dialog2res(name_id_t *name, dialog_t *dlg)
else else
internal_error(__FILE__, __LINE__, "Control has no control-class"); internal_error(__FILE__, __LINE__, "Control has no control-class");
if(ctrl->title) if(ctrl->title)
put_string(res, ctrl->title, str_unicode, TRUE); put_name_id(res, ctrl->title, TRUE);
else else
put_word(res, 0); put_word(res, 0);
if(ctrl->extra) if(ctrl->extra)
@ -528,7 +528,7 @@ res_t *dialog2res(name_id_t *name, dialog_t *dlg)
else else
internal_error(__FILE__, __LINE__, "Control has no control-class"); internal_error(__FILE__, __LINE__, "Control has no control-class");
if(ctrl->title) if(ctrl->title)
put_string(res, ctrl->title, str_char, TRUE); put_name_id(res, ctrl->title, FALSE);
else else
put_byte(res, 0); put_byte(res, 0);
@ -634,7 +634,7 @@ res_t *dialogex2res(name_id_t *name, dialogex_t *dlgex)
else else
internal_error(__FILE__, __LINE__, "Control has no control-class"); internal_error(__FILE__, __LINE__, "Control has no control-class");
if(ctrl->title) if(ctrl->title)
put_string(res, ctrl->title, str_unicode, TRUE); put_name_id(res, ctrl->title, TRUE);
else else
put_word(res, 0); put_word(res, 0);
if(ctrl->extra) if(ctrl->extra)
@ -1491,6 +1491,35 @@ res_t *toolbar2res(name_id_t *name, toolbar_t *toolbar)
return res; return res;
} }
/*
*****************************************************************************
* Function : dlginit2res
* Syntax : res_t *dlginit2res(name_id_t *name, dlginit_t *dit)
* Input :
* name - Name/ordinal of the resource
* rdt - The dlginit descriptor
* Output : New .res format structure
* Description :
* Remarks :
*****************************************************************************
*/
res_t *dlginit2res(name_id_t *name, dlginit_t *dit)
{
int restag;
res_t *res;
assert(name != NULL);
assert(dit != NULL);
res = new_res();
restag = put_res_header(res, WRC_RT_DLGINIT, NULL, name, dit->memopt, &(dit->lvc));
put_raw_data(res, dit->data, 0);
/* Set ResourceSize */
SetResSize(res, restag);
if(win32)
put_pad(res);
return res;
}
/* /*
***************************************************************************** *****************************************************************************
* Function : prep_nid_for_label * Function : prep_nid_for_label
@ -1615,6 +1644,7 @@ char *get_c_typename(enum res_e type)
case res_msg: return "MsgTab"; case res_msg: return "MsgTab";
case res_ver: return "VerInf"; case res_ver: return "VerInf";
case res_toolbar: return "TlBr"; case res_toolbar: return "TlBr";
case res_dlginit: return "DlgInit";
default: return "Oops"; default: return "Oops";
} }
} }
@ -1704,6 +1734,11 @@ void resources2res(resource_t *top)
if(!top->binres) if(!top->binres)
top->binres = toolbar2res(top->name, top->res.tbt); top->binres = toolbar2res(top->name, top->res.tbt);
break; break;
case res_dlginit:
if(!top->binres)
top->binres = dlginit2res(top->name, top->res.dlgi);
break;
default: default:
internal_error(__FILE__, __LINE__, "Unknown resource type encountered %d in binary res generation", top->type); internal_error(__FILE__, __LINE__, "Unknown resource type encountered %d in binary res generation", top->type);
} }

View File

@ -263,3 +263,26 @@ toolbar_t *new_toolbar(int button_width, int button_height, toolbar_item_t *item
tb->items = items; tb->items = items;
return tb; return tb;
} }
dlginit_t *new_dlginit(raw_data_t *rd, int *memopt)
{
dlginit_t *di = (dlginit_t *)xmalloc(sizeof(dlginit_t));
di->data = rd;
if(memopt)
{
di->memopt = *memopt;
free(memopt);
}
else
di->memopt = WRC_MO_MOVEABLE | WRC_MO_PURE | WRC_MO_DISCARDABLE;
return di;
}
style_pair_t *new_style_pair(int style, int exstyle)
{
style_pair_t *sp = (style_pair_t *)xmalloc(sizeof(style_pair_t));
sp->style = style;
sp->exstyle = exstyle;
return sp;
}

View File

@ -59,10 +59,12 @@ bitmap_t *new_bitmap(raw_data_t *rd, int *memopt);
ver_words_t *new_ver_words(int i); ver_words_t *new_ver_words(int i);
ver_words_t *add_ver_words(ver_words_t *w, int i); ver_words_t *add_ver_words(ver_words_t *w, int i);
messagetable_t *new_messagetable(raw_data_t *rd); messagetable_t *new_messagetable(raw_data_t *rd);
dlginit_t *new_dlginit(raw_data_t *rd, int *memopt);
void copy_raw_data(raw_data_t *dst, raw_data_t *src, int offs, int len); void copy_raw_data(raw_data_t *dst, raw_data_t *src, int offs, int len);
int *new_int(int i); int *new_int(int i);
stringtable_t *new_stringtable(lvc_t *lvc); stringtable_t *new_stringtable(lvc_t *lvc);
toolbar_t *new_toolbar(int button_width, int button_Height, toolbar_item_t *items, int nitems); toolbar_t *new_toolbar(int button_width, int button_Height, toolbar_item_t *items, int nitems);
style_pair_t *new_style_pair(int style, int exstyle);
#endif #endif

View File

@ -277,6 +277,7 @@ static struct keyword keywords[] = {
{ "DIALOG", DIALOG, 0, 0, 0}, { "DIALOG", DIALOG, 0, 0, 0},
{ "DIALOGEX", DIALOGEX, 1, 0, 0}, { "DIALOGEX", DIALOGEX, 1, 0, 0},
{ "DISCARDABLE", DISCARDABLE, 0, 0, 0}, { "DISCARDABLE", DISCARDABLE, 0, 0, 0},
{ "DLGINIT", DLGINIT, 0, 0, 0},
{ "EDITTEXT", EDITTEXT, 0, 0, 0}, { "EDITTEXT", EDITTEXT, 0, 0, 0},
{ "END", tEND, 0, 0, 1}, { "END", tEND, 0, 0, 1},
{ "EXSTYLE", EXSTYLE, 0, 0, 0}, { "EXSTYLE", EXSTYLE, 0, 0, 0},
@ -584,9 +585,9 @@ void add_to_substtext(char *text, int len)
\{ return tBEGIN; \{ return tBEGIN;
\} return tEND; \} return tEND;
[0-9]+[lL]? { yylval.num = atoi(yytext); return NUMBER; } [0-9]+[lL]? { yylval.num = strtoul(yytext, 0, 10); return toupper(yytext[yyleng-1]) == 'L' ? LNUMBER : NUMBER; }
0[xX][0-9A-Fa-f]+[lL]? { yylval.num = strtoul(yytext,0,16); return NUMBER; } 0[xX][0-9A-Fa-f]+[lL]? { yylval.num = strtoul(yytext, 0, 16); return toupper(yytext[yyleng-1]) == 'L' ? LNUMBER : NUMBER; }
0[oO][0-7]+ { yylval.num = strtoul(yytext+2,0,8); return NUMBER; } 0[oO][0-7]+[lL]? { yylval.num = strtoul(yytext+2, 0, 8); return toupper(yytext[yyleng-1]) == 'L' ? LNUMBER : NUMBER; }
[A-Za-z_0-9]+ { [A-Za-z_0-9]+ {
struct keyword *token; struct keyword *token;
struct pp_entry *ppp; struct pp_entry *ppp;
@ -630,6 +631,7 @@ void add_to_substtext(char *text, int len)
case CURSOR: case CURSOR:
case tBITMAP: case tBITMAP:
case MESSAGETABLE: case MESSAGETABLE:
case DLGINIT:
push_to(yywf); push_to(yywf);
break; break;
case FONT: case FONT:
@ -703,6 +705,9 @@ L\" {
<yylstr>\\t addwchar('\t'); <yylstr>\\t addwchar('\t');
<yylstr>\\v addwchar('\v'); <yylstr>\\v addwchar('\v');
<yylstr>\\(.|\n) addwchar(yytext[1]); <yylstr>\\(.|\n) addwchar(yytext[1]);
<yylstr>\"\" addcchar('\"'); /* "bla""bla" -> "bla\"bla" */
<yylstr>\\\"\" addcchar('\"'); /* "bla\""bla" -> "bla\"bla" */
<yylstr>\"{ws}+\" ; /* "bla" "bla" -> "blabla" */
<yylstr>[^\\\n\"]+ { <yylstr>[^\\\n\"]+ {
char *yptr = yytext; char *yptr = yytext;
while(*yptr) /* FIXME: codepage translation */ while(*yptr) /* FIXME: codepage translation */
@ -745,6 +750,9 @@ L\" {
while(*yptr) while(*yptr)
addcchar(*yptr++); addcchar(*yptr++);
} }
<yystr>\"\" addcchar('\"'); /* "bla""bla" -> "bla\"bla" */
<yystr>\\\"\" addcchar('\"'); /* "bla\""bla" -> "bla\"bla" */
<yystr>\"{ws}+\" ; /* "bla" "bla" -> "blabla" */

View File

@ -141,9 +141,11 @@ menuex_item_t *get_itemex_head(menuex_item_t *p);
menu_item_t *get_item_head(menu_item_t *p); menu_item_t *get_item_head(menu_item_t *p);
raw_data_t *merge_raw_data_str(raw_data_t *r1, string_t *str); raw_data_t *merge_raw_data_str(raw_data_t *r1, string_t *str);
raw_data_t *merge_raw_data_int(raw_data_t *r1, int i); raw_data_t *merge_raw_data_int(raw_data_t *r1, int i);
raw_data_t *merge_raw_data_long(raw_data_t *r1, int i);
raw_data_t *merge_raw_data(raw_data_t *r1, raw_data_t *r2); raw_data_t *merge_raw_data(raw_data_t *r1, raw_data_t *r2);
raw_data_t *str2raw_data(string_t *str); raw_data_t *str2raw_data(string_t *str);
raw_data_t *int2raw_data(int i); raw_data_t *int2raw_data(int i);
raw_data_t *long2raw_data(int i);
raw_data_t *load_file(string_t *name); raw_data_t *load_file(string_t *name);
itemex_opt_t *new_itemex_opt(int id, int type, int state, int helpid); itemex_opt_t *new_itemex_opt(int id, int type, int state, int helpid);
event_t *add_string_event(string_t *key, int id, int flags, event_t *prev); event_t *add_string_event(string_t *key, int id, int flags, event_t *prev);
@ -213,11 +215,13 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems);
ver_words_t *verw; ver_words_t *verw;
toolbar_t *tlbar; toolbar_t *tlbar;
toolbar_item_t *tlbarItems; toolbar_item_t *tlbarItems;
dlginit_t *dginit;
style_pair_t *styles;
} }
%token tIF tIFDEF tIFNDEF tELSE tELIF tENDIF tDEFINED tNL %token tIF tIFDEF tIFNDEF tELSE tELIF tENDIF tDEFINED tNL
%token tTYPEDEF tEXTERN %token tTYPEDEF tEXTERN
%token <num> NUMBER %token <num> NUMBER LNUMBER
%token <str> tSTRING IDENT FILENAME %token <str> tSTRING IDENT FILENAME
%token <raw> RAWDATA %token <raw> RAWDATA
%token ACCELERATORS tBITMAP CURSOR DIALOG DIALOGEX MENU MENUEX MESSAGETABLE %token ACCELERATORS tBITMAP CURSOR DIALOG DIALOGEX MENU MENUEX MESSAGETABLE
@ -237,6 +241,7 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems);
%token tSTRING IDENT RAWDATA %token tSTRING IDENT RAWDATA
%token TOOLBAR BUTTON %token TOOLBAR BUTTON
%token tBEGIN tEND %token tBEGIN tEND
%token DLGINIT
%left LOGOR %left LOGOR
%left LOGAND %left LOGAND
%left '|' %left '|'
@ -278,7 +283,7 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems);
%type <nid> nameid nameid_s ctlclass usertype %type <nid> nameid nameid_s ctlclass usertype
%type <num> acc_opt %type <num> acc_opt
%type <iptr> loadmemopts lamo lama %type <iptr> loadmemopts lamo lama
%type <fntid> opt_font opt_exfont %type <fntid> opt_font opt_exfont opt_expr
%type <lvc> opt_lvc %type <lvc> opt_lvc
%type <lan> opt_language %type <lan> opt_language
%type <chars> opt_characts %type <chars> opt_characts
@ -288,6 +293,9 @@ toolbar_item_t *get_tlbr_buttons_head(toolbar_item_t *p, int *nitems);
%type <iptr> pp_expr pp_constant %type <iptr> pp_expr pp_constant
%type <tlbar> toolbar %type <tlbar> toolbar
%type <tlbarItems> toolbar_items %type <tlbarItems> toolbar_items
%type <dginit> dlginit
%type <styles> optional_style_pair
%type <num> any_num
%% %%
@ -372,7 +380,7 @@ pp_expr : pp_constant { $$ = $1; }
; ;
pp_constant pp_constant
: NUMBER { $$ = new_int($1); } : any_num { $$ = new_int($1); }
| IDENT { $$ = NULL; } | IDENT { $$ = NULL; }
| tDEFINED IDENT { $$ = new_int(pp_lookup($2->str.cstr) != NULL); } | tDEFINED IDENT { $$ = new_int(pp_lookup($2->str.cstr) != NULL); }
| tDEFINED '(' IDENT ')' { $$ = new_int(pp_lookup($3->str.cstr) != NULL); } | tDEFINED '(' IDENT ')' { $$ = new_int(pp_lookup($3->str.cstr) != NULL); }
@ -475,7 +483,8 @@ resource_definition
else else
$$ = NULL; $$ = NULL;
} }
| font { $$=new_resource(res_fnt, $1, $1->memopt, dup_language(currentlanguage)); } | dlginit { $$ = new_resource(res_dlginit, $1, $1->memopt, $1->lvc.language); }
| font { $$ = new_resource(res_fnt, $1, $1->memopt, dup_language(currentlanguage)); }
| icon { | icon {
resource_t *rsc; resource_t *rsc;
icon_t *ico; icon_t *ico;
@ -549,6 +558,19 @@ rcdata : RCDATA loadmemopts opt_lvc raw_data {
} }
; ;
/* ------------------------------ DLGINIT ------------------------------ */
dlginit : DLGINIT loadmemopts opt_lvc raw_data {
$$ = new_dlginit($4, $2);
if($3)
{
$$->lvc = *($3);
free($3);
}
if(!$$->lvc.language)
$$->lvc.language = dup_language(currentlanguage);
}
;
/* ------------------------------ UserType ------------------------------ */ /* ------------------------------ UserType ------------------------------ */
userres : usertype loadmemopts FILENAME { $$ = new_user($1, load_file($3), $2); } userres : usertype loadmemopts FILENAME { $$ = new_user($1, load_file($3), $2); }
| usertype loadmemopts raw_data { $$ = new_user($1, $3, $2); } | usertype loadmemopts raw_data { $$ = new_user($1, $3, $2); }
@ -696,14 +718,7 @@ ctrls : /* Empty */ { $$ = NULL; }
| ctrls RTEXT lab_ctrl { $$=ins_ctrl(CT_STATIC, SS_RIGHT, $3, $1); } | ctrls RTEXT lab_ctrl { $$=ins_ctrl(CT_STATIC, SS_RIGHT, $3, $1); }
/* special treatment for icons, as the extent is optional */ /* special treatment for icons, as the extent is optional */
| ctrls ICON nameid_s ',' expr ',' expr ',' expr iconinfo { | ctrls ICON nameid_s ',' expr ',' expr ',' expr iconinfo {
if($3->type == name_str) $10->title = $3;
{
$10->title = $3->name.s_name;
}
else
{
$10->title = NULL;
}
$10->id = $5; $10->id = $5;
$10->x = $7; $10->x = $7;
$10->y = $9; $10->y = $9;
@ -714,7 +729,9 @@ ctrls : /* Empty */ { $$ = NULL; }
lab_ctrl lab_ctrl
: tSTRING ',' expr ',' expr ',' expr ',' expr ',' expr optional_style { : tSTRING ',' expr ',' expr ',' expr ',' expr ',' expr optional_style {
$$=new_control(); $$=new_control();
$$->title = $1; $$->title = new_name_id();
$$->title->type = name_str;
$$->title->name.s_name = $1;
$$->id = $3; $$->id = $3;
$$->x = $5; $$->x = $5;
$$->y = $7; $$->y = $7;
@ -772,7 +789,7 @@ iconinfo: /* Empty */
} }
; ;
gen_ctrl: tSTRING ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr ',' expr { gen_ctrl: nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr ',' expr {
$$=new_control(); $$=new_control();
$$->title = $1; $$->title = $1;
$$->id = $3; $$->id = $3;
@ -786,7 +803,7 @@ gen_ctrl: tSTRING ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ','
$$->exstyle = $17; $$->exstyle = $17;
$$->gotexstyle = TRUE; $$->gotexstyle = TRUE;
} }
| tSTRING ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr { | nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr {
$$=new_control(); $$=new_control();
$$->title = $1; $$->title = $1;
$$->id = $3; $$->id = $3;
@ -809,6 +826,12 @@ optional_style /* Abbused once to get optional ExStyle */
| ',' expr { $$ = new_int($2); } | ',' expr { $$ = new_int($2); }
; ;
optional_style_pair
: /* Enpty */ { $$ = NULL; }
| ',' expr { $$ = new_style_pair($2, 0); }
| ',' expr ',' expr { $$ = new_style_pair($2, $4); }
;
ctlclass ctlclass
: expr { : expr {
$$ = new_name_id(); $$ = new_name_id();
@ -866,6 +889,7 @@ dlgex_attribs
| dlgex_attribs STYLE expr { $$=dialogex_style($3,$1); } | dlgex_attribs STYLE expr { $$=dialogex_style($3,$1); }
| dlgex_attribs EXSTYLE expr { $$=dialogex_exstyle($3,$1); } | dlgex_attribs EXSTYLE expr { $$=dialogex_exstyle($3,$1); }
| dlgex_attribs CAPTION tSTRING { $$=dialogex_caption($3,$1); } | dlgex_attribs CAPTION tSTRING { $$=dialogex_caption($3,$1); }
| dlgex_attribs opt_font { $$=dialogex_font($2,$1); }
| dlgex_attribs opt_exfont { $$=dialogex_font($2,$1); } | dlgex_attribs opt_exfont { $$=dialogex_font($2,$1); }
| dlgex_attribs CLASS nameid_s { $$=dialogex_class($3,$1); } | dlgex_attribs CLASS nameid_s { $$=dialogex_class($3,$1); }
| dlgex_attribs MENU nameid { $$=dialogex_menu($3,$1); } | dlgex_attribs MENU nameid { $$=dialogex_menu($3,$1); }
@ -894,7 +918,7 @@ exctrls : /* Empty */ { $$ = NULL; }
| exctrls CTEXT lab_exctrl { $$=ins_ctrl(CT_STATIC, SS_CENTER, $3, $1); } | exctrls CTEXT lab_exctrl { $$=ins_ctrl(CT_STATIC, SS_CENTER, $3, $1); }
| exctrls RTEXT lab_exctrl { $$=ins_ctrl(CT_STATIC, SS_RIGHT, $3, $1); } | exctrls RTEXT lab_exctrl { $$=ins_ctrl(CT_STATIC, SS_RIGHT, $3, $1); }
/* special treatment for icons, as the extent is optional */ /* special treatment for icons, as the extent is optional */
| exctrls ICON tSTRING ',' expr ',' expr ',' expr iconinfo { | exctrls ICON nameid_s ',' expr ',' expr ',' expr iconinfo {
$10->title = $3; $10->title = $3;
$10->id = $5; $10->id = $5;
$10->x = $7; $10->x = $7;
@ -904,7 +928,7 @@ exctrls : /* Empty */ { $$ = NULL; }
; ;
gen_exctrl gen_exctrl
: tSTRING ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' : nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ','
expr ',' e_expr helpid opt_data { expr ',' e_expr helpid opt_data {
$$=new_control(); $$=new_control();
$$->title = $1; $$->title = $1;
@ -930,7 +954,7 @@ gen_exctrl
} }
$$->extra = $19; $$->extra = $19;
} }
| tSTRING ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr opt_data { | nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr opt_data {
$$=new_control(); $$=new_control();
$$->title = $1; $$->title = $1;
$$->id = $3; $$->id = $3;
@ -946,9 +970,11 @@ gen_exctrl
; ;
lab_exctrl lab_exctrl
: tSTRING ',' expr ',' expr ',' expr ',' expr ',' expr optional_style opt_data { : tSTRING ',' expr ',' expr ',' expr ',' expr ',' expr optional_style_pair opt_data {
$$=new_control(); $$=new_control();
$$->title = $1; $$->title = new_name_id();
$$->title->type = name_str;
$$->title->name.s_name = $1;
$$->id = $3; $$->id = $3;
$$->x = $5; $$->x = $5;
$$->y = $7; $$->y = $7;
@ -956,16 +982,23 @@ lab_exctrl
$$->height = $11; $$->height = $11;
if($12) if($12)
{ {
$$->style = *($12); $$->style = $12->style;
$$->gotstyle = TRUE; $$->gotstyle = TRUE;
if ($12->exstyle)
{
$$->exstyle = $12->exstyle;
$$->gotexstyle = TRUE;
}
free($12); free($12);
} }
$$->extra = $13; $$->extra = $13;
} }
; ;
exctrl_desc exctrl_desc
: expr ',' expr ',' expr ',' expr ',' expr optional_style opt_data { : expr ',' expr ',' expr ',' expr ',' expr optional_style_pair opt_data {
$$ = new_control(); $$ = new_control();
$$->id = $1; $$->id = $1;
$$->x = $3; $$->x = $3;
@ -974,8 +1007,14 @@ exctrl_desc
$$->height = $9; $$->height = $9;
if($10) if($10)
{ {
$$->style = *($10); $$->style = $10->style;
$$->gotstyle = TRUE; $$->gotstyle = TRUE;
if ($10->exstyle)
{
$$->exstyle = $10->exstyle;
$$->gotexstyle = TRUE;
}
free($10); free($10);
} }
$$->extra = $11; $$->extra = $11;
@ -991,7 +1030,15 @@ helpid : /* Empty */ { $$ = NULL; }
; ;
opt_exfont opt_exfont
: FONT expr ',' tSTRING ',' expr ',' expr { $$ = new_font_id($2, $4, $6, $8); } : FONT expr ',' tSTRING ',' expr ',' expr opt_expr { $$ = new_font_id($2, $4, $6, $8); }
;
/*
* FIXME: This odd expression is here to nullify an extra token found
* in some appstudio produced resources which appear to do nothing.
*/
opt_expr: /* Empty */ { $$ = NULL; }
| ',' expr { $$ = NULL; }
; ;
/* ------------------------------ Menu ------------------------------ */ /* ------------------------------ Menu ------------------------------ */
@ -1535,9 +1582,11 @@ raw_data: tBEGIN raw_elements tEND { $$ = $2; }
raw_elements raw_elements
: RAWDATA { $$ = $1; } : RAWDATA { $$ = $1; }
| NUMBER { $$ = int2raw_data($1); } | NUMBER { $$ = int2raw_data($1); }
| LNUMBER { $$ = long2raw_data($1); }
| tSTRING { $$ = str2raw_data($1); } | tSTRING { $$ = str2raw_data($1); }
| raw_elements opt_comma RAWDATA { $$ = merge_raw_data($1, $3); free($3->data); free($3); } | raw_elements opt_comma RAWDATA { $$ = merge_raw_data($1, $3); free($3->data); free($3); }
| raw_elements opt_comma NUMBER { $$ = merge_raw_data_int($1, $3); } | raw_elements opt_comma NUMBER { $$ = merge_raw_data_int($1, $3); }
| raw_elements opt_comma LNUMBER { $$ = merge_raw_data_long($1, $3); }
| raw_elements opt_comma tSTRING { $$ = merge_raw_data_str($1, $3); } | raw_elements opt_comma tSTRING { $$ = merge_raw_data_str($1, $3); }
; ;
@ -1564,9 +1613,14 @@ xpr : xpr '+' xpr { $$ = ($1) + ($3); }
| '-' xpr { $$ = -($2); } /* FIXME: shift/reduce conflict */ | '-' xpr { $$ = -($2); } /* FIXME: shift/reduce conflict */
/* | '+' xpr { $$ = $2; } */ /* | '+' xpr { $$ = $2; } */
| '(' xpr ')' { $$ = $2; } | '(' xpr ')' { $$ = $2; }
| NUMBER { $$ = $1; want_rscname = 0; } | any_num { $$ = $1; want_rscname = 0; }
| NOT NUMBER { $$ = 0; andmask &= ~($2); } | NOT any_num { $$ = 0; andmask &= ~($2); }
; ;
any_num : NUMBER { $$ = $1; }
| LNUMBER { $$ = $1; }
;
%% %%
/* Dialog specific functions */ /* Dialog specific functions */
dialog_t *dialog_style(int st, dialog_t *dlg) dialog_t *dialog_style(int st, dialog_t *dlg)
@ -1982,6 +2036,10 @@ raw_data_t *load_file(string_t *name)
raw_data_t *int2raw_data(int i) raw_data_t *int2raw_data(int i)
{ {
raw_data_t *rd; raw_data_t *rd;
if((int)((short)i) != i)
yywarning("Integer constant out of 16bit range (%d), truncated to %d\n", i, (short)i);
rd = new_raw_data(); rd = new_raw_data();
rd->size = sizeof(short); rd->size = sizeof(short);
rd->data = (char *)xmalloc(rd->size); rd->data = (char *)xmalloc(rd->size);
@ -1989,6 +2047,16 @@ raw_data_t *int2raw_data(int i)
return rd; return rd;
} }
raw_data_t *long2raw_data(int i)
{
raw_data_t *rd;
rd = new_raw_data();
rd->size = sizeof(int);
rd->data = (char *)xmalloc(rd->size);
*(int *)(rd->data) = i;
return rd;
}
raw_data_t *str2raw_data(string_t *str) raw_data_t *str2raw_data(string_t *str)
{ {
raw_data_t *rd; raw_data_t *rd;
@ -2016,6 +2084,15 @@ raw_data_t *merge_raw_data_int(raw_data_t *r1, int i)
return r1; return r1;
} }
raw_data_t *merge_raw_data_long(raw_data_t *r1, int i)
{
raw_data_t *t = long2raw_data(i);
merge_raw_data(r1, t);
free(t->data);
free(t);
return r1;
}
raw_data_t *merge_raw_data_str(raw_data_t *r1, string_t *str) raw_data_t *merge_raw_data_str(raw_data_t *r1, string_t *str)
{ {
raw_data_t *t = str2raw_data(str); raw_data_t *t = str2raw_data(str);

View File

@ -90,7 +90,7 @@ char usage[] = "Usage: wrc [options...] [infile[.rc|.res]]\n"
; ;
char version_string[] = "Wine Resource Compiler Version " WRC_FULLVERSION "\n" char version_string[] = "Wine Resource Compiler Version " WRC_FULLVERSION "\n"
"Copyright 1998 Bertho A. Stultiens\n" "Copyright 1998,1999 Bertho A. Stultiens\n"
" 1994 Martin von Loewis\n"; " 1994 Martin von Loewis\n";
/* /*

View File

@ -12,8 +12,8 @@
#include "wrctypes.h" #include "wrctypes.h"
#endif #endif
#define WRC_VERSION "1.0.11" #define WRC_VERSION "1.0.12"
#define WRC_RELEASEDATE "(22-Apr-1999)" #define WRC_RELEASEDATE "(18-Jul-1999)"
#define WRC_FULLVERSION WRC_VERSION " " WRC_RELEASEDATE #define WRC_FULLVERSION WRC_VERSION " " WRC_RELEASEDATE
/* Only used in heavy debugging sessions */ /* Only used in heavy debugging sessions */

View File

@ -44,6 +44,7 @@
#define WRC_RT_VXD (20) #define WRC_RT_VXD (20)
#define WRC_RT_ANICURSOR (21) #define WRC_RT_ANICURSOR (21)
#define WRC_RT_ANIICON (22) #define WRC_RT_ANIICON (22)
#define WRC_RT_DLGINIT (240)
#define WRC_RT_TOOLBAR (241) #define WRC_RT_TOOLBAR (241)
/* Default class type IDs */ /* Default class type IDs */
@ -145,6 +146,7 @@ enum res_e {
res_anicur, /* Not implemented, no layout available */ res_anicur, /* Not implemented, no layout available */
res_aniico, /* Not implemented, no layout available */ res_aniico, /* Not implemented, no layout available */
res_dlginit = WRC_RT_DLGINIT, /* 240 */
res_toolbar = WRC_RT_TOOLBAR, /* 241 */ res_toolbar = WRC_RT_TOOLBAR, /* 241 */
res_menex = 256 + 4, res_menex = 256 + 4,
@ -163,7 +165,7 @@ typedef struct control {
struct control *next; /* List of controls */ struct control *next; /* List of controls */
struct control *prev; struct control *prev;
name_id_t *ctlclass; /* ControlClass */ name_id_t *ctlclass; /* ControlClass */
string_t *title; /* Title of control */ name_id_t *title; /* Title of control */
int id; int id;
int x; /* Position */ int x; /* Position */
int y; int y;
@ -470,6 +472,13 @@ typedef struct toolbar {
toolbar_item_t *items; toolbar_item_t *items;
} toolbar_t; } toolbar_t;
typedef struct dlginit {
DWORD memopt;
lvc_t lvc;
raw_data_t *data;
} dlginit_t;
/* A top-level resource node */ /* A top-level resource node */
typedef struct resource { typedef struct resource {
struct resource *next; struct resource *next;
@ -484,6 +493,7 @@ typedef struct resource {
cursor_group_t *curg; cursor_group_t *curg;
dialog_t *dlg; dialog_t *dlg;
dialogex_t *dlgex; dialogex_t *dlgex;
dlginit_t *dlgi;
font_t *fnt; font_t *fnt;
icon_t *ico; icon_t *ico;
icon_group_t *icog; icon_group_t *icog;
@ -518,6 +528,11 @@ typedef struct res_count {
int n_name_entries; int n_name_entries;
} res_count_t; } res_count_t;
typedef struct style_pair {
int style;
int exstyle;
} style_pair_t;
#endif #endif