diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog index 9675f48227..9e4389dac2 100644 --- a/src/interfaces/ecpg/ChangeLog +++ b/src/interfaces/ecpg/ChangeLog @@ -383,3 +383,15 @@ Thu Jan 21 21:29:00 CET 1999 - Set library version to 2.6.3 - Added 'exec sql whenever sqlwarning'. - Set ecpg version to 2.4.6 + +Wed Jan 27 12:42:22 CET 1999 + + - Fixed bug that caused ecpg to lose 'goto' information. + - Set ecpg version to 2.4.7 + +Fri Jan 29 18:03:52 CET 1999 + + - Fixed bug that caused 'enum' to be rejected in pure C code. + - Fixed bug that caused function names to be translated to lower case. + - Set ecpg version to 2.4.8 + diff --git a/src/interfaces/ecpg/preproc/Makefile b/src/interfaces/ecpg/preproc/Makefile index 2a3f5b2633..7d13a7a98a 100644 --- a/src/interfaces/ecpg/preproc/Makefile +++ b/src/interfaces/ecpg/preproc/Makefile @@ -3,7 +3,7 @@ include $(SRCDIR)/Makefile.global MAJOR_VERSION=2 MINOR_VERSION=4 -PATCHLEVEL=6 +PATCHLEVEL=8 CFLAGS+=-I../include -DMAJOR_VERSION=$(MAJOR_VERSION) \ -DMINOR_VERSION=$(MINOR_VERSION) -DPATCHLEVEL=$(PATCHLEVEL) \ diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index 2af1e3e522..e6ef819a59 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -333,22 +333,23 @@ cppline {space}*#.*(\\{space}*\n)*\n* {identifier}/{space}*-{number} { int i; ScanKeyword *keyword; + char lower_text[NAMEDATALEN]; BEGIN(xm); - for(i = 0; yytext[i]; i++) - if (isascii((unsigned char)yytext[i]) && isupper(yytext[i])) - yytext[i] = tolower(yytext[i]); + /* this should leave the last byte set to '\0' */ + strncpy(lower_text, yytext, NAMEDATALEN-1); + for(i = 0; lower_text[i]; i++) + if (isascii((unsigned char)lower_text[i]) && isupper(lower_text[i])) + lower_text[i] = tolower(lower_text[i]); - if (i >= NAMEDATALEN) - yytext[NAMEDATALEN-1] = '\0'; - - keyword = ScanKeywordLookup((char*)yytext); +printf("yyt= %s, lt = %s\n", yytext, lower_text); + keyword = ScanKeywordLookup((char*)lower_text); if (keyword != NULL) { return keyword->value; } else { - keyword = ScanECPGKeywordLookup((char*)yytext); + keyword = ScanECPGKeywordLookup((char*)lower_text); if (keyword != NULL) { return keyword->value; } @@ -475,21 +476,22 @@ cppline {space}*#.*(\\{space}*\n)*\n* {identifier} { int i; ScanKeyword *keyword; + char lower_text[NAMEDATALEN]; - for(i = 0; yytext[i]; i++) - if (isascii((unsigned char)yytext[i]) && isupper(yytext[i])) - yytext[i] = tolower(yytext[i]); + /* this should leave the last byte set to '\0' */ + strncpy(lower_text, yytext, NAMEDATALEN-1); + for(i = 0; lower_text[i]; i++) + if (isascii((unsigned char)lower_text[i]) && isupper(lower_text[i])) + lower_text[i] = tolower(lower_text[i]); - if (i >= NAMEDATALEN) - yytext[NAMEDATALEN-1] = '\0'; - - keyword = ScanKeywordLookup((char*)yytext); +printf("yyt= %s, lt = %s\n", yytext, lower_text); + keyword = ScanKeywordLookup((char*)lower_text); if (keyword != NULL) { return keyword->value; } else { - keyword = ScanECPGKeywordLookup((char*)yytext); + keyword = ScanECPGKeywordLookup((char*)lower_text); if (keyword != NULL) { return keyword->value; } diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y index 0e34aa36dc..cda77f5281 100644 --- a/src/interfaces/ecpg/preproc/preproc.y +++ b/src/interfaces/ecpg/preproc/preproc.y @@ -521,7 +521,8 @@ output_statement(char * stmt, int mode) /* special embedded SQL token */ %token SQL_BREAK SQL_CALL SQL_CONNECT SQL_CONNECTION SQL_CONTINUE %token SQL_DISCONNECT SQL_FOUND SQL_GO SQL_GOTO -%token SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_OPEN SQL_RELEASE +%token SQL_IDENTIFIED SQL_IMMEDIATE SQL_INDICATOR SQL_OPEN +%token SQL_PREPARE SQL_RELEASE %token SQL_SECTION SQL_SEMI SQL_SQLERROR SQL_SQLPRINT SQL_START %token SQL_STOP SQL_WHENEVER SQL_SQLWARNING @@ -813,6 +814,9 @@ stmt: AddAttrStmt { output_statement($1, 0); } output_line_number(); free($1); } + | ECPGPrepare { + yyerror("PREPARE is not supported yet."); + } /* * We start with a lot of stuff that's very similar to the backend's parsing @@ -4671,12 +4675,12 @@ action : SQL_CONTINUE { } | SQL_GOTO name { $$.code = W_GOTO; - $$.command = $2; + $$.command = strdup($2); $$.str = cat2_str(make1_str("goto "), $2); } | SQL_GO TO name { $$.code = W_GOTO; - $$.command = $3; + $$.command = strdup($3); $$.str = cat2_str(make1_str("goto "), $3); } | DO name '(' dotext ')' { @@ -4695,8 +4699,15 @@ action : SQL_CONTINUE { $$.str = cat2_str(make1_str("call"), mm_strdup($$.command)); } -/* some other stuff for ecpg */ +/* + * As long as the prepare statement in not supported by the backend, we will + * try to simulate it here so we get dynamic SQL + */ +ECPGPrepare: SQL_PREPARE name FROM name + { + } +/* some other stuff for ecpg */ ecpg_expr: attr opt_indirection { $$ = cat2_str($1, $2); @@ -5032,6 +5043,7 @@ c_anything: IDENT { $$ = $1; } | S_CHAR { $$ = make1_str("char"); } | S_CONST { $$ = make1_str("const"); } | S_DOUBLE { $$ = make1_str("double"); } + | S_ENUM { $$ = make1_str("enum"); } | S_EXTERN { $$ = make1_str("extern"); } | S_FLOAT { $$ = make1_str("float"); } | S_INT { $$ = make1_str("int"); } diff --git a/src/interfaces/ecpg/test/header_test.h b/src/interfaces/ecpg/test/header_test.h index 5050113e18..d6a84322b1 100644 --- a/src/interfaces/ecpg/test/header_test.h +++ b/src/interfaces/ecpg/test/header_test.h @@ -1,9 +1,9 @@ exec sql include sqlca; -exec sql whenever sqlerror do print_and_stop(); +exec sql whenever sqlerror do PrintAndStop(); exec sql whenever sqlwarning do warn(); -void print_and_stop(void) +void PrintAndStop(void) { sqlprint(); exit(-1);