From ff830fbc42aa76d8130a0de12cf13941ac7c42bb Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Tue, 8 Jan 2019 23:16:06 +0100 Subject: [PATCH] termptyesc: extract TBC to its own function + tests --- src/bin/termptyesc.c | 58 ++++++++++++++++++++++++++++---------------- tests/tbc.sh | 36 +++++++++++++++++++++++++++ tests/tests.results | 1 + 3 files changed, 74 insertions(+), 21 deletions(-) create mode 100755 tests/tbc.sh diff --git a/src/bin/termptyesc.c b/src/bin/termptyesc.c index dae3b742..f0e324ea 100644 --- a/src/bin/termptyesc.c +++ b/src/bin/termptyesc.c @@ -2717,7 +2717,10 @@ _handle_esc_csi_decst8c(Termpty *ty, Eina_Unicode **ptr) if (arg == -CSI_ARG_ERROR) return; if ((arg != -CSI_ARG_NO_VALUE) && (arg != 5)) - return; + { + ty->decoding_error = EINA_TRUE; + return; + } DBG("DECST8C - Set Tab at Every 8 Columns: %d", arg); termpty_clear_tabs_on_screen(ty); @@ -2735,6 +2738,8 @@ _handle_esc_csi_ctc(Termpty *ty, Eina_Unicode **ptr) if (arg == -CSI_ARG_ERROR) return; + + DBG("CTC - Cursor Tab Control: %d", arg); switch (arg) { case -CSI_ARG_NO_VALUE: @@ -2756,6 +2761,35 @@ _handle_esc_csi_ctc(Termpty *ty, Eina_Unicode **ptr) } } +static void +_handle_esc_csi_tbc(Termpty *ty, Eina_Unicode **ptr) +{ + Eina_Unicode *b = *ptr; + int arg = _csi_arg_get(ty, &b); + + if (arg == -CSI_ARG_ERROR) + return; + DBG("TBC - Tab Clear: %d", arg); + switch (arg) + { + case -CSI_ARG_NO_VALUE: + EINA_FALLTHROUGH; + case 0: + TAB_UNSET(ty, ty->cursor_state.cx); + break; + case 2: + EINA_FALLTHROUGH; + case 3: + EINA_FALLTHROUGH; + case 5: + termpty_clear_tabs_on_screen(ty); + break; + default: + ERR("Tabulation Clear (TBC) with invalid argument: %d", arg); + ty->decoding_error = EINA_TRUE; + } +} + static int _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce) { @@ -2971,26 +3005,8 @@ _handle_esc_csi(Termpty *ty, const Eina_Unicode *c, const Eina_Unicode *ce) case 'f': _handle_esc_csi_cursor_pos_set(ty, &b, cc); break; - case 'g': // clear tabulation - arg = _csi_arg_get(ty, &b); - if (arg == -CSI_ARG_ERROR) - goto error; - if (arg < 0) - arg = 0; - if (arg == 0) - { - int cx = ty->cursor_state.cx; - TAB_UNSET(ty, cx); - } - else if (arg == 3) - { - termpty_clear_tabs_on_screen(ty); - } - else - { - ERR("Tabulation Clear (TBC) with invalid argument: %d", arg); - ty->decoding_error = EINA_TRUE; - } + case 'g': + _handle_esc_csi_tbc(ty, &b); break; case 'h': _handle_esc_csi_reset_mode(ty, *cc, b, be); diff --git a/tests/tbc.sh b/tests/tbc.sh new file mode 100755 index 00000000..56270559 --- /dev/null +++ b/tests/tbc.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +# fill space with E +printf '\033#8' +# set color +printf '\033[46;31;3m' +# move to 0;0 +printf '\033[H' +# set tabs +printf '\033H\033H\033[3C\033[W\033[4C\033[0W\033[5C\033H\033[6C\033H' +printf '\033[7C\033H\033[8C\033H\033[9C' +printf '\nTabs set:' +# show # on tabs +printf '\n#\t#\t#\t#\t#\t#\t#\t#\t#\t#\t#' +# remove a tab +printf '\n# \033[0g@ \033[g@ Two tabs removed' +printf '\n#\t#\t#\t#\t#\t#\t#\t#\t#\t#\t#\t#' +# remove all tabs +printf '\n\033[2gRemove all tabs:' +printf '\n#\t#' +# set tabs +printf '\nAdd them again\033[?5W:' +printf '\r\033H\033H\033[3C\033[W\033[4C\033[0W\033[5C\033H\033[6C\033H' +printf '\033[7C\033H\033[8C\033H\033[9C' +printf '\n#\t#\t#\t#\t#\t#\t#\t#\t#\t#\t#' +# remove all tabs +printf '\n\033[3gRemove all tabs:' +printf '\n#\t#' +# set tabs +printf '\nAdd them again\033[?5W:' +printf '\r\033H\033H\033[3C\033[W\033[4C\033[0W\033[5C\033H\033[6C\033H' +printf '\033[7C\033H\033[8C\033H\033[9C' +printf '\n#\t#\t#\t#\t#\t#\t#\t#\t#\t#\t#' +# remove all tabs +printf '\n\033[5gRemove all tabs:' +printf '\n#\t#' diff --git a/tests/tests.results b/tests/tests.results index e97ef43e..da071f0e 100644 --- a/tests/tests.results +++ b/tests/tests.results @@ -64,3 +64,4 @@ su.sh 591185f42b75daa61726217033a17eaf sd.sh 4bfda7ec3e6192acab077de2bc270525 decst8c.sh 0ea805e8f4c2626ce66c566a10548d0f ctc.sh d35eeacdb2e99f5ac8cc3c4e8d72f8b0 +tbc.sh d0216e4056e5ab1cb4d411b6d6074785