Fix EvalCommandsLineByLine wholly failing on any error, redesign :Set
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user