text: /* 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_string2(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);
  }
  
  const char* FAST_FUNC printable_string(const char *str)
  {
  	return printable_string2(NULL, str);
  }
  