Blame libarchive/test/test_archive_string_conversion.c

Packit Service 1d0348
/*-
Packit Service 1d0348
 * Copyright (c) 2011-2012 Michihiro NAKAJIMA
Packit Service 1d0348
 * All rights reserved.
Packit Service 1d0348
 *
Packit Service 1d0348
 * Redistribution and use in source and binary forms, with or without
Packit Service 1d0348
 * modification, are permitted provided that the following conditions
Packit Service 1d0348
 * are met:
Packit Service 1d0348
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer.
Packit Service 1d0348
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 1d0348
 *    documentation and/or other materials provided with the distribution.
Packit Service 1d0348
 *
Packit Service 1d0348
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
Packit Service 1d0348
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Packit Service 1d0348
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Packit Service 1d0348
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 1d0348
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit Service 1d0348
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 1d0348
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 1d0348
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 1d0348
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Packit Service 1d0348
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 1d0348
 */
Packit Service 1d0348
#include "test.h"
Packit Service 1d0348
__FBSDID("$FreeBSD$");
Packit Service 1d0348
Packit Service 1d0348
#include <locale.h>
Packit Service 1d0348
Packit Service 1d0348
#define __LIBARCHIVE_TEST
Packit Service 1d0348
#include "archive_string.h"
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
Execute the following to rebuild the data for this program:
Packit Service 1d0348
   tail -n +36 test_archive_string_conversion.c | /bin/sh
Packit Service 1d0348
#
Packit Service 1d0348
# This requires http://unicode.org/Public/6.0.0/ucd/NormalizationTest.txt
Packit Service 1d0348
#
Packit Service 1d0348
if="NormalizationTest.txt"
Packit Service 1d0348
if [ ! -f ${if} ]; then
Packit Service 1d0348
  echo "Not found: \"${if}\""
Packit Service 1d0348
  exit 0
Packit Service 1d0348
fi
Packit Service 1d0348
of=test_archive_string_conversion.txt.Z
Packit Service 1d0348
echo "\$FreeBSD\$" > ${of}.uu
Packit Service 1d0348
awk -F ';'  '$0 ~/^[0-9A-F]+/ {printf "%s;%s\n", $2, $3}' ${if} | compress | uuencode ${of} >> ${of}.uu
Packit Service 1d0348
exit 1
Packit Service 1d0348
*/
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
unicode_to_utf8(char *p, uint32_t uc)
Packit Service 1d0348
{        
Packit Service 1d0348
        char *_p = p;
Packit Service 1d0348
Packit Service 1d0348
        /* Translate code point to UTF8 */
Packit Service 1d0348
        if (uc <= 0x7f) {
Packit Service 1d0348
                *p++ = (char)uc;
Packit Service 1d0348
        } else if (uc <= 0x7ff) {
Packit Service 1d0348
                *p++ = 0xc0 | ((uc >> 6) & 0x1f);
Packit Service 1d0348
                *p++ = 0x80 | (uc & 0x3f);
Packit Service 1d0348
        } else if (uc <= 0xffff) {
Packit Service 1d0348
                *p++ = 0xe0 | ((uc >> 12) & 0x0f);
Packit Service 1d0348
                *p++ = 0x80 | ((uc >> 6) & 0x3f);
Packit Service 1d0348
                *p++ = 0x80 | (uc & 0x3f);
Packit Service 1d0348
        } else {
Packit Service 1d0348
                *p++ = 0xf0 | ((uc >> 18) & 0x07);
Packit Service 1d0348
                *p++ = 0x80 | ((uc >> 12) & 0x3f);
Packit Service 1d0348
                *p++ = 0x80 | ((uc >> 6) & 0x3f);
Packit Service 1d0348
                *p++ = 0x80 | (uc & 0x3f);
Packit Service 1d0348
        }
Packit Service 1d0348
        return ((int)(p - _p));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
archive_be16enc(void *pp, uint16_t u)
Packit Service 1d0348
{
Packit Service 1d0348
        unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
        p[0] = (u >> 8) & 0xff;
Packit Service 1d0348
        p[1] = u & 0xff;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
unicode_to_utf16be(char *p, uint32_t uc)
Packit Service 1d0348
{
Packit Service 1d0348
	char *utf16 = p;
Packit Service 1d0348
Packit Service 1d0348
	if (uc > 0xffff) {
Packit Service 1d0348
		/* We have a code point that won't fit into a
Packit Service 1d0348
		 * wchar_t; convert it to a surrogate pair. */
Packit Service 1d0348
		uc -= 0x10000;
Packit Service 1d0348
		archive_be16enc(utf16, ((uc >> 10) & 0x3ff) + 0xD800);
Packit Service 1d0348
		archive_be16enc(utf16+2, (uc & 0x3ff) + 0xDC00);
Packit Service 1d0348
		return (4);
Packit Service 1d0348
	} else {
Packit Service 1d0348
		archive_be16enc(utf16, uc);
Packit Service 1d0348
		return (2);
Packit Service 1d0348
	}
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
archive_le16enc(void *pp, uint16_t u)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned char *p = (unsigned char *)pp;
Packit Service 1d0348
Packit Service 1d0348
	p[0] = u & 0xff;
Packit Service 1d0348
	p[1] = (u >> 8) & 0xff;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static size_t
Packit Service 1d0348
unicode_to_utf16le(char *p, uint32_t uc)
Packit Service 1d0348
{
Packit Service 1d0348
	char *utf16 = p;
Packit Service 1d0348
Packit Service 1d0348
	if (uc > 0xffff) {
Packit Service 1d0348
		/* We have a code point that won't fit into a
Packit Service 1d0348
		 * wchar_t; convert it to a surrogate pair. */
Packit Service 1d0348
		uc -= 0x10000;
Packit Service 1d0348
		archive_le16enc(utf16, ((uc >> 10) & 0x3ff) + 0xD800);
Packit Service 1d0348
		archive_le16enc(utf16+2, (uc & 0x3ff) + 0xDC00);
Packit Service 1d0348
		return (4);
Packit Service 1d0348
	} else {
Packit Service 1d0348
		archive_le16enc(utf16, uc);
Packit Service 1d0348
		return (2);
Packit Service 1d0348
	}
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
wc_size(void)
Packit Service 1d0348
{
Packit Service 1d0348
	return (sizeof(wchar_t));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
unicode_to_wc(wchar_t *wp, uint32_t uc)
Packit Service 1d0348
{
Packit Service 1d0348
	if (wc_size() == 4) {
Packit Service 1d0348
		*wp = (wchar_t)uc;
Packit Service 1d0348
		return (1);
Packit Service 1d0348
	} 
Packit Service 1d0348
	if (uc > 0xffff) {
Packit Service 1d0348
		/* We have a code point that won't fit into a
Packit Service 1d0348
		 * wchar_t; convert it to a surrogate pair. */
Packit Service 1d0348
		uc -= 0x10000;
Packit Service 1d0348
		*wp++ = (wchar_t)(((uc >> 10) & 0x3ff) + 0xD800);
Packit Service 1d0348
		*wp = (wchar_t)((uc & 0x3ff) + 0xDC00);
Packit Service 1d0348
		return (2);
Packit Service 1d0348
	} else {
Packit Service 1d0348
		*wp = (wchar_t)uc;
Packit Service 1d0348
		return (1);
Packit Service 1d0348
	}
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Note: U+2000 - U+2FFF, U+F900 - U+FAFF and U+2F800 - U+2FAFF are not
Packit Service 1d0348
 * converted to NFD on Mac OS.
Packit Service 1d0348
 * see also http://developer.apple.com/library/mac/#qa/qa2001/qa1173.html
Packit Service 1d0348
 */
Packit Service 1d0348
static int
Packit Service 1d0348
scan_unicode_pattern(char *out, wchar_t *wout, char *u16be, char *u16le,
Packit Service 1d0348
    const char *pattern, int mac_nfd)
Packit Service 1d0348
{
Packit Service 1d0348
	unsigned uc = 0;
Packit Service 1d0348
	const char *p = pattern;
Packit Service 1d0348
	char *op = out;
Packit Service 1d0348
	wchar_t *owp = wout;
Packit Service 1d0348
	char *op16be = u16be;
Packit Service 1d0348
	char *op16le = u16le;
Packit Service 1d0348
	int ret = 0;
Packit Service 1d0348
Packit Service 1d0348
	for (;;) {
Packit Service 1d0348
		if (*p >= '0' && *p <= '9')
Packit Service 1d0348
			uc = (uc << 4) + (*p - '0');
Packit Service 1d0348
		else if (*p >= 'A' && *p <= 'F')
Packit Service 1d0348
			uc = (uc << 4) + (*p - 'A' + 0x0a);
Packit Service 1d0348
		else {
Packit Service 1d0348
			if (mac_nfd && op == out) {
Packit Service 1d0348
				/*
Packit Service 1d0348
				 * These are not converted to NFD on Mac OS.
Packit Service 1d0348
 				 * U+2000 - U+2FFF
Packit Service 1d0348
				 * U+F900 - U+FAFF
Packit Service 1d0348
				 * U+2F800 - U+2FAFF
Packit Service 1d0348
				 */
Packit Service 1d0348
				switch (uc) {
Packit Service 1d0348
				case 0x2194: case 0x219A: case 0x219B:
Packit Service 1d0348
				case 0x21AE: case 0x21CD: case 0x21CE:
Packit Service 1d0348
				case 0x21CF: case 0x2204: case 0x2209:
Packit Service 1d0348
				case 0x220C: case 0x2224: case 0x2226:
Packit Service 1d0348
				case 0x2241: case 0x2244: case 0x2247:
Packit Service 1d0348
				case 0x2249: case 0x2260: case 0x2262:
Packit Service 1d0348
				case 0x226D: case 0x226E: case 0x226F:
Packit Service 1d0348
				case 0x2270: case 0x2271: case 0x2274:
Packit Service 1d0348
				case 0x2275: case 0x2276: case 0x2278:
Packit Service 1d0348
				case 0x2279: case 0x227A: case 0x227B:
Packit Service 1d0348
				case 0x2280: case 0x2281: case 0x2284:
Packit Service 1d0348
				case 0x2285: case 0x2288: case 0x2289:
Packit Service 1d0348
				case 0x22AC: case 0x22AD: case 0x22AE:
Packit Service 1d0348
				case 0x22AF: case 0x22E0: case 0x22E1:
Packit Service 1d0348
				case 0x22E2: case 0x22E3: case 0x22EA:
Packit Service 1d0348
				case 0x22EB: case 0x22EC: case 0x22ED:
Packit Service 1d0348
				
Packit Service 1d0348
				/*
Packit Service 1d0348
				 * Those code points are not converted to
Packit Service 1d0348
				 * NFD on Mac OS. I do not know the reason
Packit Service 1d0348
				 * because it is undocumented.
Packit Service 1d0348
				 *   NFC        NFD
Packit Service 1d0348
				 *   1109A  ==> 11099 110BA
Packit Service 1d0348
				 *   1109C  ==> 1109B 110BA
Packit Service 1d0348
				 *   110AB  ==> 110A5 110BA
Packit Service 1d0348
				 */
Packit Service 1d0348
				case 0x1109A: case 0x1109C: case 0x110AB:
Packit Service 1d0348
					ret = 1;
Packit Service 1d0348
					break;
Packit Service 1d0348
				}
Packit Service 1d0348
			}
Packit Service 1d0348
			op16be += unicode_to_utf16be(op16be, uc);
Packit Service 1d0348
			op16le += unicode_to_utf16le(op16le, uc);
Packit Service 1d0348
			owp += unicode_to_wc(owp, uc);
Packit Service 1d0348
			op += unicode_to_utf8(op, uc);
Packit Service 1d0348
			if (!*p) {
Packit Service 1d0348
				*op16be++ = 0;
Packit Service 1d0348
				*op16be = 0;
Packit Service 1d0348
				*op16le++ = 0;
Packit Service 1d0348
				*op16le = 0;
Packit Service 1d0348
				*owp = L'\0';
Packit Service 1d0348
				*op = '\0';
Packit Service 1d0348
				break;
Packit Service 1d0348
			}
Packit Service 1d0348
			uc = 0;
Packit Service 1d0348
		}
Packit Service 1d0348
		p++;
Packit Service 1d0348
	}
Packit Service 1d0348
	return (ret);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
is_wc_unicode(void)
Packit Service 1d0348
{
Packit Service 1d0348
#if defined(_WIN32) && !defined(__CYGWIN__)
Packit Service 1d0348
	return (1);
Packit Service 1d0348
#else
Packit Service 1d0348
	return (0);
Packit Service 1d0348
#endif
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * A conversion test that we correctly normalize UTF-8 and UTF-16BE characters.
Packit Service 1d0348
 * On Mac OS, the characters to be Form D.
Packit Service 1d0348
 * On other platforms, the characters to be Form C.
Packit Service 1d0348
 */
Packit Service 1d0348
static void
Packit Service 1d0348
test_archive_string_normalization_nfc(const char *testdata)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a, *a2;
Packit Service 1d0348
	struct archive_string utf8;
Packit Service 1d0348
	struct archive_mstring mstr;
Packit Service 1d0348
	struct archive_string_conv *f_sconv8, *t_sconv8;
Packit Service 1d0348
	struct archive_string_conv *f_sconv16be, *f_sconv16le;
Packit Service 1d0348
	FILE *fp;
Packit Service 1d0348
	char buff[512];
Packit Service 1d0348
	int line = 0;
Packit Service 1d0348
	int locale_is_utf8, wc_is_unicode;
Packit Service 1d0348
	int sconv_opt = SCONV_SET_OPT_NORMALIZATION_C;
Packit Service 1d0348
Packit Service 1d0348
	locale_is_utf8 = (NULL != setlocale(LC_ALL, "en_US.UTF-8"));
Packit Service 1d0348
	wc_is_unicode = is_wc_unicode();
Packit Service 1d0348
	/* If it doesn't exist, just warn and return. */
Packit Service 1d0348
	if (!locale_is_utf8 && !wc_is_unicode) {
Packit Service 1d0348
		skipping("A test of string normalization for NFC requires "
Packit Service 1d0348
		    "a suitable locale; en_US.UTF-8 not available on this "
Packit Service 1d0348
		    "system");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	archive_string_init(&utf8);
Packit Service 1d0348
	memset(&mstr, 0, sizeof(mstr));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Create string conversion objects.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertA(NULL != (f_sconv8 =
Packit Service 1d0348
	    archive_string_conversion_from_charset(a, "UTF-8", 0)));
Packit Service 1d0348
	assertA(NULL != (f_sconv16be =
Packit Service 1d0348
	    archive_string_conversion_from_charset(a, "UTF-16BE", 0)));
Packit Service 1d0348
	assertA(NULL != (f_sconv16le =
Packit Service 1d0348
	    archive_string_conversion_from_charset(a, "UTF-16LE", 0)));
Packit Service 1d0348
	assert((a2 = archive_write_new()) != NULL);
Packit Service 1d0348
	assertA(NULL != (t_sconv8 =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a2, "UTF-8", 0)));
Packit Service 1d0348
	if (f_sconv8 == NULL || f_sconv16be == NULL || f_sconv16le == NULL ||
Packit Service 1d0348
	    t_sconv8 == NULL) {
Packit Service 1d0348
		/* We cannot continue this test. */
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
	archive_string_conversion_set_opt(f_sconv8, sconv_opt);
Packit Service 1d0348
	archive_string_conversion_set_opt(f_sconv16be, sconv_opt);
Packit Service 1d0348
	archive_string_conversion_set_opt(f_sconv16le, sconv_opt);
Packit Service 1d0348
	archive_string_conversion_set_opt(t_sconv8, sconv_opt);
Packit Service 1d0348
Packit Service 1d0348
	/* Open a test pattern file. */
Packit Service 1d0348
	assert((fp = fopen(testdata, "r")) != NULL);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read test data.
Packit Service 1d0348
	 *  Test data format:
Packit Service 1d0348
	 *     <NFC Unicode pattern> ';' <NFD Unicode pattern> '\n'
Packit Service 1d0348
	 *  Unicode pattern format:
Packit Service 1d0348
	 *     [0-9A-F]{4,5}([ ][0-9A-F]{4,5}){0,}
Packit Service 1d0348
	 */
Packit Service 1d0348
	while (fgets(buff, sizeof(buff), fp) != NULL) {
Packit Service 1d0348
		char nfc[80], nfd[80];
Packit Service 1d0348
		char utf8_nfc[80], utf8_nfd[80];
Packit Service 1d0348
		char utf16be_nfc[80], utf16be_nfd[80];
Packit Service 1d0348
		char utf16le_nfc[80], utf16le_nfd[80];
Packit Service 1d0348
		wchar_t wc_nfc[40], wc_nfd[40];
Packit Service 1d0348
		char *e, *p;
Packit Service 1d0348
		const wchar_t *wp;
Packit Service 1d0348
		const char *mp;
Packit Service 1d0348
		size_t mplen;
Packit Service 1d0348
Packit Service 1d0348
		line++;
Packit Service 1d0348
		if (buff[0] == '#')
Packit Service 1d0348
			continue;
Packit Service 1d0348
		p = strchr(buff, ';');
Packit Service 1d0348
		if (p == NULL)
Packit Service 1d0348
			continue;
Packit Service 1d0348
		*p++ = '\0';
Packit Service 1d0348
		/* Copy an NFC pattern */
Packit Service 1d0348
		strncpy(nfc, buff, sizeof(nfc)-1);
Packit Service 1d0348
		nfc[sizeof(nfc)-1] = '\0';
Packit Service 1d0348
		e = p;
Packit Service 1d0348
		p = strchr(p, '\n');
Packit Service 1d0348
		if (p == NULL)
Packit Service 1d0348
			continue;
Packit Service 1d0348
		*p = '\0';
Packit Service 1d0348
		/* Copy an NFD pattern */
Packit Service 1d0348
		strncpy(nfd, e, sizeof(nfd)-1);
Packit Service 1d0348
		nfd[sizeof(nfd)-1] = '\0';
Packit Service 1d0348
Packit Service 1d0348
		/*
Packit Service 1d0348
		 * Get an NFC patterns.
Packit Service 1d0348
		 */
Packit Service 1d0348
		scan_unicode_pattern(utf8_nfc, wc_nfc, utf16be_nfc, utf16le_nfc,
Packit Service 1d0348
		    nfc, 0);
Packit Service 1d0348
Packit Service 1d0348
		/*
Packit Service 1d0348
		 * Get an NFD patterns.
Packit Service 1d0348
		 */
Packit Service 1d0348
		scan_unicode_pattern(utf8_nfd, wc_nfd, utf16be_nfd, utf16le_nfd,
Packit Service 1d0348
		    nfd, 0);
Packit Service 1d0348
Packit Service 1d0348
		if (locale_is_utf8) {
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strcpy_l(
Packit Service 1d0348
			    &utf8, utf8_nfd, f_sconv8));
Packit Service 1d0348
			failure("NFD(%s) should be converted to NFC(%s):%d",
Packit Service 1d0348
			    nfd, nfc, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFC string for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strcpy_l(
Packit Service 1d0348
			    &utf8, utf8_nfc, f_sconv8));
Packit Service 1d0348
			failure("NFC(%s) should not be any changed:%d",
Packit Service 1d0348
			    nfc, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Copy an NFC string for export.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strcpy_l(
Packit Service 1d0348
			    &utf8, utf8_nfc, t_sconv8));
Packit Service 1d0348
			failure("NFC(%s) should not be any changed:%d",
Packit Service 1d0348
			    nfc, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-16BE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strncpy_l(
Packit Service 1d0348
			    &utf8, utf16be_nfd, 100000, f_sconv16be));
Packit Service 1d0348
			failure("NFD(%s) should be converted to NFC(%s):%d",
Packit Service 1d0348
			    nfd, nfc, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-16LE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strncpy_l(
Packit Service 1d0348
			    &utf8, utf16le_nfd, 100000, f_sconv16le));
Packit Service 1d0348
			failure("NFD(%s) should be converted to NFC(%s):%d",
Packit Service 1d0348
			    nfd, nfc, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
		}
Packit Service 1d0348
Packit Service 1d0348
		/*
Packit Service 1d0348
		 * Test for archive_mstring interface.
Packit Service 1d0348
		 * In specific, Windows platform UTF-16BE is directly
Packit Service 1d0348
		 * converted to/from wide-character to avoid the effect of
Packit Service 1d0348
		 * current locale since windows platform cannot make
Packit Service 1d0348
		 * locale UTF-8.
Packit Service 1d0348
		 */
Packit Service 1d0348
		if (locale_is_utf8 || wc_is_unicode) {
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-8 for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_copy_mbs_len_l(
Packit Service 1d0348
			    &mstr, utf8_nfd, 100000, f_sconv8));
Packit Service 1d0348
			assertEqualInt(0,
Packit Service 1d0348
			    archive_mstring_get_wcs(a, &mstr, &wp);;
Packit Service 1d0348
			failure("UTF-8 NFD(%s) should be converted "
Packit Service 1d0348
			    "to WCS NFC(%s):%d", nfd, nfc, line);
Packit Service 1d0348
			assertEqualWString(wc_nfc, wp);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-16BE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_copy_mbs_len_l(
Packit Service 1d0348
			    &mstr, utf16be_nfd, 100000, f_sconv16be));
Packit Service 1d0348
			assertEqualInt(0,
Packit Service 1d0348
			    archive_mstring_get_wcs(a, &mstr, &wp);;
Packit Service 1d0348
			failure("UTF-8 NFD(%s) should be converted "
Packit Service 1d0348
			    "to WCS NFC(%s):%d", nfd, nfc, line);
Packit Service 1d0348
			assertEqualWString(wc_nfc, wp);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-16LE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_copy_mbs_len_l(
Packit Service 1d0348
			    &mstr, utf16le_nfd, 100000, f_sconv16le));
Packit Service 1d0348
			assertEqualInt(0,
Packit Service 1d0348
			    archive_mstring_get_wcs(a, &mstr, &wp);;
Packit Service 1d0348
			failure("UTF-8 NFD(%s) should be converted "
Packit Service 1d0348
			    "to WCS NFC(%s):%d", nfd, nfc, line);
Packit Service 1d0348
			assertEqualWString(wc_nfc, wp);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Copy an NFC wide-string for export.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0,
Packit Service 1d0348
			    archive_mstring_copy_wcs(&mstr, wc_nfc));
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_get_mbs_l(
Packit Service 1d0348
			    &mstr, &mp, &mplen, t_sconv8));
Packit Service 1d0348
			failure("WCS NFC(%s) should be UTF-8 NFC:%d"
Packit Service 1d0348
			    ,nfc, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfc, mp);
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	archive_string_free(&utf8);
Packit Service 1d0348
	archive_mstring_clean(&mstr;;
Packit Service 1d0348
	fclose(fp);
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_write_free(a2));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_archive_string_normalization_mac_nfd(const char *testdata)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a, *a2;
Packit Service 1d0348
	struct archive_string utf8;
Packit Service 1d0348
	struct archive_mstring mstr;
Packit Service 1d0348
	struct archive_string_conv *f_sconv8, *t_sconv8;
Packit Service 1d0348
	struct archive_string_conv *f_sconv16be, *f_sconv16le;
Packit Service 1d0348
	FILE *fp;
Packit Service 1d0348
	char buff[512];
Packit Service 1d0348
	int line = 0;
Packit Service 1d0348
	int locale_is_utf8, wc_is_unicode;
Packit Service 1d0348
	int sconv_opt = SCONV_SET_OPT_NORMALIZATION_D;
Packit Service 1d0348
Packit Service 1d0348
	locale_is_utf8 = (NULL != setlocale(LC_ALL, "en_US.UTF-8"));
Packit Service 1d0348
	wc_is_unicode = is_wc_unicode();
Packit Service 1d0348
	/* If it doesn't exist, just warn and return. */
Packit Service 1d0348
	if (!locale_is_utf8 && !wc_is_unicode) {
Packit Service 1d0348
		skipping("A test of string normalization for NFD requires "
Packit Service 1d0348
		    "a suitable locale; en_US.UTF-8 not available on this "
Packit Service 1d0348
		    "system");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	archive_string_init(&utf8);
Packit Service 1d0348
	memset(&mstr, 0, sizeof(mstr));
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Create string conversion objects.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertA(NULL != (f_sconv8 =
Packit Service 1d0348
	    archive_string_conversion_from_charset(a, "UTF-8", 0)));
Packit Service 1d0348
	assertA(NULL != (f_sconv16be =
Packit Service 1d0348
	    archive_string_conversion_from_charset(a, "UTF-16BE", 0)));
Packit Service 1d0348
	assertA(NULL != (f_sconv16le =
Packit Service 1d0348
	    archive_string_conversion_from_charset(a, "UTF-16LE", 0)));
Packit Service 1d0348
	assert((a2 = archive_write_new()) != NULL);
Packit Service 1d0348
	assertA(NULL != (t_sconv8 =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a2, "UTF-8", 0)));
Packit Service 1d0348
	if (f_sconv8 == NULL || f_sconv16be == NULL || f_sconv16le == NULL ||
Packit Service 1d0348
	    t_sconv8 == NULL) {
Packit Service 1d0348
		/* We cannot continue this test. */
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
	archive_string_conversion_set_opt(f_sconv8, sconv_opt);
Packit Service 1d0348
	archive_string_conversion_set_opt(f_sconv16be, sconv_opt);
Packit Service 1d0348
	archive_string_conversion_set_opt(f_sconv16le, sconv_opt);
Packit Service 1d0348
	archive_string_conversion_set_opt(t_sconv8, sconv_opt);
Packit Service 1d0348
Packit Service 1d0348
	/* Open a test pattern file. */
Packit Service 1d0348
	assert((fp = fopen(testdata, "r")) != NULL);
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Read test data.
Packit Service 1d0348
	 *  Test data format:
Packit Service 1d0348
	 *     <NFC Unicode pattern> ';' <NFD Unicode pattern> '\n'
Packit Service 1d0348
	 *  Unicode pattern format:
Packit Service 1d0348
	 *     [0-9A-F]{4,5}([ ][0-9A-F]{4,5}){0,}
Packit Service 1d0348
	 */
Packit Service 1d0348
	while (fgets(buff, sizeof(buff), fp) != NULL) {
Packit Service 1d0348
		char nfc[80], nfd[80];
Packit Service 1d0348
		char utf8_nfc[80], utf8_nfd[80];
Packit Service 1d0348
		char utf16be_nfc[80], utf16be_nfd[80];
Packit Service 1d0348
		char utf16le_nfc[80], utf16le_nfd[80];
Packit Service 1d0348
		wchar_t wc_nfc[40], wc_nfd[40];
Packit Service 1d0348
		char *e, *p;
Packit Service 1d0348
		const wchar_t *wp;
Packit Service 1d0348
		const char *mp;
Packit Service 1d0348
		size_t mplen;
Packit Service 1d0348
		int should_be_nfc;
Packit Service 1d0348
Packit Service 1d0348
		line++;
Packit Service 1d0348
		if (buff[0] == '#')
Packit Service 1d0348
			continue;
Packit Service 1d0348
		p = strchr(buff, ';');
Packit Service 1d0348
		if (p == NULL)
Packit Service 1d0348
			continue;
Packit Service 1d0348
		*p++ = '\0';
Packit Service 1d0348
		/* Copy an NFC pattern */
Packit Service 1d0348
		strncpy(nfc, buff, sizeof(nfc)-1);
Packit Service 1d0348
		nfc[sizeof(nfc)-1] = '\0';
Packit Service 1d0348
		e = p;
Packit Service 1d0348
		p = strchr(p, '\n');
Packit Service 1d0348
		if (p == NULL)
Packit Service 1d0348
			continue;
Packit Service 1d0348
		*p = '\0';
Packit Service 1d0348
		/* Copy an NFD pattern */
Packit Service 1d0348
		strncpy(nfd, e, sizeof(nfd)-1);
Packit Service 1d0348
		nfd[sizeof(nfd)-1] = '\0';
Packit Service 1d0348
Packit Service 1d0348
		/*
Packit Service 1d0348
		 * Get an NFC patterns.
Packit Service 1d0348
		 */
Packit Service 1d0348
		should_be_nfc = scan_unicode_pattern(utf8_nfc, wc_nfc,
Packit Service 1d0348
			utf16be_nfc, utf16le_nfc, nfc, 1);
Packit Service 1d0348
Packit Service 1d0348
		/*
Packit Service 1d0348
		 * Get an NFD patterns.
Packit Service 1d0348
		 */
Packit Service 1d0348
		scan_unicode_pattern(utf8_nfd, wc_nfd, utf16be_nfd, utf16le_nfd,
Packit Service 1d0348
		    nfd, 0);
Packit Service 1d0348
Packit Service 1d0348
		if (locale_is_utf8) {
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFC string for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strcpy_l(
Packit Service 1d0348
			    &utf8, utf8_nfc, f_sconv8));
Packit Service 1d0348
			if (should_be_nfc) {
Packit Service 1d0348
				failure("NFC(%s) should not be converted to"
Packit Service 1d0348
				    " NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
			} else {
Packit Service 1d0348
				failure("NFC(%s) should be converted to"
Packit Service 1d0348
				    " NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualUTF8String(utf8_nfd, utf8.s);
Packit Service 1d0348
			}
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strcpy_l(
Packit Service 1d0348
			    &utf8, utf8_nfd, f_sconv8));
Packit Service 1d0348
			failure("NFD(%s) should not be any changed:%d",
Packit Service 1d0348
			    nfd, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfd, utf8.s);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Copy an NFD string for export.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strcpy_l(
Packit Service 1d0348
			    &utf8, utf8_nfd, t_sconv8));
Packit Service 1d0348
			failure("NFD(%s) should not be any changed:%d",
Packit Service 1d0348
			    nfd, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfd, utf8.s);
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFC string in UTF-16BE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strncpy_l(
Packit Service 1d0348
			    &utf8, utf16be_nfc, 100000, f_sconv16be));
Packit Service 1d0348
			if (should_be_nfc) {
Packit Service 1d0348
				failure("NFC(%s) should not be converted to"
Packit Service 1d0348
				    " NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
			} else {
Packit Service 1d0348
				failure("NFC(%s) should be converted to"
Packit Service 1d0348
				    " NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualUTF8String(utf8_nfd, utf8.s);
Packit Service 1d0348
			}
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFC string in UTF-16LE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_strncpy_l(
Packit Service 1d0348
			    &utf8, utf16le_nfc, 100000, f_sconv16le));
Packit Service 1d0348
			if (should_be_nfc) {
Packit Service 1d0348
				failure("NFC(%s) should not be converted to"
Packit Service 1d0348
				    " NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualUTF8String(utf8_nfc, utf8.s);
Packit Service 1d0348
			} else {
Packit Service 1d0348
				failure("NFC(%s) should be converted to"
Packit Service 1d0348
				    " NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualUTF8String(utf8_nfd, utf8.s);
Packit Service 1d0348
			}
Packit Service 1d0348
		}
Packit Service 1d0348
Packit Service 1d0348
		/*
Packit Service 1d0348
		 * Test for archive_mstring interface.
Packit Service 1d0348
		 * In specific, Windows platform UTF-16BE is directly
Packit Service 1d0348
		 * converted to/from wide-character to avoid the effect of
Packit Service 1d0348
		 * current locale since windows platform cannot make
Packit Service 1d0348
		 * locale UTF-8.
Packit Service 1d0348
		 */
Packit Service 1d0348
		if (locale_is_utf8 || wc_is_unicode) {
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-8 for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_copy_mbs_len_l(
Packit Service 1d0348
			    &mstr, utf8_nfc, 100000, f_sconv8));
Packit Service 1d0348
			assertEqualInt(0,
Packit Service 1d0348
			    archive_mstring_get_wcs(a, &mstr, &wp);;
Packit Service 1d0348
			if (should_be_nfc) {
Packit Service 1d0348
				failure("UTF-8 NFC(%s) should not be converted "
Packit Service 1d0348
				    "to WCS NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualWString(wc_nfc, wp);
Packit Service 1d0348
			} else {
Packit Service 1d0348
				failure("UTF-8 NFC(%s) should be converted "
Packit Service 1d0348
				    "to WCS NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualWString(wc_nfd, wp);
Packit Service 1d0348
			}
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-16BE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_copy_mbs_len_l(
Packit Service 1d0348
			    &mstr, utf16be_nfc, 100000, f_sconv16be));
Packit Service 1d0348
			assertEqualInt(0,
Packit Service 1d0348
			    archive_mstring_get_wcs(a, &mstr, &wp);;
Packit Service 1d0348
			if (should_be_nfc) {
Packit Service 1d0348
				failure("UTF-16BE NFC(%s) should not be "
Packit Service 1d0348
				    "converted to WCS NFD(%s):%d",
Packit Service 1d0348
				    nfc, nfd, line);
Packit Service 1d0348
				assertEqualWString(wc_nfc, wp);
Packit Service 1d0348
			} else {
Packit Service 1d0348
				failure("UTF-16BE NFC(%s) should be converted "
Packit Service 1d0348
				    "to WCS NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualWString(wc_nfd, wp);
Packit Service 1d0348
			}
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Normalize an NFD string in UTF-16LE for import.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_copy_mbs_len_l(
Packit Service 1d0348
			    &mstr, utf16le_nfc, 100000, f_sconv16le));
Packit Service 1d0348
			assertEqualInt(0,
Packit Service 1d0348
			    archive_mstring_get_wcs(a, &mstr, &wp);;
Packit Service 1d0348
			if (should_be_nfc) {
Packit Service 1d0348
				failure("UTF-16LE NFC(%s) should not be "
Packit Service 1d0348
				    "converted to WCS NFD(%s):%d",
Packit Service 1d0348
				    nfc, nfd, line);
Packit Service 1d0348
				assertEqualWString(wc_nfc, wp);
Packit Service 1d0348
			} else {
Packit Service 1d0348
				failure("UTF-16LE NFC(%s) should be converted "
Packit Service 1d0348
				    "to WCS NFD(%s):%d", nfc, nfd, line);
Packit Service 1d0348
				assertEqualWString(wc_nfd, wp);
Packit Service 1d0348
			}
Packit Service 1d0348
Packit Service 1d0348
			/*
Packit Service 1d0348
			 * Copy an NFD wide-string for export.
Packit Service 1d0348
			 */
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_copy_wcs(
Packit Service 1d0348
			    &mstr, wc_nfd));
Packit Service 1d0348
			assertEqualInt(0, archive_mstring_get_mbs_l(
Packit Service 1d0348
			    &mstr, &mp, &mplen, t_sconv8));
Packit Service 1d0348
			failure("WCS NFD(%s) should be UTF-8 NFD:%d"
Packit Service 1d0348
			    ,nfd, line);
Packit Service 1d0348
			assertEqualUTF8String(utf8_nfd, mp);
Packit Service 1d0348
		}
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	archive_string_free(&utf8);
Packit Service 1d0348
	archive_mstring_clean(&mstr;;
Packit Service 1d0348
	fclose(fp);
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_write_free(a2));
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
test_archive_string_canonicalization(void)
Packit Service 1d0348
{
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_string_conv *sconv;
Packit Service 1d0348
Packit Service 1d0348
	setlocale(LC_ALL, "en_US.UTF-8");
Packit Service 1d0348
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "UTF-8", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-8");
Packit Service 1d0348
	assertEqualString("UTF-8",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "UTF8", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-8");
Packit Service 1d0348
	assertEqualString("UTF-8",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "utf8", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-8");
Packit Service 1d0348
	assertEqualString("UTF-8",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "UTF-16BE", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-16BE");
Packit Service 1d0348
	assertEqualString("UTF-16BE",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "UTF16BE", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-16BE");
Packit Service 1d0348
	assertEqualString("UTF-16BE",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "utf16be", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-16BE");
Packit Service 1d0348
	assertEqualString("UTF-16BE",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "UTF-16LE", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-16LE");
Packit Service 1d0348
	assertEqualString("UTF-16LE",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "UTF16LE", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-16LE");
Packit Service 1d0348
	assertEqualString("UTF-16LE",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertA(NULL != (sconv =
Packit Service 1d0348
	    archive_string_conversion_to_charset(a, "utf16le", 1)));
Packit Service 1d0348
	failure("Charset name should be UTF-16LE");
Packit Service 1d0348
	assertEqualString("UTF-16LE",
Packit Service 1d0348
	    archive_string_conversion_charset_name(sconv));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
DEFINE_TEST(test_archive_string_conversion)
Packit Service 1d0348
{
Packit Service 1d0348
	static const char reffile[] = "test_archive_string_conversion.txt.Z";
Packit Service 1d0348
	static const char testdata[] = "testdata.txt";
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
	char buff[512];
Packit Service 1d0348
	ssize_t size;
Packit Service 1d0348
	FILE *fp;
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Extract a test pattern file.
Packit Service 1d0348
	 */
Packit Service 1d0348
	extract_reference_file(reffile);
Packit Service 1d0348
	assert((a = archive_read_new()) != NULL);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a));
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_raw(a));
Packit Service 1d0348
        assertEqualIntA(a, ARCHIVE_OK,
Packit Service 1d0348
            archive_read_open_filename(a, reffile, 512));
Packit Service 1d0348
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae);;
Packit Service 1d0348
	assert((fp = fopen(testdata, "w")) != NULL);
Packit Service 1d0348
	while ((size = archive_read_data(a, buff, 512)) > 0)
Packit Service 1d0348
		assertEqualInt(size, fwrite(buff, 1, size, fp));
Packit Service 1d0348
	assertEqualInt(0, fclose(fp));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	test_archive_string_normalization_nfc(testdata);
Packit Service 1d0348
	test_archive_string_normalization_mac_nfd(testdata);
Packit Service 1d0348
	test_archive_string_canonicalization();
Packit Service 1d0348
}