///|
fn normalize_path(pathname : String) -> String {
let buf = StringBuilder(size_hint=pathname.length())
for i in 0.. Array[String] {
let segments = []
if pathname.is_empty() {
return segments
}
let text = if ends_with_slash(pathname) {
pathname[:pathname.length() - 1].to_owned()
} else {
pathname
}
if text.is_empty() {
return segments
}
let mut start = 0
for i in 0.. start {
segments.push(text[start:i].to_owned())
}
start = i + 1
}
}
if start < text.length() {
segments.push(text[start:].to_owned())
}
segments
}
///|
fn join_segments(segments : Array[String], start : Int, end_ : Int) -> String {
if start >= end_ {
return ""
}
let buf = StringBuilder(size_hint=0)
for i in start.. start {
buf.write_char('/')
}
buf.write_string(segments[i])
}
buf.to_string()
}
///|
fn ends_with_slash(text : String) -> Bool {
!text.is_empty() &&
text.code_unit_at(text.length() - 1) == '/'.to_int().to_uint16()
}
///|
fn is_windows_abs(pathname : String) -> Bool {
pathname =~ re"^[a-zA-Z]:[\\/]"
}