Compile on demand and get data for a predefined regex.
100{
102
103 {
106
107#ifdef HAVE_PCRE2
108#define UNR_PCTENC_SUBDEL "][\\p{L}\\p{N}._~%!$&'()*+,;="
109#else
110#define UNR_PCTENC_SUBDEL "][[:alnum:]._~%!$&'()*+,;="
111#endif
112#define PATH ":@/ "
113 "^([[:alpha:]][-+.[:alnum:]]+):"
114 "("
115 "("
116
117 "(//"
118 "("
121 "@)?"
122 "("
124 "|"
125 "(\\[[[:xdigit:]:.]+\\])"
126 ")"
127 "(:([[:digit:]]+))?"
129 ")"
130 "|"
131 "("
133 ")"
134 ")"
135
136 "(\\?([^#]*))?"
137 ")$"
138#undef PATH
139#undef UNR_PCTENC_SUBDEL
140 },
141 {
144#define QUERY_PART "^&="
146#undef QUERY_PART
147 },
148 {
151 "=\\?"
152 "([^][()<>@,;:\\\"/?. =]+)"
153 "\\?"
154 "([qQbB])"
155 "\\?"
156 "([^?]+)"
157 "\\?="
158 },
159 {
162 "^\\#H ([[:alnum:]_\\.-]+) ([[:alnum:]]{4}( [[:alnum:]]{4}){7})[ \t]*$"
163 },
164 {
167
168#define FWS " *"
169#define C "(\\(.*\\))?"
170#define CFWS FWS C FWS
171 "^"
173 "(([[:alpha:]]+)" CFWS ", *)?"
174 CFWS "([[:digit:]]{1,2}) "
176 CFWS "([[:digit:]]{2,4}) "
177 CFWS "([[:digit:]]{1,2})"
178 ":" CFWS "([[:digit:]]{1,2})"
180 "(:" CFWS "([[:digit:]]{1,2}))?"
182 "("
183 "([+-][[:digit:]]{4})|"
184 "([[:alpha:]]+)"
185 ")?"
186#undef CFWS
187#undef C
188#undef FWS
189 },
190 {
193 "( ([[:digit:]])|([[:digit:]]{2}))"
197 " ([+-][[:digit:]]{4})"
198 },
199 {
202
203 "^From "
204 "([^[:space:]]+) +"
206 " +"
208 " ( ([[:digit:]])|([[:digit:]]{2}))"
209 " +"
211 " +"
213 },
214 {
217
218 "^From "
219 "("
220 "[^[:space:]]+"
221 "( at [^[:space:]]+)?"
222 ")?"
223 " *"
225 " +"
227 " +"
228 "( "
229 "([[:digit:]])|"
230 "([[:digit:]]{2})"
231 ")"
232 " +"
233 "("
235 "|"
236 "([[:digit:]]{2}"
237 ":[[:digit:]]{2})"
238 ")"
239 " +"
240 "("
241 "([[:alpha:] ]+)|"
242 "([+][[:digit:]]{4} )"
243 ")?"
244 "("
246 "|"
247 "([[:digit:]]{2})"
248 ")"
249 },
250 {
253 "^([[:alpha:]]+): (.*)$"
254 },
255 {
258 "^(.*)(tags:)([[:alnum:],]*) ?(.*)$"
259 },
260
261 };
262
267 {
268#ifdef HAVE_PCRE2
269 uint32_t opt = pcre2_has_unicode() ? PCRE2_UTF : 0;
270 int eno = 0;
271 PCRE2_SIZE eoff = 0;
272 h->
re = pcre2_compile((PCRE2_SPTR8) h->
str, PCRE2_ZERO_TERMINATED, opt,
273 &eno, &eoff, NULL);
275 h->mdata = pcre2_match_data_create_from_pattern(h->
re, NULL);
276 uint32_t ccount = 0;
277 pcre2_pattern_info(h->
re, PCRE2_INFO_CAPTURECOUNT, &ccount);
278 ASSERT(((ccount + 1) == h->
nmatches) &&
"Number of matches do not match (...)");
280#else
282 const int rc = regcomp(h->
re, h->
str, REG_EXTENDED);
283 ASSERT(rc == 0 &&
"Fix your RE");
285#endif
286 }
287 return h;
288}
#define MUTT_MEM_CALLOC(n, type)
#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.