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