#include "example.h"
#include <stdio.h>
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;
}
}