Compile on demand and get data for a predefined regex.
99{
101
102 {
105
106#ifdef HAVE_PCRE2
107#define UNR_PCTENC_SUBDEL "][\\p{L}\\p{N}._~%!$&'()*+,;="
108#else
109#define UNR_PCTENC_SUBDEL "][[:alnum:]._~%!$&'()*+,;="
110#endif
111#define PATH ":@/ "
112 "^([[:alpha:]][-+.[:alnum:]]+):"
113 "("
114 "("
115
116 "(//"
117 "("
120 "@)?"
121 "("
123 "|"
124 "(\\[[[:xdigit:]:.]+\\])"
125 ")"
126 "(:([[:digit:]]+))?"
128 ")"
129 "|"
130 "("
132 ")"
133 ")"
134
135 "(\\?([^#]*))?"
136 ")$"
137#undef PATH
138#undef UNR_PCTENC_SUBDEL
139 },
140 {
143#define QUERY_PART "^&="
145#undef QUERY_PART
146 },
147 {
150 "=\\?"
151 "([^][()<>@,;:\\\"/?. =]+)"
152 "\\?"
153 "([qQbB])"
154 "\\?"
155 "([^?]+)"
156 "\\?="
157 },
158 {
161 "^\\#H ([[:alnum:]_\\.-]+) ([[:alnum:]]{4}( [[:alnum:]]{4}){7})[ \t]*$"
162 },
163 {
166
167#define FWS " *"
168#define C "(\\(.*\\))?"
169#define CFWS FWS C FWS
170 "^"
172 "(([[:alpha:]]+)" CFWS ", *)?"
173 CFWS "([[:digit:]]{1,2}) "
175 CFWS "([[:digit:]]{2,4}) "
176 CFWS "([[:digit:]]{1,2})"
177 ":" CFWS "([[:digit:]]{1,2})"
179 "(:" CFWS "([[:digit:]]{1,2}))?"
181 "("
182 "([+-][[:digit:]]{4})|"
183 "([[:alpha:]]+)"
184 ")?"
185#undef CFWS
186#undef C
187#undef FWS
188 },
189 {
192 "( ([[:digit:]])|([[:digit:]]{2}))"
196 " ([+-][[:digit:]]{4})"
197 },
198 {
201
202 "^From "
203 "([^[:space:]]+) +"
205 " +"
207 " ( ([[:digit:]])|([[:digit:]]{2}))"
208 " +"
210 " +"
212 },
213 {
216
217 "^From "
218 "("
219 "[^[:space:]]+"
220 "( at [^[:space:]]+)?"
221 ")?"
222 " *"
224 " +"
226 " +"
227 "( "
228 "([[:digit:]])|"
229 "([[:digit:]]{2})"
230 ")"
231 " +"
232 "("
234 "|"
235 "([[:digit:]]{2}"
236 ":[[:digit:]]{2})"
237 ")"
238 " +"
239 "("
240 "([[:alpha:] ]+)|"
241 "([+][[:digit:]]{4} )"
242 ")?"
243 "("
245 "|"
246 "([[:digit:]]{2})"
247 ")"
248 },
249 {
252 "^([[:alpha:]]+): (.*)$"
253 },
254 {
257 "^(.*)(tags:)([[:alnum:],]*) ?(.*)$"
258 },
259
260 };
261
266 {
267#ifdef HAVE_PCRE2
268 uint32_t opt = pcre2_has_unicode() ? PCRE2_UTF : 0;
269 int eno = 0;
270 PCRE2_SIZE eoff = 0;
271 h->
re = pcre2_compile((PCRE2_SPTR8) h->
str, PCRE2_ZERO_TERMINATED, opt,
272 &eno, &eoff, NULL);
274 h->mdata = pcre2_match_data_create_from_pattern(h->
re, NULL);
275 uint32_t ccount = 0;
276 pcre2_pattern_info(h->
re, PCRE2_INFO_CAPTURECOUNT, &ccount);
277 ASSERT(((ccount + 1) == h->
nmatches) &&
"Number of matches do not match (...)");
279#else
281 const int rc = regcomp(h->
re, h->
str, REG_EXTENDED);
282 ASSERT(rc == 0 &&
"Fix your RE");
284#endif
285 }
286 return h;
287}
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_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_ALIAS_TAGS
tags:a,b,c
@ PREX_IMAP_DATE
[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
@ PREX_ALIAS_TAGS_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.