S8_String Fmt(const char *str, ...) S8__PrintfFormat(1, 2); Array operator+(Array a, Array b) { Array c = a.copy(MA_GetAllocator(Perm)); c.add_array(b); return c; } Array operator+(Array a, S8_String b) { Array c = a.copy(MA_GetAllocator(Perm)); c.add(b); return c; } Array operator+(S8_String a, Array b) { Array c = b.copy(MA_GetAllocator(Perm)); c.insert(a, 0); return c; } Array operator+(S8_String a, S8_String b) { Array c = {MA_GetAllocator(Perm)}; c.add(a); c.add(b); return c; } Array &operator+=(Array &a, Array b) { a.add_array(b); return a; } Array &operator+=(Array &a, S8_String s) { a.add(s); return a; } //@todo: split on any whitespace instead! Array Split(S8_String s, S8_String sep = " ") { S8_List list = S8_Split(Perm, s, sep, 0); Array result = {MA_GetAllocator(Perm)}; S8_For(it, list) result.add(it->string); return result; } S8_String Merge(MA_Arena *arena, Array list, S8_String separator = " "_s) { int64_t char_count = 0; For(list) char_count += it.len; if (char_count == 0) return {}; int64_t node_count = list.len; int64_t base_size = (char_count + 1); int64_t sep_size = (node_count - 1) * separator.len; int64_t size = base_size + sep_size; char *buff = (char *)MA_PushSize(arena, sizeof(char) * (size + 1)); S8_String string = S8_Make(buff, 0); For(list) { IO_Assert(string.len + it.len <= size); MA_MemoryCopy(string.str + string.len, it.str, it.len); string.len += it.len; if (!list.is_last(it)) { MA_MemoryCopy(string.str + string.len, separator.str, separator.len); string.len += separator.len; } } IO_Assert(string.len == size - 1); string.str[size] = 0; return string; } S8_String Merge(Array list, S8_String separator = " ") { return Merge(Perm, list, separator); } S8_String Fmt(const char *str, ...) { S8_FORMAT(Perm, str, str_fmt); return str_fmt; } Array ListDir(char *dir) { Array result = {MA_GetAllocator(Perm)}; for (OS_FileIter it = OS_IterateFiles(Perm, S8_MakeFromChar(dir)); OS_IsValid(it); OS_Advance(&it)) { result.add(S8_Copy(Perm, it.absolute_path)); } return result; } Array CMD_Make(char **argv, int argc) { Array result = {MA_GetAllocator(Perm)}; for (int i = 1; i < argc; i += 1) { S8_String it = S8_MakeFromChar(argv[i]); result.add(it); } return result; } S8_String CMD_Get(Array &cmd, S8_String name, S8_String default_value = "") { For(cmd) { int64_t idx = 0; if (S8_Seek(it, "="_s, 0, &idx)) { S8_String key = S8_GetPrefix(it, idx); S8_String value = S8_Skip(it, idx + 1); if (key == name) { return value; } } } return default_value; } bool CMD_Match(Array &cmd, S8_String name) { For(cmd) { if (it == name) return true; } return false; }