LCOV - code coverage report
Current view: top level - src/interfaces/ecpg/preproc - c_keywords.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 100.0 % 11 11
Test Date: 2026-02-17 17:20:33 Functions: 100.0 % 1 1
Legend: Lines:     hit not hit

            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        10191 : 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        10191 :     len = strlen(text);
      47        10191 :     if (len > ScanCKeywords.max_kw_len)
      48         1389 :         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         8802 :     h = ScanCKeywords_hash_func(text, len);
      55              : 
      56              :     /* An out-of-range result implies no match */
      57         8802 :     if (h < 0 || h >= ScanCKeywords.num_keywords)
      58         4968 :         return -1;
      59              : 
      60         3834 :     kw = GetScanKeyword(h, &ScanCKeywords);
      61              : 
      62         3834 :     if (strcmp(kw, text) == 0)
      63          940 :         return ScanCKeywordTokens[h];
      64              : 
      65         2894 :     return -1;
      66              : }
        

Generated by: LCOV version 2.0-1