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

#include <mba/msgno.h>
#include <mba/text.h>

#define BSIZE 0xFFFF

int
main(int argc, char *argv[])
{
	FILE *fp;
	size_t n;
	unsigned char buf[BSIZE];
	int lower = 0;

	if (argc < 2) {
		fprintf(stderr, "usage: %s <utf8file> [0]\n", argv[0]);
		return EXIT_FAILURE;
	}

	errno = 0;

	if ((fp = fopen(argv[1], "r")) == NULL) {
		MMNF(errno, ": %s", argv[1]);
		return EXIT_FAILURE;
	}

	if (argc > 2) {
		lower = strcmp("0", argv[2]) == 0;
	}

	if (!setlocale(LC_CTYPE, "")) {
		MMSG("failed to setlocale");
		return EXIT_FAILURE;
	}

	while ((n = fread(buf, 1, BSIZE, fp)) > 0) {
		if (lower) {
			if (utf8tolower(buf, buf + n) != (int)n) {
				MMSG("conversion failure");
				return EXIT_FAILURE;
			}
		} else {
			if (utf8toupper(buf, buf + n) != (int)n) {
				MMSG("conversion failure");
				return EXIT_FAILURE;
			}
		}
		if (fwrite(buf, 1, n, stdout) != n) {
			MMSG("write failure");
			return EXIT_FAILURE;
		}
	}

	return EXIT_SUCCESS;
}


syntax highlighted by Code2HTML, v. 0.9.1