LCOV - code coverage report
Current view: top level - src - regexp_match.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 64.3 % 28 18
Test Date: 2026-01-12 05:34:38 Functions: 100.0 % 1 1

            Line data    Source code
       1              : #include "precizer.h"
       2              : 
       3              : /**
       4              :  *
       5              :  * Checks whether PCRE2 regular expression matches a comparison string or not
       6              :  *
       7              :  */
       8          892 : REGEXP regexp_match(
       9              :         const char *regexp,
      10              :         const char *relative_path,
      11              :         bool       *showed_once)
      12              : {
      13          892 :         bool match = false;
      14              : 
      15              :         /* for pcre2_compile */
      16              :         pcre2_code *re;
      17              :         PCRE2_SIZE erroffset;
      18              :         int errcode;
      19              :         PCRE2_UCHAR8 buffer[MAX_CHARACTERS];
      20              : 
      21              :         /* for pcre2_match */
      22              :         int rc;
      23              : #if 0
      24              :         PCRE2_SIZE *ovector;
      25              : #endif
      26              : 
      27          892 :         const unsigned char *pattern = (const unsigned char *)regexp;
      28          892 :         size_t pattern_size = strlen(regexp);
      29              : 
      30          892 :         const unsigned char *subject = (const unsigned char *)relative_path;
      31          892 :         size_t subject_size = strlen(relative_path);
      32          892 :         uint32_t options = 0;
      33              : 
      34              :         pcre2_match_data *match_data;
      35              : 
      36          892 :         re = pcre2_compile(pattern,pattern_size,options,&errcode,&erroffset,NULL);
      37              : 
      38          892 :         if(re == NULL)
      39              :         {
      40            0 :                 if(*showed_once == false)
      41              :                 {
      42            0 :                         *showed_once = true;
      43            0 :                         pcre2_get_error_message(errcode,buffer,MAX_CHARACTERS);
      44            0 :                         slog(ERROR,"PCRE2 regular expression %s has an error:%d %s\n",pattern,errcode,buffer);
      45              :                 }
      46            0 :                 return(REGEXP_ERROR);
      47              :         }
      48              : 
      49          892 :         match_data = pcre2_match_data_create_from_pattern(re,NULL);
      50          892 :         rc = pcre2_match(re,subject,subject_size,0,options,match_data,NULL);
      51              : 
      52          892 :         if(rc == 0)
      53              :         {
      54            0 :                 if(*showed_once == false)
      55              :                 {
      56            0 :                         *showed_once = true;
      57            0 :                         pcre2_get_error_message(errcode,buffer,MAX_CHARACTERS);
      58            0 :                         slog(ERROR,"PCRE2 regular expression %s has an error: %d \"offset vector too small\"\n",pattern,rc);
      59              :                 }
      60            0 :                 return(REGEXP_ERROR);
      61          892 :         } else if(rc > 0){
      62              : #if 0
      63              :                 ovector = pcre2_get_ovector_pointer(match_data);
      64              : #endif
      65              : 
      66          324 :                 for(PCRE2_SIZE i = 0; i < (size_t)rc; i++)
      67              :                 {
      68              : #if 0
      69              :                         PCRE2_SPTR start = subject + ovector[2*i];
      70              :                         PCRE2_SIZE slen = ovector[2*i+1] - ovector[2*i];
      71              :                         printf( "%2ld: %.*s\n",i,(int)slen,(const char *)start );
      72              : #endif
      73          162 :                         match = true;
      74              :                 }
      75              :         }
      76              : #if 0
      77              :         else if(rc < 0){
      78              :                 printf("No match\n");
      79              :         }
      80              : #endif
      81              : 
      82          892 :         pcre2_match_data_free(match_data);
      83          892 :         pcre2_code_free(re);
      84              : 
      85          892 :         return(match);
      86              : }
        

Generated by: LCOV version 2.0-1