+ pcre_list *re_list_head = NULL;
+ pcre_list *ri;
+
+ /* precompile our regexes */
+ while ((regex_string = string_nextinlist(&list, &sep,
+ regex_string_buffer,
+ sizeof(regex_string_buffer))) != NULL) {
+ pcre *re;
+
+ /* parse option */
+ if ( (strcmpic(regex_string,US"false") == 0) ||
+ (Ustrcmp(regex_string,"0") == 0) )
+ continue; /* explicitly no matching */
+
+ /* compile our regular expression */
+ if (!(re = pcre_compile( CS regex_string,
+ 0, &pcre_error, &pcre_erroffset, NULL ))) {
+ log_write(0, LOG_MAIN,
+ "regex acl condition warning - error in regex '%s': %s at offset %d, skipped.",
+ regex_string, pcre_error, pcre_erroffset);
+ continue;
+ }
+
+ ri = store_get(sizeof(pcre_list));
+ ri->re = re;
+ ri->pcre_text = string_copy(regex_string);
+ ri->next = re_list_head;
+ re_list_head = ri;
+ }
+ return re_list_head;
+}
+
+static int
+matcher(pcre_list * re_list_head, uschar * linebuffer, int len)
+{
+ pcre_list * ri;
+
+ for(ri = re_list_head; ri; ri = ri->next)
+ {
+ int ovec[3*(REGEX_VARS+1)];
+ int n, nn;
+
+ /* try matcher on the line */
+ n = pcre_exec(ri->re, NULL,
+ CS linebuffer, len, 0, 0,
+ ovec, nelem(ovec));
+ if (n > 0)
+ {
+ Ustrncpy(regex_match_string_buffer, ri->pcre_text, 1023);
+ regex_match_string = regex_match_string_buffer;
+
+ for (nn = 1; nn < n; nn++)
+ regex_vars[nn-1] =
+ string_copyn(linebuffer + ovec[nn*2], ovec[nn*2+1] - ovec[nn*2]);
+
+ return OK;
+ }
+ }
+ return FAIL;
+}
+
+int
+regex(const uschar **listptr)
+{
+ unsigned long mbox_size;
+ FILE *mbox_file;
+ pcre_list *re_list_head;