Compile on demand and get data for a predefined regex.
Characters allowed in URL components (unreserved + percent-encoded + sub-delims) - without Unicode
101{
103
104 {
107
108#ifdef HAVE_PCRE2
110#define UNR_PCTENC_SUBDEL "][\\p{L}\\p{N}._~%!$&'()*+,;="
111#else
113#define UNR_PCTENC_SUBDEL "][[:alnum:]._~%!$&'()*+,;="
114#endif
115#define PATH ":@/ "
116 "^([[:alpha:]][-+.[:alnum:]]+):"
117 "("
118 "("
119
120 "(//"
121 "("
124 "@)?"
125 "("
127 "|"
128 "(\\[[[:xdigit:]:.]+\\])"
129 ")"
130 "(:([[:digit:]]+))?"
132 ")"
133 "|"
134 "("
136 ")"
137 ")"
138
139 "(\\?([^#]*))?"
140 ")$"
141#undef PATH
142#undef UNR_PCTENC_SUBDEL
143 },
144 {
148#define QUERY_PART "^&="
150#undef QUERY_PART
151 },
152 {
155 "=\\?"
156 "([^][()<>@,;:\\\"/?. =]+)"
157 "\\?"
158 "([qQbB])"
159 "\\?"
160 "([^?]+)"
161 "\\?="
162 },
163 {
166 "^\\#H ([[:alnum:]_\\.-]+) ([[:alnum:]]{4}( [[:alnum:]]{4}){7})[ \t]*$"
167 },
168 {
171
172#define FWS " *"
173#define C "(\\(.*\\))?"
174#define CFWS FWS C FWS
175 "^"
177 "(([[:alpha:]]+)" CFWS ", *)?"
178 CFWS "([[:digit:]]{1,2}) "
180 CFWS "([[:digit:]]{2,4}) "
181 CFWS "([[:digit:]]{1,2})"
182 ":" CFWS "([[:digit:]]{1,2})"
184 "(:" CFWS "([[:digit:]]{1,2}))?"
186 "("
187 "([+-][[:digit:]]{4})|"
188 "([[:alpha:]]+)"
189 ")?"
190#undef CFWS
191#undef C
192#undef FWS
193 },
194 {
197 "( ([[:digit:]])|([[:digit:]]{2}))"
201 " ([+-][[:digit:]]{4})"
202 },
203 {
206
207 "^From "
208 "([^[:space:]]+) +"
210 " +"
212 " ( ([[:digit:]])|([[:digit:]]{2}))"
213 " +"
215 " +"
217 },
218 {
221
222 "^From "
223 "("
224 "[^[:space:]]+"
225 "( at [^[:space:]]+)?"
226 ")?"
227 " *"
229 " +"
231 " +"
232 "( "
233 "([[:digit:]])|"
234 "([[:digit:]]{2})"
235 ")"
236 " +"
237 "("
239 "|"
240 "([[:digit:]]{2}"
241 ":[[:digit:]]{2})"
242 ")"
243 " +"
244 "("
245 "([[:alpha:] ]+)|"
246 "([+][[:digit:]]{4} )"
247 ")?"
248 "("
250 "|"
251 "([[:digit:]]{2})"
252 ")"
253 },
254 {
257 "^([[:alpha:]]+): (.*)$"
258 },
259 {
262 "^(.*)(tags:)([[:alnum:],]*) ?(.*)$"
263 },
264
265 };
266
271 {
272#ifdef HAVE_PCRE2
273 uint32_t opt = pcre2_has_unicode() ? PCRE2_UTF : 0;
274 int eno = 0;
275 PCRE2_SIZE eoff = 0;
276 h->
re = pcre2_compile((PCRE2_SPTR8) h->
str, PCRE2_ZERO_TERMINATED, opt,
277 &eno, &eoff, NULL);
279 h->mdata = pcre2_match_data_create_from_pattern(h->
re, NULL);
280 uint32_t ccount = 0;
281 pcre2_pattern_info(h->
re, PCRE2_INFO_CAPTURECOUNT, &ccount);
282 ASSERT(((ccount + 1) == h->
nmatches) &&
"Number of matches do not match (...)");
284#else
286 const int rc = regcomp(h->
re, h->
str, REG_EXTENDED);
287 ASSERT(rc == 0 &&
"Fix your RE");
289#endif
290 }
291 return h;
292}
#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.