diff options
Diffstat (limited to 'src/interfaces/ecpg/preproc/ecpg_keywords.c')
-rw-r--r-- | src/interfaces/ecpg/preproc/ecpg_keywords.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/preproc/ecpg_keywords.c b/src/interfaces/ecpg/preproc/ecpg_keywords.c new file mode 100644 index 0000000..a2db06f --- /dev/null +++ b/src/interfaces/ecpg/preproc/ecpg_keywords.c @@ -0,0 +1,54 @@ +/*------------------------------------------------------------------------- + * + * ecpg_keywords.c + * lexical token lookup for reserved words in postgres embedded SQL + * + * IDENTIFICATION + * src/interfaces/ecpg/preproc/ecpg_keywords.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres_fe.h" + +#include <ctype.h> + +/* ScanKeywordList lookup data for ECPG keywords */ +#include "ecpg_kwlist_d.h" +#include "preproc_extern.h" +#include "preproc.h" + +/* Token codes for ECPG keywords */ +#define PG_KEYWORD(kwname, value) value, + +static const uint16 ECPGScanKeywordTokens[] = { +#include "ecpg_kwlist.h" +}; + +#undef PG_KEYWORD + + +/* + * ScanECPGKeywordLookup - see if a given word is a keyword + * + * Returns the token value of the keyword, or -1 if no match. + * + * Keywords are matched using the same case-folding rules as in the backend. + */ +int +ScanECPGKeywordLookup(const char *text) +{ + int kwnum; + + /* First check SQL symbols defined by the backend. */ + kwnum = ScanKeywordLookup(text, &ScanKeywords); + if (kwnum >= 0) + return SQLScanKeywordTokens[kwnum]; + + /* Try ECPG-specific keywords. */ + kwnum = ScanKeywordLookup(text, &ScanECPGKeywords); + if (kwnum >= 0) + return ECPGScanKeywordTokens[kwnum]; + + return -1; +} |