diff --git a/core.c b/core.c index 6894c14..ff4f378 100644 --- a/core.c +++ b/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; diff --git a/core.h b/core.h index a9dfa52..e5315b0 100644 --- a/core.h +++ b/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);