Ignore:
Timestamp:
Apr 19, 2000, 4:46:07 PM (25 years ago)
Author:
sandervl
Message:

update with latest wine code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/wrc/parser.y

    r882 r3426  
    33 * Copyright  Martin von Loewis, 1994
    44 * Copyright 1998 Bertho A. Stultiens (BS)
     5 *           1999 Juergen Schmied (JS)
    56 *
     7 * 6-Nov-1999 JS        - see CHANGES
     8 *
    69 * 29-Dec-1998 AdH      - Grammar and function extensions.
    710 *                           grammar: TOOLBAR resources, Named ICONs in
     
    104107#include "preproc.h"
    105108#include "parser.h"
     109#include "windef.h"
     110#include "wingdi.h"
    106111#include "winuser.h"
    107112
     
    110115#endif
    111116
    112 DWORD andmask;          /* Used to parse 'NOT NUMBER' expressions */
    113117int indialog = 0;       /* Signal flex that we're parsing a dialog */
    114118int want_rscname = 0;   /* Set when a resource's name is required */
     
    158162dialogex_t *dialogex_font(font_id_t *f, dialogex_t *dlg);
    159163dialogex_t *dialogex_caption(string_t *s, dialogex_t *dlg);
    160 dialogex_t *dialogex_exstyle(int st, dialogex_t *dlg);
    161 dialogex_t *dialogex_style(int st, dialogex_t *dlg);
     164dialogex_t *dialogex_exstyle(style_t *st, dialogex_t *dlg);
     165dialogex_t *dialogex_style(style_t *st, dialogex_t *dlg);
    162166name_id_t *convert_ctlclass(name_id_t *cls);
    163 control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev);
     167control_t *ins_ctrl(int type, int special_style, control_t *ctrl, control_t *prev);
    164168dialog_t *dialog_version(version_t *v, dialog_t *dlg);
    165169dialog_t *dialog_characteristics(characts_t *c, dialog_t *dlg);
     
    169173dialog_t *dialog_font(font_id_t *f, dialog_t *dlg);
    170174dialog_t *dialog_caption(string_t *s, dialog_t *dlg);
    171 dialog_t *dialog_exstyle(int st, dialog_t *dlg);
    172 dialog_t *dialog_style(int st, dialog_t *dlg);
     175dialog_t *dialog_exstyle(style_t * st, dialog_t *dlg);
     176dialog_t *dialog_style(style_t * st, dialog_t *dlg);
    173177resource_t *build_stt_resources(stringtable_t *stthead);
    174178stringtable_t *find_stringtable(lvc_t *lvc);
     
    218222        dlginit_t       *dginit;
    219223        style_pair_t    *styles;
     224        style_t         *style;
    220225}
    221226
     
    264269%type <dlg>     dialog dlg_attributes
    265270%type <ctl>     ctrls gen_ctrl lab_ctrl ctrl_desc iconinfo
    266 %type <iptr>    optional_style helpid
     271%type <iptr>    helpid
    267272%type <dlgex>   dialogex dlgex_attribs
    268273%type <ctl>     exctrls gen_exctrl lab_exctrl exctrl_desc
     
    289294%type <chars>   opt_characts
    290295%type <ver>     opt_version
    291 %type <num>     expr xpr dummy
     296%type <num>     expr xpr
    292297%type <iptr>    e_expr
    293298%type <iptr>    pp_expr pp_constant
     
    297302%type <styles>  optional_style_pair
    298303%type <num>     any_num
     304%type <style>   optional_style
     305%type <style>   style
    299306
    300307%%
     
    389396/* C ignore stuff */
    390397cjunk   : tTYPEDEF                      { strip_til_semicolon(); }
    391         | tEXTERN                       { strip_til_semicolon(); }
     398        | tEXTERN                       { strip_extern(); }
    392399        | IDENT IDENT                   { strip_til_semicolon(); }
    393400        | IDENT '('                     { strip_til_parenthesis(); }
     
    434441 */
    435442nameid  : expr  {
     443                if($1 > 65535 || $1 < -32768)
     444                        yyerror("Resource's ID out of range (%d)", $1);
    436445                $$ = new_name_id();
    437446                $$->type = name_ord;
     
    672681                if(!$$->gotstyle)
    673682                {
    674                         $$->style = WS_POPUP;
     683                        $$->style->or_mask = WS_POPUP;
    675684                        $$->gotstyle = TRUE;
    676685                }
    677686                if($$->title)
    678                         $$->style |= WS_CAPTION;
     687                        $$->style->or_mask |= WS_CAPTION;
    679688                if($$->font)
    680                         $$->style |= DS_SETFONT;
     689                        $$->style->or_mask |= DS_SETFONT;
     690
     691                $$->style->or_mask &= ~($$->style->and_mask);
     692                $$->style->and_mask = 0;
     693
    681694                indialog = FALSE;
    682695                if(!$$->lvc.language)
     
    687700dlg_attributes
    688701        : /* Empty */                   { $$=new_dialog(); }
    689         | dlg_attributes STYLE expr     { $$=dialog_style($3,$1); }
    690         | dlg_attributes EXSTYLE expr   { $$=dialog_exstyle($3,$1); }
     702        | dlg_attributes STYLE style    { $$=dialog_style($3,$1); }
     703        | dlg_attributes EXSTYLE style  { $$=dialog_exstyle($3,$1); }
    691704        | dlg_attributes CAPTION tSTRING { $$=dialog_caption($3,$1); }
    692705        | dlg_attributes opt_font       { $$=dialog_font($2,$1); }
     
    718731        | ctrls RTEXT           lab_ctrl        { $$=ins_ctrl(CT_STATIC, SS_RIGHT, $3, $1); }
    719732        /* special treatment for icons, as the extent is optional */
    720         | ctrls ICON nameid_s ',' expr ',' expr ',' expr iconinfo {
     733        | ctrls ICON nameid_s opt_comma expr ',' expr ',' expr iconinfo {
    721734                $10->title = $3;
    722735                $10->id = $5;
     
    728741
    729742lab_ctrl
    730         : tSTRING ',' expr ',' expr ',' expr ',' expr ',' expr optional_style {
     743        : tSTRING opt_comma expr ',' expr ',' expr ',' expr ',' expr optional_style {
    731744                $$=new_control();
    732745                $$->title = new_name_id();
     
    740753                if($12)
    741754                {
    742                         $$->style = *($12);
     755                        $$->style = $12;
    743756                        $$->gotstyle = TRUE;
    744                         free($12);
    745757                }
    746758                }
     
    757769                if($10)
    758770                {
    759                         $$->style = *($10);
     771                        $$->style = $10;
    760772                        $$->gotstyle = TRUE;
    761                         free($10);
    762773                }
    763774                }
     
    772783                $$->height = $4;
    773784                }
    774         | ',' expr ',' expr ',' expr {
     785        | ',' expr ',' expr ',' style {
    775786                $$ = new_control();
    776787                $$->width = $2;
     
    779790                $$->gotstyle = TRUE;
    780791                }
    781         | ',' expr ',' expr ',' expr ',' expr {
     792        | ',' expr ',' expr ',' style ',' style {
    782793                $$ = new_control();
    783794                $$->width = $2;
     
    790801        ;
    791802
    792 gen_ctrl: nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr ',' expr {
     803gen_ctrl: nameid_s opt_comma expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ',' expr ',' style {
    793804                $$=new_control();
    794805                $$->title = $1;
     
    804815                $$->gotexstyle = TRUE;
    805816                }
    806         | nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr {
     817        | nameid_s opt_comma expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ',' expr {
    807818                $$=new_control();
    808819                $$->title = $1;
     
    822833        ;
    823834
     835/* ------------------------------ style flags ------------------------------ */
    824836optional_style          /* Abbused once to get optional ExStyle */
    825837        : /* Empty */   { $$ = NULL; }
    826         | ',' expr      { $$ = new_int($2); }
     838        | ',' style     { $$ = $2; }
    827839        ;
    828840
    829841optional_style_pair
    830         : /* Enpty */           { $$ = NULL; }
    831         | ',' expr              { $$ = new_style_pair($2, 0); }
    832         | ',' expr ',' expr     { $$ = new_style_pair($2, $4); }
    833         ;
     842        : /* Empty */           { $$ = NULL; }
     843        | ',' style             { $$ = new_style_pair($2, 0); }
     844        | ',' style ',' style   { $$ = new_style_pair($2, $4); }
     845        ;
     846
     847style
     848        : style '|' style       { $$ = new_style($1->or_mask | $3->or_mask, $1->and_mask | $3->and_mask); free($1); free($3);}
     849        | '(' style ')'         { $$ = $2; }
     850        | any_num               { $$ = new_style($1, 0); }
     851        | NOT any_num           { $$ = new_style(0, $2); }
     852        ;   
    834853
    835854ctlclass
     
    870889                $11->controls = get_control_head($13);
    871890                $$ = $11;
     891
     892                assert($$->style != NULL);
    872893                if(!$$->gotstyle)
    873894                {
    874                         $$->style = WS_POPUP;
     895                        $$->style->or_mask = WS_POPUP;
    875896                        $$->gotstyle = TRUE;
    876897                }
    877898                if($$->title)
    878                         $$->style |= WS_CAPTION;
     899                        $$->style->or_mask |= WS_CAPTION;
    879900                if($$->font)
    880                         $$->style |= DS_SETFONT;
     901                        $$->style->or_mask |= DS_SETFONT;
     902
     903                $$->style->or_mask &= ~($$->style->and_mask);
     904                $$->style->and_mask = 0;
     905
    881906                indialog = FALSE;
    882907                if(!$$->lvc.language)
     
    887912dlgex_attribs
    888913        : /* Empty */                   { $$=new_dialogex(); }
    889         | dlgex_attribs STYLE expr      { $$=dialogex_style($3,$1); }
    890         | dlgex_attribs EXSTYLE expr    { $$=dialogex_exstyle($3,$1); }
     914        | dlgex_attribs STYLE style     { $$=dialogex_style($3,$1); }
     915        | dlgex_attribs EXSTYLE style   { $$=dialogex_exstyle($3,$1); }
    891916        | dlgex_attribs CAPTION tSTRING { $$=dialogex_caption($3,$1); }
    892917        | dlgex_attribs opt_font        { $$=dialogex_font($2,$1); }
     
    919944        | exctrls RTEXT         lab_exctrl      { $$=ins_ctrl(CT_STATIC, SS_RIGHT, $3, $1); }
    920945        /* special treatment for icons, as the extent is optional */
    921         | exctrls ICON nameid_s ',' expr ',' expr ',' expr iconinfo {
     946        | exctrls ICON nameid_s opt_comma expr ',' expr ',' expr iconinfo {
    922947                $10->title = $3;
    923948                $10->id = $5;
     
    929954
    930955gen_exctrl
    931         : nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ','
    932           expr ',' e_expr helpid opt_data {
     956        : nameid_s opt_comma expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ','
     957          expr ',' style helpid opt_data {
    933958                $$=new_control();
    934959                $$->title = $1;
     
    943968                if($17)
    944969                {
    945                         $$->exstyle = *($17);
     970                        $$->exstyle = $17;
    946971                        $$->gotexstyle = TRUE;
    947                         free($17);
    948972                }
    949973                if($18)
     
    955979                $$->extra = $19;
    956980                }
    957         | nameid_s ',' expr ',' ctlclass ',' expr ',' expr ',' expr ',' expr ',' expr opt_data {
     981        | nameid_s opt_comma expr ',' ctlclass ',' style ',' expr ',' expr ',' expr ',' expr opt_data {
    958982                $$=new_control();
    959983                $$->title = $1;
     
    971995
    972996lab_exctrl
    973         : tSTRING ',' expr ',' expr ',' expr ',' expr ',' expr optional_style_pair opt_data {
     997        : tSTRING opt_comma expr ',' expr ',' expr ',' expr ',' expr optional_style_pair opt_data {
    974998                $$=new_control();
    975999                $$->title = new_name_id();
     
    10711095item_definitions
    10721096        : /* Empty */   {$$ = NULL;}
    1073         | item_definitions MENUITEM tSTRING ',' expr item_options {
     1097        | item_definitions MENUITEM tSTRING opt_comma expr item_options {
    10741098                $$=new_menu_item();
    10751099                $$->prev = $1;
     
    13061330                int i;
    13071331                assert(tagstt != NULL);
     1332                if($2 > 65535 || $2 < -32768)
     1333                        yyerror("Stringtable entry's ID out of range (%d)", $2);
    13081334                /* Search for the ID */
    13091335                for(i = 0; i < tagstt->nentries; i++)
     
    15981624        | expr          { $$ = new_int($1); }
    15991625        ;
    1600 expr    : dummy xpr     { $$ = ($2) & andmask; }
    1601         ;
    1602 
    1603 dummy   : /* Empty */   { $$ = 0; andmask = -1; }
     1626expr    : xpr   { $$ = ($1); }
    16041627        ;
    16051628
     
    16151638        | '(' xpr ')'   { $$ = $2; }
    16161639        | any_num       { $$ = $1; want_rscname = 0; }
    1617         | NOT any_num   { $$ = 0; andmask &= ~($2); }
     1640        | NOT any_num   { $$ = ~($2); }
    16181641        ;
    16191642
     
    16241647%%
    16251648/* Dialog specific functions */
    1626 dialog_t *dialog_style(int st, dialog_t *dlg)
    1627 {
    1628         DWORD s = 0;
     1649dialog_t *dialog_style(style_t * st, dialog_t *dlg)
     1650{
    16291651        assert(dlg != NULL);
     1652        if(dlg->style == NULL)
     1653        {
     1654                dlg->style = new_style(0,0);
     1655        }
     1656
    16301657        if(dlg->gotstyle)
    16311658        {
    16321659                yywarning("Style already defined, or-ing together");
    1633                 s = dlg->style;
    1634         }
    1635         dlg->style = st | s;
     1660        }
     1661        else
     1662        {
     1663                dlg->style->or_mask = 0;
     1664                dlg->style->and_mask = 0;
     1665        }
     1666        dlg->style->or_mask |= st->or_mask;
     1667        dlg->style->and_mask |= st->and_mask;
    16361668        dlg->gotstyle = TRUE;
     1669        free(st);
    16371670        return dlg;
    16381671}
    16391672
    1640 dialog_t *dialog_exstyle(int st, dialog_t *dlg)
    1641 {
    1642         DWORD s = 0;
     1673dialog_t *dialog_exstyle(style_t *st, dialog_t *dlg)
     1674{
    16431675        assert(dlg != NULL);
     1676        if(dlg->exstyle == NULL)
     1677        {
     1678                dlg->exstyle = new_style(0,0);
     1679        }
     1680
    16441681        if(dlg->gotexstyle)
    16451682        {
    16461683                yywarning("ExStyle already defined, or-ing together");
    1647                 s = dlg->style;
    1648         }
    1649         dlg->exstyle = st | s;
     1684        }
     1685        else
     1686        {
     1687                dlg->exstyle->or_mask = 0;
     1688                dlg->exstyle->and_mask = 0;
     1689        }
     1690        dlg->exstyle->or_mask |= st->or_mask;
     1691        dlg->exstyle->and_mask |= st->and_mask;
    16501692        dlg->gotexstyle = TRUE;
     1693        free(st);
    16511694        return dlg;
    16521695}
     
    17161759
    17171760/* Controls specific functions */
    1718 control_t *ins_ctrl(int type, int style, control_t *ctrl, control_t *prev)
    1719 {
     1761control_t *ins_ctrl(int type, int special_style, control_t *ctrl, control_t *prev)
     1762{
     1763        /* Hm... this seems to be jammed in at all time... */
     1764        int defaultstyle = WS_CHILD | WS_VISIBLE;
     1765
    17201766        assert(ctrl != NULL);
    17211767        ctrl->prev = prev;
     1768
    17221769        if(prev)
    17231770                prev->next = ctrl;
     1771
    17241772        if(type != -1)
    17251773        {
     
    17291777        }
    17301778
    1731         /* Hm... this seems to be jammed in at all time... */
    1732         ctrl->style |= WS_CHILD | WS_VISIBLE;
    17331779        switch(type)
    17341780        {
    17351781        case CT_BUTTON:
    1736                 ctrl->style |= style;
    1737                 if(style != BS_GROUPBOX && style != BS_RADIOBUTTON)
    1738                         ctrl->style |= WS_TABSTOP;
     1782                if(special_style != BS_GROUPBOX && special_style != BS_RADIOBUTTON)
     1783                        defaultstyle |= WS_TABSTOP;
    17391784                break;
    17401785        case CT_EDIT:
    1741                 ctrl->style |= WS_TABSTOP | WS_BORDER;
     1786                defaultstyle |= WS_TABSTOP | WS_BORDER;
    17421787                break;
    17431788        case CT_LISTBOX:
    1744                 ctrl->style |= LBS_NOTIFY | WS_BORDER;
     1789                defaultstyle |= LBS_NOTIFY | WS_BORDER;
    17451790                break;
    17461791        case CT_COMBOBOX:
    1747                 ctrl->style |= CBS_SIMPLE;
     1792                defaultstyle |= CBS_SIMPLE;
    17481793                break;
    17491794        case CT_STATIC:
    1750                 ctrl->style |= style;
    1751                 if(style == SS_CENTER || style == SS_LEFT || style == SS_RIGHT)
    1752                         ctrl->style |= WS_GROUP;
     1795                if(special_style == SS_CENTER || special_style == SS_LEFT || special_style == SS_RIGHT)
     1796                        defaultstyle |= WS_GROUP;
    17531797                break;
    17541798        }
     
    17591803                {
    17601804                case CT_EDIT:
    1761                         ctrl->style |= ES_LEFT;
     1805                        defaultstyle |= ES_LEFT;
    17621806                        break;
    17631807                case CT_LISTBOX:
    1764                         ctrl->style |= LBS_NOTIFY;
     1808                        defaultstyle |= LBS_NOTIFY;
    17651809                        break;
    17661810                case CT_COMBOBOX:
    1767                         ctrl->style |= CBS_SIMPLE | WS_TABSTOP;
     1811                        defaultstyle |= CBS_SIMPLE | WS_TABSTOP;
    17681812                        break;
    17691813                case CT_SCROLLBAR:
    1770                         ctrl->style |= SBS_HORZ;
     1814                        defaultstyle |= SBS_HORZ;
    17711815                        break;
    17721816                case CT_BUTTON:
    1773                         switch(style)
     1817                        switch(special_style)
    17741818                        {
    17751819                        case BS_CHECKBOX:
     
    17821826                        case BS_3STATE:
    17831827                        case BS_AUTOCHECKBOX:
    1784                                 ctrl->style |= WS_TABSTOP;
     1828                                defaultstyle |= WS_TABSTOP;
    17851829                                break;
    17861830                        default:
    1787                                 yywarning("Unknown default button control-style 0x%08x", style);
     1831                                yywarning("Unknown default button control-style 0x%08x", special_style);
    17881832                        case BS_RADIOBUTTON:
    17891833                                break;
     
    17921836
    17931837                case CT_STATIC:
    1794                         switch(style)
     1838                        switch(special_style)
    17951839                        {
    17961840                        case SS_LEFT:
    17971841                        case SS_RIGHT:
    17981842                        case SS_CENTER:
    1799                                 ctrl->style |= WS_GROUP;
     1843                                defaultstyle |= WS_GROUP;
    18001844                                break;
    18011845                        case SS_ICON:   /* Special case */
    18021846                                break;
    18031847                        default:
    1804                                 yywarning("Unknown default static control-style 0x%08x", style);
     1848                                yywarning("Unknown default static control-style 0x%08x", special_style);
    18051849                                break;
    18061850                        }
     
    18151859
    18161860        /* The SS_ICON flag is always forced in for icon controls */
    1817         if(type == CT_STATIC && style == SS_ICON)
    1818                 ctrl->style |= SS_ICON;
    1819 
     1861        if(type == CT_STATIC && special_style == SS_ICON)
     1862                defaultstyle |= SS_ICON;
     1863
     1864        if (!ctrl->gotstyle)
     1865                ctrl->style = new_style(0,0);
     1866
     1867        /* combine all styles */
     1868        ctrl->style->or_mask = ctrl->style->or_mask | defaultstyle | special_style;
    18201869        ctrl->gotstyle = TRUE;
    18211870byebye:
     1871        /* combine with NOT mask */
     1872        if (ctrl->gotstyle)
     1873        {
     1874                ctrl->style->or_mask &= ~(ctrl->style->and_mask);
     1875                ctrl->style->and_mask = 0;
     1876        }
     1877        if (ctrl->gotexstyle)
     1878        {
     1879                ctrl->exstyle->or_mask &= ~(ctrl->exstyle->and_mask);
     1880                ctrl->exstyle->and_mask = 0;
     1881        }
    18221882        return ctrl;
    18231883}
     
    18611921
    18621922/* DialogEx specific functions */
    1863 dialogex_t *dialogex_style(int st, dialogex_t *dlg)
    1864 {
    1865         DWORD s = 0;
     1923dialogex_t *dialogex_style(style_t * st, dialogex_t *dlg)
     1924{
    18661925        assert(dlg != NULL);
     1926        if(dlg->style == NULL)
     1927        {
     1928                dlg->style = new_style(0,0);
     1929        }
     1930
    18671931        if(dlg->gotstyle)
    18681932        {
    18691933                yywarning("Style already defined, or-ing together");
    1870                 s = dlg->style;
    1871         }
    1872         dlg->style = st | s;
     1934        }
     1935        else
     1936        {
     1937                dlg->style->or_mask = 0;
     1938                dlg->style->and_mask = 0;
     1939        }
     1940        dlg->style->or_mask |= st->or_mask;
     1941        dlg->style->and_mask |= st->and_mask;
    18731942        dlg->gotstyle = TRUE;
     1943        free(st);
    18741944        return dlg;
    18751945}
    18761946
    1877 dialogex_t *dialogex_exstyle(int st, dialogex_t *dlg)
    1878 {
    1879         DWORD s = 0;
     1947dialogex_t *dialogex_exstyle(style_t * st, dialogex_t *dlg)
     1948{
    18801949        assert(dlg != NULL);
     1950        if(dlg->exstyle == NULL)
     1951        {
     1952                dlg->exstyle = new_style(0,0);
     1953        }
     1954
    18811955        if(dlg->gotexstyle)
    18821956        {
    18831957                yywarning("ExStyle already defined, or-ing together");
    1884                 s = dlg->exstyle;
    1885         }
    1886         dlg->exstyle = st | s;
     1958        }
     1959        else
     1960        {
     1961                dlg->exstyle->or_mask = 0;
     1962                dlg->exstyle->and_mask = 0;
     1963        }
     1964        dlg->exstyle->or_mask |= st->or_mask;
     1965        dlg->exstyle->and_mask |= st->and_mask;
    18871966        dlg->gotexstyle = TRUE;
     1967        free(st);
    18881968        return dlg;
    18891969}
Note: See TracChangeset for help on using the changeset viewer.