Line data Source code
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 20110 : ScanCKeywordLookup(const char *text) 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 20110 : len = strlen(text); 47 20110 : if (len > ScanCKeywords.max_kw_len) 48 2754 : 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 17356 : h = ScanCKeywords_hash_func(text, len); 55 : 56 : /* An out-of-range result implies no match */ 57 17356 : if (h < 0 || h >= ScanCKeywords.num_keywords) 58 9808 : return -1; 59 : 60 7548 : kw = GetScanKeyword(h, &ScanCKeywords); 61 : 62 7548 : if (strcmp(kw, text) == 0) 63 1868 : return ScanCKeywordTokens[h]; 64 : 65 5680 : return -1; 66 : }