This change retains "or later" state! No licensing _changes_ here, only form is adjusted (article, space between "GPL" and "v2" and so on). Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.2 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)
 | 
						|
{
 | 
						|
	static char *saved[4];
 | 
						|
	static unsigned cur_saved; /* = 0 */
 | 
						|
 | 
						|
	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
 | 
						|
 | 
						|
	free(saved[cur_saved]);
 | 
						|
	saved[cur_saved] = dst;
 | 
						|
	cur_saved = (cur_saved + 1) & (ARRAY_SIZE(saved)-1);
 | 
						|
 | 
						|
	return dst;
 | 
						|
}
 |