Merge pull request #1194 from Kelimion/define

Allow `-define:name=string`.
This commit is contained in:
Jeroen van Rijn
2021-09-25 09:56:51 -07:00
committed by GitHub

View File

@@ -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;
}