@@ -500,6 +500,7 @@ output_statement(char * stmt, int mode)
500
500
whenever_action (mode);
501
501
free (stmt);
502
502
}
503
+
503
504
%}
504
505
505
506
%union {
@@ -509,6 +510,7 @@ output_statement(char * stmt, int mode)
509
510
struct when action;
510
511
struct index index;
511
512
int tagname;
513
+ struct this_type type;
512
514
enum ECPGttype type_enum;
513
515
}
514
516
@@ -520,8 +522,8 @@ output_statement(char * stmt, int mode)
520
522
%token SQL_STOP SQL_WHENEVER
521
523
522
524
/* C token */
523
- %token S_ANYTHING S_AUTO S_BOOL S_CHAR S_CONST S_DOUBLE S_EXTERN
524
- %token S_FLOAT S_INT
525
+ %token S_ANYTHING S_AUTO S_BOOL S_CHAR S_CONST S_DOUBLE S_ENUM S_EXTERN
526
+ %token S_FLOAT S_INT S
525
527
%token S_LONG S_REGISTER S_SHORT S_SIGNED S_STATIC S_STRUCT
526
528
%token S_UNSIGNED S_VARCHAR
527
529
@@ -582,7 +584,7 @@ output_statement(char * stmt, int mode)
582
584
%token PASSWORD , CREATEDB , NOCREATEDB , CREATEUSER , NOCREATEUSER , VALID , UNTIL
583
585
584
586
/* Special keywords, not in the query language - see the "lex" file */
585
- %token <str> IDENT SCONST Op CSTRING CVARIABLE
587
+ %token <str> IDENT SCONST Op CSTRING CVARIABLE CPP_LINE
586
588
%token <ival> ICONST PARAM
587
589
%token <dval> FCONST
588
590
@@ -676,12 +678,15 @@ output_statement(char * stmt, int mode)
676
678
%type <str> blockend variable_list variable var_anything do_anything
677
679
%type <str> opt_pointer cvariable ECPGDisconnect dis_name
678
680
%type <str> stmt symbol opt_symbol ECPGRelease execstring server_name
679
- %type <str> connection_object opt_server opt_port
681
+ %type <str> connection_object opt_server opt_port c_thing
680
682
%type <str> user_name opt_user char_variable ora_user ident
681
683
%type <str> db_prefix server opt_options opt_connection_name
682
- %type <str> ECPGSetConnection
684
+ %type <str> ECPGSetConnection c_line cpp_line s_enum
685
+ %type <str> enum_type
686
+
687
+ %type <type_enum> simple_type
683
688
684
- %type <type_enum> simple_type type struct_type
689
+ %type <type> type
685
690
686
691
%type <action> action
687
692
@@ -694,7 +699,8 @@ statements: /* empty */
694
699
695
700
statement : ecpgstart stmt SQL_SEMI
696
701
| ECPGDeclaration
697
- | c_anything { fputs($1 , yyout); free($1 ); }
702
+ | c_thing { fprintf(yyout, " %s" , $1 ); free($1 ); }
703
+ | cpp_line { fprintf(yyout, " %s" , $1 ); free($1 ); }
698
704
| blockstart { fputs($1 , yyout); free($1 ); }
699
705
| blockend { fputs($1 , yyout); free($1 ); }
700
706
@@ -3795,29 +3801,49 @@ variable_declarations: /* empty */
3795
3801
declaration : storage_clause type
3796
3802
{
3797
3803
actual_storage[struct_level] = $1 ;
3798
- actual_type[struct_level] = $2 ;
3799
- if ($2 != ECPGt_varchar && $2 != ECPGt_struct)
3800
- fprintf (yyout, " %s %s" , $1 , ECPGtype_name($2 ));
3804
+ actual_type[struct_level] = $2 .type_enum;
3805
+ if ($2 .type_enum != ECPGt_varchar && $2 .type_enum != ECPGt_struct)
3806
+ fprintf (yyout, " %s %s" , $1 , $2 .type_str);
3807
+ free ($2 .type_str);
3801
3808
}
3802
3809
variable_list ' ;' { fputc(' ;' , yyout); }
3803
3810
3804
- storage_clause : S_EXTERN { $$ = make1_str( " extern" ) ; }
3805
- | S_STATIC { $$ = make1_str( " static" ) ; }
3806
- | S_SIGNED { $$ = make1_str( " signed" ) ; }
3807
- | S_CONST { $$ = make1_str( " const" ) ; }
3808
- | S_REGISTER { $$ = make1_str( " register" ) ; }
3809
- | S_AUTO { $$ = make1_str( " auto" ) ; }
3810
- | /* empty */ { $$ = make1_str( " " ) ; }
3811
+ storage_clause : S_EXTERN { $$ = " extern" ; }
3812
+ | S_STATIC { $$ = " static" ; }
3813
+ | S_SIGNED { $$ = " signed" ; }
3814
+ | S_CONST { $$ = " const" ; }
3815
+ | S_REGISTER { $$ = " register" ; }
3816
+ | S_AUTO { $$ = " auto" ; }
3817
+ | /* empty */ { $$ = " " ; }
3811
3818
3812
3819
type : simple_type
3820
+ {
3821
+ $$ .type_enum = $1 ;
3822
+ $$ .type_str = strdup(ECPGtype_name($1 ));
3823
+ }
3813
3824
| struct_type
3825
+ {
3826
+ $$ .type_enum = ECPGt_struct;
3827
+ $$ .type_str = make1_str(" " );
3828
+ }
3829
+ | enum_type
3830
+ {
3831
+ $$ .type_str = $1 ;
3832
+ $$ .type_enum = ECPGt_int;
3833
+ }
3834
+
3835
+ enum_type : s_enum ' {' c_line ' }'
3836
+ {
3837
+ $$ = cat4_str($1 , make1_str(" {" ), $3 , make1_str(" }" ));
3838
+ }
3839
+
3840
+ s_enum : S_ENUM opt_symbol { $$ = cat2_str(make1_str(" enum" ), $2 ); }
3814
3841
3815
3842
struct_type : s_struct ' {' variable_declarations ' }'
3816
3843
{
3817
3844
ECPGfree_struct_member (struct_member_list[struct_level]);
3818
3845
free (actual_storage[struct_level--]);
3819
3846
fputs (" } " , yyout);
3820
- $$ = ECPGt_struct;
3821
3847
}
3822
3848
3823
3849
s_struct : S_STRUCT opt_symbol
@@ -3957,7 +3983,7 @@ variable: opt_pointer symbol opt_array_bounds opt_initializer
3957
3983
if (struct_level == 0 )
3958
3984
new_variable ($2 , type);
3959
3985
else
3960
- ECPGmake_struct_member ($2 , type, &(struct_member_list[struct_level - 1 ]))->typ ;
3986
+ ECPGmake_struct_member ($2 , type, &(struct_member_list[struct_level - 1 ]));
3961
3987
3962
3988
free ($1 );
3963
3989
free ($2 );
@@ -4562,27 +4588,36 @@ civariableonly : cvariable name {
4562
4588
add_variable (&argsinsert, find_variable($1 ), &no_indicator);
4563
4589
}
4564
4590
4565
- cvariable : CVARIABLE { $$ = make1_str( $1 ) ; }
4591
+ cvariable : CVARIABLE { $$ = $1 ; }
4566
4592
4567
4593
indicator : /* empty */ { $$ = NULL ; }
4568
4594
| cvariable { check_indicator((find_variable($1 ))->type); $$ = $1 ; }
4569
4595
| SQL_INDICATOR cvariable { check_indicator((find_variable($2 ))->type); $$ = $2 ; }
4570
4596
| SQL_INDICATOR name { check_indicator((find_variable($2 ))->type); $$ = $2 ; }
4571
4597
4572
- ident : IDENT { $$ = make1_str( $1 ) ; }
4598
+ ident : IDENT { $$ = $1 ; }
4573
4599
| CSTRING { $$ = $1 ; }
4574
4600
/*
4575
4601
* C stuff
4576
4602
*/
4577
4603
4578
- symbol : IDENT { $$ = make1_str($1 ); }
4604
+ symbol : IDENT { $$ = $1 ; }
4605
+
4606
+ cpp_line : CPP_LINE { $$ = $1 ; }
4607
+
4608
+ c_line : c_anything { $$ = $1 ; }
4609
+ | c_line c_anything
4610
+ {
4611
+ $$ = make2_str($1 , $2 );
4612
+ }
4613
+
4614
+ c_thing : c_anything | ' ;' { $$ = make1_str(" ;" ); }
4579
4615
4580
- c_anything : IDENT { $$ = make1_str( $1 ) ; }
4616
+ c_anything : IDENT { $$ = $1 ; }
4581
4617
| CSTRING { $$ = make3_str(make1_str(" \" " ), $1 , make1_str(" \" " )); }
4582
4618
| Iconst { $$ = $1 ; }
4583
4619
| FCONST { $$ = make_name(); }
4584
- | ' *' { $$ = make1_str(" *" ); }
4585
- | ' ;' { $$ = make1_str(" ;" ); }
4620
+ | ' *' { $$ = make1_str(" *" ); }
4586
4621
| S_AUTO { $$ = make1_str(" auto" ); }
4587
4622
| S_BOOL { $$ = make1_str(" bool" ); }
4588
4623
| S_CHAR { $$ = make1_str(" char" ); }
@@ -4607,19 +4642,17 @@ c_anything: IDENT { $$ = make1_str($1); }
4607
4642
| ' =' { $$ = make1_str(" =" ); }
4608
4643
| ' ,' { $$ = make1_str(" ," ); }
4609
4644
4610
- do_anything : IDENT { $$ = make1_str( $1 ) ; }
4645
+ do_anything : IDENT { $$ = $1 ; }
4611
4646
| CSTRING { $$ = make3_str(make1_str(" \" " ), $1 , make1_str(" \" " ));}
4612
4647
| Iconst { $$ = $1 ; }
4613
4648
| FCONST { $$ = make_name(); }
4614
4649
| ' ,' { $$ = make1_str(" ," ); }
4615
4650
4616
- var_anything : IDENT { $$ = make1_str($1 ); }
4617
- | CSTRING { $$ = make3_str(make1_str(" \" " ), $1 , make1_str(" \" " )); }
4618
- | Iconst { $$ = $1 ; }
4619
- | FCONST { $$ = make_name(); }
4620
- /* FIXME: | ',' { $$ = make1_str(","); }*/
4621
- | ' {' { $$ = make1_str(" {" ); }
4622
- | ' }' { $$ = make1_str(" }" ); }
4651
+ var_anything : IDENT { $$ = $1 ; }
4652
+ | CSTRING { $$ = make3_str(make1_str(" \" " ), $1 , make1_str(" \" " )); }
4653
+ | Iconst { $$ = $1 ; }
4654
+ | FCONST { $$ = make_name(); }
4655
+ | ' {' c_line ' }' { $$ = make3_str(make1_str(" {" ), $2 , make1_str(" }" )); }
4623
4656
4624
4657
blockstart : ' {' {
4625
4658
braces_open++;
@@ -4635,6 +4668,6 @@ blockend : '}' {
4635
4668
4636
4669
void yyerror (char * error )
4637
4670
{
4638
- fprintf (stderr, " %s in line %d\n " , error, yylineno);
4671
+ fprintf (stderr, " %s in line %d of file %s \n " , error, yylineno, input_filename );
4639
4672
exit (PARSE_ERROR);
4640
4673
}
0 commit comments