123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /* 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_string(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);
- }
|