#include "example.h" #include void translate (int what, struct unicode_translator *p) { int i; uint32_t uni; switch (what) { case UNICODE_2_UTF8: uni = p->unicode; for(i=0;i<4;) p->eight_bits[i++] = 0; if (uni < 0x7F) { p->eight_bits[0] = uni & 0x7F; p->nchars = 1; return; } else { p->eight_bits[0] = uni & 0x3F; p->eight_bits[0] |= 0x80; uni >>= 6; } if (uni < 0x20) { p->eight_bits[1] = uni & 0x1F; p->eight_bits[1] |= 0xC0; p->nchars = 2; return; } else { p->eight_bits[1] = uni & 0x3F; p->eight_bits[1] |= 0x80; uni >>= 6; } if (uni < 0x10) { p->eight_bits[2] = uni & 0xF; p->eight_bits[2] |= 0xEF; p->nchars = 3; return; } else { p->eight_bits[2] = uni & 0x3F; p->eight_bits[2] |= 0x80; uni >>= 6; } p->eight_bits[3] = uni & 0x7; p->eight_bits[3] |= 0xF0; p->nchars = 4; return; case UTF8_2_UNICODE: for(i=p->nchars;i<4;) p->eight_bits[i++] = 0; if (p->eight_bits[0] < 0x80) { p->unicode = p->eight_bits[0]; return; } else p->unicode = p->eight_bits[0] & 0x3F; if (p->eight_bits[1] < 0xE0) { p->unicode += (p->eight_bits[1] & 0x1F) << 6; return; } else p->unicode += (p->eight_bits[1] & 0x3F) << 6; if (p->eight_bits[2] < 0xF0) { p->unicode += (p->eight_bits[2] & 0xF) << 12; return; } else p->unicode += (p->eight_bits[2] & 0x3F) << 12; p->unicode += (p->eight_bits[3] & 0x7) << 18; return; } }