blob: 3204d9658076213a093d858693efef1838d0a046 [file] [log] [blame]
/* This testcase would cause a hang in PTA solving due to a complex copy
constraint and marking the wrong variable as changed. */
typedef struct RExC_state_t
{
char *end;
char *parse;
} RExC_state_t;
struct regnode_string
{
unsigned char str_len;
char string[1];
};
static void *regatom (RExC_state_t * pRExC_state, int *flagp);
static void *
regpiece (RExC_state_t * pRExC_state, int *flagp)
{
return regatom (0, 0);
}
static void *
regbranch (RExC_state_t * pRExC_state, int *flagp, int first)
{
return regpiece (0, 0);
}
static void *
reg (RExC_state_t * pRExC_state, int paren, int *flagp)
{
return regbranch (0, 0, 1);
}
void *
Perl_pregcomp (char *exp, char *xend, void *pm)
{
return reg (0, 0, 0);
}
static void *
regatom (RExC_state_t * pRExC_state, int *flagp)
{
register void *ret = 0;
int flags;
tryagain:
switch (*(pRExC_state->parse))
{
case '(':
ret = reg (pRExC_state, 1, &flags);
if (flags & 0x8)
{
goto tryagain;
}
break;
default:
{
register unsigned long len;
register unsigned ender;
register char *p;
char *oldp, *s;
unsigned long numlen;
unsigned long foldlen;
unsigned char tmpbuf[6 + 1], *foldbuf;
defchar:
s = (((struct regnode_string *) ret)->string);
for (len = 0, p = (pRExC_state->parse) - 1;
len < 127 && p < (pRExC_state->end); len++)
{
if (((*p) == '*' || (*p) == '+' || (*p) == '?'
|| ((*p) == '{' && regcurly (p))))
{
unsigned long unilen;
for (foldbuf = tmpbuf; foldlen; foldlen -= numlen)
{
reguni (pRExC_state, ender, s, &unilen);
s += unilen;
}
break;
}
unsigned long unilen;
reguni (pRExC_state, ender, s, &unilen);
s += unilen;
}
};
break;
}
return (ret);
}