#include <stdio.h>
#include <regex.h>
#include <string.h>
#include <stdlib.h>
#include <err.h>
static char *
mkstr(const char *str, size_t len)
{
size_t i, slen = strlen(str);
char *p = malloc(slen * len + 1);
if (p == NULL)
err(1, "malloc");
for (i = 0; i < len; i++)
strlcpy(&p[i * slen], str, slen * len + 1 - (i * slen));
return p;
}
static char *
concat(const char *d, const char *s)
{
size_t dlen = strlen(d);
size_t slen = strlen(s);
char *p = malloc(dlen + slen + 1);
strlcpy(p, d, dlen + slen + 1);
strlcat(p, s, dlen + slen + 1);
return p;
}
static char *
p0(size_t len)
{
char *d, *s1, *s2;
s1 = mkstr("\\(", len);
s2 = concat(s1, ")");
free(s1);
d = concat("(", s2);
free(s2);
return d;
}
static char *
p1(size_t len)
{
char *d, *s1, *s2, *s3;
s1 = mkstr("\\(", 60);
s2 = mkstr("(.*)", len);
s3 = concat(s1, s2);
free(s2);
free(s1);
s1 = concat(s3, ")");
free(s3);
d = concat("(", s1);
free(s1);
return d;
}
static char *
ps(const char *m, const char *s, size_t len)
{
char *d, *s1, *s2, *s3;
s1 = mkstr(m, len);
s2 = mkstr(s, len);
s3 = concat(s1, s2);
free(s2);
free(s1);
d = concat("(.?)", s3);
free(s3);
return d;
}
static char *
p2(size_t len)
{
return ps("((.*){0,255}", ")", len);
}
static char *
p3(size_t len)
{
return ps("(.\\{0,}", ")", len);
}
static char *
p4(size_t len)
{
return ps("((.*){1,255}", ")", len);
}
static char *
p5(size_t len)
{
return ps("(", "){1,100}", len);
}
static char *
p6(size_t len)
{
char *d, *s1, *s2;
s1 = mkstr("(?:(.*)|", len);
s2 = concat(s1, "(.*)");
free(s1);
s1 = mkstr(")", len);
d = concat(s2, s1);
free(s1);
free(s2);
return d;
}
static char *(*patterns[])(size_t) = {
p0,
p1,
p2,
p3,
p4,
p5,
p6,
};
int
main(void)
{
regex_t re;
int e, ret = 0;
size_t i;
for (i = 0; i < sizeof(patterns) / sizeof(patterns[0]); i++) {
char *d = (*patterns[i])(9999);
e = regcomp(&re, d, i == 6 ? REG_BASIC : REG_EXTENDED);
free(d);
if (e) {
if (e != REG_ESPACE) {
printf("regcomp returned %d for pattern %zu", e, i);
ret = 1;
}
continue;
}
(void)regexec(&re, "aaaaaaaa", 0, NULL, 0);
regfree(&re);
}
return ret;
}