forked from mirrors/linux
		
	This is almost the opposite function to string_unescape(). Nevertheless it handles \0 and could be used for any byte buffer. The documentation is supplied together with the function prototype. The test cases covers most of the scenarios and would be expanded later on. [akpm@linux-foundation.org: avoid 1k stack consumption] Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: "John W . Linville" <linville@tuxdriver.com> Cc: Johannes Berg <johannes@sipsolutions.net> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Joe Perches <joe@perches.com> Cc: Wu Fengguang <fengguang.wu@intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#ifndef _LINUX_STRING_HELPERS_H_
 | 
						|
#define _LINUX_STRING_HELPERS_H_
 | 
						|
 | 
						|
#include <linux/types.h>
 | 
						|
 | 
						|
/* Descriptions of the types of units to
 | 
						|
 * print in */
 | 
						|
enum string_size_units {
 | 
						|
	STRING_UNITS_10,	/* use powers of 10^3 (standard SI) */
 | 
						|
	STRING_UNITS_2,		/* use binary powers of 2^10 */
 | 
						|
};
 | 
						|
 | 
						|
int string_get_size(u64 size, enum string_size_units units,
 | 
						|
		    char *buf, int len);
 | 
						|
 | 
						|
#define UNESCAPE_SPACE		0x01
 | 
						|
#define UNESCAPE_OCTAL		0x02
 | 
						|
#define UNESCAPE_HEX		0x04
 | 
						|
#define UNESCAPE_SPECIAL	0x08
 | 
						|
#define UNESCAPE_ANY		\
 | 
						|
	(UNESCAPE_SPACE | UNESCAPE_OCTAL | UNESCAPE_HEX | UNESCAPE_SPECIAL)
 | 
						|
 | 
						|
int string_unescape(char *src, char *dst, size_t size, unsigned int flags);
 | 
						|
 | 
						|
static inline int string_unescape_inplace(char *buf, unsigned int flags)
 | 
						|
{
 | 
						|
	return string_unescape(buf, buf, 0, flags);
 | 
						|
}
 | 
						|
 | 
						|
static inline int string_unescape_any(char *src, char *dst, size_t size)
 | 
						|
{
 | 
						|
	return string_unescape(src, dst, size, UNESCAPE_ANY);
 | 
						|
}
 | 
						|
 | 
						|
static inline int string_unescape_any_inplace(char *buf)
 | 
						|
{
 | 
						|
	return string_unescape_any(buf, buf, 0);
 | 
						|
}
 | 
						|
 | 
						|
#define ESCAPE_SPACE		0x01
 | 
						|
#define ESCAPE_SPECIAL		0x02
 | 
						|
#define ESCAPE_NULL		0x04
 | 
						|
#define ESCAPE_OCTAL		0x08
 | 
						|
#define ESCAPE_ANY		\
 | 
						|
	(ESCAPE_SPACE | ESCAPE_OCTAL | ESCAPE_SPECIAL | ESCAPE_NULL)
 | 
						|
#define ESCAPE_NP		0x10
 | 
						|
#define ESCAPE_ANY_NP		(ESCAPE_ANY | ESCAPE_NP)
 | 
						|
#define ESCAPE_HEX		0x20
 | 
						|
 | 
						|
int string_escape_mem(const char *src, size_t isz, char **dst, size_t osz,
 | 
						|
		unsigned int flags, const char *esc);
 | 
						|
 | 
						|
static inline int string_escape_mem_any_np(const char *src, size_t isz,
 | 
						|
		char **dst, size_t osz, const char *esc)
 | 
						|
{
 | 
						|
	return string_escape_mem(src, isz, dst, osz, ESCAPE_ANY_NP, esc);
 | 
						|
}
 | 
						|
 | 
						|
static inline int string_escape_str(const char *src, char **dst, size_t sz,
 | 
						|
		unsigned int flags, const char *esc)
 | 
						|
{
 | 
						|
	return string_escape_mem(src, strlen(src), dst, sz, flags, esc);
 | 
						|
}
 | 
						|
 | 
						|
static inline int string_escape_str_any_np(const char *src, char **dst,
 | 
						|
		size_t sz, const char *esc)
 | 
						|
{
 | 
						|
	return string_escape_str(src, dst, sz, ESCAPE_ANY_NP, esc);
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |