aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-php-shim
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe-php-shim')
-rw-r--r--crates/shirabe-php-shim/src/preg.rs41
1 files changed, 10 insertions, 31 deletions
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<T: AsRef<str>>(
}
pub fn preg_split(pattern: impl PregPattern, subject: &str) -> Vec<String> {
- 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<String> {
+pub fn preg_split_delim_capture(pattern: impl PregPattern, subject: &str) -> Vec<String> {
+ preg_split_impl(pattern, subject, true)
+}
+
+fn preg_split_impl(pattern: impl PregPattern, subject: &str, delim_capture: bool) -> Vec<String> {
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<String> = Vec::new();
- let push = |s: &str, result: &mut Vec<String>| {
- 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
}