diff options
Diffstat (limited to 'source/blender/editors/space_text/text_format.c')
-rw-r--r-- | source/blender/editors/space_text/text_format.c | 75 |
1 files changed, 70 insertions, 5 deletions
diff --git a/source/blender/editors/space_text/text_format.c b/source/blender/editors/space_text/text_format.c index 294f94dd4b7..a8c2de193c4 100644 --- a/source/blender/editors/space_text/text_format.c +++ b/source/blender/editors/space_text/text_format.c @@ -140,6 +140,54 @@ 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; +} +/** + * ascii version of #text_format_fill, + * use when we no the text being stepped over is ascii (as is the case for most keywords) + */ +void text_format_fill_ascii(const char **str_p, char **fmt_p, const char type, const int len) +{ + const char *str = *str_p; + char *fmt = *fmt_p; + + memset(fmt, type, len); + + str += len - 1; + fmt += len - 1; + + BLI_assert(*str != '\0'); + + *str_p = str; + *fmt_p = fmt; +} + /* *** Registration *** */ static ListBase tft_lb = {NULL, NULL}; void ED_text_format_register(TextFormatType *tft) @@ -149,14 +197,31 @@ void ED_text_format_register(TextFormatType *tft) TextFormatType *ED_text_format_get(Text *text) { - /* NOTE: once more types are added we'll need to return some type based on 'text' - * for now this function is more of a placeholder */ + TextFormatType *tft; + + if (text) { + const char *text_ext = strchr(text->id.name + 2, '.'); + if (text_ext) { + text_ext++; /* skip the '.' */ + /* Check all text formats in the static list */ + for (tft = tft_lb.first; tft; tft = tft->next) { + /* All formats should have an ext, but just in case */ + const char **ext; + for (ext = tft->ext; *ext; ext++) { + /* If extension matches text name, return the matching tft */ + if (BLI_strcasecmp(text_ext, *ext) == 0) { + return tft; + } + } + } + } - /* XXX, wrong, but OK for testing */ - if (text && BLI_testextensie(text->id.name + 2, ".osl")) { - return tft_lb.last; + /* If we make it here we never found an extension that worked - return + * the "default" text format */ + return tft_lb.first; } else { + /* Return the "default" text format */ return tft_lb.first; } } |