Alexandre Julliard <julliard@winehq.org>

- Added support for HTML resource type.
Mike McCormack <mike@codeweavers.com>
- gcc 4.0 -Wpointer-sign fixes.
Stefan Huehner <stefan@huehner.org>
- Fix some -Wsign-compare warnings.
Jacek Caban <jack@itma.pwr.wroc.pl>
- '.' is a valid char of tIDENT.
Marcus Meissner <marcus@jet.franken.de>
- Fixed signedness warnings.

svn path=/trunk/; revision=17286
This commit is contained in:
Gé van Geldorp 2005-08-11 15:10:01 +00:00
parent f5a7132861
commit 9664020ca4
13 changed files with 1864 additions and 1785 deletions

View file

@ -78,13 +78,13 @@ const char *get_typename(const resource_t* r)
* Remarks : No codepage translation is done. * Remarks : No codepage translation is done.
***************************************************************************** *****************************************************************************
*/ */
static char *strncpyWtoA(char *cs, WCHAR *ws, int maxlen) static char *strncpyWtoA(char *cs, const WCHAR *ws, int maxlen)
{ {
char *cptr = cs; char *cptr = cs;
WCHAR *wsMax = ws + maxlen - 1; const WCHAR *wsMax = ws + maxlen - 1;
while(*ws && ws < wsMax) while(*ws && ws < wsMax)
{ {
if((short)*ws < -128 || (short)*ws > 127) if(*ws > 255)
fprintf(stderr, "***Warning: Unicode string contains non-printable chars***\n"); fprintf(stderr, "***Warning: Unicode string contains non-printable chars***\n");
*cptr++ = (char)*ws++; *cptr++ = (char)*ws++;
} }

View file

@ -62,7 +62,7 @@ res_t *new_res(void)
return r; return r;
} }
res_t *grow_res(res_t *r, int add) res_t *grow_res(res_t *r, unsigned int add)
{ {
r->allocsize += add; r->allocsize += add;
r->data = (char *)xrealloc(r->data, r->allocsize); r->data = (char *)xrealloc(r->data, r->allocsize);
@ -416,7 +416,7 @@ static void put_lvc(res_t *res, lvc_t *lvc)
*/ */
static void put_raw_data(res_t *res, raw_data_t *raw, int offset) static void put_raw_data(res_t *res, raw_data_t *raw, int offset)
{ {
int wsize = raw->size - offset; unsigned int wsize = raw->size - offset;
if(res->allocsize - res->size < wsize) if(res->allocsize - res->size < wsize)
grow_res(res, wsize); grow_res(res, wsize);
memcpy(&(res->data[res->size]), raw->data + offset, wsize); memcpy(&(res->data[res->size]), raw->data + offset, wsize);
@ -1348,6 +1348,35 @@ static res_t *fontdir2res(name_id_t *name, fontdir_t *fnd)
return res; return res;
} }
/*
*****************************************************************************
* Function : html2res
* Syntax : res_t *html2res(name_id_t *name, html_t *html)
* Input :
* name - Name/ordinal of the resource
* rdt - The html descriptor
* Output : New .res format structure
* Description :
* Remarks :
*****************************************************************************
*/
static res_t *html2res(name_id_t *name, html_t *html)
{
int restag;
res_t *res;
assert(name != NULL);
assert(html != NULL);
res = new_res();
restag = put_res_header(res, WRC_RT_HTML, NULL, name, html->memopt, &(html->data->lvc));
put_raw_data(res, html->data, 0);
/* Set ResourceSize */
SetResSize(res, restag);
if(win32)
put_pad(res);
return res;
}
/* /*
***************************************************************************** *****************************************************************************
* Function : rcdata2res * Function : rcdata2res
@ -1941,6 +1970,10 @@ void resources2res(resource_t *top)
if(!top->binres) if(!top->binres)
top->binres = menuex2res(top->name, top->res.menex); top->binres = menuex2res(top->name, top->res.menex);
break; break;
case res_html:
if(!top->binres)
top->binres = html2res(top->name, top->res.html);
break;
case res_rdt: case res_rdt:
if(!top->binres) if(!top->binres)
top->binres = rcdata2res(top->name, top->res.rdt); top->binres = rcdata2res(top->name, top->res.rdt);

View file

@ -24,7 +24,7 @@
#include "wrctypes.h" #include "wrctypes.h"
res_t *new_res(void); res_t *new_res(void);
res_t *grow_res(res_t *r, int add); res_t *grow_res(res_t *r, unsigned int add);
void put_byte(res_t *res, unsigned c); void put_byte(res_t *res, unsigned c);
void put_word(res_t *res, unsigned w); void put_word(res_t *res, unsigned w);
void put_dword(res_t *res, unsigned d); void put_dword(res_t *res, unsigned d);

File diff suppressed because it is too large Load diff

View file

@ -123,6 +123,20 @@ characts_t *dup_characts(characts_t *c)
return new_characts(*c); return new_characts(*c);
} }
html_t *new_html(raw_data_t *rd, int *memopt)
{
html_t *html = xmalloc(sizeof(html_t));
html->data = rd;
if(memopt)
{
html->memopt = *memopt;
free(memopt);
}
else
html->memopt = WRC_MO_MOVEABLE | WRC_MO_PURE;
return html;
}
rcdata_t *new_rcdata(raw_data_t *rd, int *memopt) rcdata_t *new_rcdata(raw_data_t *rd, int *memopt)
{ {
rcdata_t *rc = (rcdata_t *)xmalloc(sizeof(rcdata_t)); rcdata_t *rc = (rcdata_t *)xmalloc(sizeof(rcdata_t));

View file

@ -61,6 +61,7 @@ language_t *new_language(int id, int sub);
language_t *dup_language(language_t *l); language_t *dup_language(language_t *l);
version_t *dup_version(version_t *v); version_t *dup_version(version_t *v);
characts_t *dup_characts(characts_t *c); characts_t *dup_characts(characts_t *c);
html_t *new_html(raw_data_t *rd, int *memopt);
rcdata_t *new_rcdata(raw_data_t *rd, int *memopt); rcdata_t *new_rcdata(raw_data_t *rd, int *memopt);
font_id_t *new_font_id(int size, string_t *face, int weight, int italic); font_id_t *new_font_id(int size, string_t *face, int weight, int italic);
user_t *new_user(name_id_t *type, raw_data_t *rd, int *memopt); user_t *new_user(name_id_t *type, raw_data_t *rd, int *memopt);
@ -82,4 +83,3 @@ style_pair_t *new_style_pair(style_t *style, style_t *exstyle);
style_t *new_style(DWORD or_mask, DWORD and_mask); style_t *new_style(DWORD or_mask, DWORD and_mask);
#endif #endif

View file

@ -204,6 +204,7 @@ static struct keyword keywords[] = {
{ "GRAYED", tGRAYED, 0, 0, 0}, { "GRAYED", tGRAYED, 0, 0, 0},
{ "GROUPBOX", tGROUPBOX, 0, 0, 0}, { "GROUPBOX", tGROUPBOX, 0, 0, 0},
{ "HELP", tHELP, 0, 0, 0}, { "HELP", tHELP, 0, 0, 0},
{ "HTML", tHTML, 0, 0, 0},
{ "ICON", tICON, 0, 0, 0}, { "ICON", tICON, 0, 0, 0},
{ "IMPURE", tIMPURE, 0, 0, 0}, { "IMPURE", tIMPURE, 0, 0, 0},
{ "INACTIVE", tINACTIVE, 0, 0, 0}, { "INACTIVE", tINACTIVE, 0, 0, 0},
@ -405,7 +406,7 @@ static struct keyword *iskeyword(char *kw)
* and *only* in a filename. In this case, the second * and *only* in a filename. In this case, the second
* rule will be reduced because it is longer. * rule will be reduced because it is longer.
*/ */
[A-Za-z_0-9]+ { [A-Za-z_0-9.]+ {
struct keyword *tok = iskeyword(yytext); struct keyword *tok = iskeyword(yytext);
if(tok) if(tok)

View file

@ -251,6 +251,7 @@ static int rsrcid_to_token(int lookahead);
fontdir_t *fnd; fontdir_t *fnd;
menu_t *men; menu_t *men;
menuex_t *menex; menuex_t *menex;
html_t *html;
rcdata_t *rdt; rcdata_t *rdt;
stringtable_t *stt; stringtable_t *stt;
stt_entry_t *stte; stt_entry_t *stte;
@ -285,7 +286,7 @@ static int rsrcid_to_token(int lookahead);
%token <str> tSTRING tIDENT tFILENAME %token <str> tSTRING tIDENT tFILENAME
%token <raw> tRAWDATA %token <raw> tRAWDATA
%token tACCELERATORS tBITMAP tCURSOR tDIALOG tDIALOGEX tMENU tMENUEX tMESSAGETABLE %token tACCELERATORS tBITMAP tCURSOR tDIALOG tDIALOGEX tMENU tMENUEX tMESSAGETABLE
%token tRCDATA tVERSIONINFO tSTRINGTABLE tFONT tFONTDIR tICON %token tRCDATA tVERSIONINFO tSTRINGTABLE tFONT tFONTDIR tICON tHTML
%token tAUTO3STATE tAUTOCHECKBOX tAUTORADIOBUTTON tCHECKBOX tDEFPUSHBUTTON %token tAUTO3STATE tAUTOCHECKBOX tAUTORADIOBUTTON tCHECKBOX tDEFPUSHBUTTON
%token tPUSHBUTTON tRADIOBUTTON tSTATE3 /* PUSHBOX */ %token tPUSHBUTTON tRADIOBUTTON tSTATE3 /* PUSHBOX */
%token tGROUPBOX tCOMBOBOX tLISTBOX tSCROLLBAR %token tGROUPBOX tCOMBOBOX tLISTBOX tSCROLLBAR
@ -323,6 +324,7 @@ static int rsrcid_to_token(int lookahead);
%type <iptr> helpid %type <iptr> helpid
%type <dlgex> dialogex dlgex_attribs %type <dlgex> dialogex dlgex_attribs
%type <ctl> exctrls gen_exctrl lab_exctrl exctrl_desc %type <ctl> exctrls gen_exctrl lab_exctrl exctrl_desc
%type <html> html
%type <rdt> rcdata %type <rdt> rcdata
%type <raw> raw_data raw_elements opt_data file_raw %type <raw> raw_data raw_elements opt_data file_raw
%type <veri> versioninfo fix_version %type <veri> versioninfo fix_version
@ -644,6 +646,7 @@ resource_definition
$$ = NULL; $$ = NULL;
} }
| messagetable { $$ = new_resource(res_msg, $1, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, $1->data->lvc.language); } | messagetable { $$ = new_resource(res_msg, $1, WRC_MO_MOVEABLE | WRC_MO_DISCARDABLE, $1->data->lvc.language); }
| html { $$ = new_resource(res_html, $1, $1->memopt, $1->data->lvc.language); }
| rcdata { $$ = new_resource(res_rdt, $1, $1->memopt, $1->data->lvc.language); } | rcdata { $$ = new_resource(res_rdt, $1, $1->memopt, $1->data->lvc.language); }
| toolbar { $$ = new_resource(res_toolbar, $1, $1->memopt, $1->lvc.language); } | toolbar { $$ = new_resource(res_toolbar, $1, $1->memopt, $1->lvc.language); }
| userres { $$ = new_resource(res_usr, $1, $1->memopt, $1->data->lvc.language); } | userres { $$ = new_resource(res_usr, $1, $1->memopt, $1->data->lvc.language); }
@ -724,6 +727,10 @@ messagetable
} }
; ;
/* ------------------------------ HTML ------------------------------ */
html : tHTML loadmemopts file_raw { $$ = new_html($3, $2); }
;
/* ------------------------------ RCData ------------------------------ */ /* ------------------------------ RCData ------------------------------ */
rcdata : tRCDATA loadmemopts file_raw { $$ = new_rcdata($3, $2); } rcdata : tRCDATA loadmemopts file_raw { $$ = new_rcdata($3, $2); }
; ;
@ -3017,6 +3024,10 @@ static int rsrcid_to_token(int lookahead)
type = "TOOLBAR"; type = "TOOLBAR";
token = tTOOLBAR; token = tTOOLBAR;
break; break;
case WRC_RT_HTML:
type = "HTML";
token = tHTML;
break;
case WRC_RT_STRING: case WRC_RT_STRING:
type = "STRINGTABLE"; type = "STRINGTABLE";
@ -3032,7 +3043,6 @@ static int rsrcid_to_token(int lookahead)
case WRC_RT_DLGINCLUDE: case WRC_RT_DLGINCLUDE:
case WRC_RT_PLUGPLAY: case WRC_RT_PLUGPLAY:
case WRC_RT_VXD: case WRC_RT_VXD:
case WRC_RT_HTML:
yywarning("Usertype uses reserved type ID %d, which is not supported by wrc yet", yylval.num); yywarning("Usertype uses reserved type ID %d, which is not supported by wrc yet", yylval.num);
default: default:
return lookahead; return lookahead;

View file

@ -232,7 +232,7 @@ static resource_t *read_res32(FILE *fp)
str = new_string(); str = new_string();
str->type = str_unicode; str->type = str_unicode;
str->size = (idx - tag) / 2; str->size = (idx - tag) / 2;
str->str.wstr = (WCHAR *)xmalloc(idx-tag+2); str->str.wstr = xmalloc(idx-tag+2);
memcpy(str->str.wstr, &res->data[tag], idx-tag); memcpy(str->str.wstr, &res->data[tag], idx-tag);
str->str.wstr[str->size] = 0; str->str.wstr[str->size] = 0;
type = new_name_id(); type = new_name_id();
@ -266,7 +266,7 @@ static resource_t *read_res32(FILE *fp)
str = new_string(); str = new_string();
str->type = str_unicode; str->type = str_unicode;
str->size = (idx - tag) / 2; str->size = (idx - tag) / 2;
str->str.wstr = (WCHAR *)xmalloc(idx-tag+2); str->str.wstr = xmalloc(idx-tag+2);
memcpy(str->str.wstr, &res->data[tag], idx-tag); memcpy(str->str.wstr, &res->data[tag], idx-tag);
str->str.wstr[str->size] = 0; str->str.wstr[str->size] = 0;
name = new_name_id(); name = new_name_id();

View file

@ -87,10 +87,10 @@
#define RES_BLOCKSIZE 512 #define RES_BLOCKSIZE 512
typedef struct res { typedef struct res {
int allocsize; /* Allocated datablock size */ unsigned int allocsize; /* Allocated datablock size */
int size; /* Actual size of data */ unsigned int size; /* Actual size of data */
int dataidx; /* Tag behind the resource-header */ unsigned int dataidx; /* Tag behind the resource-header */
char *data; char *data;
} res_t; } res_t;
/* Resource strings are slightly more complex because they include '\0' */ /* Resource strings are slightly more complex because they include '\0' */
@ -441,6 +441,11 @@ typedef struct bitmap {
raw_data_t *data; raw_data_t *data;
} bitmap_t; } bitmap_t;
typedef struct html {
DWORD memopt;
raw_data_t *data;
} html_t;
typedef struct rcdata { typedef struct rcdata {
DWORD memopt; DWORD memopt;
raw_data_t *data; raw_data_t *data;
@ -615,6 +620,7 @@ typedef struct resource {
menu_t *men; menu_t *men;
menuex_t *menex; menuex_t *menex;
messagetable_t *msg; messagetable_t *msg;
html_t *html;
rcdata_t *rdt; rcdata_t *rdt;
stringtable_t *stt; stringtable_t *stt;
toolbar_t *tbt; toolbar_t *tbt;

View file

@ -46,7 +46,7 @@
void write_resfile(char *outname, resource_t *top) void write_resfile(char *outname, resource_t *top)
{ {
FILE *fo; FILE *fo;
int ret; unsigned int ret;
char zeros[3] = {0, 0, 0}; char zeros[3] = {0, 0, 0};
fo = fopen(outname, "wb"); fo = fopen(outname, "wb");

File diff suppressed because it is too large Load diff

View file

@ -50,67 +50,68 @@
tFONT = 276, tFONT = 276,
tFONTDIR = 277, tFONTDIR = 277,
tICON = 278, tICON = 278,
tAUTO3STATE = 279, tHTML = 279,
tAUTOCHECKBOX = 280, tAUTO3STATE = 280,
tAUTORADIOBUTTON = 281, tAUTOCHECKBOX = 281,
tCHECKBOX = 282, tAUTORADIOBUTTON = 282,
tDEFPUSHBUTTON = 283, tCHECKBOX = 283,
tPUSHBUTTON = 284, tDEFPUSHBUTTON = 284,
tRADIOBUTTON = 285, tPUSHBUTTON = 285,
tSTATE3 = 286, tRADIOBUTTON = 286,
tGROUPBOX = 287, tSTATE3 = 287,
tCOMBOBOX = 288, tGROUPBOX = 288,
tLISTBOX = 289, tCOMBOBOX = 289,
tSCROLLBAR = 290, tLISTBOX = 290,
tCONTROL = 291, tSCROLLBAR = 291,
tEDITTEXT = 292, tCONTROL = 292,
tRTEXT = 293, tEDITTEXT = 293,
tCTEXT = 294, tRTEXT = 294,
tLTEXT = 295, tCTEXT = 295,
tBLOCK = 296, tLTEXT = 296,
tVALUE = 297, tBLOCK = 297,
tSHIFT = 298, tVALUE = 298,
tALT = 299, tSHIFT = 299,
tASCII = 300, tALT = 300,
tVIRTKEY = 301, tASCII = 301,
tGRAYED = 302, tVIRTKEY = 302,
tCHECKED = 303, tGRAYED = 303,
tINACTIVE = 304, tCHECKED = 304,
tNOINVERT = 305, tINACTIVE = 305,
tPURE = 306, tNOINVERT = 306,
tIMPURE = 307, tPURE = 307,
tDISCARDABLE = 308, tIMPURE = 308,
tLOADONCALL = 309, tDISCARDABLE = 309,
tPRELOAD = 310, tLOADONCALL = 310,
tFIXED = 311, tPRELOAD = 311,
tMOVEABLE = 312, tFIXED = 312,
tCLASS = 313, tMOVEABLE = 313,
tCAPTION = 314, tCLASS = 314,
tCHARACTERISTICS = 315, tCAPTION = 315,
tEXSTYLE = 316, tCHARACTERISTICS = 316,
tSTYLE = 317, tEXSTYLE = 317,
tVERSION = 318, tSTYLE = 318,
tLANGUAGE = 319, tVERSION = 319,
tFILEVERSION = 320, tLANGUAGE = 320,
tPRODUCTVERSION = 321, tFILEVERSION = 321,
tFILEFLAGSMASK = 322, tPRODUCTVERSION = 322,
tFILEOS = 323, tFILEFLAGSMASK = 323,
tFILETYPE = 324, tFILEOS = 324,
tFILEFLAGS = 325, tFILETYPE = 325,
tFILESUBTYPE = 326, tFILEFLAGS = 326,
tMENUBARBREAK = 327, tFILESUBTYPE = 327,
tMENUBREAK = 328, tMENUBARBREAK = 328,
tMENUITEM = 329, tMENUBREAK = 329,
tPOPUP = 330, tMENUITEM = 330,
tSEPARATOR = 331, tPOPUP = 331,
tHELP = 332, tSEPARATOR = 332,
tTOOLBAR = 333, tHELP = 333,
tBUTTON = 334, tTOOLBAR = 334,
tBEGIN = 335, tBUTTON = 335,
tEND = 336, tBEGIN = 336,
tDLGINIT = 337, tEND = 337,
tNOT = 338, tDLGINIT = 338,
pUPM = 339 tNOT = 339,
pUPM = 340
}; };
#endif #endif
#define tNL 258 #define tNL 258
@ -134,73 +135,74 @@
#define tFONT 276 #define tFONT 276
#define tFONTDIR 277 #define tFONTDIR 277
#define tICON 278 #define tICON 278
#define tAUTO3STATE 279 #define tHTML 279
#define tAUTOCHECKBOX 280 #define tAUTO3STATE 280
#define tAUTORADIOBUTTON 281 #define tAUTOCHECKBOX 281
#define tCHECKBOX 282 #define tAUTORADIOBUTTON 282
#define tDEFPUSHBUTTON 283 #define tCHECKBOX 283
#define tPUSHBUTTON 284 #define tDEFPUSHBUTTON 284
#define tRADIOBUTTON 285 #define tPUSHBUTTON 285
#define tSTATE3 286 #define tRADIOBUTTON 286
#define tGROUPBOX 287 #define tSTATE3 287
#define tCOMBOBOX 288 #define tGROUPBOX 288
#define tLISTBOX 289 #define tCOMBOBOX 289
#define tSCROLLBAR 290 #define tLISTBOX 290
#define tCONTROL 291 #define tSCROLLBAR 291
#define tEDITTEXT 292 #define tCONTROL 292
#define tRTEXT 293 #define tEDITTEXT 293
#define tCTEXT 294 #define tRTEXT 294
#define tLTEXT 295 #define tCTEXT 295
#define tBLOCK 296 #define tLTEXT 296
#define tVALUE 297 #define tBLOCK 297
#define tSHIFT 298 #define tVALUE 298
#define tALT 299 #define tSHIFT 299
#define tASCII 300 #define tALT 300
#define tVIRTKEY 301 #define tASCII 301
#define tGRAYED 302 #define tVIRTKEY 302
#define tCHECKED 303 #define tGRAYED 303
#define tINACTIVE 304 #define tCHECKED 304
#define tNOINVERT 305 #define tINACTIVE 305
#define tPURE 306 #define tNOINVERT 306
#define tIMPURE 307 #define tPURE 307
#define tDISCARDABLE 308 #define tIMPURE 308
#define tLOADONCALL 309 #define tDISCARDABLE 309
#define tPRELOAD 310 #define tLOADONCALL 310
#define tFIXED 311 #define tPRELOAD 311
#define tMOVEABLE 312 #define tFIXED 312
#define tCLASS 313 #define tMOVEABLE 313
#define tCAPTION 314 #define tCLASS 314
#define tCHARACTERISTICS 315 #define tCAPTION 315
#define tEXSTYLE 316 #define tCHARACTERISTICS 316
#define tSTYLE 317 #define tEXSTYLE 317
#define tVERSION 318 #define tSTYLE 318
#define tLANGUAGE 319 #define tVERSION 319
#define tFILEVERSION 320 #define tLANGUAGE 320
#define tPRODUCTVERSION 321 #define tFILEVERSION 321
#define tFILEFLAGSMASK 322 #define tPRODUCTVERSION 322
#define tFILEOS 323 #define tFILEFLAGSMASK 323
#define tFILETYPE 324 #define tFILEOS 324
#define tFILEFLAGS 325 #define tFILETYPE 325
#define tFILESUBTYPE 326 #define tFILEFLAGS 326
#define tMENUBARBREAK 327 #define tFILESUBTYPE 327
#define tMENUBREAK 328 #define tMENUBARBREAK 328
#define tMENUITEM 329 #define tMENUBREAK 329
#define tPOPUP 330 #define tMENUITEM 330
#define tSEPARATOR 331 #define tPOPUP 331
#define tHELP 332 #define tSEPARATOR 332
#define tTOOLBAR 333 #define tHELP 333
#define tBUTTON 334 #define tTOOLBAR 334
#define tBEGIN 335 #define tBUTTON 335
#define tEND 336 #define tBEGIN 336
#define tDLGINIT 337 #define tEND 337
#define tNOT 338 #define tDLGINIT 338
#define pUPM 339 #define tNOT 339
#define pUPM 340
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
#line 240 "parser.y" #line 240 "./parser.y"
typedef union YYSTYPE { typedef union YYSTYPE {
string_t *str; string_t *str;
int num; int num;
@ -215,6 +217,7 @@ typedef union YYSTYPE {
fontdir_t *fnd; fontdir_t *fnd;
menu_t *men; menu_t *men;
menuex_t *menex; menuex_t *menex;
html_t *html;
rcdata_t *rdt; rcdata_t *rdt;
stringtable_t *stt; stringtable_t *stt;
stt_entry_t *stte; stt_entry_t *stte;
@ -244,7 +247,7 @@ typedef union YYSTYPE {
ani_any_t *ani; ani_any_t *ani;
} YYSTYPE; } YYSTYPE;
/* Line 1275 of yacc.c. */ /* Line 1275 of yacc.c. */
#line 248 "parser.tab.h" #line 251 "y.tab.h"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_TRIVIAL 1