47 lines · 1.4 KB · Text
RawDownload
Sigh.  The regexec matcher in libc 5.4.44 = GNU regex-0.12 loops on this: -  regexec (regcomp "\\(\\*([^\\*]*(\\*|[^\\)])?)*\\*\\)" [Extended]) [] "(*hjdshf  * *)sds(*bad *)    \n\touue "; The problem appears in a C program, too: /* Try GNU implementation of POSIX regex */ #include <stdlib.h>#include <sys/types.h>#include <regex.h> /* ML type: string -> word -> regex */ void main(int argc, char* argv[]) {  regex_t patbuf;  char* pat = "\\(\\*([^\\*]*(\\*|[^\\)])?)*\\*\\)";  int comperror = regcomp(&patbuf, pat, REG_EXTENDED);  int nmatch = 1;  regmatch_t* pmatch = (regmatch_t*)(malloc(nmatch * sizeof(regmatch_t)));  char* str = "(*hjdshf  * *)sds(*bad *)    \n\touue ";  int matcherror = regexec(&patbuf, str, nmatch, pmatch, 0);  printf("%d\n", matcherror);} The problem does not appear if REG_NOSUB is specified. If we remove the alternation symbol (|), which shouldn't be thereanyway, the problem goes away:   char* pat = "\\(\\*([^\\*]*(\\*[^\\)])?)*\\*\\)";     Define fapp f (x, r) = f x :: r   Then     map regex f s = List.rev (fold regex (#2, fapp f) [] s)    app regex f s = fold regex (fn _ => (), f o #1) () s    fields regex f s = fold regex (fapp Substring.string, #2) [] s    tokens regex f s = List.filter (fn s => s <> "") (fields regex f s)    substitute regex f s = Substring.concat(fold regex (op ::,    fn (v, r) => f(Substring.string(Vector.sub(v, 0))) :: r) [] s)