diff options
Diffstat (limited to 'src/interfaces/ecpg/preproc/pgc.l')
-rw-r--r-- | src/interfaces/ecpg/preproc/pgc.l | 119 |
1 files changed, 65 insertions, 54 deletions
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index f72b7bf7d2a..4e89cd6453a 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.137 2005/10/05 14:58:36 meskes Exp $ + * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.137.2.1 2007/08/29 13:58:51 meskes Exp $ * *------------------------------------------------------------------------- */ @@ -47,6 +47,8 @@ static void addlit(char *ytext, int yleng); static void addlitchar (unsigned char); static void parse_include (void); static void check_escape_warning(void); +static bool isdefine(void); +static bool isinformixdefine(void); char *token_start; int state_before; @@ -647,29 +649,8 @@ cppline {space}*#(.*\\{space})*.*{newline} } <SQL>{identifier} { ScanKeyword *keyword; - struct _defines *ptr; - - /* How about a DEFINE? */ - for (ptr = defines; ptr; ptr = ptr->next) - { - if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL) - { - struct _yy_buffer *yb; - - yb = mm_alloc(sizeof(struct _yy_buffer)); - yb->buffer = YY_CURRENT_BUFFER; - yb->lineno = yylineno; - yb->filename = mm_strdup(input_filename); - yb->next = yy_buffer; - - ptr->used = yy_buffer = yb; - - yy_scan_string(ptr->new); - break; - } - } - if (ptr == NULL) + if (!isdefine()) { /* Is it an SQL keyword? */ keyword = ScanKeywordLookup(yytext); @@ -741,38 +722,10 @@ cppline {space}*#(.*\\{space})*.*{newline} } <C>{identifier} { ScanKeyword *keyword; - struct _defines *ptr; - - if (INFORMIX_MODE) - { - /* Informix uses SQL defines only in SQL space */ - ptr = NULL; - } - else - { - /* is it a define? */ - for (ptr = defines; ptr; ptr = ptr->next) - { - if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL) - { - struct _yy_buffer *yb; - - yb = mm_alloc(sizeof(struct _yy_buffer)); - - yb->buffer = YY_CURRENT_BUFFER; - yb->lineno = yylineno; - yb->filename = mm_strdup(input_filename); - yb->next = yy_buffer; - - ptr->used = yy_buffer = yb; - yy_scan_string(ptr->new); - break; - } - } - } - - if (ptr == NULL) + /* Informix uses SQL defines only in SQL space */ + /* however, some defines have to be taken care of for compatibility */ + if ((!INFORMIX_MODE || !isinformixdefine()) && !isdefine()) { keyword = ScanCKeywordLookup(yytext); if (keyword != NULL) @@ -1245,3 +1198,61 @@ check_escape_warning(void) mmerror (PARSE_ERROR, ET_WARNING, "nonstandard use of escape in a string literal"); warn_on_first_escape = false; /* warn only once per string */ } + +static bool isdefine(void) +{ + struct _defines *ptr; + + /* is it a define? */ + for (ptr = defines; ptr; ptr = ptr->next) + { + if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL) + { + struct _yy_buffer *yb; + + yb = mm_alloc(sizeof(struct _yy_buffer)); + + yb->buffer = YY_CURRENT_BUFFER; + yb->lineno = yylineno; + yb->filename = mm_strdup(input_filename); + yb->next = yy_buffer; + + ptr->used = yy_buffer = yb; + + yy_scan_string(ptr->new); + return true; + } + } + + return false; +} + +static bool isinformixdefine(void) +{ + const char *new = NULL; + + if (strcmp(yytext, "dec_t") == 0) + new = "decimal"; + else if (strcmp(yytext, "intrvl_t") == 0) + new = "interval"; + else if (strcmp(yytext, "dtime_t") == 0) + new = "timestamp"; + + if (new) + { + struct _yy_buffer *yb; + + yb = mm_alloc(sizeof(struct _yy_buffer)); + + yb->buffer = YY_CURRENT_BUFFER; + yb->lineno = yylineno; + yb->filename = mm_strdup(input_filename); + yb->next = yy_buffer; + yy_buffer = yb; + + yy_scan_string(new); + return true; + } + + return false; +} |