Mercurial > hg
diff mcabber/src/utf8.c @ 24:e88b15cbf2de
[/trunk] Changeset 40 by mikael
* Change structure -> src directory for mcabber source code...
author | mikael |
---|---|
date | Sun, 27 Mar 2005 20:16:02 +0000 |
parents | |
children | f78ffe7ce43d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mcabber/src/utf8.c Sun Mar 27 20:16:02 2005 +0000 @@ -0,0 +1,58 @@ +#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); + char *aux = 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); + char *aux = ret; + + while (*src) { + unsigned char ch = *src++; + if (ch < 0x80) { + *aux = ch; + } else { /* if (ch < 0x800) { */ + *aux++ = 0xc0 | (ch >> 6 & 0x1f); + *aux = 0xc0 | (0x80 | (ch & 0x3f)); + } + aux++; + } + + return ret; +}