summaryrefslogtreecommitdiffstats
path: root/src/interfaces/ecpg/preproc/ecpg_keywords.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/preproc/ecpg_keywords.c')
-rw-r--r--src/interfaces/ecpg/preproc/ecpg_keywords.c54
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;
+}