Fix EvalCommandsLineByLine wholly failing on any error, redesign :Set

This commit is contained in:
Krzosa Karol
2026-01-03 14:48:27 +01:00
parent da96fb847c
commit bfcab9b3c3
7 changed files with 235 additions and 226 deletions

View File

@@ -339,6 +339,22 @@ API Array<String> Split(Allocator allocator, String string, String delimiter) {
return result;
}
API Array<String> SplitWhitespace(Allocator allocator, String string) {
Array<String> result = {allocator};
String it = {string.data, 0};
for (int64_t i = 0; i < string.len; i += 1) {
if (IsWhitespace(string[i])) {
if (it.len) Add(&result, it);
it.len = 0;
it.data = string.data + (i + 1);
} else {
it.len += 1;
}
}
if (it.len) Add(&result, it);
return result;
}
API String Merge(Allocator allocator, Array<String> list, String separator) {
int64_t char_count = 0;
For(list) char_count += it.len;
@@ -441,3 +457,58 @@ API Int ChopNumber(String *string) {
Int result = strtoll(col.data, NULL, 10) - 1;
return result;
}
String SkipIdent(String *string) {
String begin = {string->data, 0};
if (IsIdent(At(*string, 0))) {
for (;string->len;) {
char c = At(*string, 0);
if (!IsIdent(c) && !IsDigit(c)) {
break;
}
*string = Skip(*string, 1);
begin.len += 1;
}
}
return begin;
}
String SkipString(String *string) {
String saved_string = *string;
char c = At(*string, 0);
String q = {&c, 1};
if (c == '"' || c == '\'') {
*string = Skip(*string, 1);
String quote = SkipUntil(string, q);
if (At(*string, 0) != c) {
*string = saved_string;
return {};
}
return quote;
}
return {};
}
API String SkipFloatEx(String *string) {
String col = {string->data, 0};
if (At(*string, 0) == '-') {
col.len += 1;
*string = Skip(*string, 1);
}
for (int64_t i = 0; i < string->len; i += 1) {
if (IsDigit(string->data[i]) || string->data[i] == u'.') {
col.len += 1;
} else {
break;
}
}
*string = Skip(*string, col.len);
return col;
}
API Float SkipFloat(String *string) {
String col = SkipFloatEx(string);
if (col.len == 0) return 0;
Float result = strtod(string->data, NULL);
return result;
}