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}