1/* This testcase would cause a hang in PTA solving due to a complex copy 2 constraint and marking the wrong variable as changed. */ 3 4typedef struct RExC_state_t 5{ 6 char *end; 7 char *parse; 8} RExC_state_t; 9 10struct regnode_string 11{ 12 unsigned char str_len; 13 char string[1]; 14}; 15 16static void *regatom (RExC_state_t * pRExC_state, int *flagp); 17 18static void * 19regpiece (RExC_state_t * pRExC_state, int *flagp) 20{ 21 return regatom (0, 0); 22} 23 24static void * 25regbranch (RExC_state_t * pRExC_state, int *flagp, int first) 26{ 27 return regpiece (0, 0); 28} 29 30static void * 31reg (RExC_state_t * pRExC_state, int paren, int *flagp) 32{ 33 return regbranch (0, 0, 1); 34} 35 36void * 37Perl_pregcomp (char *exp, char *xend, void *pm) 38{ 39 return reg (0, 0, 0); 40} 41 42static void * 43regatom (RExC_state_t * pRExC_state, int *flagp) 44{ 45 register void *ret = 0; 46 int flags; 47 48tryagain: 49 switch (*(pRExC_state->parse)) 50 { 51 case '(': 52 ret = reg (pRExC_state, 1, &flags); 53 if (flags & 0x8) 54 { 55 goto tryagain; 56 } 57 break; 58 default: 59 { 60 register unsigned long len; 61 register unsigned ender; 62 register char *p; 63 char *oldp, *s; 64 unsigned long numlen; 65 unsigned long foldlen; 66 unsigned char tmpbuf[6 + 1], *foldbuf; 67 68 defchar: 69 s = (((struct regnode_string *) ret)->string); 70 for (len = 0, p = (pRExC_state->parse) - 1; 71 len < 127 && p < (pRExC_state->end); len++) 72 { 73 if (((*p) == '*' || (*p) == '+' || (*p) == '?' 74 || ((*p) == '{' && regcurly (p)))) 75 { 76 unsigned long unilen; 77 for (foldbuf = tmpbuf; foldlen; foldlen -= numlen) 78 { 79 reguni (pRExC_state, ender, s, &unilen); 80 s += unilen; 81 } 82 break; 83 } 84 unsigned long unilen; 85 86 reguni (pRExC_state, ender, s, &unilen); 87 s += unilen; 88 } 89 90 }; 91 break; 92 } 93 return (ret); 94} 95