1/* vi: set sw=4 ts=4: */ 2/* 3 * Unicode support routines. 4 * 5 * Copyright (C) 2010 Denys Vlasenko 6 * 7 * Licensed under GPL version 2, see file LICENSE in this tarball for details. 8 */ 9#include "libbb.h" 10#include "unicode.h" 11 12const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str) 13{ 14 static char *saved[4]; 15 static unsigned cur_saved; /* = 0 */ 16 17 char *dst; 18 const char *s; 19 20 s = str; 21 while (1) { 22 unsigned char c = *s; 23 if (c == '\0') { 24 /* 99+% of inputs do not need conversion */ 25 if (stats) { 26 stats->byte_count = (s - str); 27 stats->unicode_count = (s - str); 28 stats->unicode_width = (s - str); 29 } 30 return str; 31 } 32 if (c < ' ') 33 break; 34 if (c >= 0x7f) 35 break; 36 s++; 37 } 38 39#if ENABLE_UNICODE_SUPPORT 40 dst = unicode_conv_to_printable(stats, str); 41#else 42 { 43 char *d = dst = xstrdup(str); 44 while (1) { 45 unsigned char c = *d; 46 if (c == '\0') 47 break; 48 if (c < ' ' || c >= 0x7f) 49 *d = '?'; 50 d++; 51 } 52 if (stats) { 53 stats->byte_count = (d - dst); 54 stats->unicode_count = (d - dst); 55 stats->unicode_width = (d - dst); 56 } 57 } 58#endif 59 60 free(saved[cur_saved]); 61 saved[cur_saved] = dst; 62 cur_saved = (cur_saved + 1) & (ARRAY_SIZE(saved)-1); 63 64 return dst; 65} 66