| /* vi: set sw=4 ts=4: */ |
| /* |
| * Unicode support routines. |
| * |
| * Copyright (C) 2010 Denys Vlasenko |
| * |
| * Licensed under GPLv2, see file LICENSE in this source tree. |
| */ |
| #include "libbb.h" |
| #include "unicode.h" |
| |
| const char* FAST_FUNC printable_string2(uni_stat_t *stats, const char *str) |
| { |
| char *dst; |
| const char *s; |
| |
| s = str; |
| while (1) { |
| unsigned char c = *s; |
| if (c == '\0') { |
| /* 99+% of inputs do not need conversion */ |
| if (stats) { |
| stats->byte_count = (s - str); |
| stats->unicode_count = (s - str); |
| stats->unicode_width = (s - str); |
| } |
| return str; |
| } |
| if (c < ' ') |
| break; |
| if (c >= 0x7f) |
| break; |
| s++; |
| } |
| |
| #if ENABLE_UNICODE_SUPPORT |
| dst = unicode_conv_to_printable(stats, str); |
| #else |
| { |
| char *d = dst = xstrdup(str); |
| while (1) { |
| unsigned char c = *d; |
| if (c == '\0') |
| break; |
| if (c < ' ' || c >= 0x7f) |
| *d = '?'; |
| d++; |
| } |
| if (stats) { |
| stats->byte_count = (d - dst); |
| stats->unicode_count = (d - dst); |
| stats->unicode_width = (d - dst); |
| } |
| } |
| #endif |
| return auto_string(dst); |
| } |
| |
| const char* FAST_FUNC printable_string(const char *str) |
| { |
| return printable_string2(NULL, str); |
| } |