blob: a316f60de52b493926e210f5a9a46c8afb4e5708 [file] [log] [blame]
Denys Vlasenkod8528b82010-01-31 05:15:38 +01001/* vi: set sw=4 ts=4: */
2/*
3 * Unicode support routines.
4 *
5 * Copyright (C) 2010 Denys Vlasenko
6 *
Denys Vlasenko0ef64bd2010-08-16 20:14:46 +02007 * Licensed under GPLv2, see file LICENSE in this source tree.
Denys Vlasenkod8528b82010-01-31 05:15:38 +01008 */
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
Denys Vlasenko19158a82010-03-26 14:06:56 +010039#if ENABLE_UNICODE_SUPPORT
Denys Vlasenkod8528b82010-01-31 05:15:38 +010040 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}