ecpg patches - Mailing list pgsql-hackers

From Michael Meskes
Subject ecpg patches
Date
Msg-id 199804231230.OAA04399@gauss.topsystem.de
Whole thread Raw
List pgsql-hackers
The next one:

diff -rcN ecpg/ChangeLog ecpg.mm/ChangeLog
*** ecpg/ChangeLog    Tue Apr 21 15:22:19 1998
--- ecpg.mm/ChangeLog    Thu Apr 23 13:55:53 1998
***************
*** 126,128 ****
--- 126,137 ----

      - Set indicator to amount of data really written (truncation).

+ Thu Apr 23 09:27:16 CEST 1998
+
+     - Also allow call in whenever statement with the same functionality
+       as do.
+
+ Thu Apr 23 12:29:28 CEST 1998
+
+     - Also rewrote variable declaration part. It is now possible to
+       declare more than one variable per line.
diff -rcN ecpg/preproc/Makefile ecpg.mm/preproc/Makefile
*** ecpg/preproc/Makefile    Tue Apr 21 15:22:21 1998
--- ecpg.mm/preproc/Makefile    Thu Apr 23 14:25:39 1998
***************
*** 2,8 ****
  include $(SRCDIR)/Makefile.global

  MAJOR_VERSION=2
! MINOR_VERSION=0
  PATCHLEVEL=0

  CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \
--- 2,8 ----
  include $(SRCDIR)/Makefile.global

  MAJOR_VERSION=2
! MINOR_VERSION=1
  PATCHLEVEL=0

  CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \
diff -rcN ecpg/preproc/ecpg_keywords.c ecpg.mm/preproc/ecpg_keywords.c
*** ecpg/preproc/ecpg_keywords.c    Tue Apr 21 15:23:03 1998
--- ecpg.mm/preproc/ecpg_keywords.c    Thu Apr 23 09:26:52 1998
***************
*** 21,26 ****
--- 21,27 ----
   */
  static ScanKeyword ScanKeywords[] = {
      /* name                    value            */
+     {"call", SQL_CALL},
      {"connect", SQL_CONNECT},
      {"continue", SQL_CONTINUE},
      {"found", SQL_FOUND},
diff -rcN ecpg/preproc/extern.h ecpg.mm/preproc/extern.h
*** ecpg/preproc/extern.h    Tue Apr 21 15:22:21 1998
--- ecpg.mm/preproc/extern.h    Thu Apr 23 14:09:38 1998
***************
*** 23,28 ****
--- 23,40 ----

  extern struct cursor *cur;

+ /* This is a linked list of the variable names and types. */
+ struct variable
+ {
+     char * name;
+     struct ECPGtype * type;
+     int brace_level;
+     struct variable * next;
+ };
+
+ extern struct ECPGtype ecpg_no_indicator;
+ extern struct variable no_indicator;
+
  /* functions */

  extern void lex_init(void);
diff -rcN ecpg/preproc/pgc.l ecpg.mm/preproc/pgc.l
*** ecpg/preproc/pgc.l    Tue Apr 21 15:22:23 1998
--- ecpg.mm/preproc/pgc.l    Thu Apr 23 13:09:59 1998
***************
*** 70,75 ****
--- 70,76 ----
  %x xb
  %x xc
  %x xd
+ %x xdc
  %x xh
  %x xm
  %x xq
***************
*** 261,267 ****
  <xd>{xdstop}    {
                      BEGIN(SQL);
                      yylval.str = strdup(literal);
!                     return (IDENT);
                  }
  <xd>{xdinside}    {
                      if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1))
--- 262,268 ----
  <xd>{xdstop}    {
                      BEGIN(SQL);
                      yylval.str = strdup(literal);
!                     return (CSTRING);
                  }
  <xd>{xdinside}    {
                      if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1))
***************
*** 269,275 ****
                      memcpy(literal+llen, yytext, yyleng+1);
                      llen += yyleng;
                  }
!

  <xm>{space}*    { /* ignore */ }
  <xm>{xmstop}    {
--- 270,291 ----
                      memcpy(literal+llen, yytext, yyleng+1);
                      llen += yyleng;
                  }
! <C>{xdstart}        {
!                     BEGIN(xdc);
!                     llen = 0;
!                     *literal = '\0';
!                 }
! <xdc>{xdstop}    {
!                     BEGIN(C);
!                     yylval.str = strdup(literal);
!                     return (CSTRING);
!                 }
! <xdc>{xdinside}    {
!                     if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1))
!                         yyerror("ERROR: quoted string parse buffer exceeded");
!                     memcpy(literal+llen, yytext, yyleng+1);
!                     llen += yyleng;
!                 }

  <xm>{space}*    { /* ignore */ }
  <xm>{xmstop}    {
***************
*** 283,289 ****
  <SQL>{self}/-[\.0-9]        {
                      return (yytext[0]);
                  }
! <SQL>{self}            {     return (yytext[0]); }
  <SQL>{operator}/-[\.0-9]    {
                      yylval.str = strdup((char*)yytext);
                      return (Op);
--- 299,305 ----
  <SQL>{self}/-[\.0-9]        {
                      return (yytext[0]);
                  }
! <SQL>{self}                {     return (yytext[0]); }
  <SQL>{operator}/-[\.0-9]    {
                      yylval.str = strdup((char*)yytext);
                      return (Op);
***************
*** 423,434 ****
                      }
                  }
  <C>";"                      { return(';'); }
  <C>{space}        { ECHO; }
! \{            { return('{'); }
! \}            { return('}'); }
! \[            { return('['); }
! \]            { return(']'); }
! \=            { return('='); }
  <C>{other}            { return (S_ANYTHING); }
  <C>{exec}{space}{sql}{space}{include}    { BEGIN(incl); }
  <incl>{space}        /* eat the whitespace */
--- 439,452 ----
                      }
                  }
  <C>";"                      { return(';'); }
+ <C>","                      { return(','); }
+ <C>"*"                      { return('*'); }
  <C>{space}        { ECHO; }
! <C>\{            { return('{'); }
! <C>\}            { return('}'); }
! <C>\[            { return('['); }
! <C>\]            { return(']'); }
! <C>\=            { return('='); }
  <C>{other}            { return (S_ANYTHING); }
  <C>{exec}{space}{sql}{space}{include}    { BEGIN(incl); }
  <incl>{space}        /* eat the whitespace */
diff -rcN ecpg/preproc/preproc.y ecpg.mm/preproc/preproc.y
*** ecpg/preproc/preproc.y    Tue Apr 21 15:23:26 1998
--- ecpg.mm/preproc/preproc.y    Thu Apr 23 14:06:24 1998
***************
*** 12,20 ****
   * Variables containing simple states.
   */
  static int    struct_level = 0;
! static char    *do_str = NULL, errortext[128];
! static int    do_length = 0;
  static int      QueryIsRule = 0;

  /* temporarily store record members while creating the data structure */
  struct ECPGrecord_member *record_member_list[128] = { NULL };
--- 12,21 ----
   * Variables containing simple states.
   */
  static int    struct_level = 0;
! static char    errortext[128];
  static int      QueryIsRule = 0;
+ static enum ECPGttype actual_type[128];
+ static char     *actual_storage[128];

  /* temporarily store record members while creating the data structure */
  struct ECPGrecord_member *record_member_list[128] = { NULL };
***************
*** 22,27 ****
--- 23,31 ----
  /* keep a list of cursors */
  struct cursor *cur = NULL;

+ struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, 0L, {NULL}};
+ struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
+
  /*
   * Handle the filename and line numbering.
   */
***************
*** 82,96 ****
   */
  int braces_open;

- /* This is a linked list of the variable names and types. */
- struct variable
- {
-     char * name;
-     struct ECPGtype * type;
-     int brace_level;
-     struct variable * next;
- };
-
  static struct variable * allvariables = NULL;

  static struct variable *
--- 86,91 ----
***************
*** 167,175 ****
  static struct arguments * argsinsert = NULL;
  static struct arguments * argsresult = NULL;

- static struct ECPGtype ecpg_no_indicator = {ECPGt_NO_INDICATOR, 0L, {NULL}};
- static struct variable no_indicator = {"no_indicator", &ecpg_no_indicator, 0, NULL};
-
  static void
  reset_variables(void)
  {
--- 162,167 ----
***************
*** 209,215 ****
      dump_variables(list->next);

      /* Then the current element and its indicator */
!     ECPGdump_a_type(yyout, list->variable->name, list->variable->type, list->indicator->name, list->indicator->type,
NULL,NULL); 

      /* Then release the list element. */
      free(list);
--- 201,209 ----
      dump_variables(list->next);

      /* Then the current element and its indicator */
!     ECPGdump_a_type(yyout, list->variable->name, list->variable->type,
!     (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->name : NULL,
!     (list->indicator->type->typ != ECPGt_NO_INDICATOR) ? list->indicator->type : NULL, NULL, NULL);

      /* Then release the list element. */
      free(list);
***************
*** 375,388 ****
      double                  dval;
          int                     ival;
      char *                  str;
-     struct ECPGtemp_type    type;
      struct when             action;
      int            tagname;
      enum ECPGttype        type_enum;
  }

  /* special embedded SQL token */
! %token        SQL_CONNECT SQL_CONTINUE SQL_FOUND SQL_GO SQL_GOTO
  %token        SQL_IMMEDIATE SQL_INDICATOR SQL_OPEN
  %token        SQL_SECTION SQL_SEMI SQL_SQLERROR SQL_SQLPRINT SQL_START
  %token        SQL_STOP SQL_WHENEVER
--- 369,382 ----
      double                  dval;
          int                     ival;
      char *                  str;
      struct when             action;
+     struct index        index;
      int            tagname;
      enum ECPGttype        type_enum;
  }

  /* special embedded SQL token */
! %token        SQL_CALL SQL_CONNECT SQL_CONTINUE SQL_FOUND SQL_GO SQL_GOTO
  %token        SQL_IMMEDIATE SQL_INDICATOR SQL_OPEN
  %token        SQL_SECTION SQL_SEMI SQL_SQLERROR SQL_SQLPRINT SQL_START
  %token        SQL_STOP SQL_WHENEVER
***************
*** 449,455 ****
  %token  USER, PASSWORD, CREATEDB, NOCREATEDB, CREATEUSER, NOCREATEUSER, VALID, UNTIL

  /* Special keywords, not in the query language - see the "lex" file */
! %token <str>    IDENT SCONST Op
  %token <ival>   ICONST PARAM
  %token <dval>   FCONST

--- 443,449 ----
  %token  USER, PASSWORD, CREATEDB, NOCREATEDB, CREATEUSER, NOCREATEUSER, VALID, UNTIL

  /* Special keywords, not in the query language - see the "lex" file */
! %token <str>    IDENT SCONST Op CSTRING
  %token <ival>   ICONST PARAM
  %token <dval>   FCONST

***************
*** 538,548 ****
  %type  <str>    GrantStmt privileges operation_commalist operation

  %type  <str>    ECPGWhenever ECPGConnect db_name ECPGOpen open_opts
! %type  <str>    indicator ECPGExecute c_expr
  %type  <str>    stmt symbol

  %type  <action> action

  %%
  prog: statements;

--- 532,549 ----
  %type  <str>    GrantStmt privileges operation_commalist operation

  %type  <str>    ECPGWhenever ECPGConnect db_name ECPGOpen open_opts
! %type  <str>    indicator ECPGExecute c_expr variable_list dotext
! %type  <str>    storage_clause opt_initializer vartext c_anything blockstart
! %type  <str>    blockend variable_list variable var_anything sql_anything
! %type  <str>    opt_pointer ecpg_ident
!
  %type  <str>    stmt symbol

+ %type  <type_enum> simple_type type struct_type
+
  %type  <action> action

+ %type  <index>    opt_index
  %%
  prog: statements;

***************
*** 551,559 ****

  statement: ecpgstart stmt SQL_SEMI
      | ECPGDeclaration
!     | c_anything
!     | blockstart
!     | blockend

  stmt:  AddAttrStmt            { output_statement($1); }
          | AlterUserStmt        { output_statement($1); }
--- 552,560 ----

  statement: ecpgstart stmt SQL_SEMI
      | ECPGDeclaration
!     | c_anything            { fputs($1, yyout); }
!     | blockstart            { fputs($1, yyout); }
!     | blockend            { fputs($1, yyout); }

  stmt:  AddAttrStmt            { output_statement($1); }
          | AlterUserStmt        { output_statement($1); }
***************
*** 1332,1338 ****
                      $$ = make_name();
                  }
              | Sconst    {  $$ = $1; }
!             | IDENT        {  $$ = $1; }
          ;

  DropTrigStmt:  DROP TRIGGER name ON relation_name
--- 1333,1339 ----
                      $$ = make_name();
                  }
              | Sconst    {  $$ = $1; }
!             | ecpg_ident        {  $$ = $1; }
          ;

  DropTrigStmt:  DROP TRIGGER name ON relation_name
***************
*** 1829,1835 ****

  event_object:  relation_name '.' attr_name
                  {
!                     $$ = make3_str($1, ",", $3);
                  }
          | relation_name
                  {
--- 1830,1836 ----

  event_object:  relation_name '.' attr_name
                  {
!                     $$ = cat3_str($1, ".", $3);
                  }
          | relation_name
                  {
***************
*** 2243,2249 ****
                  }
          | ColId '.' ColId OptUseOp
                  {
!                     $$ = make4_str($1, ".", $3, $4);
                  }
          | Iconst OptUseOp
                  {
--- 2244,2250 ----
                  }
          | ColId '.' ColId OptUseOp
                  {
!                     $$ = make2_str(cat3_str($1, ".", $3), $4);
                  }
          | Iconst OptUseOp
                  {
***************
*** 2292,2298 ****
                  }
          | ColId '.' ColId
                  {
!                     $$ = make3_str($1, ",", $3);
                  }
          | Iconst
                  {
--- 2293,2299 ----
                  }
          | ColId '.' ColId
                  {
!                     $$ = cat3_str($1, ",", $3);
                  }
          | Iconst
                  {
***************
*** 2383,2389 ****
                  }
          | ColId '.' ColId
                  {
!                     $$ = make3_str($1, ".", $3);
                  }
          | Iconst
                  {
--- 2384,2390 ----
                  }
          | ColId '.' ColId
                  {
!                     $$ = cat3_str($1, ".", $3);
                  }
          | Iconst
                  {
***************
*** 2455,2461 ****
                  }
          ;

! generic:  IDENT                    { $$ = $1; }
          | TYPE_P            { $$ = "type"; }
          ;

--- 2456,2462 ----
                  }
          ;

! generic:  ecpg_ident                    { $$ = $1; }
          | TYPE_P            { $$ = "type"; }
          ;

***************
*** 3409,3428 ****

  attr:  relation_name '.' attrs
                  {
!                     $$ = make3_str($1, ".", $3);
                  }
          | ParamNo '.' attrs
                  {
!                     $$ = make3_str($1, ".", $3);
                  }
          ;

  attrs:      attr_name
                  { $$ = $1; }
          | attrs '.' attr_name
!                 { $$ = make3_str($1, ".", $3); }
          | attrs '.' '*'
!                 { $$ = make2_str($1, ".*"); }
          ;


--- 3410,3429 ----

  attr:  relation_name '.' attrs
                  {
!                     $$ = cat3_str($1, ".", $3);
                  }
          | ParamNo '.' attrs
                  {
!                     $$ = cat3_str($1, ".", $3);
                  }
          ;

  attrs:      attr_name
                  { $$ = $1; }
          | attrs '.' attr_name
!                 { $$ = cat3_str($1, ".", $3); }
          | attrs '.' '*'
!                 { $$ = cat2_str($1, ".*"); }
          ;


***************
*** 3449,3455 ****
                  }
          | relation_name '.' '*'
                  {
!                     $$ = make2_str($1, ".*");
                  }
          ;

--- 3450,3456 ----
                  }
          | relation_name '.' '*'
                  {
!                     $$ = cat2_str($1, ".*");
                  }
          ;

***************
*** 3475,3481 ****
                  }
          | relation_name '.' '*'
                  {
!                     $$ = make2_str($1, ".*");
                  }
          | '*'
                  {
--- 3476,3482 ----
                  }
          | relation_name '.' '*'
                  {
!                     $$ = cat2_str($1, ".*");
                  }
          | '*'
                  {
***************
*** 3505,3513 ****
          ;

  database_name:            ColId            { $$ = $1; };
! access_method:            IDENT            { $$ = $1; };
  attr_name:                ColId            { $$ = $1; };
! class:                    IDENT            { $$ = $1; };
  index_name:                ColId            { $$ = $1; };

  /* Functions
--- 3506,3514 ----
          ;

  database_name:            ColId            { $$ = $1; };
! access_method:            ecpg_ident            { $$ = $1; };
  attr_name:                ColId            { $$ = $1; };
! class:                    ecpg_ident            { $$ = $1; };
  index_name:                ColId            { $$ = $1; };

  /* Functions
***************
*** 3518,3524 ****
  func_name:                ColId            { $$ = $1; };

  file_name:                Sconst            { $$ = $1; };
! recipe_name:            IDENT            { $$ = $1; };

  /* Constants
   * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
--- 3519,3525 ----
  func_name:                ColId            { $$ = $1; };

  file_name:                Sconst            { $$ = $1; };
! recipe_name:            ecpg_ident            { $$ = $1; };

  /* Constants
   * Include TRUE/FALSE for SQL3 support. - thomas 1997-10-24
***************
*** 3569,3575 ****
                              $$[strlen($1)+2]='\0';
                              $$[strlen($1)+1]='\'';
                          }
! UserId:  IDENT                                  { $$ = $1;};

  /* Column and type identifier
   * Does not include explicit datetime types
--- 3570,3576 ----
                              $$[strlen($1)+2]='\0';
                              $$[strlen($1)+1]='\'';
                          }
! UserId:  ecpg_ident                                  { $$ = $1;};

  /* Column and type identifier
   * Does not include explicit datetime types
***************
*** 3591,3597 ****
   *  list due to shift/reduce conflicts in yacc. If so, move
   *  down to the ColLabel entity. - thomas 1997-11-06
   */
! ColId:  IDENT                            { $$ = $1; }
          | datetime                        { $$ = $1; }
          | ACTION                        { $$ = "action"; }
          | CACHE                            { $$ = "cache"; }
--- 3592,3598 ----
   *  list due to shift/reduce conflicts in yacc. If so, move
   *  down to the ColLabel entity. - thomas 1997-11-06
   */
! ColId:  ecpg_ident                            { $$ = $1; }
          | datetime                        { $$ = $1; }
          | ACTION                        { $$ = "action"; }
          | CACHE                            { $$ = "cache"; }
***************
*** 3688,3854 ****
      output_line_number();
  }

! variable_declarations : /* empty */
!                       | variable_declarations variable_declaration;

! /* Here is where we can enter support for typedef. */
! variable_declaration: type initializer ';'     {
!     /* don't worry about our list when we're working on a struct */
!     if (struct_level == 0)
!     {
!         new_variable($<type>1.name, $<type>1.typ);
!         free((void *)$<type>1.name);
!     }
!     fputs(";", yyout);
! }

! initializer : /*empty */
!             | '=' {fwrite(yytext, yyleng, 1, yyout);} vartext;

! type : maybe_storage_clause type_detailed { $<type>$ = $<type>2; };
! type_detailed : varchar_type { $<type>$ = $<type>1; }
!           | simple_type { $<type>$ = $<type>1; }
!           | string_type { $<type>$ = $<type>1; }
! /*          | array_type {$<type>$ = $<type>1; }
!           | pointer_type {$<type>$ = $<type>1; }*/
!           | struct_type {$<type>$ = $<type>1; };
!
! varchar_type : varchar_tag symbol index {
!     if ($<ival>3 > 0L)
!     fprintf(yyout, "struct varchar_%s { int len; char arr[%d]; } %s", $2, $<ival>3, $2);
!     else
!     fprintf(yyout, "struct varchar_%s { int len; char arr[]; } %s", $2, $2);
!     if (struct_level == 0)
!     {
!     $<type>$.name = $2;
!     $<type>$.typ = ECPGmake_varchar_type(ECPGt_varchar, $<ival>3);
!     }
!     else
!     ECPGmake_record_member($2, ECPGmake_varchar_type(ECPGt_varchar, $<ival>3),
&(record_member_list[struct_level-1]));
! }

! varchar_tag: S_VARCHAR /*| S_VARCHAR2 */;

! simple_type : simple_tag symbol {
!     fprintf(yyout, "%s %s", ECPGtype_name($<type_enum>1), $2);
!     if (struct_level == 0)
!     {
!     $<type>$.name = $2;
!     $<type>$.typ = ECPGmake_simple_type($<type_enum>1, 1);
!     }
!     else
!         ECPGmake_record_member($2, ECPGmake_simple_type($<type_enum>1, 1), &(record_member_list[struct_level-1]));
! }

! string_type : char_tag symbol index {
!     if ($<ival>3 > 0L)
!         fprintf(yyout, "%s %s [%d]", ECPGtype_name($<type_enum>1), $2, $<ival>3);
!     else
!         fprintf(yyout, "%s %s []", ECPGtype_name($<type_enum>1), $2);
!     if (struct_level == 0)
!     {
!     $<type>$.name = $2;
!     $<type>$.typ = ECPGmake_simple_type($<type_enum>1, $<ival>3);
!     }
!     else
!     ECPGmake_record_member($2, ECPGmake_simple_type($<type_enum>1, $<ival>3), &(record_member_list[struct_level-1]));
! }
!     |    char_tag '*' symbol {
!     fprintf(yyout, "%s *%s", ECPGtype_name($<type_enum>1), $3);
!     if (struct_level == 0)
!     {
!     $<type>$.name = $3;
!     $<type>$.typ = ECPGmake_simple_type($<type_enum>1, 0);
!     }
!     else
!     ECPGmake_record_member($3, ECPGmake_simple_type($<type_enum>1, 0), &(record_member_list[struct_level-1]));
! }
!     |    char_tag symbol {
!     fprintf(yyout, "%s %s", ECPGtype_name($<type_enum>1), $2);
!     if (struct_level == 0)
!     {
!     $<type>$.name = $2;
!     $<type>$.typ = ECPGmake_simple_type($<type_enum>1, 1);
!     }
!     else
!         ECPGmake_record_member($2, ECPGmake_simple_type($<type_enum>1, 1), &(record_member_list[struct_level-1]));
! }

! char_tag : S_CHAR { $<type_enum>$ = ECPGt_char; }
!            | S_UNSIGNED S_CHAR { $<type_enum>$ = ECPGt_unsigned_char; }

! /*
! array_type : simple_tag symbol index {
!     if ($<ival>3 > 0)
!         fprintf(yyout, "%s %s [%ld]", ECPGtype_name($<type_enum>1), $2, $<ival>3);
!     else
!         fprintf(yyout, "%s %s []", ECPGtype_name($<type_enum>1), $2);
!     if (struct_level == 0)
!     {
!     $<type>$.name = $2;
!     $<type>$.typ = ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), $<ival>3);
!     }
!     else
!     ECPGmake_record_member($2, ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), $<ival>3),
&(record_member_list[struct_level-1]));
! }

! pointer_type : simple_tag '*' symbol {
!     fprintf(yyout, "%s * %s", ECPGtype_name($<type_enum>1), $3);
!     if (struct_level == 0)
!     {
!     $<type>$.name = $3;
!     $<type>$.typ = ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), 0);
!     }
!     else
!     ECPGmake_record_member($3, ECPGmake_array_type(ECPGmake_simple_type($<type_enum>1), 0),
&(record_member_list[struct_level-1]));
! }
! */

! s_struct : S_STRUCT symbol {
!     struct_level++;
!     fprintf(yyout, "struct %s {", $2);
! }

! struct_type : s_struct '{' variable_declarations '}' symbol {
!     struct_level--;
!     if (struct_level == 0)
!     {
!     $<type>$.name = $5;
!     $<type>$.typ = ECPGmake_record_type(record_member_list[struct_level]);
!     }
!     else
!     ECPGmake_record_member($5, ECPGmake_record_type(record_member_list[struct_level]),
&(record_member_list[struct_level-1])); 
!     fprintf(yyout, "} %s", $5);
!     record_member_list[struct_level] = NULL;
! }

! simple_tag : S_SHORT { $<type_enum>$ = ECPGt_short; }
!            | S_UNSIGNED S_SHORT { $<type_enum>$ = ECPGt_unsigned_short; }
!        | S_INT { $<type_enum>$ = ECPGt_int; }
!            | S_UNSIGNED S_INT { $<type_enum>$ = ECPGt_unsigned_int; }
!        | S_LONG { $<type_enum>$ = ECPGt_long; }
!            | S_UNSIGNED S_LONG { $<type_enum>$ = ECPGt_unsigned_long; }
!            | S_FLOAT { $<type_enum>$ = ECPGt_float; }
!            | S_DOUBLE { $<type_enum>$ = ECPGt_double; }
!        | S_BOOL { $<type_enum>$ = ECPGt_bool; };
!
! maybe_storage_clause : S_EXTERN { fwrite(yytext, yyleng, 1, yyout); }
!                | S_STATIC { fwrite(yytext, yyleng, 1, yyout); }
!                | S_SIGNED { fwrite(yytext, yyleng, 1, yyout); }
!                | S_CONST { fwrite(yytext, yyleng, 1, yyout); }
!                | S_REGISTER { fwrite(yytext, yyleng, 1, yyout); }
!                | S_AUTO { fwrite(yytext, yyleng, 1, yyout); }
!                        | /* empty */ { };
!
! index : '[' Iconst ']' { $<ival>$ = atol($2); }
!     | '[' ']' { $<ival>$ = 0L; }

  /*
   * the exec sql connect statement: connect to the given database
   */
! ECPGConnect : SQL_CONNECT db_name { $$ = $2; }

! db_name : database_name { $$ = $1; }
      | ':' name { /* check if we have a char variable */
              struct variable *p = find_variable($2);
              enum ECPGttype typ = p->type->typ;
--- 3689,3825 ----
      output_line_number();
  }

! variable_declarations: /* empty */
!     | declaration variable_declarations;

! declaration: storage_clause type
!     {
!         actual_storage[struct_level] = $1;
!         actual_type[struct_level] = $2;
!         if ($2 != ECPGt_varchar && $2 != ECPGt_record)
!             fprintf(yyout, "%s %s", $1, ECPGtype_name($2));
!     }
!     variable_list ';' { fputc(';', yyout); }

! storage_clause : S_EXTERN    { $$ = "extern"; }
!        | S_STATIC        { $$ = "static"; }
!        | S_SIGNED        { $$ = "signed"; }
!        | S_CONST        { $$ = "const"; }
!        | S_REGISTER        { $$ = "register"; }
!        | S_AUTO            { $$ = "auto"; }
!        | /* empty */        { $$ = "" ; }

! type: simple_type
!     | struct_type

! struct_type: s_struct '{' variable_declarations '}'
!     {
!         struct_level--;
!         $$ = actual_type[struct_level] = ECPGt_record;
!     }

! s_struct : S_STRUCT symbol
!     {
!         struct_level++;
!         fprintf(yyout, "struct %s {", $2);
!     }

! simple_type: S_SHORT        { $$ = ECPGt_short; }
!            | S_UNSIGNED S_SHORT { $$ = ECPGt_unsigned_short; }
!        | S_INT         { $$ = ECPGt_int; }
!            | S_UNSIGNED S_INT    { $$ = ECPGt_unsigned_int; }
!        | S_LONG        { $$ = ECPGt_long; }
!            | S_UNSIGNED S_LONG    { $$ = ECPGt_unsigned_long; }
!            | S_FLOAT        { $$ = ECPGt_float; }
!            | S_DOUBLE        { $$ = ECPGt_double; }
!        | S_BOOL        { $$ = ECPGt_bool; };
!        | S_CHAR        { $$ = ECPGt_char; }
!            | S_UNSIGNED S_CHAR    { $$ = ECPGt_unsigned_char; }
!        | S_VARCHAR        { $$ = ECPGt_varchar; }

! variable_list: variable
!     | variable_list ','
!     {
!         if (actual_type[struct_level] != ECPGt_varchar)
!             fputs(", ", yyout);
!         else
!             fputs(";\n ", yyout);
!     } variable

! variable: opt_pointer symbol opt_index opt_initializer
!         {
!             int length = $3.ival;

!             /* pointer has to get length 0 */
!             if (strlen($1) > 0)
!                 length = 0;

!             switch (actual_type[struct_level])
!             {
!                case ECPGt_record:
!                 if (struct_level == 0)
!                     new_variable($2, ECPGmake_record_type(record_member_list[struct_level]));
!                 else
!                         ECPGmake_record_member($2, ECPGmake_record_type(record_member_list[struct_level]),
&(record_member_list[struct_level-1]));

!                 record_member_list[struct_level] = NULL;
!                  fprintf(yyout, "} %s%s%s%s", $1, $2, $3.str, $4);

!                 break;
!                case ECPGt_varchar:
!                 if (strlen($4) != 0)
!                     yyerror("varchar initilization impossible");
!
!                 if (struct_level == 0)
!                     new_variable($2, ECPGmake_varchar_type(actual_type[struct_level], length));
!                 else
!                         ECPGmake_record_member($2, ECPGmake_varchar_type(actual_type[struct_level], length),
&(record_member_list[struct_level-1]));
!
!                 if (length > 0)
!                     fprintf(yyout, "%s struct varchar_%s { int len; char arr[%d]; } %s",
actual_storage[struct_level],$2, length, $2); 
!                 else
!                     fprintf(yyout, "%s struct varchar_%s { int len; char arr[]; } %s", actual_storage[struct_level],
$2,$2); 
!
!                 break;
!
!                default:
!                 if (struct_level == 0)
!                     new_variable($2, ECPGmake_simple_type(actual_type[struct_level], length));
!                 else
!                         ECPGmake_record_member($2, ECPGmake_simple_type(actual_type[struct_level], length),
&(record_member_list[struct_level-1]));
!
!                 fprintf(yyout, "%s%s%s%s", $1, $2, $3.str, $4);
!
!                 break;
!             }
!         }
!
! opt_initializer: /* empty */        { $$ = ""; }
!     | '=' vartext            { $$ = cat2_str("=", $2); }
!
! opt_pointer: /* empty */    { $$ = ""; }
!     | '*'            { $$ = "*"; }
!
! opt_index: '[' Iconst ']'    {
!                     $$.ival = atol($2);
!                     $$.str = cat3_str("[", $2, "]");
!                 }
!         | '[' ']'
!                 {
!                     $$.ival = 0;
!                     $$.str = "[]";
!                 }
!     | /* empty */        {
!                     $$.ival = 1;
!                     $$.str = "";
!                 }

  /*
   * the exec sql connect statement: connect to the given database
   */
! ECPGConnect: SQL_CONNECT db_name { $$ = $2; }

! db_name: database_name { $$ = $1; }
      | ':' name { /* check if we have a char variable */
              struct variable *p = find_variable($2);
              enum ECPGttype typ = p->type->typ;
***************
*** 3895,3901 ****
                  }

  /*
!  * whenever statement: decide what to do in case of error/no dat
   */
  ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action {
      when_error.code = $<action>3.code;
--- 3866,3875 ----
                  }

  /*
!  * whenever statement: decide what to do in case of error/no data found
!  * according to SQL standards we miss: SQLSTATE, CONSTRAINT, SQLEXCEPTION
!  * and SQLWARNING
!
   */
  ECPGWhenever: SQL_WHENEVER SQL_SQLERROR action {
      when_error.code = $<action>3.code;
***************
*** 3933,3949 ****
          $<action>$.command = $3;
      $<action>$.str = make2_str("goto ", $3);
  }
!        | DO name '(' {
!     do_str = (char *) mm_alloc(do_length = strlen($2) + 4);
!     sprintf(do_str, "%s (", $2);
! } dotext ')' {
!     do_str[strlen(do_str)+1]='\0';
!     do_str[strlen(do_str)]=')';
      $<action>$.code = W_DO;
!     $<action>$.command = do_str;
!     $<action>$.str = make2_str("do ", do_str);
!     do_str = NULL;
!     do_length = 0;
  }

  /* some other stuff for ecpg */
--- 3907,3921 ----
          $<action>$.command = $3;
      $<action>$.str = make2_str("goto ", $3);
  }
!        | DO name '(' dotext ')' {
!     $<action>$.code = W_DO;
!     $<action>$.command = cat4_str($2, "(", $4, ")");
!     $<action>$.str = make2_str("do", $<action>$.command);
! }
!        | SQL_CALL name '(' dotext ')' {
      $<action>$.code = W_DO;
!     $<action>$.command = cat4_str($2, "(", $4, ")");
!     $<action>$.str = make2_str("call", $<action>$.command);
  }

  /* some other stuff for ecpg */
***************
*** 4231,4246 ****

  ecpgstart: SQL_START { reset_variables();}

! dotext: /* empty */
!     | dotext sql_anything {
!                 if (strlen(do_str) + yyleng + 1 >= do_length)
!                         do_str = mm_realloc(do_str, do_length += yyleng);

!                 strcat(do_str, yytext);
! }
!
! vartext: both_anything { fwrite(yytext, yyleng, 1, yyout); }
!         | vartext both_anything { fwrite(yytext, yyleng, 1, yyout); }

  coutputvariable : ':' name indicator {
          add_variable(&argsresult, find_variable($2), ($3 == NULL) ? &no_indicator : find_variable($3));
--- 4203,4213 ----

  ecpgstart: SQL_START { reset_variables();}

! dotext: /* empty */        { $$ = ""; }
!     | dotext sql_anything    { $$ = cat2_str($1, $2); }

! vartext: var_anything        { $$ = $1; }
!         | vartext var_anything { $$ = cat2_str($1, $2); }

  coutputvariable : ':' name indicator {
          add_variable(&argsresult, find_variable($2), ($3 == NULL) ? &no_indicator : find_variable($3));
***************
*** 4259,4289 ****
      | SQL_INDICATOR ':' name     { check_indicator((find_variable($3))->type); $$ = $3; }
      | SQL_INDICATOR name        { check_indicator((find_variable($2))->type); $$ = $2; }

  /*
   * C stuff
   */

! symbol: IDENT    { $$ = $1; }
!
! c_anything: both_anything    { fwrite(yytext, yyleng, 1, yyout); }
!     | ';'            { fputc(';', yyout); }
!
! sql_anything: IDENT {} | ICONST {} | FCONST {}

! both_anything: IDENT {} | ICONST {} | FCONST {}
!     | S_AUTO | S_BOOL | S_CHAR | S_CONST | S_DOUBLE | S_EXTERN | S_FLOAT
!     | S_INT    | S_LONG | S_REGISTER | S_SHORT    | S_SIGNED | S_STATIC
!     | S_STRUCT | S_UNSIGNED    | S_VARCHAR | S_ANYTHING
!     | '[' | ']' | '(' | ')' | '='

  blockstart : '{' {
      braces_open++;
!     fputc('{', yyout);
  }

  blockend : '}' {
      remove_variables(braces_open--);
!     fputc('}', yyout);
  }

  %%
--- 4226,4288 ----
      | SQL_INDICATOR ':' name     { check_indicator((find_variable($3))->type); $$ = $3; }
      | SQL_INDICATOR name        { check_indicator((find_variable($2))->type); $$ = $2; }

+ ecpg_ident: IDENT    { $$ = $1; }
+     | CSTRING    { $$ = cat3_str("\"", $1, "\""); }
  /*
   * C stuff
   */

! symbol: ecpg_ident    { $$ = $1; }

! c_anything:  ecpg_ident     { $$ = $1; }
!     | Iconst    { $$ = $1; }
!     | FCONST    { $$ = make_name(); }
!     | '*'            { $$ = "*"; }
!     | ';'            { $$ = ";"; }
!     | S_AUTO    { $$ = "auto"; }
!     | S_BOOL    { $$ = "bool"; }
!     | S_CHAR    { $$ = "char"; }
!     | S_CONST    { $$ = "const"; }
!     | S_DOUBLE    { $$ = "double"; }
!     | S_EXTERN    { $$ = "extern"; }
!     | S_FLOAT    { $$ = "float"; }
!         | S_INT        { $$ = "int"; }
!     | S_LONG    { $$ = "long"; }
!     | S_REGISTER    { $$ = "register"; }
!     | S_SHORT    { $$ = "short"; }
!     | S_SIGNED    { $$ = "signed"; }
!     | S_STATIC    { $$ = "static"; }
!         | S_STRUCT    { $$ = "struct"; }
!     | S_UNSIGNED    { $$ = "unsigned"; }
!     | S_VARCHAR    { $$ = "varchar"; }
!     | S_ANYTHING    { $$ = make_name(); }
!         | '['        { $$ = "["; }
!     | ']'        { $$ = "]"; }
!     | '('        { $$ = "("; }
!     | ')'        { $$ = ")"; }
!     | '='        { $$ = "="; }
!     | ','        { $$ = ","; }
!
! sql_anything: ecpg_ident    { $$ = $1; }
!     | Iconst    { $$ = $1; }
!     | FCONST    { $$ = make_name(); }
!     | ','        { $$ = ","; }
!
! var_anything: ecpg_ident     { $$ = $1; }
!     | Iconst    { $$ = $1; }
!     | FCONST    { $$ = make_name(); }
! /*FIXME:    | ','        { $$ = ","; }*/
!     | '{'        { $$ = "{"; }
!     | '}'        { $$ = "}"; }

  blockstart : '{' {
      braces_open++;
!     $$ = "{";
  }

  blockend : '}' {
      remove_variables(braces_open--);
!     $$ = "}";
  }

  %%
diff -rcN ecpg/preproc/type.c ecpg.mm/preproc/type.c
*** ecpg/preproc/type.c    Tue Apr 21 15:23:26 1998
--- ecpg.mm/preproc/type.c    Thu Apr 23 14:11:56 1998
***************
*** 130,135 ****
--- 130,141 ----
  void
  ECPGdump_a_type(FILE *o, const char *name, struct ECPGtype * typ, const char *ind_name, struct ECPGtype * ind_typ,
constchar *prefix, const char *ind_prefix) 
  {
+     if (ind_typ == NULL)
+     {
+         ind_typ = &ecpg_no_indicator;
+         ind_name = "no_indicator";
+     }
+
      if (IS_SIMPLE_TYPE(typ->typ))
      {
          ECPGdump_a_simple(o, name, typ->typ, typ->size, 0, 0, prefix);
***************
*** 267,273 ****
       * then we are in a record in a record and the offset is used as
       * offset.
       */
!     struct ECPGrecord_member *p, *ind_p;
      char        obuf[BUFSIZ];
      char        pbuf[BUFSIZ], ind_pbuf[BUFSIZ];
      const char *offset;
--- 273,279 ----
       * then we are in a record in a record and the offset is used as
       * offset.
       */
!     struct ECPGrecord_member *p, *ind_p = NULL;
      char        obuf[BUFSIZ];
      char        pbuf[BUFSIZ], ind_pbuf[BUFSIZ];
      const char *offset;
***************
*** 288,296 ****
      sprintf(ind_pbuf, "%s%s.", ind_prefix ? ind_prefix : "", ind_name);
      ind_prefix = ind_pbuf;

!     for (p = typ->u.members, ind_p = ind_typ->u.members; p; p = p->next, ind_p = ind_p->next)
      {
!         ECPGdump_a_type(o, p->name, p->typ, ind_p->name, ind_p->typ, prefix, ind_prefix);
      }
  }

--- 294,304 ----
      sprintf(ind_pbuf, "%s%s.", ind_prefix ? ind_prefix : "", ind_name);
      ind_prefix = ind_pbuf;

!     if (ind_typ != NULL) ind_p = ind_typ->u.members;
!     for (p = typ->u.members; p; p = p->next)
      {
!         ECPGdump_a_type(o, p->name, p->typ, (ind_p != NULL) ? ind_p->name : NULL, (ind_p != NULL) ? ind_p->typ :
NULL,prefix, ind_prefix); 
!         if (ind_p != NULL) ind_p = ind_p->next;
      }
  }

diff -rcN ecpg/preproc/type.h ecpg.mm/preproc/type.h
*** ecpg/preproc/type.h    Tue Apr 21 15:23:26 1998
--- ecpg.mm/preproc/type.h    Thu Apr 23 10:50:36 1998
***************
*** 74,76 ****
--- 74,82 ----
      char        *command;
      char           *str;
  };
+
+ struct index
+ {
+     int ival;
+     char *str;
+ };

Michael
--
Dr. Michael Meskes, Project-Manager    | topsystem Systemhaus GmbH
meskes@topsystem.de                    | Europark A2, Adenauerstr. 20
meskes@debian.org                      | 52146 Wuerselen
Go SF49ers! Go Rhein Fire!             | Tel: (+49) 2405/4670-44
Use Debian GNU/Linux!                  | Fax: (+49) 2405/4670-10

pgsql-hackers by date:

Previous
From: "Meskes, Michael"
Date:
Subject: RE: [HACKERS] Just another question
Next
From: Michael Meskes
Date:
Subject: Oops