diff options
Diffstat (limited to 'unicode/unicodetest.c')
| -rw-r--r-- | unicode/unicodetest.c | 206 | 
1 files changed, 206 insertions, 0 deletions
| diff --git a/unicode/unicodetest.c b/unicode/unicodetest.c new file mode 100644 index 0000000..0356624 --- /dev/null +++ b/unicode/unicodetest.c @@ -0,0 +1,206 @@ +/* +** Copyright 2011 Double Precision, Inc. +** See COPYING for distribution information. +** +*/ + +#include	"unicode_config.h" +#include	"unicode.h" +#include	<string.h> +#include	<stdlib.h> +#include	<stdio.h> +#include	<errno.h> + +struct collect_buf { +	char *ptr; +	size_t cnt; +	size_t size; +}; + +static int save_output(const char *p, size_t n, void *ptr) +{ +	struct collect_buf *cb=(struct collect_buf *)ptr; + +	while (n) +	{ +		if (cb->cnt < cb->size) +			cb->ptr[cb->cnt++]=*p; +		++p; +		--n; +	} +	return 0; +} + +static void test1() +{ +	static const char teststr[]= { +		0x00, 0x00, 0x00, 0x41, +		0x00, 0x00, 0x04, 0x14, +		0x00, 0x00, 0x04, 0x30, +		0x00, 0x00, 0x00, 0x42}; +	char outputbuf[12]; +	struct collect_buf cb; +	libmail_u_convert_handle_t h; +	int checkflag; + +	cb.ptr=outputbuf; +	cb.cnt=0; +	cb.size=sizeof(outputbuf); + +	if ((h=libmail_u_convert_init("UCS-4BE", "ISO-8859-1", +				      save_output, &cb)) == NULL) +	{ +		perror("libmail_u_convert_init"); +		exit(1); +	} + +	libmail_u_convert(h, teststr, sizeof(teststr)); + +	if (libmail_u_convert_deinit(h, &checkflag)) +	{ +		perror("libmail_u_convert_deinit"); +		exit(1); +	} +	if (cb.cnt != 2 || memcmp(cb.ptr, "AB", 2) || !checkflag) +	{ +		fprintf(stderr, "Unexpected result from convert()\n"); +		exit(1); +	} +} + +static void test2() +{ +	unicode_char *ucptr; +	size_t ucsize; +	libmail_u_convert_handle_t h= +		libmail_u_convert_tou_init("utf-8", &ucptr, &ucsize, 1); +	char *cptr; +	size_t csize; + +	if (h) +	{ +		size_t i; + +		for (i=0; i<1024/32; ++i) +			libmail_u_convert(h, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", +					  32); + +		if (libmail_u_convert_deinit(h, NULL) == 0 && +		    ucsize == 1024+1) +		{ +			for (i=0; i<1024; i++) +				if (ucptr[i] != 'A') +					break; + +			if (i == 1024) +			{ +				h=libmail_u_convert_fromu_init("utf-8", +							       &cptr, &csize, +							       1); + +				if (h) +				{ +					libmail_u_convert_uc(h, ucptr, 1024); +					if (libmail_u_convert_deinit(h, NULL) +					    == 0 && csize == 1024+1) +					{ +						for (i=0; i<1024; i++) +							if (cptr[i] != 'A') +								break; + +						free(ucptr); +						free(cptr); +						if (i == 1024) +							return; +					} +				} +			} +		} +		fprintf(stderr, "test2: failed"); +		errno=EINVAL; +	} +	perror("test2"); +	exit(1); +} + +int main(int argc, char **argv) +{ +	const char *chset=unicode_x_imap_modutf7; +	int argn=1; + +	if (argn < argc && strcmp(argv[argn], "--smap") == 0) +	{ +		chset=unicode_x_imap_modutf7 " ./~:"; +		++argn; +	} + +	if (argn < argc && strcmp(argv[argn], "--totitle") == 0) +	{ +		++argn; + +		if (argn < argc) +		{ +			char *p=libmail_u_convert_tocase(argv[argn], +							 "utf-8", +							 unicode_tc, +							 unicode_lc); + +			if (p) +			{ +				printf("%s\n", p); +				free(p); +				exit(0); +			} +		} +		exit(1); +	} + +	if (argn < argc) +	{ +		int errflag; +		char *p=libmail_u_convert_tobuf(argv[argn], +						"utf-8", +						chset, +						&errflag); +		char *q; + +		if (!p) +		{ +			perror("libmail_u_convert"); +			exit(1); +		} + +		if (errflag) +		{ +			fprintf(stderr, "Conversion error?\n"); +			exit(1); +		} + +		q=libmail_u_convert_tobuf(p, chset, "utf-8", &errflag); +		if (!q) +		{ +			perror("libmail_u_convert"); +			exit(1); +		} + +		if (errflag) +		{ +			fprintf(stderr, "Conversion error?\n"); +			exit(1); +		} +		if (strcmp(q, argv[argn])) +		{ +			fprintf(stderr, "Round trip error\n"); +			exit(1); +		} +		printf("%s\n", p); +		free(p); +		free(q); +	} +	else +	{ +		test1(); +		test2(); +	} +	return 0; +} | 
