diff --git a/arm9/source/config.c b/arm9/source/config.c index b82e8d5..b532f55 100644 --- a/arm9/source/config.c +++ b/arm9/source/config.c @@ -142,29 +142,55 @@ static int parseDecIntOption(s64 *out, const char *val, s64 minval, s64 maxval) static int parseDecFloatOption(s64 *out, const char *val, s64 minval, s64 maxval) { - char *point = strchrnul(val, '.'); - if (point == val) { + s64 sign = 1;// intPart < 0 ? -1 : 1; + + switch (val[0]) { + case '\0': + return -1; + case '+': + ++val; + break; + case '-': + sign = -1; + ++val; + break; + default: + break; + } + + // Reject "-" and "+" + if (val[0] == '\0') { return -1; } + char *point = strchrnul(val, '.'); + // Parse integer part, then fractional part s64 intPart = 0; s64 fracPart = 0; - int rc = parseDecIntOptionImpl(&intPart, val, point - val, INT64_MIN, INT64_MAX); + int rc = 0; + + if (point == val) { + // e.g. -.5 + if (val[1] == '\0') + return -1; + } + else { + rc = parseDecIntOptionImpl(&intPart, val, point - val, INT64_MIN, INT64_MAX); + } if (rc != 0) { return -1; } - s64 sign = intPart < 0 ? -1 : 1; s64 intPartAbs = sign == -1 ? -intPart : intPart; s64 res = 0; bool of = __builtin_mul_overflow(intPartAbs, FLOAT_CONV_MULT, &res); - + if (of) { return -1; } - + s64 mul = FLOAT_CONV_MULT / 10; // Check if there's a fractional part @@ -173,7 +199,7 @@ static int parseDecFloatOption(s64 *out, const char *val, s64 minval, s64 maxval if (*pos < '0' || *pos > '9') { return -1; } - + res += (*pos - '0') * mul; mul /= 10; } diff --git a/sysmodules/rosalina/source/utils.c b/sysmodules/rosalina/source/utils.c index fa42c48..9bbf055 100644 --- a/sysmodules/rosalina/source/utils.c +++ b/sysmodules/rosalina/source/utils.c @@ -179,8 +179,8 @@ int floatToString(char *out, float f, u32 precision, bool pad) u64 mult = pow10[precision]; double f2 = fabs((double)f) * mult + 0.5; - const char *sign = f2 >= 0.0f ? "" : "-"; u64 f3 = (u64)f2; + const char *sign = (f >= 0.0f || f3 == 0) ? "" : "-"; u64 intPart = f3 / mult; u64 fracPart = f3 % mult; @@ -194,7 +194,7 @@ int floatToString(char *out, float f, u32 precision, bool pad) return n; n += sprintf(out + n, ".%0*llu", (int)precision, fracPart); - + int n2 = n - 1; while (out[n2] == '0') out[n2--] = '\0';