1#include "include/pw.h"
 2
 3[[nodiscard]] bool pw_basename(PwValuePtr filename, PwValuePtr result)
 4{
 5    if (!pw_validate(filename, PwTypeId_String)) {
 6        return false;
 7    }
 8    PwValue parts = PW_NULL;
 9    if (!pw_string_rsplit_chr(filename, '/', 1, &parts)) {
10        return false;
11    }
12    return pw_array_item(&parts, -1, result);
13}
14
15[[nodiscard]] bool pw_dirname(PwValuePtr filename, PwValuePtr result)
16{
17    if (!pw_validate(filename, PwTypeId_String)) {
18        return false;
19    }
20    PwValue parts = PW_NULL;
21    if (!pw_string_rsplit_chr(filename, '/', 1, &parts)) {
22        return false;
23    }
24    return pw_array_item(&parts, 0, result);
25}
26
27[[nodiscard]] bool _pw_path_va(PwValuePtr result, ...)
28{
29    PwValue parts = PW_NULL;
30    if (!pw_create_array(&parts)) {
31        return false;
32    }
33    va_list ap;
34    va_start(ap);
35    for (;;) {
36        PwValue arg = va_arg(ap, _PwValue);
37        if (pw_is_status(&arg)) {
38            if (pw_is_va_end(&arg)) {
39                break;
40            }
41            _pw_destroy_args(ap);
42            va_end(ap);
43            pw_set_status(pw_clone(&arg));
44            return false;
45        }
46        if (pw_is_string(&arg)) {
47            if (!pw_array_append(&parts, &arg)) {
48                _pw_destroy_args(ap);
49                va_end(ap);
50                return false;
51            }
52        }
53    }
54    va_end(ap);
55    return pw_array_join(&parts, '/', result);
56}