///|
fn chars_string(chars : Array[Char], end : Int) -> String {
let out = StringBuilder()
for i in 0.. String {
if path is "" {
return "."
}
let chars : Array[Char] = path.iter().collect()
let mut end = chars.length()
while end > 1 && chars[end - 1] == '/' {
end -= 1
}
if end == 1 && chars[0] == '/' {
return "/"
}
while end > 0 && chars[end - 1] != '/' {
end -= 1
}
if end == 0 {
return "."
}
while end > 1 && chars[end - 1] == '/' {
end -= 1
}
chars_string(chars, end)
}
///|
async fn main {
let args = @env.args()[1:]
let parsed = @cli.parse(args, [
@cli.flag("zero", short='z'),
@cli.flag("help"),
]) catch {
@cli.CliError(option~, message~, ..) => {
@stdio.stderr.write("dirname: \{message}: '\{option}'\n")
@sys.exit(2)
return
}
}
if parsed.contains("help") {
@stdio.stdout.write("Usage: dirname [-z] NAME...\n")
return
}
let operands = parsed.operands
let zero = parsed.contains("zero")
if operands.is_empty() {
@stdio.stderr.write("dirname: missing operand\n")
@sys.exit(1)
return
}
let separator = if zero { "\u0000" } else { "\n" }
for path in operands {
@stdio.stdout.write(dir_name(path) + separator)
}
}