Contents of /tags/mkinitrd-6_3_0/busybox/libbb/printable_string.c
Parent Directory | Revision Log
Revision 1139 -
(show annotations)
(download)
Thu Aug 19 10:14:02 2010 UTC (14 years, 1 month ago) by niro
File MIME type: text/plain
File size: 1215 byte(s)
Thu Aug 19 10:14:02 2010 UTC (14 years, 1 month ago) by niro
File MIME type: text/plain
File size: 1215 byte(s)
tagged 'mkinitrd-6_3_0'
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 | |
12 | const 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 | } |