summaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/preproc/c_keywords.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/preproc/c_keywords.c')
-rw-r--r--src/interfaces/ecpg/preproc/c_keywords.c31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/interfaces/ecpg/preproc/c_keywords.c b/src/interfaces/ecpg/preproc/c_keywords.c
index 2eae2c769b..36f72b537e 100644
--- a/src/interfaces/ecpg/preproc/c_keywords.c
+++ b/src/interfaces/ecpg/preproc/c_keywords.c
@@ -1,10 +1,10 @@
/*-------------------------------------------------------------------------
*
- * keywords.c
+ * c_keywords.c
* lexical token lookup for reserved words in postgres embedded SQL
*
- * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/c_keywords.c,v 1.23 2009/06/11 14:49:13 momjian Exp $
- * ยง
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/c_keywords.c,v 1.24 2009/07/14 20:24:10 tgl Exp $
+ *
*-------------------------------------------------------------------------
*/
#include "postgres_fe.h"
@@ -55,8 +55,31 @@ static const ScanKeyword ScanCKeywords[] = {
{"year", YEAR_P, 0},
};
+
+/*
+ * Do a binary search using plain strcmp() comparison. This is much like
+ * ScanKeywordLookup(), except we want case-sensitive matching.
+ */
const ScanKeyword *
ScanCKeywordLookup(const char *text)
{
- return DoLookup(text, &ScanCKeywords[0], endof(ScanCKeywords) - 1);
+ const ScanKeyword *low = &ScanCKeywords[0];
+ const ScanKeyword *high = &ScanCKeywords[lengthof(ScanCKeywords) - 1];
+
+ while (low <= high)
+ {
+ const ScanKeyword *middle;
+ int difference;
+
+ middle = low + (high - low) / 2;
+ difference = strcmp(middle->name, text);
+ if (difference == 0)
+ return middle;
+ else if (difference < 0)
+ low = middle + 1;
+ else
+ high = middle - 1;
+ }
+
+ return NULL;
}