move parse methods to result type

This commit is contained in:
Daniel Ledda
2025-01-23 16:44:51 +01:00
parent 068c41a15d
commit a337c0d9ac
3 changed files with 33 additions and 25 deletions

View File

@@ -274,7 +274,7 @@ list<string> strSplit(Arena *arena, string splitStr, string inputStr) {
return result;
}
int8 parsePositiveInt(string str, size_t *lengthPointer) {
ParsePositiveIntResult parsePositiveInt(string str, size_t *lengthPointer) {
size_t numEnd = 0;
char currChar = str.str[numEnd];
while (numEnd < str.length && isNumeric(currChar)) {
@@ -288,14 +288,14 @@ int8 parsePositiveInt(string str, size_t *lengthPointer) {
result *= 10;
result += str.str[i] - '0';
}
return result;
return {result, true};
} else {
return -1;
return {0, false};
}
}
real32 parsePositiveReal32(string str, size_t *lengthPointer) {
real32 result = NAN;
ParsePositiveReal32Result parsePositiveReal32(string str, size_t *lengthPointer) {
ParsePositiveReal32Result result = {NAN, false};
string wholePartStr = string{0};
string fractionalPartStr = string{0};
@@ -314,16 +314,21 @@ real32 parsePositiveReal32(string str, size_t *lengthPointer) {
c++;
}
if (split) {
int wholePart = parsePositiveInt(wholePartStr, lengthPointer);
ParsePositiveIntResult wholePartParsed = parsePositiveInt(wholePartStr, lengthPointer);
*lengthPointer += 1;
int fractionalPart = parsePositiveInt(fractionalPartStr, lengthPointer);
if (wholePart >= 0 && fractionalPart >= 0) {
ParsePositiveIntResult fractionalPartParsed = parsePositiveInt(fractionalPartStr, lengthPointer);
if (wholePartParsed.valid && fractionalPartParsed.valid) {
// TODO(dledda): implement powf with intrinsics? or just custom
real32 fractionalPartMultiplier = 1.0f / powf(10.0f, (real32)fractionalPartStr.length);
result = (real32)wholePart + (real32)fractionalPart * (real32)fractionalPartMultiplier;
result.result = (real32)wholePartParsed.result + (real32)fractionalPartParsed.result * (real32)fractionalPartMultiplier;
result.valid = true;
}
} else if (c > 0) {
result = (real32)parsePositiveInt(str, lengthPointer);
ParsePositiveIntResult intPartParsed = parsePositiveInt(str, lengthPointer);
if (intPartParsed.valid) {
result.result = (real32)intPartParsed.result;
result.valid = true;
}
}
return result;
}

View File

@@ -176,8 +176,10 @@ list<string> strSplit(Arena *arena, string splitStr, string inputStr);
string strPrintfv(Arena *arena, const char *fmt, va_list args);
string strPrintf(Arena *arena, const char *fmt, ...);
int8 parsePositiveInt(string str, size_t *lengthPointer);
real32 parsePositiveReal32(Arena *arena, string str, size_t *lengthPointer);
struct ParsePositiveIntResult { uint8 result; bool valid; };
ParsePositiveIntResult parsePositiveInt(string str, size_t *lengthPointer);
struct ParsePositiveReal32Result { real32 result; bool valid; };
ParsePositiveReal32Result parsePositiveReal32(Arena *arena, string str, size_t *lengthPointer);
inline function bool isNumeric(char c);