diff --git a/src/main.cpp b/src/main.cpp index 9e35062f2..9269c0963 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -688,35 +688,55 @@ void add_flag(Array *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; }