1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
/* 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);
}
|