#! /bin/sh

for kmap in $*
do
(
cat <<\/eoc
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
printchar (ch)
	unsigned long ch;
{
	if (ch == '\\' || ch == '"') {
		printf ("\\");
	}
	printf ("%c", ch);
}

int main () {
/eoc

sed -f `basename $0`.sed $kmap

cat <</eoc
}
/eoc
) > $kmap.c

	if cc -o $kmap.exe $kmap.c
	then	name=`echo $kmap | sed -e "s,\..*,," -e "s,-,_,g"`
		echo "struct keymap keymap_$name [] = {" > $kmap.h
		./$kmap.exe >> $kmap.h
		echo "	{NIL_PTR}" >> $kmap.h
		echo "};" >> $kmap.h

		rm -f $kmap.c $kmap.exe
	fi
done
