diff --git a/core.cpp b/core.cpp index c08b51b..0f931ca 100644 --- a/core.cpp +++ b/core.cpp @@ -274,7 +274,7 @@ list 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; } diff --git a/core.h b/core.h index 2889d13..257cb65 100644 --- a/core.h +++ b/core.h @@ -176,8 +176,10 @@ list 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); @@ -206,6 +208,52 @@ enum LogTarget { LogTarget_count, }; +#define ANSI_INSTRUCTION_FROM_ENUM(ansiCodeEnum) ANSI_INSTRUCTION(ansiCodeEnum) +#define ANSI_INSTRUCTION(ansiCode) "\u001b[" #ansiCode "m" +#define ANSI_INSTRUCTION_STR(ansiCodeStr) "\u001b[" ansiCodeStr "m" +#define ANSI_RESET ANSI_INSTRUCTION(0) + +#define ANSI_fg_black 30 +#define ANSI_fg_red 31 +#define ANSI_fg_green 32 +#define ANSI_fg_yellow 33 +#define ANSI_fg_blue 34 +#define ANSI_fg_magenta 35 +#define ANSI_fg_cyan 36 +#define ANSI_fg_white 37 + +#define ANSI_fg_bblack 90 +#define ANSI_fg_bred 91 +#define ANSI_fg_bgreen 92 +#define ANSI_fg_byellow 93 +#define ANSI_fg_bblue 94 +#define ANSI_fg_bmagenta 95 +#define ANSI_fg_bcyan 96 +#define ANSI_fg_bwhite 97 + +#define ANSI_bg_black 40 +#define ANSI_bg_red 41 +#define ANSI_bg_green 42 +#define ANSI_bg_yellow 43 +#define ANSI_bg_blue 44 +#define ANSI_bg_magenta 45 +#define ANSI_bg_cyan 46 +#define ANSI_bg_white 47 + +#define ANSI_bg_bblack 100 +#define ANSI_bg_bred 101 +#define ANSI_bg_bgreen 102 +#define ANSI_bg_byellow 103 +#define ANSI_bg_bblue 104 +#define ANSI_bg_bmagenta 105 +#define ANSI_bg_bcyan 106 +#define ANSI_bg_bwhite 107 + +#define COLOR_TEXT(text, foregroundcolor) ANSI_INSTRUCTION_FROM_ENUM(foregroundcolor) text ANSI_RESET +#define COLOR_TEXT_BG(text, backgroundcolor) ANSI_INSTRUCTION_FROM_ENUM(backgroundcolor) text ANSI_RESET +#define COLOR_TEXT_FG_BG(text, foregroundcolor, backgroundcolor) ANSI_INSTRUCTION_FROM_ENUM(foregroundcolor) ANSI_INSTRUCTION_FROM_ENUM(backgroundcolor) text ANSI_RESET +#define COLOR_TEXT_RGB(text, red, green, blue) ANSI_INSTRUCTION_STR("38;2;" #red ";" #green ";" #blue) text ANSI_RESET + void log(list l, LogTarget target = LogTarget_stdout); void log(list l, LogTarget target = LogTarget_stdout); void log(const char *fmt, ...);