diff options
author | Yves Orton <demerphq@gmail.com> | 2023-01-09 20:49:12 +0100 |
---|---|---|
committer | Yves Orton <demerphq@gmail.com> | 2023-01-11 14:28:33 +0100 |
commit | 3f11a2855248134af98ca8d71cf71a3fe736dbae (patch) | |
tree | 7938935c782a5aabed1b392f3b841906d91e167c /regexp.h | |
parent | 67244d99e1ad05ddedabc8d640ceaf1d5b8e259d (diff) | |
download | perl-3f11a2855248134af98ca8d71cf71a3fe736dbae.tar.gz |
regexec engine - wrap and replace RX_OFFS() with better abstractions
RX_OFFS() exposes a bit too much about how capture buffers are represented.
This adds RX_OFFS_START() and RX_OFFS_END() and RX_OFFS_VALID() to replace
most of the uses of the RX_OFFS() macro or direct access to the rx->off[]
array. (We add RX_OFFSp() for those rare cases that should have direct
access to the array.) This allows us to replace this logic with more
complicated macros in the future. Pretty much anything using RX_OFFS() is
going to be broken by future changes, so changing the define allows us to
track it down easily.
Not all use of the rx->offs[] array are converted; some uses are required
for the regex engine internals, but anything outside of the regex engine
should be using the replacement macros, and most things in the regex internals
should use it also.
Diffstat (limited to 'regexp.h')
-rw-r--r-- | regexp.h | 21 |
1 files changed, 16 insertions, 5 deletions
@@ -174,7 +174,18 @@ typedef struct regexp { } regexp; -# define RXp_PAREN_NAMES(rx) ((rx)->paren_names) +#define RXp_PAREN_NAMES(rx) ((rx)->paren_names) + +#define RXp_OFFS_START(rx,n) ((rx)->offs[(n)].start) + +#define RXp_OFFS_END(rx,n) ((rx)->offs[(n)].end) + +#define RXp_OFFS_VALID(rx,n) \ + ( (rx)->offs[(n)].end != -1 && (rx)->offs[(n)].start != -1 ) + +#define RX_OFFS_START(rx_sv,n) RXp_OFFS_START(ReANY(rx_sv),n) +#define RX_OFFS_END(rx_sv,n) RXp_OFFS_END(ReANY(rx_sv),n) +#define RX_OFFS_VALID(rx_sv,n) RXp_OFFS_VALID(ReANY(rx_sv),n) /* used for high speed searches */ typedef struct re_scream_pos_data_s @@ -538,8 +549,8 @@ and check for NULL. # define RXp_SUBOFFSET(prog) (prog->suboffset) # define RX_SUBOFFSET(rx_sv) (RXp_SUBOFFSET(ReANY(rx_sv))) # define RX_SUBCOFFSET(rx_sv) (ReANY(rx_sv)->subcoffset) -# define RXp_OFFS(prog) (prog->offs) -# define RX_OFFS(rx_sv) (RXp_OFFS(ReANY(rx_sv))) +# define RXp_OFFSp(prog) (prog->offs) +# define RX_OFFSp(rx_sv) (RXp_OFFSp(ReANY(rx_sv))) # define RXp_NPARENS(prog) (prog->nparens) # define RX_NPARENS(rx_sv) (RXp_NPARENS(ReANY(rx_sv))) # define RX_SUBLEN(rx_sv) (ReANY(rx_sv)->sublen) @@ -555,8 +566,8 @@ and check for NULL. # define RX_SAVED_COPY(rx_sv) (RXp_SAVED_COPY(ReANY(rx_sv))) /* last match was zero-length */ # define RXp_ZERO_LEN(prog) \ - (RXp_OFFS(prog)[0].start + (SSize_t)RXp_GOFS(prog) \ - == RXp_OFFS(prog)[0].end) + (RXp_OFFS_START(prog,0) + (SSize_t)RXp_GOFS(prog) \ + == RXp_OFFS_END(prog,0)) # define RX_ZERO_LEN(rx_sv) (RXp_ZERO_LEN(ReANY(rx_sv))) #endif /* PLUGGABLE_RE_EXTENSION */ |