diff options
author | nicm <nicm> | 2019-05-29 10:08:36 +0000 |
---|---|---|
committer | nicm <nicm> | 2019-05-29 10:08:36 +0000 |
commit | a4424fbebf929f4ad742200365fc330a26a65d7f (patch) | |
tree | ca1fe1736e695e02ad075ac6079dc96b3ab6f145 | |
parent | 580cd16f4c3474d7cae867b9b24f01665a268e9d (diff) | |
download | rtmux-a4424fbebf929f4ad742200365fc330a26a65d7f.tar.gz rtmux-a4424fbebf929f4ad742200365fc330a26a65d7f.tar.bz2 rtmux-a4424fbebf929f4ad742200365fc330a26a65d7f.zip |
Support \ooo escapes, from Avi Halachmi.
-rw-r--r-- | cmd-parse.y | 26 | ||||
-rw-r--r-- | tmux.1 | 6 |
2 files changed, 29 insertions, 3 deletions
diff --git a/cmd-parse.y b/cmd-parse.y index f347280b..739ca56c 100644 --- a/cmd-parse.y +++ b/cmd-parse.y @@ -1083,12 +1083,34 @@ error: static int yylex_token_escape(char **buf, size_t *len) { - int ch, type; + int ch, type, o2, o3; u_int size, i, tmp; char s[9]; struct utf8_data ud; - switch (ch = yylex_getc()) { + ch = yylex_getc(); + + if (ch >= '4' && ch <= '7') { + yyerror("invalid octal escape"); + return (0); + } + if (ch >= '0' && ch <= '3') { + o2 = yylex_getc(); + if (o2 >= '0' && o2 <= '7') { + o3 = yylex_getc(); + if (o3 >= '0' && o3 <= '7') { + ch = 64 * (ch - '0') + + 8 * (o2 - '0') + + (o3 - '0'); + yylex_append1(buf, len, ch); + return (1); + } + } + yyerror("invalid octal escape"); + return (0); + } + + switch (ch) { case EOF: return (0); case 'e': @@ -515,7 +515,11 @@ the given four or eight digit hexadecimal number. When preceded (escaped) by a \e, the following characters are replaced: \ee by the escape character; \er by a carriage return; \en by a newline; and \et by a tab. -.Pp +.It +\eooo is replaced by a character of the octal value ooo. +Three octal digits are required, for example \e001. +The largest valid character is \e377. +.It Any other characters preceded by \e are replaced by themselves (that is, the \e is removed) and are not treated as having any special meaning - so for example \e; will not mark a command sequence and \e$ will not expand an environment |