Commit 811f7df2 authored by Bruce Momjian's avatar Bruce Momjian

When a macro is replaced by the preprocessor, pgc.l reaches a end of

file, which is not the actual end of the file. One side effect of that
is that if you are i n a ifdef block, you get a wrong error telling you
that a endif is missing.

This patch corrects pgc.l and also adds a test of this problem to
test1.pgc. To  convince you apply the patch to test1.pgc first then try
to compile the test the n apply the patch to pgc.l.

The patch moves the test of the scope of an ifdef block to the end of
the file b eeing parsed, including all includes files, ... .

Nicolas Bazin
parent 3cbe6b24
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.89 2002/03/24 18:22:21 tgl Exp $ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.90 2002/04/05 11:39:45 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -837,14 +837,14 @@ cppline {space}*#(.*\\{space})*.* ...@@ -837,14 +837,14 @@ cppline {space}*#(.*\\{space})*.*
} }
<<EOF>> { <<EOF>> {
if (yy_buffer == NULL) {
if ( preproc_tos > 0 ) if ( preproc_tos > 0 )
{ {
preproc_tos = 0; preproc_tos = 0;
mmerror(PARSE_ERROR, ET_FATAL, "Missing 'EXEC SQL ENDIF;'"); mmerror(PARSE_ERROR, ET_FATAL, "Missing 'EXEC SQL ENDIF;'");
} }
if (yy_buffer == NULL)
yyterminate(); yyterminate();
}
else else
{ {
struct _yy_buffer *yb = yy_buffer; struct _yy_buffer *yb = yy_buffer;
......
...@@ -17,9 +17,9 @@ static void warn(void) ...@@ -17,9 +17,9 @@ static void warn(void)
/* comment */ /* comment */
exec sql define AMOUNT 6; exec sql define AMOUNT 6;
exec sql define NAMELEN 8;
exec sql type intarray is int[AMOUNT]; exec sql type intarray is int[AMOUNT];
exec sql type string is char(8);
typedef int intarray[AMOUNT]; typedef int intarray[AMOUNT];
...@@ -27,16 +27,19 @@ int ...@@ -27,16 +27,19 @@ int
main () main ()
{ {
exec sql begin declare section; exec sql begin declare section;
exec sql ifdef NAMELEN;
typedef char string[NAMELEN];
intarray amount; intarray amount;
int increment=100; int increment=100;
char name[AMOUNT][8]; char name[AMOUNT][NAMELEN];
char letter[AMOUNT][1]; char letter[AMOUNT][1];
struct name_letter_struct struct name_letter_struct
{ {
char name[8]; char name[NAMELEN];
int amount; int amount;
char letter; char letter;
} name_letter[AMOUNT]; } name_letter[AMOUNT];
exec sql endif;
struct ind_struct struct ind_struct
{ {
short a; short a;
...@@ -62,8 +65,8 @@ exec sql end declare section; ...@@ -62,8 +65,8 @@ exec sql end declare section;
exec sql connect to pm; exec sql connect to pm;
strcpy(msg, "create"); strcpy(msg, "create");
exec sql at main create table "Test" (name char(8), amount int, letter char(1)); exec sql at main create table "Test" (name char(NAMELEN), amount int, letter char(1));
exec sql create table "Test" (name char(8), amount int, letter char(1)); exec sql create table "Test" (name char(NAMELEN), amount int, letter char(1));
strcpy(msg, "commit"); strcpy(msg, "commit");
exec sql at main commit; exec sql at main commit;
...@@ -115,7 +118,7 @@ exec sql end declare section; ...@@ -115,7 +118,7 @@ exec sql end declare section;
int a = amount[i]; int a = amount[i];
exec sql end declare section; exec sql end declare section;
strncpy(n, name[i], 8); strncpy(n, name[i], NAMELEN);
printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l); printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
amount[i]+=1000; amount[i]+=1000;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment