1- /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.258 2003/09/22 13:19:39 meskes Exp $*/
1+ /* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.259 2003/09/23 12:56:35 meskes Exp $*/
22
33/* Copyright comment*/
44%{
@@ -540,7 +540,7 @@ add_additional_variables(char *name, bool insert)
540540%type <str> col_name_keyword func_name_keyword precision opt_scale
541541%type <str> ECPGTypeName using_list ECPGColLabelCommon UsingConst
542542%type <str> inf_val_list inf_col_list using_descriptor into_descriptor
543- %type <str> ecpg_into_using prepared_name
543+ %type <str> ecpg_into_using prepared_name struct_union_type_with_symbol
544544
545545%type <struct_union> s_struct_union_symbol
546546
@@ -551,7 +551,6 @@ add_additional_variables(char *name, bool insert)
551551%type <dtype_enum> descriptor_item desc_header_item
552552
553553%type <type> var_type common_type single_vt_type
554- %type <type> struct_union_type_with_symbol
555554
556555%type <action> action
557556
@@ -4441,34 +4440,7 @@ single_var_declaration: storage_declaration
44414440}
44424441| struct_union_type_with_symbol ' ;'
44434442{
4444- /* this is essantially a typedef but needs the keyword struct/union as well*/
4445- struct typedefs *ptr, *this ;
4446-
4447- for (ptr = types; ptr !=NULL ; ptr = ptr->next)
4448- {
4449- if (strcmp($1 .type_str, ptr->name) ==0 )
4450- {
4451- /* re-definition is a bug*/
4452- snprintf (errortext,sizeof (errortext), "Type %s already defined", $1.type_str);
4453- mmerror (PARSE_ERROR, ET_ERROR, errortext);
4454- }
4455- }
4456-
4457- this = (struct typedefs *) mm_alloc(sizeof (struct typedefs ));
4458-
4459- /* initial definition*/
4460- this ->next = types;
4461- this ->name =$1 .type_str;
4462- this ->type = (struct this_type *) mm_alloc(sizeof (struct this_type ));
4463- this ->type->type_enum =$1 .type_enum;
4464- this ->type->type_str = mm_strdup($1 .type_str);
4465- this ->type->type_dimension = make_str(" -1" );/* dimension of array*/
4466- this ->type->type_index = make_str(" -1" );/* length of string*/
4467- this ->type->type_sizeof = ECPGstruct_sizeof;
4468- this ->struct_member_list = struct_member_list[struct_level];
4469-
4470- types =this ;
4471- $$ = cat2_str($1 .type_sizeof, make_str(" ;" ));
4443+ $$ = cat2_str($1 , make_str(" ;" ));
44724444}
44734445;
44744446
@@ -4658,6 +4630,7 @@ type_declaration: S_TYPEDEF
46584630char * dimension =$6 .index1;
46594631char * length =$6 .index2;
46604632
4633+ printf (" MM: %s\n " , $5 );
46614634if (($3 .type_enum == ECPGt_struct ||
46624635$3 .type_enum == ECPGt_union) &&
46634636 initializer ==1 )
@@ -4735,34 +4708,7 @@ var_declaration: storage_declaration
47354708}
47364709| struct_union_type_with_symbol ' ;'
47374710{
4738- /* this is essantially a typedef but needs the keyword struct/union as well*/
4739- struct typedefs *ptr, *this ;
4740-
4741- for (ptr = types; ptr !=NULL ; ptr = ptr->next)
4742- {
4743- if (strcmp($1 .type_str, ptr->name) ==0 )
4744- {
4745- /* re-definition is a bug*/
4746- snprintf (errortext,sizeof (errortext), "Type %s already defined", $1.type_str);
4747- mmerror (PARSE_ERROR, ET_ERROR, errortext);
4748- }
4749- }
4750-
4751- this = (struct typedefs *) mm_alloc(sizeof (struct typedefs ));
4752-
4753- /* initial definition*/
4754- this ->next = types;
4755- this ->name =$1 .type_str;
4756- this ->type = (struct this_type *) mm_alloc(sizeof (struct this_type ));
4757- this ->type->type_enum =$1 .type_enum;
4758- this ->type->type_str = mm_strdup($1 .type_str);
4759- this ->type->type_dimension = make_str(" -1" );/* dimension of array*/
4760- this ->type->type_index = make_str(" -1" );/* length of string*/
4761- this ->type->type_sizeof = ECPGstruct_sizeof;
4762- this ->struct_member_list = struct_member_list[struct_level];
4763-
4764- types =this ;
4765- $$ = cat2_str($1 .type_sizeof, make_str(" ;" ));
4711+ $$ = cat2_str($1 , make_str(" ;" ));
47664712}
47674713;
47684714
@@ -4996,21 +4942,51 @@ struct_union_type_with_symbol: s_struct_union_symbol
49964942}
49974943' {' variable_declarations ' }'
49984944{
4945+ struct typedefs *ptr, *this ;
4946+ struct this_type su_type;
4947+
49994948ECPGfree_struct_member (struct_member_list[struct_level]);
50004949struct_member_list[struct_level] =NULL ;
50014950free (actual_storage[struct_level--]);
50024951if (strncmp($1 .su," struct" ,sizeof (" struct" )-1 ) ==0 )
5003- $$ .type_enum = ECPGt_struct;
4952+ su_type .type_enum = ECPGt_struct;
50044953else
5005- $$ .type_enum = ECPGt_union;
5006- $$ .type_str = cat2_str($1 .su,$1 .symbol);
5007- $$ .type_sizeof = cat_str(4 , mm_strdup($$ .type_str), make_str(" {" ),$4 , make_str(" }" ));
4954+ su_type.type_enum = ECPGt_union;
4955+ su_type.type_str = cat2_str($1 .su,$1 .symbol);
50084956free (forward_name);
50094957forward_name =NULL ;
4958+
4959+ /* This is essantially a typedef but needs the keyword struct/union as well.
4960+ * So we create the typedef for each struct definition with symbol*/
4961+ for (ptr = types; ptr !=NULL ; ptr = ptr->next)
4962+ {
4963+ if (strcmp(su_type.type_str, ptr->name) ==0 )
4964+ {
4965+ /* re-definition is a bug*/
4966+ snprintf (errortext,sizeof (errortext), "Type %s already defined", su_type.type_str);
4967+ mmerror (PARSE_ERROR, ET_ERROR, errortext);
4968+ }
4969+ }
4970+
4971+ this = (struct typedefs *) mm_alloc(sizeof (struct typedefs ));
4972+
4973+ /* initial definition*/
4974+ this ->next = types;
4975+ this ->name = mm_strdup(su_type.type_str);
4976+ this ->type = (struct this_type *) mm_alloc(sizeof (struct this_type ));
4977+ this ->type->type_enum = su_type.type_enum;
4978+ this ->type->type_str = mm_strdup(su_type.type_str);
4979+ this ->type->type_dimension = make_str(" -1" );/* dimension of array*/
4980+ this ->type->type_index = make_str(" -1" );/* length of string*/
4981+ this ->type->type_sizeof = ECPGstruct_sizeof;
4982+ this ->struct_member_list = struct_member_list[struct_level];
4983+
4984+ types =this ;
4985+ $$ = cat_str(4 , su_type.type_str, make_str(" {" ),$4 , make_str(" }" ));
50104986}
50114987;
50124988
5013- struct_union_type :struct_union_type_with_symbol {$$ =$1 .type_sizeof ; }
4989+ struct_union_type :struct_union_type_with_symbol {$$ =$1 ; }
50144990| s_struct_union
50154991{
50164992struct_member_list[struct_level++] =NULL ;