view mcabber/src/utf8.c @ 147:7571de4aed73

[/trunk] Changeset 159 by mikael * Fix a bug in buddylist_build() * We now lock the current buddy even not when being in chat mode. For example, if we're writing to s.o. and he leaves just before we press enter, we won't write to the wrong buddy... If the current_buddy is a group, we lock it too. * Remove MCABBER_TESTUNIT ifdef in roster.h (test program isn't up-to-date anymore...)
author mikael
date Fri, 29 Apr 2005 19:56:28 +0000
parents 18a03a69f5e4
children 1bc374915787 33b8e801ffa6
line wrap: on
line source

#include <stdlib.h>
#include <string.h>

#include "utf8.h"


/* Desc: convert UTF8 -> ASCII
 * 
 * In  : UTF8 string
 * Out : ASCII string
 *
 * Note: it is up to the caller to free the returned string
 */
char *utf8_decode(const char *src)
{
  char *ret = calloc(1, strlen(src) + 1);
  unsigned char *aux = (unsigned char*)ret;

  while (*src) {
    unsigned char lead = *src++;
    if ((lead & 0xe0) == 0xc0) {
      unsigned char ch2 = *src++;
      *aux = ((lead & 0x1f) << 6) | (ch2 & 0x3f);
    } else {
      *aux = lead;
    }
    aux++;
  }

  return ret;
}


/* Desc: convert ASCII -> UTF8
 * 
 * In  : ASCII string
 * Out : UTF8 string
 *
 * Note: it is up to the caller to free the returned string
 */
char *utf8_encode(const char *src)
{
  char *ret = calloc(1, (strlen(src) * 2) + 1);
  unsigned char *aux = (unsigned char*)ret;

  while (*src) {
    unsigned char ch = *src++;
    if (ch < 0x80U) {
      *aux++ = ch;
    } else {  /* if (ch < 0x800U) { */
      *aux++ = 0xc0 | (ch >> 6);
      *aux++ = 0x80 | (ch & 0x3f);
    }
  }

  return ret;
}