From b26eb6bd1c91048aa91ab4d7862647e04780e233 Mon Sep 17 00:00:00 2001 From: "BADIM-PC\\Vadim" Date: Thu, 21 Dec 2017 09:09:45 +0300 Subject: [PATCH] #477 added block string [[ string ]] highlight --- src/code.c | 110 ++++++++++++++++++++++++++++------------------------- 1 file changed, 58 insertions(+), 52 deletions(-) diff --git a/src/code.c b/src/code.c index 49ea44a..382f82f 100644 --- a/src/code.c +++ b/src/code.c @@ -198,6 +198,8 @@ typedef struct { const char* blockCommentStart; const char* blockCommentEnd; + const char* blockStringStart; + const char* blockStringEnd; const char* singleCommentStart; const char* const * keywords; @@ -217,6 +219,8 @@ static const SyntaxConfig LuaSyntaxConfig = .blockCommentStart = "--[[", .blockCommentEnd = "]]", .singleCommentStart = "--", + .blockStringStart = "[[", + .blockStringEnd = "]]", .keywords = LuaKeywords, .keywordsCount = COUNT_OF(LuaKeywords), }; @@ -234,8 +238,10 @@ static const char* const MoonKeywords [] = static const SyntaxConfig MoonSyntaxConfig = { - .blockCommentStart = "--[[", - .blockCommentEnd = "]]", + .blockCommentStart = NULL, + .blockCommentEnd = NULL, + .blockStringStart = NULL, + .blockStringEnd = NULL, .singleCommentStart = "--", .keywords = MoonKeywords, .keywordsCount = COUNT_OF(MoonKeywords), @@ -253,6 +259,8 @@ static const SyntaxConfig JsSyntaxConfig = { .blockCommentStart = "/*", .blockCommentEnd = "*/", + .blockStringStart = NULL, + .blockStringEnd = NULL, .singleCommentStart = "//", .keywords = JsKeywords, .keywordsCount = COUNT_OF(JsKeywords), @@ -264,6 +272,7 @@ static void parse(const char* start, u8* color, const SyntaxConfig* config) const char* blockCommentStart = NULL; const char* blockStringStart = NULL; + const char* blockStdStringStart = NULL; const char* singleCommentStart = NULL; const char* wordStart = NULL; const char* numberStart = NULL; @@ -283,18 +292,24 @@ static void parse(const char* start, u8* color, const SyntaxConfig* config) } else if(blockStringStart) { - const char* blockStart = blockStringStart+1; + const char* end = strstr(ptr, config->blockStringEnd); + + ptr = end ? end + strlen(config->blockStringEnd) : blockStringStart + strlen(blockStringStart); + memset(color + (blockStringStart - start), getConfig()->theme.code.string, ptr - blockStringStart); + blockStringStart = NULL; + continue; + } + else if(blockStdStringStart) + { + const char* blockStart = blockStdStringStart+1; while(true) { - const char* pos = strchr(blockStart, *blockStringStart); + const char* pos = strchr(blockStart, *blockStdStringStart); if(pos) { - if(*(pos-1) == '\\' && *(pos-2) != '\\') - { - blockStart = pos + 1; - } + if(*(pos-1) == '\\' && *(pos-2) != '\\') blockStart = pos + 1; else { ptr = pos + 1; @@ -303,13 +318,13 @@ static void parse(const char* start, u8* color, const SyntaxConfig* config) } else { - ptr = blockStringStart + strlen(blockStringStart); + ptr = blockStdStringStart + strlen(blockStdStringStart); break; } } - memset(color + (blockStringStart - start), getConfig()->theme.code.string, ptr - blockStringStart); - blockStringStart = NULL; + memset(color + (blockStdStringStart - start), getConfig()->theme.code.string, ptr - blockStdStringStart); + blockStdStringStart = NULL; continue; } else if(singleCommentStart) @@ -379,53 +394,44 @@ static void parse(const char* start, u8* color, const SyntaxConfig* config) } else { - s32 blockCommentStartSize = strlen(config->blockCommentStart); - if(c == config->blockCommentStart[0] && memcmp(ptr, config->blockCommentStart, blockCommentStartSize) == 0) + if(config->blockCommentStart && memcmp(ptr, config->blockCommentStart, strlen(config->blockCommentStart)) == 0) { blockCommentStart = ptr; - ptr += blockCommentStartSize; + ptr += strlen(config->blockCommentStart); continue; } - else + if(config->blockStringStart && memcmp(ptr, config->blockStringStart, strlen(config->blockStringStart)) == 0) { - if(c == '"' || c == '\'') - { - blockStringStart = ptr; - ptr++; - continue; - } - else - { - s32 singleCommentStartSize = strlen(config->singleCommentStart); - - if(c == config->singleCommentStart[0] && memcmp(ptr, config->singleCommentStart, singleCommentStartSize) == 0) - { - singleCommentStart = ptr; - ptr += singleCommentStartSize; - continue; - } - else - { - if(isalpha_(c)) - { - wordStart = ptr; - ptr++; - continue; - } - else - { - if(isdigit(c) || (c == '.' && isdigit(ptr[1]))) - { - numberStart = ptr; - ptr++; - continue; - } - else if(ispunct(c)) - color[ptr - start] = getConfig()->theme.code.sign; - } - } - } + blockStringStart = ptr; + ptr += strlen(config->blockStringStart); + continue; } + else if(c == '"' || c == '\'') + { + blockStdStringStart = ptr; + ptr++; + continue; + } + else if(config->singleCommentStart && memcmp(ptr, config->singleCommentStart, strlen(config->singleCommentStart)) == 0) + { + singleCommentStart = ptr; + ptr += strlen(config->singleCommentStart); + continue; + } + else if(isalpha_(c)) + { + wordStart = ptr; + ptr++; + continue; + } + else if(isdigit(c) || (c == '.' && isdigit(ptr[1]))) + { + numberStart = ptr; + ptr++; + continue; + } + else if(ispunct(c)) color[ptr - start] = getConfig()->theme.code.sign; + else if(iscntrl(c)) color[ptr - start] = getConfig()->theme.code.other; } if(!c) break;