Browse Source

Merge branch 'master' of https://github.com/odin-lang/Odin

gingerBill 3 years ago
parent
commit
5e30b3eeef
1 changed files with 46 additions and 26 deletions
  1. 46 26
      src/main.cpp

+ 46 - 26
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;
 }