fix int parsing

This commit is contained in:
Daniel Ledda
2025-12-25 14:05:03 +01:00
parent b39bcc6513
commit 3f3ef5351f
2 changed files with 31 additions and 8 deletions

31
core.c
View File

@@ -176,6 +176,10 @@ string strSlice(string str, size_t start, size_t stop) {
}; };
} }
inline string strChopStart(string str, size_t start) {
return strSlice(str, start, str.length);
}
string strListJoin(Arena *arena, StringList list) { string strListJoin(Arena *arena, StringList list) {
string result = PushString(arena, 0); string result = PushString(arena, 0);
for (EachEl(list, string, item)) { for (EachEl(list, string, item)) {
@@ -252,7 +256,7 @@ StringList strSplit(Arena *arena, string splitStr, string inputStr) {
return result; return result;
} }
Int32Result parsePositiveInt(string str) { Int32Result parsePositiveInt32(string str) {
size_t numEnd = 0; size_t numEnd = 0;
char currChar = str.str[numEnd]; char currChar = str.str[numEnd];
while (numEnd < str.length && isNumeric(currChar)) { while (numEnd < str.length && isNumeric(currChar)) {
@@ -271,6 +275,25 @@ Int32Result parsePositiveInt(string str) {
} }
} }
Int64Result parsePositiveInt64(string str) {
size_t numEnd = 0;
char currChar = str.str[numEnd];
while (numEnd < str.length && isNumeric(currChar)) {
numEnd++;
currChar = str.str[numEnd];
}
if (numEnd > 0) {
uint64 result = 0;
for (size_t i = 0; i < numEnd; i++) {
result *= 10;
result += str.str[i] - '0';
}
return (Int64Result){ .result=result, .valid=true };
} else {
return (Int64Result){ .result=0, .valid=false};
}
}
Real32Result parsePositiveReal32(string str) { Real32Result parsePositiveReal32(string str) {
Real32Result result = { .result=NAN, .valid=false}; Real32Result result = { .result=NAN, .valid=false};
@@ -291,8 +314,8 @@ Real32Result parsePositiveReal32(string str) {
c++; c++;
} }
if (split) { if (split) {
Int32Result wholePartParsed = parsePositiveInt(wholePartStr); Int32Result wholePartParsed = parsePositiveInt32(wholePartStr);
Int32Result fractionalPartParsed = parsePositiveInt(fractionalPartStr); Int32Result fractionalPartParsed = parsePositiveInt32(fractionalPartStr);
if (wholePartParsed.valid && fractionalPartParsed.valid) { if (wholePartParsed.valid && fractionalPartParsed.valid) {
// TODO(dledda): implement powf with intrinsics? or just custom // TODO(dledda): implement powf with intrinsics? or just custom
real32 fractionalPartMultiplier = 1.0f / powf(10.0f, (real32)fractionalPartStr.length); real32 fractionalPartMultiplier = 1.0f / powf(10.0f, (real32)fractionalPartStr.length);
@@ -300,7 +323,7 @@ Real32Result parsePositiveReal32(string str) {
result.valid = true; result.valid = true;
} }
} else if (c > 0) { } else if (c > 0) {
Int32Result intPartParsed = parsePositiveInt(str); Int32Result intPartParsed = parsePositiveInt32(str);
if (intPartParsed.valid) { if (intPartParsed.valid) {
result.result = (real32)intPartParsed.result; result.result = (real32)intPartParsed.result;
result.valid = true; result.valid = true;

8
core.h
View File

@@ -229,6 +229,7 @@ bool strContains(string a, string b);
string strReverse(Arena *arena, string str); string strReverse(Arena *arena, string str);
string strSlice(string str, size_t start, size_t stop); string strSlice(string str, size_t start, size_t stop);
string strChopStart(string str, size_t start);
string strSliceCStr(char *data, size_t start, size_t stop); string strSliceCStr(char *data, size_t start, size_t stop);
StringList strSplit(Arena *arena, string splitStr, string inputStr); StringList strSplit(Arena *arena, string splitStr, string inputStr);
string strPrintfv(Arena *arena, const char *fmt, va_list args); string strPrintfv(Arena *arena, const char *fmt, va_list args);
@@ -245,13 +246,12 @@ string strListJoin(Arena *arena, StringList list);
typedef type prefix ## Result ## _underlying typedef type prefix ## Result ## _underlying
DefineResult(int32, Int32); DefineResult(int32, Int32);
Int32Result parsePositiveInt(string str); Int32Result parsePositiveInt32(string str);
DefineResult(int64, Int64);
Int64Result parsePositiveInt64(string str);
DefineResult(real32, Real32); DefineResult(real32, Real32);
Real32Result parsePositiveReal32(string str); Real32Result parsePositiveReal32(string str);
inline function bool isNumeric(char c);
// ### Cmdline ### // ### Cmdline ###
StringList getArgs(Arena *arena, int argc, char **argv); StringList getArgs(Arena *arena, int argc, char **argv);