#! /bin/sh

if ! make Unihan.txt
then	echo Could not acquire Unicode data file Unihan.txt
	exit 1
fi

name=Cangjie

(
cat <<\/eoc
char * keys = "";

void
printutf8 (unichar)
	unsigned long unichar;
{
	if (unichar < 0x80) {
		printf ("%c", unichar);
	} else if (unichar < 0x800) {
		printf ("%c", 0xC0 | (unichar >> 6));
		printf ("%c", 0x80 | (unichar & 0x3F));
	} else if (unichar < 0x10000) {
		printf ("%c", 0xE0 | (unichar >> 12));
		printf ("%c", 0x80 | ((unichar >> 6) & 0x3F));
		printf ("%c", 0x80 | (unichar & 0x3F));
	} else if (unichar < 0x200000) {
		printf ("%c", 0xF0 | (unichar >> 18));
		printf ("%c", 0x80 | ((unichar >> 12) & 0x3F));
		printf ("%c", 0x80 | ((unichar >> 6) & 0x3F));
		printf ("%c", 0x80 | (unichar & 0x3F));
	} else if (unichar < 0x4000000) {
		printf ("%c", 0xF8 | (unichar >> 24));
		printf ("%c", 0x80 | ((unichar >> 18) & 0x3F));
		printf ("%c", 0x80 | ((unichar >> 12) & 0x3F));
		printf ("%c", 0x80 | ((unichar >> 6) & 0x3F));
		printf ("%c", 0x80 | (unichar & 0x3F));
	} else if (unichar < 0x80000000) {
		printf ("%c", 0xFC | (unichar >> 30));
		printf ("%c", 0x80 | ((unichar >> 24) & 0x3F));
		printf ("%c", 0x80 | ((unichar >> 18) & 0x3F));
		printf ("%c", 0x80 | ((unichar >> 12) & 0x3F));
		printf ("%c", 0x80 | ((unichar >> 6) & 0x3F));
		printf ("%c", 0x80 | (unichar & 0x3F));
	}
}

void
addmap (k, ch)
	char * k;
	unsigned long ch;
{
	if (strcmp (k, keys) != 0) {
		if (* keys != '\0') {
			printf ("\"},\n");
		}
		if (* k != '\0') {
			printf ("	{\"%s\", \"", k);
		}
	} else {
		printf (" ");
	}
	if (* k != '\0') {
		printutf8 (ch);
	}
	keys = k;
}

int
main () {
/eoc

# extract mappings from Unihan data
sed	-e 's/^U+\([^	]*\)	kCangjie	\([^	]*\)$/\2	\1/' \
	-e t -e d Unihan.txt |
sort -k 1,1 | tr '[A-Z]' '[a-z]' |
sed	-e 's/\(.*\)	\(.*\)/	addmap ("\1", 0x\2);/'

cat <</eoc
	addmap ("", 0);
}
/eoc
) > keymaps/$name.c

if cc -o keymaps/$name.exe keymaps/$name.c
then	if [ -f keymaps/$name.h ]
	then	echo saving previous keyboard mapping file to keymaps/$name.h.sav
		mv -i keymaps/$name.h keymaps/$name.h.sav
	fi
	(
	echo "/***************************************************"
	echo "	mined keyboard mapping table"
	echo "	generated with mkcangjie"
	echo "	from Unihan.txt"
	echo "*/"
	echo "struct keymap keymap_$name [] = {"
	keymaps/$name.exe
	echo "	{NIL_PTR}"
	echo "};"
	) > keymaps/$name.h

	./mkkentry $name

	rm -f keymaps/$name.c keymaps/$name.exe
fi

