Skip to main content

rpat

Struct rpat 

Source
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 the size of the input. Without it, (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: u32

parsfound 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: i32

Port 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§

Source§

impl rpat

Source

pub fn new() -> Self

Trait Implementations§

Source§

impl Clone for rpat

Source§

fn clone(&self) -> rpat

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

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> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> ArchivePointee for T

Source§

type ArchivedMetadata = ()

The archived version of the pointer metadata for this type.
Source§

fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata

Converts some archived metadata to the pointer metadata for itself.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<F, W, T, D> Deserialize<With<T, W>, D> for F
where W: DeserializeWith<F, T, D>, D: Fallible + ?Sized, F: ?Sized,

Source§

fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>

Deserializes using the given deserializer
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> LayoutRaw for T

Source§

fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>

Gets the layout of the type.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The type for metadata in pointers and references to Self.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more