diff options
author | nicm <nicm> | 2018-08-19 19:03:46 +0000 |
---|---|---|
committer | nicm <nicm> | 2018-08-19 19:03:46 +0000 |
commit | d95fad3d5f945c8047cd35de65cf59c60499f306 (patch) | |
tree | c3d11365613eff899dfc65f47aa699b76c63f8dc | |
parent | 88327c7698fc45a16d1a5235d71a078d419febb4 (diff) | |
download | rtmux-d95fad3d5f945c8047cd35de65cf59c60499f306.tar.gz rtmux-d95fad3d5f945c8047cd35de65cf59c60499f306.tar.bz2 rtmux-d95fad3d5f945c8047cd35de65cf59c60499f306.zip |
Expand \u and \U escape sequences in command strings, from Christopher
Hunt in GitHub issue 1443.
-rw-r--r-- | cmd-string.c | 39 | ||||
-rw-r--r-- | window-tree.c | 1 |
2 files changed, 33 insertions, 7 deletions
diff --git a/cmd-string.c b/cmd-string.c index 9c8f10c1..440a0231 100644 --- a/cmd-string.c +++ b/cmd-string.c @@ -54,6 +54,22 @@ cmd_string_ungetc(size_t *p) (*p)--; } +static int +cmd_string_unicode(wchar_t *wc, const char *s, size_t *p, char ch) +{ + int size = (ch == 'u') ? 4 : 8; + u_int tmp; + + if (size == 4 && sscanf(s + *p, "%4x", &tmp) != 1) + return (-1); + if (size == 8 && sscanf(s + *p, "%8x", &tmp) != 1) + return (-1); + *p += size; + + *wc = (wchar_t)tmp; + return (0); +} + int cmd_string_split(const char *s, int *rargc, char ***rargv) { @@ -191,12 +207,11 @@ cmd_string_copy(char **dst, char *src, size_t *len) static char * cmd_string_string(const char *s, size_t *p, char endch, int esc) { - int ch; - char *buf, *t; - size_t len; - - buf = NULL; - len = 0; + int ch; + wchar_t wc; + struct utf8_data ud; + char *buf = NULL, *t; + size_t len = 0; while ((ch = cmd_string_getc(s, p)) != endch) { switch (ch) { @@ -220,6 +235,18 @@ cmd_string_string(const char *s, size_t *p, char endch, int esc) case 't': ch = '\t'; break; + case 'u': + case 'U': + if (cmd_string_unicode(&wc, s, p, ch) != 0) + goto error; + if (utf8_split(wc, &ud) != UTF8_DONE) + goto error; + if (len >= SIZE_MAX - ud.size - 1) + goto error; + buf = xrealloc(buf, len + ud.size); + memcpy(buf + len, ud.data, ud.size); + len += ud.size; + continue; } break; case '$': diff --git a/window-tree.c b/window-tree.c index 52ab195e..2eb31612 100644 --- a/window-tree.c +++ b/window-tree.c @@ -461,7 +461,6 @@ window_tree_build(void *modedata, u_int sort_type, uint64_t *tag, } } - static void window_tree_draw_label(struct screen_write_ctx *ctx, u_int px, u_int py, u_int sx, u_int sy, const struct grid_cell *gc, const char *label) |