Compile on demand and get data for a predefined regex.
97{
99
100 {
103
104#ifdef HAVE_PCRE2
105#define UNR_PCTENC_SUBDEL "][\\p{L}\\p{N}._~%!$&'()*+,;="
106#else
107#define UNR_PCTENC_SUBDEL "][[:alnum:]._~%!$&'()*+,;="
108#endif
109#define PATH ":@/ "
110 "^([[:alpha:]][-+.[:alnum:]]+):"
111 "("
112 "("
113
114 "(//"
115 "("
118 "@)?"
119 "("
121 "|"
122 "(\\[[[:xdigit:]:.]+\\])"
123 ")"
124 "(:([[:digit:]]+))?"
126 ")"
127 "|"
128 "("
130 ")"
131 ")"
132
133 "(\\?([^#]*))?"
134 ")$"
135#undef PATH
136#undef UNR_PCTENC_SUBDEL
137 },
138 {
141#define QUERY_PART "^&="
143#undef QUERY_PART
144 },
145 {
148 "=\\?"
149 "([^][()<>@,;:\\\"/?. =]+)"
150 "\\?"
151 "([qQbB])"
152 "\\?"
153 "([^?]+)"
154 "\\?="
155 },
156 {
159 "^\\#H ([[:alnum:]_\\.-]+) ([[:alnum:]]{4}( [[:alnum:]]{4}){7})[ \t]*$"
160 },
161 {
164
165 "^"
167 " *"
168 "([[:digit:]]{1,2}) "
170 " ([[:digit:]]{2,4}) "
171 "([[:digit:]]{2})"
172 ":([[:digit:]]{2})"
173 "(:([[:digit:]]{2}))?"
174 " *"
175 "("
176 "([+-][[:digit:]]{4})|"
177 "([[:alpha:]]+)"
178 ")"
179 },
180 {
183
184#define FWS " *"
185#define C "(\\(.*\\))?"
186#define CFWS FWS C FWS
187 "^"
189 "(([[:alpha:]]+)" CFWS ", *)?"
190 CFWS "([[:digit:]]{1,2}) "
192 CFWS "([[:digit:]]{2,4}) "
193 CFWS "([[:digit:]]{1,2})"
194 ":" CFWS "([[:digit:]]{1,2})"
196 "(:" CFWS "([[:digit:]]{1,2}))?"
198 "("
199 "([+-][[:digit:]]{4})|"
200 "([[:alpha:]]+)"
201 ")?"
202#undef CFWS
203#undef C
204#undef FWS
205 },
206 {
209 "( ([[:digit:]])|([[:digit:]]{2}))"
213 " ([+-][[:digit:]]{4})"
214 },
215 {
218
219 "^From "
220 "([^[:space:]]+) +"
222 " +"
224 " ( ([[:digit:]])|([[:digit:]]{2}))"
225 " +"
227 " +"
229 },
230 {
233
234 "^From "
235 "("
236 "[^[:space:]]+"
237 "( at [^[:space:]]+)?"
238 ")?"
239 " *"
241 " +"
243 " +"
244 "( "
245 "([[:digit:]])|"
246 "([[:digit:]]{2})"
247 ")"
248 " +"
249 "("
251 "|"
252 "([[:digit:]]{2}"
253 ":[[:digit:]]{2})"
254 ")"
255 " +"
256 "("
257 "([[:alpha:] ]+)|"
258 "([+][[:digit:]]{4} )"
259 ")?"
260 "("
262 "|"
263 "([[:digit:]]{2})"
264 ")"
265 },
266 {
269 "^([[:alpha:]]+): (.*)$"
270 },
271
272 };
273
276 assert((
which == h->
which) &&
"Fix 'storage' array");
278 {
279#ifdef HAVE_PCRE2
280 uint32_t opt = pcre2_has_unicode() ? PCRE2_UTF : 0;
281 int eno = 0;
282 PCRE2_SIZE eoff = 0;
283 h->
re = pcre2_compile((PCRE2_SPTR8) h->
str, PCRE2_ZERO_TERMINATED, opt,
284 &eno, &eoff, NULL);
285 assert(h->
re &&
"Fix your RE");
286 h->mdata = pcre2_match_data_create_from_pattern(h->
re, NULL);
287 uint32_t ccount = 0;
288 pcre2_pattern_info(h->
re, PCRE2_INFO_CAPTURECOUNT, &ccount);
289 assert(ccount + 1 == h->
nmatches &&
"Number of matches do not match (...)");
291#else
293 const int rc = regcomp(h->
re, h->
str, REG_EXTENDED);
294 assert(rc == 0 && "Fix your RE");
296#endif
297 }
298 return h;
299}
void * mutt_mem_calloc(size_t nmemb, size_t size)
Allocate zeroed memory on the heap.
#define UNR_PCTENC_SUBDEL
@ PREX_MBOX_FROM_LAX_MATCH_MAX
@ PREX_ACCOUNT_CMD_MATCH_MAX
@ PREX_IMAP_DATE_MATCH_MAX
@ PREX_RFC5322_DATE_MATCH_MAX
@ PREX_MBOX_FROM_MATCH_MAX
@ PREX_RFC2047_ENCODED_WORD_MATCH_MAX
@ PREX_URL_QUERY_KEY_VAL_MATCH_MAX
@ PREX_GNUTLS_CERT_HOST_HASH
[#H foo.com A76D 954B EB79 1F49 5B3A 0A0E 0681 65B1]
@ PREX_MBOX_FROM_LAX
[From god@heaven.af.mil Sat Jan 3 01:05:34 1996]
@ PREX_URL
[imaps://user:pass@example.com/INBOX?foo=bar]
@ PREX_MBOX_FROM
[From god@heaven.af.mil Sat Jan 3 01:05:34 1996]
@ PREX_ACCOUNT_CMD
key: value
@ PREX_IMAP_DATE
[16-MAR-2020 15:09:35 -0700]
@ PREX_RFC5322_DATE
[Mon, 16 Mar 2020 15:09:35 -0700]
@ PREX_RFC5322_DATE_LAX
[Mon, (Comment) 16 Mar 2020 15:09:35 -0700]
@ PREX_URL_QUERY_KEY_VAL
https://example.com/?[q=foo]
@ PREX_RFC2047_ENCODED_WORD
[=?utf-8?Q?=E8=81=AA=E6=98=8E=E7=9A=84?=]
@ PREX_RFC5322_DATE_LAX_MATCH_MAX
@ PREX_GNUTLS_CERT_HOST_HASH_MATCH_MAX
A predefined / precompiled regex.
const char * str
Regex string.
enum Prex which
Regex type, e.g. PREX_URL.
size_t nmatches
Number of regex matches.
regex_t * re
Compiled regex.
regmatch_t * matches
Resulting matches.