1#include "include/pw.h"
2#include "include/pwlib/path.h"
3
4[[nodiscard]] bool _pw_path_va(PwValuePtr result, ...)
5{
6 PwValue parts = PW_NULL;
7 if (!pw_create_array(&parts)) {
8 return false;
9 }
10 bool abspath = false;
11 va_list ap;
12 va_start(ap);
13 for (unsigned i = 0;; i++) {
14 PwValue arg = va_arg(ap, _PwValue);
15 if (pw_is_status(&arg)) {
16 if (pw_is_va_end(&arg)) {
17 break;
18 }
19 _pw_destroy_args(ap);
20 va_end(ap);
21 pw_set_status(pw_clone(&arg));
22 return false;
23 }
24 if (pw_is_string(&arg) && pw_strlen(&arg)) {
25 if (i == 0 && pw_equal(&arg, "/")) {
26 abspath = true;
27 } else if (!pw_array_append(&parts, &arg)) {
28 _pw_destroy_args(ap);
29 va_end(ap);
30 return false;
31 }
32 }
33 }
34 va_end(ap);
35
36 if (abspath) {
37 // insert empty element so the result would start with slash after joining
38 PwValue root = PW_STRING();
39 if (!pw_array_insert(&parts, 0, &root)) {
40 return false;
41 }
42 if (pw_array_length(&parts) == 1) {
43 // the only element in `parts` is empty string, add yet another empty string for joining
44 if (!pw_array_append(&parts, &root)) {
45 return false;
46 }
47 }
48 }
49 return pw_array_join(&parts, '/', result);
50}