From 704ba2d87733657dea852fa697fc6d23a961a71b Mon Sep 17 00:00:00 2001 From: nsfisis Date: Mon, 17 Aug 2026 04:18:59 +0900 Subject: refactor(preg): replace Preg::split*() with shim preg_split*() preg_split2()'s limit was always -1 and its flags were always either 0 or PREG_SPLIT_DELIM_CAPTURE alone, so both arguments are gone: the shim now exposes preg_split() and preg_split_delim_capture() over a shared preg_split_impl(). That leaves Preg::split()/split4() as bare pass-throughs, so callers use the shim functions directly and the wrappers are dropped along with the now-unreferenced PREG_SPLIT_* constants. Co-Authored-By: Claude Opus 5 (1M context) --- crates/shirabe-php-shim/src/preg.rs | 41 +++++++++---------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) (limited to 'crates/shirabe-php-shim/src') diff --git a/crates/shirabe-php-shim/src/preg.rs b/crates/shirabe-php-shim/src/preg.rs index c762cb95..6d70c717 100644 --- a/crates/shirabe-php-shim/src/preg.rs +++ b/crates/shirabe-php-shim/src/preg.rs @@ -5,9 +5,6 @@ pub const PREG_PATTERN_ORDER: i64 = 1; pub const PREG_SET_ORDER: i64 = 2; pub const PREG_OFFSET_CAPTURE: i64 = 256; pub const PREG_UNMATCHED_AS_NULL: i64 = 512; -pub const PREG_SPLIT_NO_EMPTY: i64 = 1; -pub const PREG_SPLIT_DELIM_CAPTURE: i64 = 2; -pub const PREG_SPLIT_OFFSET_CAPTURE: i64 = 4; #[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)] pub enum CaptureKey { @@ -208,52 +205,34 @@ pub fn preg_grep>( } pub fn preg_split(pattern: impl PregPattern, subject: &str) -> Vec { - preg_split2(pattern, subject, -1, 0) + preg_split_impl(pattern, subject, false) } -pub fn preg_split2( - pattern: impl PregPattern, - subject: &str, - limit: i64, - flags: i64, -) -> Vec { +pub fn preg_split_delim_capture(pattern: impl PregPattern, subject: &str) -> Vec { + preg_split_impl(pattern, subject, true) +} + +fn preg_split_impl(pattern: impl PregPattern, subject: &str, delim_capture: bool) -> Vec { let __resolved = pattern.resolve(); let (re, _anchored) = __resolved.parts(); - let no_empty = flags & PREG_SPLIT_NO_EMPTY != 0; - let delim_capture = flags & PREG_SPLIT_DELIM_CAPTURE != 0; - // `limit` counts the resulting pieces; a non-positive value means no limit. - let max_delims = if limit > 0 { - (limit as usize).saturating_sub(1) - } else { - usize::MAX - }; let mut result: Vec = Vec::new(); - let push = |s: &str, result: &mut Vec| { - if !(no_empty && s.is_empty()) { - result.push(s.to_string()); - } - }; - let mut last = 0usize; - for (delims, caps) in re.captures_iter(subject).enumerate() { - if delims >= max_delims { - break; - } + for caps in re.captures_iter(subject) { let m = caps.get(0).unwrap(); - push(&subject[last..m.start()], &mut result); + result.push(subject[last..m.start()].to_string()); if delim_capture { // Mirror preg_match: trailing unmatched groups are dropped, interior // unmatched groups are emitted as "". if let Some(last_g) = (1..caps.len()).rev().find(|&g| caps.get(g).is_some()) { for g in 1..=last_g { - push(caps.get(g).map(|x| x.as_str()).unwrap_or(""), &mut result); + result.push(caps.get(g).map(|x| x.as_str()).unwrap_or("").to_string()); } } } last = m.end(); } - push(&subject[last..], &mut result); + result.push(subject[last..].to_string()); result } -- cgit v1.3.1-4-g156e