00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 #include "JRegex.h"
00031 #include "Inform.h" 
00032 
00033 #if defined(VMDUSEPCRE2)
00034 #define  PCRE2_CODE_UNIT_WIDTH 8
00035 #include "pcre2.h"
00036 #else
00037 #include "pcre.h"
00038 #endif
00039 
00040 JRegex::JRegex(const char *pattern, int) {
00041   if (pattern == NULL) {
00042     msgErr << "NULL pattern passed to JRegex!" << sendmsg;
00043   }
00044   else {
00045 #if defined(VMDUSEPCRE2)
00046     
00047     
00048     
00049     
00050     
00051     int errornumber=0;
00052     size_t erroroffset=0;
00053     md = NULL;
00054     JIT=0;
00055     rpat = pcre2_compile((PCRE2_SPTR) pattern,   
00056                          PCRE2_ZERO_TERMINATED,  
00057                          0,                      
00058                          &errornumber,           
00059                          &erroroffset,           
00060                          NULL);                  
00061 
00062     if (rpat == NULL) {
00063       PCRE2_UCHAR errbuf[256];
00064       pcre2_get_error_message(errornumber, errbuf, sizeof(errbuf));
00065       msgWarn << "JRegex: Error in pcre2_compile(), " << sendmsg;
00066       msgWarn << "Error in regex pattern begins with " << pattern+erroroffset
00067               << sendmsg;
00068     } else {
00069 #if 1
00070       
00071       
00072       
00073       
00074       int rc=0;
00075       rc=pcre2_jit_compile((pcre2_code *) rpat, PCRE2_JIT_COMPLETE); 
00076       if (rc && rc != PCRE2_ERROR_JIT_BADOPTION) 
00077         msgWarn << "JRegex: pcre2_jit_compile() returned an error." << sendmsg;
00078 
00079       
00080       if (!rc) {
00081         size_t len=0;
00082         pcre2_pattern_info((pcre2_code *) rpat, PCRE2_INFO_JITSIZE, &len);
00083 
00084         if (len != 0)
00085           JIT=1;
00086       }
00087 #endif
00088 
00089 
00090       md = pcre2_match_data_create_from_pattern((pcre2_code *) rpat, NULL);
00091     }
00092 #else
00093     const char *errptr;
00094     int erroffset;
00095     rpat = vmdpcre_compile(pattern,    
00096                            0,          
00097                            &errptr,    
00098                            &erroffset, 
00099                            NULL);      
00100     if (rpat == NULL) {
00101       msgWarn << "JRegex: Error in pcre_compile(), " << errptr << sendmsg;
00102       msgWarn << "Error in regex pattern begins with " << pattern+erroffset
00103               << sendmsg;
00104     }
00105 #endif
00106   }
00107 }
00108 
00109 JRegex::~JRegex() {
00110 #if defined(VMDUSEPCRE2)
00111   if (md)
00112     pcre2_match_data_free((pcre2_match_data *) md);  
00113   if (rpat)
00114     pcre2_code_free((pcre2_code *) rpat);
00115 #else
00116   vmdpcre_free(rpat);
00117 #endif
00118 }
00119 
00120 int JRegex::match(const char *str, int len) const {
00121 #if defined(VMDUSEPCRE2)
00122   if (rpat==NULL || md == NULL) {
00123 
00124     return -1;
00125   } 
00126 
00127   int rc=0;
00128 
00129   
00130   
00131   if (JIT) {
00132     rc=pcre2_jit_match((pcre2_code *) rpat,     
00133                        (PCRE2_SPTR) str,        
00134                        len,                     
00135                        0,                       
00136                        0,                       
00137                        (pcre2_match_data *) md, 
00138                        NULL);                   
00139     return rc;
00140   }
00141 
00142   rc=pcre2_match((pcre2_code *) rpat,     
00143                  (PCRE2_SPTR) str,        
00144                  len,                     
00145                  0,                       
00146                  0,                       
00147                  (pcre2_match_data *) md, 
00148                  NULL);                   
00149   return rc;
00150 #else
00151   if (rpat==NULL) {
00152 
00153     return -1;
00154   } 
00155   int retval;
00156   retval=vmdpcre_exec(rpat, 
00157                       NULL, 
00158                       str,  
00159                       len,  
00160                       0,    
00161                       0,    
00162                       NULL, 
00163                       0);   
00164   return retval;
00165 #endif
00166 }
00167 
00168 int JRegex::search(const char *str, int len, int &length, int start) {
00169 #if defined(VMDUSEPCRE2)
00170   return -1; 
00171 #else
00172   if (rpat==NULL) {
00173 
00174     return -1;
00175   } 
00176   int ovec[6], retval;
00177   retval=vmdpcre_exec(rpat, 
00178                       NULL, 
00179                       str,  
00180                       len,  
00181                       start,
00182                       0,    
00183                       ovec, 
00184                       6);   
00185   if (retval < 0) 
00186     return retval;
00187   length = ovec[1]-ovec[0]; 
00188   return ovec[0]; 
00189 #endif
00190 }
00191