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