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}