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)
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 there
anyway, 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)