223 lines
7.7 KiB
Plaintext
223 lines
7.7 KiB
Plaintext
%{
|
|
/*
|
|
*
|
|
* Copyright Martin von Loewis, 1994
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include "parser.h"
|
|
#include "windows.h"
|
|
%}
|
|
%union{
|
|
gen_res *res;
|
|
char *str;
|
|
int num;
|
|
struct rc_style *style;
|
|
}
|
|
%token <num> NUMBER
|
|
%token <str> STRING SINGLE_QUOTED IDENT
|
|
%token ACCELERATORS ALT ASCII tBEGIN tBITMAP CAPTION CHECKBOX CHECKED
|
|
%token CLASS COMBOBOX CONTROL CTEXT CURSOR DEFPUSHBUTTON DIALOG
|
|
%token DISCARDABLE EDITTEXT tEND FIXED FONT GRAYED GROUPBOX HELP ICON
|
|
%token IDENT INACTIVE LISTBOX LTEXT MENU MENUBARBREAK MENUBREAK MENUITEM
|
|
%token MOVEABLE LOADONCALL NOINVERT NOT NOT_SUPPORTED POPUP PRELOAD
|
|
%token PURE PUSHBUTTON RADIOBUTTON RCDATA RTEXT SCROLLBAR SHIFT SEPARATOR
|
|
%token SINGLE_QUOTED STRING STRINGTABLE STYLE VERSIONINFO VIRTKEY
|
|
%type <res> resource_file resource resources resource_definition accelerators
|
|
%type <res> events bitmap cursor dialog dlg_attributes controls
|
|
%type <res> generic_control labeled_control control_desc font icon
|
|
%type <res> iconinfo menu menu_body item_definitions rcdata raw_data raw_elements
|
|
%type <res> stringtable strings versioninfo
|
|
%type <num> acc_options item_options
|
|
%type <style> style style_elm optional_style
|
|
%%
|
|
|
|
resource_file: resources {create_output($1);}
|
|
|
|
/*resources are put into a linked list*/
|
|
resources: {$$=0;}
|
|
|resource resources {$$=add_resource($1,$2);}
|
|
;
|
|
|
|
/* get the name for a single resource*/
|
|
resource: NUMBER resource_definition
|
|
{$$=$2;$$->n.i_name=$1;$$->n_type=0;
|
|
if(verbose)fprintf(stderr,"Got %s %d\n",get_typename($2),$1);
|
|
}
|
|
| IDENT resource_definition
|
|
{$$=$2;$$->n.s_name=$1;$$->n_type=1;
|
|
if(verbose)fprintf(stderr,"Got %s %s\n",get_typename($2),$1);
|
|
}
|
|
| stringtable
|
|
{$$=$1; /* <-- should be NULL */
|
|
if(verbose)fprintf(stderr,"Got STRINGTABLE\n");
|
|
}
|
|
;
|
|
|
|
/* get the value for a single resource*/
|
|
resource_definition: accelerators {$$=$1;}
|
|
| bitmap {$$=$1;}
|
|
| cursor {$$=$1;}
|
|
| dialog {$$=$1;}
|
|
| font {$$=$1;}
|
|
| icon {$$=$1;}
|
|
| menu {$$=$1;}
|
|
| rcdata {$$=$1;}
|
|
| versioninfo {$$=$1;}
|
|
;
|
|
|
|
/* have to use tBEGIN because BEGIN is predefined */
|
|
accelerators: ACCELERATORS tBEGIN events tEND {$$=$3;$$->type=acc;}
|
|
/* the events are collected in a gen_res, as the accelerator resource is just
|
|
an array of events */
|
|
events: {$$=new_res();}
|
|
| STRING ',' NUMBER acc_options events
|
|
{$$=add_string_accelerator($1,$3,$4,$5);}
|
|
| NUMBER ',' NUMBER ',' ASCII acc_options events
|
|
{$$=add_ascii_accelerator($1,$3,$6,$7);}
|
|
| NUMBER ',' NUMBER ',' VIRTKEY acc_options events
|
|
{$$=add_vk_accelerator($1,$3,$6,$7);}
|
|
acc_options: {$$=0;}
|
|
| ',' NOINVERT acc_options {$$=$3|2;}
|
|
| ',' ALT acc_options {$$=$3|16;}
|
|
| ',' SHIFT acc_options {$$=$3|4;}
|
|
| ',' CONTROL acc_options {$$=$3|8;}
|
|
|
|
bitmap: tBITMAP load_and_memoption STRING {$$=make_bitmap(load_file($3));}
|
|
| tBITMAP load_and_memoption raw_data {$$=make_bitmap($3);}
|
|
|
|
/* load and memory options are ignored */
|
|
load_and_memoption: | lamo load_and_memoption
|
|
lamo: PRELOAD | LOADONCALL | FIXED | MOVEABLE | DISCARDABLE | PURE
|
|
|
|
cursor: CURSOR load_and_memoption STRING {$$=make_cursor(load_file($3));}
|
|
|CURSOR load_and_memoption raw_data {$$=make_cursor($3);}
|
|
|
|
dialog: DIALOG load_and_memoption NUMBER ',' NUMBER ',' NUMBER ',' NUMBER
|
|
dlg_attributes
|
|
tBEGIN controls tEND
|
|
{$$=make_dialog($10,$3,$5,$7,$9,$12);}
|
|
|
|
dlg_attributes: {$$=new_dialog();}
|
|
| STYLE style dlg_attributes
|
|
{$$=dialog_style($2,$3);}
|
|
| CAPTION STRING dlg_attributes
|
|
{$$=dialog_caption($2,$3);}
|
|
| FONT NUMBER ',' STRING dlg_attributes
|
|
{$$=dialog_font($2,$4,$5);}
|
|
| CLASS STRING dlg_attributes
|
|
{$$=dialog_class($2,$3);}
|
|
| MENU STRING dlg_attributes
|
|
{$$=dialog_menu($2,$3);}
|
|
|
|
/* the controls are collected into a gen_res, and finally the dialog header
|
|
is put at the beginning */
|
|
controls: {$$=new_res();}
|
|
| CHECKBOX labeled_control controls
|
|
{$$=add_control(CT_BUTTON, BS_CHECKBOX, $2, $3);}
|
|
| COMBOBOX control_desc controls
|
|
{$$=add_control(CT_COMBOBOX, 0, $2, $3);}
|
|
| CONTROL generic_control controls
|
|
{$$=add_generic_control($2, $3);}
|
|
| CTEXT labeled_control controls
|
|
{$$=add_control(CT_STATIC, SS_CENTER, $2, $3);}
|
|
| DEFPUSHBUTTON labeled_control controls
|
|
{$$=add_control(CT_BUTTON, BS_DEFPUSHBUTTON, $2, $3);}
|
|
| EDITTEXT control_desc controls
|
|
{$$=add_control(CT_EDIT, 0, $2, $3);}
|
|
| GROUPBOX labeled_control controls
|
|
{$$=add_control(CT_BUTTON, BS_GROUPBOX, $2, $3);}
|
|
/*special treatment for icons, as the extent is optional*/
|
|
| ICON STRING ',' NUMBER ',' NUMBER ',' NUMBER iconinfo controls
|
|
{$$=add_icon($2, $4, $6, $8, $9, $10);}
|
|
| LISTBOX control_desc controls
|
|
{$$=add_control(CT_LISTBOX, 0, $2, $3);}
|
|
| LTEXT labeled_control controls
|
|
{$$=add_control(CT_STATIC, SS_LEFT, $2, $3);}
|
|
| PUSHBUTTON labeled_control controls
|
|
{$$=add_control(CT_BUTTON, BS_PUSHBUTTON, $2, $3);}
|
|
| RADIOBUTTON labeled_control controls
|
|
{$$=add_control(CT_BUTTON, BS_RADIOBUTTON, $2, $3);}
|
|
| RTEXT labeled_control controls
|
|
{$$=add_control(CT_STATIC, SS_RIGHT, $2, $3);}
|
|
| SCROLLBAR control_desc controls
|
|
{$$=add_control(CT_SCROLLBAR, 0, $2, $3);}
|
|
|
|
|
|
labeled_control: STRING ',' control_desc {$$=label_control_desc($1,$3);}
|
|
control_desc: NUMBER ',' NUMBER ',' NUMBER ',' NUMBER ',' NUMBER optional_style
|
|
{$$=create_control_desc($1,$3,$5,$7,$9,$10);}
|
|
|
|
optional_style: {$$=0;}|
|
|
',' style {$$=$2;}
|
|
|
|
iconinfo: /*set extent and style to 0 if they are not provided */
|
|
{$$=create_control_desc(0,0,0,0,0,0);}
|
|
/* x and y are overwritten later */
|
|
| ',' NUMBER ',' NUMBER optional_style
|
|
{$$=create_control_desc(0,0,0,$2,$4,$5);}
|
|
|
|
generic_control: STRING ',' NUMBER ',' STRING ',' style ',' NUMBER
|
|
',' NUMBER ',' NUMBER ',' NUMBER
|
|
{$$=create_generic_control($1,$3,$5,$7,$9,$11,$13,$15);}
|
|
|
|
font: FONT load_and_memoption STRING {$$=make_font(load_file($3));}
|
|
|
|
icon: ICON load_and_memoption STRING {$$=make_icon(load_file($3));}
|
|
| ICON load_and_memoption raw_data {$$=make_icon($3);}
|
|
|
|
menu: MENU load_and_memoption menu_body {$$=make_menu($3);}
|
|
/* menu items are collected in a gen_res and prefixed with the menu header*/
|
|
menu_body: tBEGIN item_definitions tEND {$$=$2;}
|
|
item_definitions: {$$=new_res();}
|
|
| MENUITEM STRING ',' NUMBER item_options item_definitions
|
|
{$$=add_menuitem($2,$4,$5,$6);}
|
|
| MENUITEM SEPARATOR item_definitions
|
|
{$$=add_menuitem("",0,0,$3);}
|
|
| POPUP STRING item_options menu_body item_definitions
|
|
{$$=add_popup($2,$3,$4,$5);}
|
|
item_options: {$$=0;}
|
|
| ',' CHECKED item_options {$$=$3|MF_CHECKED;}
|
|
| ',' GRAYED item_options {$$=$3|MF_GRAYED;}
|
|
| ',' HELP item_options {$$=$3|MF_HELP;}
|
|
| ',' INACTIVE item_options {$$=$3|MF_DISABLED;}
|
|
| ',' MENUBARBREAK item_options {$$=$3|MF_MENUBARBREAK;}
|
|
| ',' MENUBREAK item_options {$$=$3|MF_MENUBREAK;}
|
|
|
|
rcdata: RCDATA load_and_memoption raw_data {$$=make_raw($3);}
|
|
|
|
raw_data: tBEGIN raw_elements tEND {$$=$2;}
|
|
raw_elements: SINGLE_QUOTED {$$=hex_to_raw($1,new_res());}
|
|
| NUMBER {$$=int_to_raw($1,new_res());}
|
|
| SINGLE_QUOTED raw_elements {$$=hex_to_raw($1,$2);}
|
|
| NUMBER ',' raw_elements {$$=int_to_raw($1,$3);}
|
|
|
|
stringtable: STRINGTABLE load_and_memoption tBEGIN strings tEND
|
|
{$$=$4;}
|
|
strings: {$$=0;}|
|
|
NUMBER STRING strings {$$=0;add_str_tbl_elm($1,$2);}
|
|
|
|
versioninfo: VERSIONINFO NOT_SUPPORTED {$$=0;}
|
|
|
|
/* NOT x | NOT y | a | b means (a|b)& ~x & ~y
|
|
NOT is used to disable default styles */
|
|
style: {$$=new_style();}
|
|
| style_elm {$$=$1;}
|
|
| style_elm '|' style
|
|
{$$=$1;$$->or|=$3->or;$$->and&=$3->and;free($3);}
|
|
|
|
style_elm: NUMBER {$$=new_style();$$->or=$1;}
|
|
| NOT NUMBER {$$=new_style();$$->and=~($2);}
|
|
| '(' style ')' {$$=$2;}
|
|
%%
|
|
extern int line_number;
|
|
extern char* yytext;
|
|
|
|
int yyerror(char *s)
|
|
{
|
|
fprintf(stderr,"stdin:%d: %s before '%s'\n",line_number,s,yytext);
|
|
return 0;
|
|
}
|
|
|