/* vi: set sw=4 ts=4: */ /* * Utility routines. * * Copyright (C) 2007 Denys Vlasenko * * Licensed under GPLv2, see file LICENSE in this source tree. */ #include "libbb.h" void FAST_FUNC fputc_printable(int ch, FILE *file) { if ((ch & (0x80 + PRINTABLE_META)) == (0x80 + PRINTABLE_META)) { fputs("M-", file); ch &= 0x7f; } ch = (unsigned char) ch; if (ch == 0x9b) { /* VT100's CSI, aka Meta-ESC, is not printable on vt-100 */ ch = '{'; goto print_caret; } if (ch < ' ') { ch += '@'; goto print_caret; } if (ch == 0x7f) { ch = '?'; print_caret: fputc('^', 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'; }