From a6d9bcd36d6e703b515e4d68dacdc9a0050b3719 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 16 Jan 2013 03:18:22 +0000 Subject: text syntax highlighting, add utility function 'text_format_fill()' which fills in the line with a formatting value. this fixes a mistake in OSL lexer which would comment all lines after '//' --- source/blender/editors/space_text/text_format.c | 29 ++++++++++++++++++++++ source/blender/editors/space_text/text_format.h | 7 +++--- .../blender/editors/space_text/text_format_osl.c | 12 +++------ source/blender/editors/space_text/text_format_py.c | 9 +++---- 4 files changed, 40 insertions(+), 17 deletions(-) (limited to 'source/blender/editors/space_text') diff --git a/source/blender/editors/space_text/text_format.c b/source/blender/editors/space_text/text_format.c index 294f94dd4b7..91e1376ee28 100644 --- a/source/blender/editors/space_text/text_format.c +++ b/source/blender/editors/space_text/text_format.c @@ -140,6 +140,35 @@ int text_check_format_len(TextLine *line, unsigned int len) return 1; } +/** + * Fill the string with formatting constant, + * advancing \a str_p and \a fmt_p + * + * \param len length in bytes + */ +void text_format_fill(const char **str_p, char **fmt_p, const char type, const int len) +{ + const char *str = *str_p; + char *fmt = *fmt_p; + int i = 0; + + while (i < len) { + const int size = BLI_str_utf8_size_safe(str); + *fmt++ = type; + + str += size; + i += size; + } + + str--; + fmt--; + + BLI_assert(*str != '\0'); + + *str_p = str; + *fmt_p = fmt; +} + /* *** Registration *** */ static ListBase tft_lb = {NULL, NULL}; void ED_text_format_register(TextFormatType *tft) diff --git a/source/blender/editors/space_text/text_format.h b/source/blender/editors/space_text/text_format.h index e593e41d42c..f19616a9947 100644 --- a/source/blender/editors/space_text/text_format.h +++ b/source/blender/editors/space_text/text_format.h @@ -49,18 +49,17 @@ enum { FMT_CONT_TRIPLE = (1 << 2), /* triplets of quotes: """ or ''' */ FMT_CONT_QUOTESINGLE_TRIPLE = (FMT_CONT_TRIPLE | FMT_CONT_QUOTESINGLE), FMT_CONT_QUOTEDOUBLE_TRIPLE = (FMT_CONT_TRIPLE | FMT_CONT_QUOTEDOUBLE), - FMT_CONT_COMMENT_C = (1 << 3), /* multi-line comments, OSL only (C style) */ - FMT_CONT_COMMENT_CXX = (1 << 4), /* single-line comments, OSL only (C++ style) */ + FMT_CONT_COMMENT_C = (1 << 3) /* multi-line comments, OSL only (C style) */ }; #define FMT_CONT_ALL \ - (FMT_CONT_QUOTESINGLE | FMT_CONT_QUOTEDOUBLE | FMT_CONT_TRIPLE | FMT_CONT_COMMENT_C | FMT_CONT_COMMENT_CXX) + (FMT_CONT_QUOTESINGLE | FMT_CONT_QUOTEDOUBLE | FMT_CONT_TRIPLE | FMT_CONT_COMMENT_C) int flatten_string(struct SpaceText *st, FlattenString *fs, const char *in); void flatten_string_free(FlattenString *fs); int flatten_string_strlen(FlattenString *fs, const char *str); int text_check_format_len(TextLine *line, unsigned int len); - +void text_format_fill(const char **str_p, char **fmt_p, const char type, const int len); /* *** Generalize Formatting *** */ typedef struct TextFormatType { diff --git a/source/blender/editors/space_text/text_format_osl.c b/source/blender/editors/space_text/text_format_osl.c index 3120e88163e..26bb5f66cef 100644 --- a/source/blender/editors/space_text/text_format_osl.c +++ b/source/blender/editors/space_text/text_format_osl.c @@ -228,10 +228,7 @@ static void txtfmt_osl_format_line(SpaceText *st, TextLine *line, const int do_n /* Handle continuations */ else if (cont) { /* C-Style comments */ - if (cont & FMT_CONT_COMMENT_CXX) { - *fmt = FMT_TYPE_COMMENT; - } - else if (cont & FMT_CONT_COMMENT_C) { + if (cont & FMT_CONT_COMMENT_C) { if (*str == '*' && *(str + 1) == '/') { *fmt = FMT_TYPE_COMMENT; fmt++; str++; *fmt = FMT_TYPE_COMMENT; @@ -254,8 +251,8 @@ static void txtfmt_osl_format_line(SpaceText *st, TextLine *line, const int do_n else { /* Deal with comments first */ if (*str == '/' && *(str + 1) == '/') { - cont = FMT_CONT_COMMENT_CXX; - *fmt = FMT_TYPE_COMMENT; + /* fill the remaining line */ + text_format_fill(&str, &fmt, FMT_TYPE_COMMENT, len - (int)(str - fs.buf)); } /* C-Style (multi-line) comments */ else if (*str == '/' && *(str + 1) == '*') { @@ -298,8 +295,7 @@ static void txtfmt_osl_format_line(SpaceText *st, TextLine *line, const int do_n else if ((i = txtfmt_osl_find_preprocessor(str)) != -1) prev = FMT_TYPE_DIRECTIVE; if (i > 0) { - memset(fmt, prev, i); - i--; fmt += i; str += i; + text_format_fill(&str, &fmt, prev, i); } else { str += BLI_str_utf8_size_safe(str) - 1; diff --git a/source/blender/editors/space_text/text_format_py.c b/source/blender/editors/space_text/text_format_py.c index cbccc6a770f..cd9d45c5b0e 100644 --- a/source/blender/editors/space_text/text_format_py.c +++ b/source/blender/editors/space_text/text_format_py.c @@ -231,9 +231,9 @@ static void txtfmt_py_format_line(SpaceText *st, TextLine *line, const int do_ne /* Not in a string... */ else { /* Deal with comments first */ - if (prev == FMT_TYPE_COMMENT || *str == '#') { - *fmt = FMT_TYPE_COMMENT; - str += BLI_str_utf8_size_safe(str) - 1; + if (*str == '#') { + /* fill the remaining line */ + text_format_fill(&str, &fmt, prev, len - (int)(str - fs.buf)); } else if (*str == '"' || *str == '\'') { /* Strings */ @@ -285,8 +285,7 @@ static void txtfmt_py_format_line(SpaceText *st, TextLine *line, const int do_ne else if ((i = txtfmt_py_find_decorator(str)) != -1) prev = FMT_TYPE_DIRECTIVE; if (i > 0) { - memset(fmt, prev, i); - i--; fmt += i; str += i; + text_format_fill(&str, &fmt, prev, i); } else { str += BLI_str_utf8_size_safe(str) - 1; -- cgit v1.2.3