mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-02 04:38:16 +00:00
Merge pull request #1194 from Kelimion/define
Allow `-define:name=string`.
This commit is contained in:
+46
-26
@@ -688,35 +688,55 @@ void add_flag(Array<BuildFlag> *build_flags, BuildFlagKind kind, String name, Bu
|
|||||||
|
|
||||||
ExactValue build_param_to_exact_value(String name, String param) {
|
ExactValue build_param_to_exact_value(String name, String param) {
|
||||||
ExactValue value = {};
|
ExactValue value = {};
|
||||||
if (str_eq_ignore_case(param, str_lit("t")) ||
|
|
||||||
str_eq_ignore_case(param, str_lit("true"))) {
|
/*
|
||||||
value = exact_value_bool(true);
|
Bail out on an empty param string
|
||||||
} else if (str_eq_ignore_case(param, str_lit("f")) ||
|
*/
|
||||||
str_eq_ignore_case(param, str_lit("false"))) {
|
if (param.len == 0) {
|
||||||
value = exact_value_bool(false);
|
|
||||||
} else if (param.len > 0) {
|
|
||||||
if (param[0] == '"') {
|
|
||||||
value = exact_value_string(param);
|
|
||||||
if (value.kind == ExactValue_String) {
|
|
||||||
String s = value.value_string;
|
|
||||||
if (s.len > 1 && s[0] == '"' && s[s.len-1] == '"') {
|
|
||||||
value.value_string = substring(s, 1, s.len-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (param[0] == '-' || param[0] == '+' || gb_is_between(param[0], '0', '9')) {
|
|
||||||
if (string_contains_char(param, '.')) {
|
|
||||||
value = exact_value_float_from_string(param);
|
|
||||||
} else {
|
|
||||||
value = exact_value_integer_from_string(param);
|
|
||||||
}
|
|
||||||
if (value.kind == ExactValue_Invalid) {
|
|
||||||
gb_printf_err("Invalid flag parameter for '%.*s' = '%.*s'\n", LIT(name), LIT(param));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gb_printf_err("Invalid flag parameter for '%.*s' = '%.*s'\n", LIT(name), LIT(param));
|
gb_printf_err("Invalid flag parameter for '%.*s' = '%.*s'\n", LIT(name), LIT(param));
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Attempt to parse as bool first.
|
||||||
|
*/
|
||||||
|
if (str_eq_ignore_case(param, str_lit("t")) || str_eq_ignore_case(param, str_lit("true"))) {
|
||||||
|
return exact_value_bool(true);
|
||||||
|
}
|
||||||
|
if (str_eq_ignore_case(param, str_lit("f")) || str_eq_ignore_case(param, str_lit("false"))) {
|
||||||
|
return exact_value_bool(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Try to parse as an integer or float
|
||||||
|
*/
|
||||||
|
if (param[0] == '-' || param[0] == '+' || gb_is_between(param[0], '0', '9')) {
|
||||||
|
if (string_contains_char(param, '.')) {
|
||||||
|
value = exact_value_float_from_string(param);
|
||||||
|
} else {
|
||||||
|
value = exact_value_integer_from_string(param);
|
||||||
|
}
|
||||||
|
if (value.kind != ExactValue_Invalid) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Treat the param as a string literal,
|
||||||
|
optionally be quoted in '' to avoid being parsed as a bool, integer or float.
|
||||||
|
*/
|
||||||
|
value = exact_value_string(param);
|
||||||
|
|
||||||
|
if (param[0] == '\'' && value.kind == ExactValue_String) {
|
||||||
|
String s = value.value_string;
|
||||||
|
if (s.len > 1 && s[0] == '\'' && s[s.len-1] == '\'') {
|
||||||
|
value.value_string = substring(s, 1, s.len-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.kind != ExactValue_String) {
|
||||||
|
gb_printf_err("Invalid flag parameter for '%.*s' = '%.*s'\n", LIT(name), LIT(param));
|
||||||
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user