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 
20 static 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  */
35 int
36 ScanCKeywordLookup(const char *str)
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(str);
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(str, 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, str) == 0)
63  return ScanCKeywordTokens[h];
64 
65  return -1;
66 }
static const uint16 ScanCKeywordTokens[]
Definition: c_keywords.c:20
static const char * GetScanKeyword(int n, const ScanKeywordList *keywords)
Definition: kwlookup.h:39
unsigned short uint16
Definition: c.h:358
int ScanCKeywordLookup(const char *str)
Definition: c_keywords.c:36