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