In Informix mode ecpg should still be able to parse preprocessor directives.

This commit is contained in:
Michael Meskes 2003-02-14 16:40:01 +00:00
parent e9551212d2
commit 1005c993a6

View File

@ -12,7 +12,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.104 2003/02/14 13:17:13 meskes Exp $ * $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.105 2003/02/14 16:40:01 meskes Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -43,6 +43,7 @@ static int literalalloc; /* current allocated buffer size */
#define startlit() (literalbuf[0] = '\0', literallen = 0) #define startlit() (literalbuf[0] = '\0', literallen = 0)
static void addlit(char *ytext, int yleng); static void addlit(char *ytext, int yleng);
static void addlitchar (unsigned char); static void addlitchar (unsigned char);
static void string_unput (char *);
char *token_start; char *token_start;
int state_before; int state_before;
@ -701,12 +702,67 @@ cppline {space}*#(.*\\{space})*.*
<C>{other} { return S_ANYTHING; } <C>{other} { return S_ANYTHING; }
<C>{exec_sql}{define}{space}* { BEGIN(def_ident); } <C>{exec_sql}{define}{space}* { BEGIN(def_ident); }
<C>{informix_special}{define}{space}* {
/* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX)
{
BEGIN(def_ident);
}
else
{
string_unput("define ");
/* remove the "define " part of the text */
yytext[1] = '\0';
return (S_ANYTHING);
}
}
<C>{exec_sql}{include}{space}* { BEGIN(incl); } <C>{exec_sql}{include}{space}* { BEGIN(incl); }
<C>{informix_special}{include}{space}* { BEGIN(incl); } <C>{informix_special}{include}{space}* {
/* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX)
{
BEGIN(incl);
}
else
{
string_unput("include ");
/* remove the "include " part of the text */
yytext[1] = '\0';
return (S_ANYTHING);
}
}
<C,xskip>{exec_sql}{ifdef}{space}* { ifcond = TRUE; BEGIN(xcond); } <C,xskip>{exec_sql}{ifdef}{space}* { ifcond = TRUE; BEGIN(xcond); }
<C,xskip>{informix_special}{ifdef}{space}* {
/* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX)
{
ifcond = TRUE;
BEGIN(xcond);
}
else
{
string_unput("ifdef ");
/* remove the "ifdef " part of the text */
yytext[1] = '\0';
return (S_ANYTHING);
}
}
<C,xskip>{exec_sql}{ifndef}{space}* { ifcond = FALSE; BEGIN(xcond); } <C,xskip>{exec_sql}{ifndef}{space}* { ifcond = FALSE; BEGIN(xcond); }
<C,xskip>{informix_special}{ifndef}{space}* {
/* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX)
{
ifcond = FALSE;
BEGIN(xcond);
}
else
{
string_unput("ifndef ");
/* remove the "ifndef " part of the text */
yytext[1] = '\0';
return (S_ANYTHING);
}
}
<C,xskip>{exec_sql}{elif}{space}* { /* pop stack */ <C,xskip>{exec_sql}{elif}{space}* { /* pop stack */
if ( preproc_tos == 0 ) { if ( preproc_tos == 0 ) {
mmerror(PARSE_ERROR, ET_FATAL, "Missing matching 'EXEC SQL IFDEF / EXEC SQL IFNDEF'"); mmerror(PARSE_ERROR, ET_FATAL, "Missing matching 'EXEC SQL IFDEF / EXEC SQL IFNDEF'");
@ -718,6 +774,28 @@ cppline {space}*#(.*\\{space})*.*
ifcond = TRUE; BEGIN(xcond); ifcond = TRUE; BEGIN(xcond);
} }
<C,xskip>{informix_special}{elif}{space}* {
/* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX)
{
if ( preproc_tos == 0 ) {
mmerror(PARSE_ERROR, ET_FATAL, "Missing matching 'EXEC SQL IFDEF / EXEC SQL IFNDEF'");
}
else if ( stacked_if_value[preproc_tos].else_branch )
mmerror(PARSE_ERROR, ET_FATAL, "Missing 'EXEC SQL ENDIF;'");
else
preproc_tos--;
ifcond = TRUE; BEGIN(xcond);
}
else
{
string_unput("elif ");
/* remove the "elif " part of the text */
yytext[1] = '\0';
return (S_ANYTHING);
}
}
<C,xskip>{exec_sql}{else}{space}*";" { /* only exec sql endif pops the stack, so take care of duplicated 'else' */ <C,xskip>{exec_sql}{else}{space}*";" { /* only exec sql endif pops the stack, so take care of duplicated 'else' */
if ( stacked_if_value[preproc_tos].else_branch ) { if ( stacked_if_value[preproc_tos].else_branch ) {
@ -735,6 +813,33 @@ cppline {space}*#(.*\\{space})*.*
BEGIN(xskip); BEGIN(xskip);
} }
} }
<C,xskip>{informix_special}{else}{space}* {
/* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX)
{
if ( stacked_if_value[preproc_tos].else_branch ) {
mmerror(PARSE_ERROR, ET_FATAL, "Duplicated 'EXEC SQL ELSE;'");
}
else {
stacked_if_value[preproc_tos].else_branch = TRUE;
stacked_if_value[preproc_tos].condition =
(stacked_if_value[preproc_tos-1].condition &&
! stacked_if_value[preproc_tos].condition);
if ( stacked_if_value[preproc_tos].condition )
BEGIN(C);
else
BEGIN(xskip);
}
}
else
{
string_unput("else ");
/* remove the "else " part of the text */
yytext[1] = '\0';
return (S_ANYTHING);
}
}
<C,xskip>{exec_sql}{endif}{space}*";" { <C,xskip>{exec_sql}{endif}{space}*";" {
if ( preproc_tos == 0 ) if ( preproc_tos == 0 )
mmerror(PARSE_ERROR, ET_FATAL, "Unmatched 'EXEC SQL ENDIF;'"); mmerror(PARSE_ERROR, ET_FATAL, "Unmatched 'EXEC SQL ENDIF;'");
@ -746,6 +851,28 @@ cppline {space}*#(.*\\{space})*.*
else else
BEGIN(xskip); BEGIN(xskip);
} }
<C,xskip>{informix_special}{endif}{space}* {
/* are we simulating Informix? */
if (compat == ECPG_COMPAT_INFORMIX)
{
if ( preproc_tos == 0 )
mmerror(PARSE_ERROR, ET_FATAL, "Unmatched 'EXEC SQL ENDIF;'");
else
preproc_tos--;
if ( stacked_if_value[preproc_tos].condition )
BEGIN(C);
else
BEGIN(xskip);
}
else
{
string_unput("endif ");
/* remove the "endif " part of the text */
yytext[1] = '\0';
return (S_ANYTHING);
}
}
<xskip>{other} { /* ignore */ } <xskip>{other} { /* ignore */ }
@ -983,3 +1110,14 @@ addlitchar(unsigned char ychar)
literallen += 1; literallen += 1;
literalbuf[literallen] = '\0'; literalbuf[literallen] = '\0';
} }
/* put string back on stack */
static void
string_unput (char *string)
{
int i;
for (i = strlen(string)-1; i>=0; i--)
unput(string[i]);
}