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 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
8
core.h
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user