#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <locale.h>
#include <string.h>

int
main(int argc, char **argv)
{
	char *buffer = NULL;
	size_t buflen = 0;
	char *extrabuf = NULL;
	size_t extralen = 0;
	const char *hexdigit = "0123456789abcdef";

	if (argc < 3)
	{
		fprintf(stderr, "Usage: strxfrm {collation} {string}...\n");
		exit(1);
	}
	if (setlocale(LC_COLLATE, argv[1]) == NULL)
	{
		fprintf(stderr, "setlocale: %s\n", strerror(errno));
		exit(1);
	}
	argv += 2;

	while (*argv)
	{
		size_t r;
		size_t k;

		r = strxfrm(buffer, *argv, buflen);
		if (r > buflen)
		{
			if (buffer != NULL)
				free(buffer);
			buflen = r + 1;
			buffer = malloc(buflen);
			if (buffer == NULL)
			{
				fprintf(stderr, "out of memory\n");
				exit(1);
			}
			continue;
		}
		if (extralen < 2 * r + 1)
		{
			if (extrabuf != NULL)
				free(extrabuf);
			extralen = 2 * r + 1;
			extrabuf = malloc(extralen);
			if (extrabuf == NULL)
			{
				fprintf(stderr, "out of memory\n");
				exit(1);
			}
		}
		for (k = 0; k < r; ++k)
		{
			unsigned char	c = buffer[k];
			extrabuf[2 * k] = hexdigit[c >> 4];
			extrabuf[2 * k + 1] = hexdigit[c & 15];
		}
		extrabuf[2 * k] = '\0';
		printf("\"%s\" -> %s (%d bytes)\n", *argv, extrabuf, r);
		++argv;
	}
	exit(0);
}
