pub struct rpat {
pub wbranch_visits: HashMap<usize, Vec<u8>>,
pub patbeginp: [usize; 9],
pub patendp: [usize; 9],
pub captures_set: u32,
pub errsfound: i32,
}Expand description
State accumulated during a single patmatch walk. C uses
per-thread globals (patbeginp[] / patendp[] for captures);
the Rust port encapsulates them in this struct passed by &mut.
Rule D: this struct represents matcher-internal scratch state
(analogous to struct rpat pattrystate at pattern.c:248), not a
bag-of-globals from unrelated subsystems.
C counterpart: struct rpat at pattern.c:248.
Fields§
§wbranch_visits: HashMap<usize, Vec<u8>>Per-P_WBRANCH visit bitmap, keyed by WBRANCH-opcode offset.
Mirrors C’s Upat ptrp (pattern.c:3217): every WBRANCH carries
an 8-byte payload sized as union upat — initialised to NULL,
then lazily filled by patmatch with a buffer the size of the
input string. Each byte tracks “have we already tried this
WBRANCH at this input position with at most this many errors?”.
On revisit at the same position with the same-or-fewer errors,
C returns 0 to bound the recursion (pattern.c:3245-3248). The
Rust port keeps the bitmap on rpat (per-pattry call) instead of
inside the bytecode payload so the bytecode stays read-only —
the key is the WBRANCH offset; the value is a Vec(fo#)# against ANY input that
requires the closure to consume at least one char per iteration
(like “ffo”) burns through PATMATCH_MAX_DEPTH and aborts.
patbeginp: [usize; 9]§patendp: [usize; 9]§captures_set: u32parsfound from Src/pattern.c (per c:2957/c:2989 references).
Two-stripe bitmap: bits 0..NSUBEXP track per-group P_OPEN
first-write (patbeginp[i] committed); bits NSUBEXP..2*NSUBEXP
track per-group P_CLOSE first-write (patendp[i] committed).
Bit n-1 (open) = 1 << (n-1); bit n-1+NSUBEXP (close) =
1 << (n-1+NSUBEXP). Width u32 to fit 2*NSUBEXP = 18 bits.
The prior u16 width with a single-stripe (close-only) bit
allowed P_OPEN to re-overwrite patbeginp[i] on every
backtrack iteration — turning the SECOND capture’s start
offset into the FIRST iteration’s, e.g. (*)-(*) against
hello-world returned match[2] = "hello-world" instead of
the right "world".
errsfound: i32Port of file-static int errsfound from Src/pattern.c:2046.
Cumulative edit-count for approximate-match (#aN). Reset to 0
at the top of each pattry, incremented on P_EXACTLY mismatches
when glob_flags & 0xff > 0 (the substitution-budget byte).
Implementations§
Trait Implementations§
Auto Trait Implementations§
impl Freeze for rpat
impl RefUnwindSafe for rpat
impl Send for rpat
impl Sync for rpat
impl Unpin for rpat
impl UnsafeUnpin for rpat
impl UnwindSafe for rpat
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more