1
2#ifndef PERL_REGINLINE_H
3
4/*
5 - regnext - dig the "next" pointer out of a node
6 */
7PERL_STATIC_INLINE
8regnode *
9Perl_regnext(pTHX_ const regnode *p)
10{
11    I32 offset;
12
13    if (!p)
14        return(NULL);
15
16    if (OP(p) > REGNODE_MAX) {                /* regnode.type is unsigned */
17        Perl_croak(aTHX_ "Corrupted regexp opcode %d > %d",
18                                                (int)OP(p), (int)REGNODE_MAX);
19    }
20
21    offset = (REGNODE_OFF_BY_ARG(OP(p)) ? ARG1u(p) : NEXT_OFF(p));
22    if (offset == 0)
23        return(NULL);
24
25    return(regnode *)(p+offset);
26}
27
28/*
29 - regnode_after - find the node physically following p in memory,
30   taking into account the size of p as determined by OP(p), our
31   sizing data, and possibly the STR_SZ() macro.
32 */
33PERL_STATIC_INLINE
34regnode *
35Perl_regnode_after(pTHX_ const regnode *p, const bool varies)
36{
37    assert(p);
38    const U8 op = OP(p);
39    assert(op < REGNODE_MAX);
40    const regnode *ret = p + NODE_STEP_REGNODE + REGNODE_ARG_LEN(op);
41    if (varies || REGNODE_ARG_LEN_VARIES(op))
42        ret += STR_SZ(STR_LEN(p));
43    return (regnode *)ret;
44}
45
46/* validate that the passed in node and extra length would match that
47 * returned by regnode_after() */
48PERL_STATIC_INLINE
49bool
50Perl_check_regnode_after(pTHX_ const regnode *p, const STRLEN extra)
51{
52    const regnode *nextoper = regnode_after((regnode *)p,FALSE);
53    const regnode *other = REGNODE_AFTER_PLUS(p, extra);
54    if (nextoper != other) {
55        return FALSE;
56    }
57    return TRUE;
58}
59
60#define PERL_REGINLINE_H
61#endif
62/*
63 * ex: set ts=8 sts=4 sw=4 et:
64 */
65