PostgreSQL Source Code git master
c_keywords.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * c_keywords.c
4 * lexical token lookup for reserved words in postgres embedded SQL
5 *
6 * src/interfaces/ecpg/preproc/c_keywords.c
7 *
8 *-------------------------------------------------------------------------
9 */
10#include "postgres_fe.h"
11
12/* ScanKeywordList lookup data for C keywords */
13#include "c_kwlist_d.h"
14#include "preproc_extern.h"
15#include "preproc.h"
16
17/* Token codes for C keywords */
18#define PG_KEYWORD(kwname, value) value,
19
20static const uint16 ScanCKeywordTokens[] = {
21#include "c_kwlist.h"
22};
23
24#undef PG_KEYWORD
25
26
27/*
28 * ScanCKeywordLookup - see if a given word is a keyword
29 *
30 * Returns the token value of the keyword, or -1 if no match.
31 *
32 * Do a hash search using plain strcmp() comparison. This is much like
33 * ScanKeywordLookup(), except we want case-sensitive matching.
34 */
35int
37{
38 size_t len;
39 int h;
40 const char *kw;
41
42 /*
43 * Reject immediately if too long to be any keyword. This saves useless
44 * hashing work on long strings.
45 */
46 len = strlen(text);
47 if (len > ScanCKeywords.max_kw_len)
48 return -1;
49
50 /*
51 * Compute the hash function. Since it's a perfect hash, we need only
52 * match to the specific keyword it identifies.
53 */
54 h = ScanCKeywords_hash_func(text, len);
55
56 /* An out-of-range result implies no match */
57 if (h < 0 || h >= ScanCKeywords.num_keywords)
58 return -1;
59
60 kw = GetScanKeyword(h, &ScanCKeywords);
61
62 if (strcmp(kw, text) == 0)
63 return ScanCKeywordTokens[h];
64
65 return -1;
66}
uint16_t uint16
Definition: c.h:501
int ScanCKeywordLookup(const char *text)
Definition: c_keywords.c:36
static const uint16 ScanCKeywordTokens[]
Definition: c_keywords.c:20
static const char * GetScanKeyword(int n, const ScanKeywordList *keywords)
Definition: kwlookup.h:39
const void size_t len
Definition: c.h:658