aboutsummaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp72
1 files changed, 46 insertions, 26 deletions
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<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;
}