Use it in libiproute: get rid of one static string buffer. function old new delta auto_string - 51 +51 ll_index_to_name 10 49 +39 buffer_fill_and_print 169 178 +9 scan_recursive 378 380 +2 decode_one_format 732 734 +2 cmdputs 334 332 -2 static.cur_saved 4 1 -3 static.nbuf 16 - -16 printable_string 94 57 -37 ll_idx_n2a 53 - -53 ------------------------------------------------------------------------------ (add/remove: 2/2 grow/shrink: 4/3 up/down: 103/-111) Total: -8 bytes text data bss dec hex filename 939880 992 17496 958368 e9fa0 busybox_old 939880 992 17480 958352 e9f90 busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* 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);
 | 
						|
}
 |