packages feed

bindings-common-0.2.2: example/example.c

#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;

      }

}