fix int parsing
This commit is contained in:
31
core.c
31
core.c
@@ -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 result = PushString(arena, 0);
|
||||
for (EachEl(list, string, item)) {
|
||||
@@ -252,7 +256,7 @@ StringList strSplit(Arena *arena, string splitStr, string inputStr) {
|
||||
return result;
|
||||
}
|
||||
|
||||
Int32Result parsePositiveInt(string str) {
|
||||
Int32Result parsePositiveInt32(string str) {
|
||||
size_t numEnd = 0;
|
||||
char currChar = str.str[numEnd];
|
||||
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 result = { .result=NAN, .valid=false};
|
||||
|
||||
@@ -291,8 +314,8 @@ Real32Result parsePositiveReal32(string str) {
|
||||
c++;
|
||||
}
|
||||
if (split) {
|
||||
Int32Result wholePartParsed = parsePositiveInt(wholePartStr);
|
||||
Int32Result fractionalPartParsed = parsePositiveInt(fractionalPartStr);
|
||||
Int32Result wholePartParsed = parsePositiveInt32(wholePartStr);
|
||||
Int32Result fractionalPartParsed = parsePositiveInt32(fractionalPartStr);
|
||||
if (wholePartParsed.valid && fractionalPartParsed.valid) {
|
||||
// TODO(dledda): implement powf with intrinsics? or just custom
|
||||
real32 fractionalPartMultiplier = 1.0f / powf(10.0f, (real32)fractionalPartStr.length);
|
||||
@@ -300,7 +323,7 @@ Real32Result parsePositiveReal32(string str) {
|
||||
result.valid = true;
|
||||
}
|
||||
} else if (c > 0) {
|
||||
Int32Result intPartParsed = parsePositiveInt(str);
|
||||
Int32Result intPartParsed = parsePositiveInt32(str);
|
||||
if (intPartParsed.valid) {
|
||||
result.result = (real32)intPartParsed.result;
|
||||
result.valid = true;
|
||||
|
||||
8
core.h
8
core.h
@@ -229,6 +229,7 @@ bool strContains(string a, string b);
|
||||
|
||||
string strReverse(Arena *arena, string str);
|
||||
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);
|
||||
StringList strSplit(Arena *arena, string splitStr, string inputStr);
|
||||
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
|
||||
|
||||
DefineResult(int32, Int32);
|
||||
Int32Result parsePositiveInt(string str);
|
||||
|
||||
Int32Result parsePositiveInt32(string str);
|
||||
DefineResult(int64, Int64);
|
||||
Int64Result parsePositiveInt64(string str);
|
||||
DefineResult(real32, Real32);
|
||||
Real32Result parsePositiveReal32(string str);
|
||||
|
||||
inline function bool isNumeric(char c);
|
||||
|
||||
// ### Cmdline ###
|
||||
StringList getArgs(Arena *arena, int argc, char **argv);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user