Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-01-16 07:18:22 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-01-16 07:18:22 +0400
commita6d9bcd36d6e703b515e4d68dacdc9a0050b3719 (patch)
tree6b88d141fcc86f0e4d53764b10563e608d26506d /source/blender/editors/space_text
parente6e8bd5db42c8bc58aa5f439e2dbe479cb7e9834 (diff)
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 '//'
Diffstat (limited to 'source/blender/editors/space_text')
-rw-r--r--source/blender/editors/space_text/text_format.c29
-rw-r--r--source/blender/editors/space_text/text_format.h7
-rw-r--r--source/blender/editors/space_text/text_format_osl.c12
-rw-r--r--source/blender/editors/space_text/text_format_py.c9
4 files changed, 40 insertions, 17 deletions
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;