diff --git a/src/code.c b/src/code.c index 323df9b..9ce9122 100644 --- a/src/code.c +++ b/src/code.c @@ -404,6 +404,8 @@ static bool isWord(char symbol) {return isLetter(symbol) || isNumber(symbol);} #include +static inline bool islineend(char c) {return c == '\n' || c == '\0';} + static void parse(const char* start, u8* color) { const char* ptr = start; @@ -411,6 +413,7 @@ static void parse(const char* start, u8* color) const char* blockCommentStart = NULL; const char* blockStringStart = NULL; const char* singleCommentStart = NULL; + const char* numberStart = NULL; static const char BlockCommentStart[] = "--[["; static const char BlockCommentEnd[] = "]]"; @@ -460,11 +463,57 @@ static void parse(const char* start, u8* color) } else if(singleCommentStart) { - while(*ptr != '\0' && *ptr != '\n')ptr++; + while(!islineend(*ptr))ptr++; memset(color + (singleCommentStart - start), getConfig()->theme.code.comment, ptr - singleCommentStart); singleCommentStart = NULL; } + else if(numberStart) + { + bool digit = true; + while(!islineend(*ptr)) + { + char c = *ptr; + + if(isdigit(c)) + { + ptr++; + } + else if(numberStart[0] == '0' && (numberStart[1] == 'x' || numberStart[1] == 'X')) + { + if(ptr - numberStart <= 2) + { + ptr++; + } + else if(ptr - numberStart > 2 && isxdigit(c)) + { + ptr++; + } + else + { + digit = false; + break; + } + } + else if(c == '.' || c == 'e') + { + if(isdigit(ptr[1])) + ptr++; + else break; + } + else if(isalpha(c) || c == '_') + { + digit = false; + break; + } + else break; + } + + if(digit) + memset(color + (numberStart - start), getConfig()->theme.code.number, ptr - numberStart); + + numberStart = NULL; + } else { s32 blockCommentStartSize = strlen(BlockCommentStart); @@ -494,7 +543,12 @@ static void parse(const char* start, u8* color) } else { - // do other stuff + if(isdigit(c) || (c == '.' && isdigit(ptr[1]))) + { + numberStart = ptr; + ptr += 1; + continue; + } } } }