mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-31 18:32:12 +00:00
Merge pull request #1194 from Kelimion/define
Allow `-define:name=string`.
This commit is contained in:
72
src/main.cpp
72
src/main.cpp
@@ -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 value = {};
|
||||
if (str_eq_ignore_case(param, str_lit("t")) ||
|
||||
str_eq_ignore_case(param, str_lit("true"))) {
|
||||
value = exact_value_bool(true);
|
||||
} else if (str_eq_ignore_case(param, str_lit("f")) ||
|
||||
str_eq_ignore_case(param, str_lit("false"))) {
|
||||
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 {
|
||||
|
||||
/*
|
||||
Bail out on an empty param string
|
||||
*/
|
||||
if (param.len == 0) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user