diff options
author | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2015-03-09 17:38:40 +0100 |
---|---|---|
committer | Robin Haberkorn <robin.haberkorn@googlemail.com> | 2015-03-09 21:24:52 +0100 |
commit | 10e4e27ccce8f6a7da7c2e6c4aa62193c4426cda (patch) | |
tree | 3954724a9d9a020186cb373b82d194cebd993641 /src/string-utils.cpp | |
parent | 76d0548608dc3fbb8d6b9161be6809c05605b610 (diff) | |
download | sciteco-10e4e27ccce8f6a7da7c2e6c4aa62193c4426cda.tar.gz |
fixed displaying of control characters in the "info" line (and window title)
* this relied on Curses' control character drawing on Curses.
However it treats tab and line feed differently than other
control characters, so registers like "^Mfoo" could not be displayed
properly.
Even if we can configure Curses to display them correctly, we need
a "canonicalized", flat form of strings for other purposes (like setting
window titles. This is form is different from the formatting used
for command lines which may change anyway once we introduce Scintilla
mini buffers.
* therefore String::canonicalize_ctl() was introduced
* also set window title on PDCurses
Diffstat (limited to 'src/string-utils.cpp')
-rw-r--r-- | src/string-utils.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/string-utils.cpp b/src/string-utils.cpp index 6481765..7da9875 100644 --- a/src/string-utils.cpp +++ b/src/string-utils.cpp @@ -21,10 +21,46 @@ #include <glib.h> +#include "sciteco.h" #include "string-utils.h" namespace SciTECO { +/** + * Canonicalize control characters in str. + * This converts all control characters to printable + * characters without tabs, line feeds, etc. + * Useful for displaying Q-Register names and + * TECO code. + */ +gchar * +String::canonicalize_ctl(const gchar *str) +{ + gsize ret_len = 1; /* for trailing 0 */ + gchar *ret, *p; + + /* + * Instead of approximating size with strlen() + * we can just as well calculate it exactly: + */ + for (const gchar *p = str; *p; p++) + ret_len += IS_CTL(*p) ? 2 : 1; + + p = ret = (gchar *)g_malloc(ret_len); + + while (*str) { + if (IS_CTL(*str)) { + *p++ = '^'; + *p++ = CTL_ECHO(*str++); + } else { + *p++ = *str++; + } + } + *p = '\0'; + + return ret; +} + void String::get_coord(const gchar *str, gint pos, gint &line, gint &column) |