1
2
3
4
5
6
7
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;
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
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