Just intermediate results for backup reasons.
authorMichael Meskes
Thu, 13 Feb 2003 20:37:28 +0000 (20:37 +0000)
committerMichael Meskes
Thu, 13 Feb 2003 20:37:28 +0000 (20:37 +0000)
src/interfaces/ecpg/preproc/pgc.l
src/interfaces/ecpg/preproc/preproc.y

index 0ff7900c68bbb073b943ae798c341ebd002f64ea..44e22f5cc0045f5d258a1604c4227fd3cc172413 100644 (file)
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.102 2003/02/13 13:11:52 meskes Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.103 2003/02/13 20:37:28 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -831,7 +831,16 @@ cppline            {space}*#(.*\\{space})*.*
                            i > 0 && isspace((unsigned char) yytext[i]);
                            i-- )
                            {}
-                       yytext[i+1] = '\0';
+
+                       /* Remove trailing '"' if it exists */
+                       if (yytext[i] == '"') 
+                           yytext[i] = '\0';
+                       else
+                           yytext[i+1] = '\0';
+
+                       /* also remove starting '"' */
+                       if (yytext[0] == '"')
+                           memmove(yytext, yytext+1, strlen(yytext));
 
                        yyin = NULL;
                        for (ip = include_paths; yyin == NULL && ip != NULL; ip = ip->next)
index e1e374cd690fefb9fb502bfda95b48787636ba0c..3d407f1cac6a703a35a25f2b218a6be6cdcd48c4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.206 2003/01/21 20:01:12 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/Attic/preproc.y,v 1.207 2003/02/13 20:37:28 meskes Exp $ */
 
 /* Copyright comment */
 %{
@@ -376,7 +376,7 @@ make_name(void)
 %type     storage_clause opt_initializer c_anything
 %type     variable_list variable c_thing c_term
 %type     opt_pointer ECPGDisconnect dis_name storage_modifier
-%type     stmt ECPGRelease execstring server_name
+%type     ECPGRelease execstring server_name ECPGVarDeclaration
 %type     connection_object opt_server opt_port c_stuff c_stuff_item
 %type     user_name opt_user char_variable ora_user ident opt_reference
 %type     var_type_declarations quoted_ident_stringvar
@@ -385,13 +385,13 @@ make_name(void)
 %type     enum_type civar civarind ECPGCursorStmt ECPGDeallocate
 %type     ECPGFree ECPGDeclare ECPGVar opt_at enum_definition
 %type     struct_type s_struct vt_declarations variable_declarations
-%type     var_declaration type_declaration
+%type     var_declaration type_declaration single_vt_declaration
 %type     s_union union_type ECPGSetAutocommit on_off
 %type     ECPGAllocateDescr ECPGDeallocateDescr symbol opt_symbol
-%type     ECPGGetDescriptorHeader ECPGColLabel
+%type     ECPGGetDescriptorHeader ECPGColLabel single_var_declaration
 %type     reserved_keyword unreserved_keyword
 %type     col_name_keyword func_name_keyword
-%type     ECPGTypeName variablelist
+%type     ECPGTypeName variablelist ECPGColLabelCommon
 
 %type   ECPGGetDescriptor
 
@@ -399,7 +399,7 @@ make_name(void)
 
 %type   descriptor_item desc_header_item
 
-%type    type
+%type    type common_type single_vt_type
 
 %type   action
 
@@ -652,6 +652,12 @@ stmt:  AlterDatabaseSetStmt { output_statement($1, 0, connection); }
 
            output_simple_statement($1);
        }
+       | ECPGVarDeclaration
+       {
+           fprintf(yyout, "%s", $1);
+                        free($1);
+           output_line_number();
+       }
        | ECPGWhenever
        {
            if (connection)
@@ -4125,8 +4131,89 @@ ECPGDeallocate: DEALLOCATE PREPARE ident
            { $$ = cat_str(2, make_str("ECPGdeallocate(__LINE__, \""), $2, make_str("\");")); }
        ;
 
+/* 
+ * variable decalartion outside exec sql declare block
+ */
+ECPGVarDeclaration: single_vt_declaration;
+
+single_vt_declaration: type_declaration        { $$ = $1; }
+       | single_var_declaration    { $$ = $1; }
+       ;
+   
+single_var_declaration: storage_clause storage_modifier
+       {
+           actual_storage[struct_level] = cat2_str(mm_strdup($1), mm_strdup($2));
+           actual_startline[struct_level] = hashline_number();
+       }
+       single_vt_type
+       {
+           actual_type[struct_level].type_enum = $4.type_enum;
+           actual_type[struct_level].type_dimension = $4.type_dimension;
+           actual_type[struct_level].type_index = $4.type_index;
+           actual_type[struct_level].type_sizeof = $4.type_sizeof;
+
+           /* we do not need the string "varchar" for output */
+           /* so replace it with an empty string */
+           if ($4.type_enum == ECPGt_varchar)
+           {
+               free($4.type_str);
+               $4.type_str=EMPTY;
+           }
+       }
+       variable_list 
+       {
+           $$ = cat_str(6, actual_startline[struct_level], $1, $2, $4.type_str, $6, make_str(";\n"));
+       }
+       ;
+
+single_vt_type: common_type
+       | ECPGColLabelCommon
+       {
+           /*
+            * Check for type names that the SQL grammar treats as
+            * unreserved keywords
+            */
+           if (strcmp($1, "varchar") == 0)
+           {
+               $$.type_enum = ECPGt_varchar;
+               $$.type_str = make_str("varchar");
+               $$.type_dimension = -1;
+               $$.type_index = -1;
+               $$.type_sizeof = NULL;
+           }
+           else if (strcmp($1, "float") == 0)
+           {
+               $$.type_enum = ECPGt_float;
+               $$.type_str = make_str("float");
+               $$.type_dimension = -1;
+               $$.type_index = -1;
+               $$.type_sizeof = NULL;
+           }
+           else if (strcmp($1, "double") == 0)
+           {
+               $$.type_enum = ECPGt_double;
+               $$.type_str = make_str("double");
+               $$.type_dimension = -1;
+               $$.type_index = -1;
+               $$.type_sizeof = NULL;
+           }
+           else
+           {
+               /* this is for typedef'ed types */
+               struct typedefs *this = get_typedef($1);
+
+               $$.type_str = (this->type->type_enum == ECPGt_varchar) ? EMPTY : mm_strdup(this->name);
+               $$.type_enum = this->type->type_enum;
+               $$.type_dimension = this->type->type_dimension;
+               $$.type_index = this->type->type_index;
+               $$.type_sizeof = this->type->type_sizeof;
+               struct_member_list[struct_level] = ECPGstruct_member_dup(this->struct_member_list);
+           }
+       }
+       ;
+
 /*
- * variable declaration inside the exec sql declare block
+ * variable declaration inside exec sql declare block
  */
 ECPGDeclaration: sql_startdeclare
        { fputs("/* exec sql begin declare section */", yyout); }
@@ -4256,7 +4343,7 @@ storage_modifier : S_CONST        { $$ = make_str("const"); }
        | /*EMPTY*/             { $$ = EMPTY; }
        ;
 
-type: simple_type
+common_type: simple_type
        {
            $$.type_enum = $1;
            $$.type_str = mm_strdup(ECPGtype_name($1));
@@ -4288,6 +4375,9 @@ type: simple_type
            $$.type_index = -1;
            $$.type_sizeof = NULL;
        }
+       ;
+
+type:      common_type
        | ECPGColLabel
        {
            /*
@@ -5108,15 +5198,17 @@ ColLabel:  ECPGColLabel                 { $$ = $1; }
        | UNION                         { $$ = make_str("union"); }
        ;
 
-ECPGColLabel:  ident                   { $$ = $1; }
+ECPGColLabelCommon:  ident                              { $$ = $1; }
+                | col_name_keyword                      { $$ = $1; }
+                | func_name_keyword                     { $$ = $1; }
+                ;
+       
+ECPGColLabel:  ECPGColLabelCommon          { $$ = $1; }
        | unreserved_keyword            { $$ = $1; }
-       | col_name_keyword              { $$ = $1; }
-       | func_name_keyword             { $$ = $1; }
-       | reserved_keyword              { $$ = $1; }
-       | ECPGKeywords                  { $$ = $1; }
+       | reserved_keyword          { $$ = $1; }
+       | ECPGKeywords              { $$ = $1; }
        ;
 
-
 /*
  * Keyword classification lists.  Generally, every keyword present in
  * the Postgres grammar should appear in exactly one of these lists.