%{ #include #include void put_utf8(int); %} %START BUCK %% "<" BEGIN 0; ECHO; ">" BEGIN BUCK; ECHO; "'" put_utf8(0x0621); "|" put_utf8(0x0622); ">" put_utf8(0x0623); "&" put_utf8(0x0624); "<" put_utf8(0x0625); "}" put_utf8(0x0626); "A" put_utf8(0x0627); "b" put_utf8(0x0628); "p" put_utf8(0x0629); "t" put_utf8(0x062a); "v" put_utf8(0x062b); "j" put_utf8(0x062c); "H" put_utf8(0x062d); "x" put_utf8(0x062e); "d" put_utf8(0x062f); "*" put_utf8(0x0630); "r" put_utf8(0x0631); "z" put_utf8(0x0632); "s" put_utf8(0x0633); "$" put_utf8(0x0634); "S" put_utf8(0x0635); "D" put_utf8(0x0636); "T" put_utf8(0x0637); "Z" put_utf8(0x0638); "E" put_utf8(0x0639); "g" put_utf8(0x063a); "_" put_utf8(0x0640); "f" put_utf8(0x0641); "q" put_utf8(0x0642); "k" put_utf8(0x0643); "l" put_utf8(0x0644); "m" put_utf8(0x0645); "n" put_utf8(0x0646); "h" put_utf8(0x0647); "w" put_utf8(0x0648); "Y" put_utf8(0x0649); "y" put_utf8(0x064a); "F" put_utf8(0x064b); "N" put_utf8(0x064c); "K" put_utf8(0x064d); "a" put_utf8(0x064e); "u" put_utf8(0x064f); "i" put_utf8(0x0650); "~" put_utf8(0x0651); "o" put_utf8(0x0652); "`" put_utf8(0x0670); "{" put_utf8(0x0671); "^" ; "-" ; . ECHO; \n { ECHO; fflush(stdout); } %% void put_utf8(int in) { char out[7]; int count; int mask = 0x3f; if (in <= 0x7f) { count = 1; out[0] = in; } else if (in >= 0x80 && in <= 0x7ff) { count = 2; out[1] = (in & mask) | 0x80; out[0] = ((in >> 6) & mask) | (0xf << (8 - count)); /* 0xc0; */ } else if (in >= 0x800 && in <= 0xffff) { count = 3; out[2] = (in & mask) | 0x80; out[1] = ((in >> 6) & mask) | 0x80; out[0] = ((in >> 12) & mask) | (0xf << (8 - count)); /* 0xe0; */ } out[count] = '\0'; printf("%s", out); /* printf("%x %x\n", 0xc0, ((0x0f << 5) & 0xff)); */ }