/* compile with -finput-charset=utf-8 */

#define _XOPEN_SOURCE 600
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

#define UNKNOWN printf("%lc",L'⣿')

/* TODO: This table is missing oa ? */
int main(void) {
	int i;
	setlocale(LC_ALL,"fr_FR.UTF-8");
	for (i=0; i<= 0x199; i++) {
		printf("\n%lc ",0x1200+i);

		switch (0x1200+i) {
		case L'፡': printf("%lc",L'⠀'); continue; /* wordspace */
		case L'።': printf("%lc",L'⠲'); continue; /* full stop */
		case L'፣': printf("%lc",L'⠂'); continue; /* comma */
		case L'፤': printf("%lc",L'⠆'); continue; /* semicolon */
		case L'፥': printf("%lc",L'⠒'); continue; /* colon */
		case L'፧': printf("%lc",L'⠦'); continue; /* question mark */
		}

		if (i/8 >= 45 && i/8 <= 48) {
			/* digits */
			switch (i-45*8) {
			case 1: printf("%lc",L'⠡'); continue;
			case 2: printf("%lc",L'⠣'); continue;
			case 3: printf("%lc",L'⠩'); continue;
			case 4: printf("%lc",L'⠹'); continue;
			case 5: printf("%lc",L'⠱'); continue;
			case 6: printf("%lc",L'⠫'); continue;
			case 7: printf("%lc",L'⠻'); continue;
			case 8: printf("%lc",L'⠳'); continue;
			case 9: printf("%lc",L'⠪'); continue;
			case 10: printf("%ls",L"⠡⠼"); continue; /* 10 */
			case 11: printf("%ls",L"⠣⠼"); continue; /* 20 */
			case 12: printf("%ls",L"⠩⠼"); continue; /* 30 */
			case 13: printf("%ls",L"⠹⠼"); continue; /* 40 */
			case 14: printf("%ls",L"⠱⠼"); continue; /* 50 */
			case 15: printf("%ls",L"⠫⠼"); continue; /* 60 */
			case 16: printf("%ls",L"⠻⠼"); continue; /* 70 */
			case 17: printf("%ls",L"⠳⠼"); continue; /* 80 */
			case 18: printf("%ls",L"⠪⠼"); continue; /* 90 */
			case 19: printf("%ls",L"⠡⠼⠼"); continue; /* 100 */
			case 20: printf("%ls",L"⠡⠼⠼⠼⠼"); continue; /* 10000 */
			}
			UNKNOWN; /* unknown */
			continue;
		}

#define ISDIPH() (i/8 == 9 || i/8 == 17 || i/8 == 22 || i/8 == 34)

		if (i%8 == 5 && !ISDIPH()) {
			/* short E/I */
			switch (i/8) {
			case 0: printf("%lc",L'⠐'); continue;
			case 1: printf("%lc",L'⠸'); continue;
			case 2: printf("%lc",L'⠐'); continue;
			case 3: printf("%lc",L'⠆'); continue;
			case 4: printf("%ls",L"⠠⠰"); continue;
			case 5: printf("%lc",L'⠳'); continue;
			case 6: printf("%lc",L'⠰'); continue;
			case 7: printf("%lc",L'⠱'); continue;
			case 8: printf("%lc",L'⠨'); continue; /* KI */
			case 12: printf("%lc",L'⠘'); continue; /* BI */
			case 14: printf("%lc",L'⠂'); continue; /* TI */
			case 15: printf("%lc",L'⠒'); continue; /* CI */
			case 16: printf("%lc",L'⠐'); continue; /* XI */
			case 18: printf("%lc",L'⠫'); continue; /* NI */
			case 19: printf("%lc",L'⠢'); continue; /* NYI */
			case 20: printf("%lc",L'⠌'); continue; /* 'I */
			case 21: printf("%lc",L'⠔'); continue; /* KI */
			case 23: printf("%lc",L'⠿'); continue; /* KXI */
			case 25: printf("%lc",L'⠪'); continue; /* WI */
			case 26: printf("%lc",L'⠌'); continue; /* I */
			case 27: printf("%lc",L'⠮'); continue; /* ZI */
			case 28: printf("%lc",L'⠦'); continue; /* ZHI */
			case 29: printf("%lc",L'⠧'); continue; /* YI */
			case 30: printf("%lc",L'⠹'); continue; /* DI */
			case 32: printf("%lc",L'⠣'); continue; /* DJI */
			case 33: printf("%lc",L'⠶'); continue; /* GI */
			case 36: printf("%lc",L'⠷'); continue; /* THI */
			case 37: printf("%lc",L'⠤'); continue; /* CHI */
			case 38: printf("%lc",L'⠼'); continue; /* PHI */
			case 39: printf("%lc",L'⠜'); continue; /* TSI */
			case 40: printf("%lc",L'⠜'); continue; /* TZI */
			case 41: printf("%lc",L'⠈'); continue; /* Fi */
			case 42: printf("%lc",L'⠠'); continue; /* PI */
			}
			UNKNOWN; /* Unknown */
			continue;
		}

#define DIPH \
	if ((i%8 == 6) || (i%8 == 1)) { \
		UNKNOWN; \
		continue; \
	} else printf("%lc",L'⠻');

		if (i%8!=7)
		switch (i/8) {
		  case 0:  printf("%lc",L'⠓'); break;
		  case 1:  printf("%lc",L'⠇'); break;
		  case 2:  printf("%lc",L'⠓'); break;
		  case 3:  printf("%lc",L'⠍'); break;
		  case 4:  printf("%ls",L"⠠⠎"); break;
		  case 5:  printf("%lc",L'⠗'); break;
		  case 6:  printf("%lc",L'⠎'); break;
		  case 7:  printf("%lc",L'⠩'); break;
		  case 8:  printf("%lc",L'⠟'); break; /* KA */
		  case 9: DIPH; printf("%lc",L'⠟'); break; /* QWA */
		  case 10: UNKNOWN; continue; /* QHA, missing */
		  case 11: UNKNOWN; continue; /* QHWA, missing */
		  case 12: printf("%lc",L'⠃'); break; /* BA */
		  case 13: UNKNOWN; continue; /* VA, missing */
		  case 14: printf("%lc",L'⠞'); break; /* TA */
		  case 15: printf("%lc",L'⠡'); break; /* CA */
		  case 16: printf("%lc",L'⠓'); break; /* XA */
		  case 17: DIPH; printf("%lc",L'⠓'); break; /* XWA */
		  case 18: printf("%lc",L'⠝'); break; /* NA */
		  case 19: printf("%lc",L'⠬'); break; /* NYA */
		  case 20: printf("%lc",L'⠄'); break; /* 'A */
		  case 21: printf("%lc",L'⠅'); break; /* KA */
		  case 22: DIPH; printf("%lc",L'⠅');	break; /* KWA */
		  case 23: printf("%lc",L'⠭'); break; /* KXA */
		  case 24: UNKNOWN; continue; /* KXWA, missing */
		  case 25: printf("%lc",L'⠺'); break; /* WA */
		  case 26: printf("%lc",L'⠄'); break; /* A */
		  case 27: printf("%lc",L'⠵'); break; /* ZA */
		  case 28: printf("%lc",L'⠴'); break; /* ZHA */
		  case 29: printf("%lc",L'⠽'); break; /* YA */
		  case 30: printf("%lc",L'⠙'); break; /* DA */
		  case 31: UNKNOWN; continue; /* DDA, missing */
		  case 32: printf("%lc",L'⠚'); break; /* DJA */
		  case 33: printf("%lc",L'⠛'); break; /* GA */
			   /* note the if: is this a typo in the document or an exception? */
		  case 34: DIPH; if (i%8!=0) printf("%lc",L'⠛'); break; /* GWA */
		  case 35: UNKNOWN; continue; /* GGA, missing */
		  case 36: printf("%lc",L'⠾'); break; /* THA */
		  case 37: printf("%lc",L'⠉'); break; /* CHA */
		  case 38: printf("%lc",L'⠖'); break; /* PHA */
		  case 39: printf("%lc",L'⠯'); break; /* TSA */
		  case 40: printf("%lc",L'⠯'); break; /* TZA */
		  case 41: printf("%lc",L'⠋'); break; /* FA */
		  case 42: printf("%lc",L'⠏'); break; /* PA */
		  case 43: UNKNOWN; continue; /* RYA, missing */
		default: UNKNOWN; continue; /* unknown, ignore */
		}
		switch (i%8) {
		case 0: break; /* short A */
		case 1: printf("%lc",L'⠥'); break; /* long U */
		case 2: if (ISDIPH()) /* long I */
			  printf("%lc",L'⠥');
			else
			  printf("%lc",L'⠊');
			break;
		case 3: printf("%lc",L'⠁'); break; /* long A */
		case 4: printf("%lc",L'⠑'); break; /* long E */
		case 5: if (ISDIPH()) /* short E/I */
			  printf("%lc",L'⠊');
			break;
		case 6: printf("%lc",L'⠕'); break; /* long O */
		case 7: UNKNOWN; continue; /* OA, missing */
		}
	}
	return 0;
}

