Refactor catv. Move visible() from stty to libbb.

Fixes the following TODO:

  stty's visible() function and catv's guts are identical. Merge them into
  an appropriate libbb function.

Also makes catv behave exactly like coreutils' cat -v e.g. it'll print 'M-^I'
instead of 'M-   '.

function                                             old     new   delta
visible                                                -      70     +70
do_display                                           431     379     -52
catv_main                                            306     250     -56
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/2 up/down: 70/-108)           Total: -38 bytes

Signed-off-by: Bartosz Golaszewski <bartekgola@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Bartosz Golaszewski
2013-07-30 06:29:42 +02:00
committed by Denys Vlasenko
parent d0bc708cb5
commit 79c618c411
5 changed files with 51 additions and 58 deletions

View File

@@ -32,3 +32,27 @@ void FAST_FUNC fputc_printable(int ch, FILE *file)
}
fputc(ch, file);
}
void FAST_FUNC visible(unsigned ch, char *buf, int flags)
{
if (ch == '\t' && !(flags & VISIBLE_SHOW_TABS)) {
goto raw;
}
if (ch == '\n') {
if (flags & VISIBLE_ENDLINE)
*buf++ = '$';
} else {
if (ch >= 128) {
ch -= 128;
*buf++ = 'M';
*buf++ = '-';
}
if (ch < 32 || ch == 127) {
*buf++ = '^';
ch ^= 0x40;
}
}
raw:
*buf++ = ch;
*buf = '\0';
}