mcabber/src/utf8.c
author Mikael Berthe <mikael@lilotux.net>
Wed, 20 Jul 2005 19:16:09 +0100
changeset 343 998b63be6e6b
parent 327 53dfe6aa6a23
child 364 33b8e801ffa6
permissions -rw-r--r--
Change default auto-away status message
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     1
#include <stdlib.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     2
#include <string.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     3
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     4
#include "utf8.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     5
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     6
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     7
/* Desc: convert UTF8 -> ASCII
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     8
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     9
 * In  : UTF8 string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    10
 * Out : ASCII string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    11
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    12
 * Note: it is up to the caller to free the returned string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    13
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    14
char *utf8_decode(const char *src)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    15
{
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    16
  unsigned char *ret, *aux;
326
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    17
  
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    18
  if (!src) return NULL;
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    19
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    20
  aux = ret = calloc(1, strlen(src) + 1);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    21
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    22
  while (*src) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    23
    unsigned char lead = *src++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    24
    if ((lead & 0xe0) == 0xc0) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    25
      unsigned char ch2 = *src++;
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    26
      *aux = ((lead & 0x1f) << 6) | (ch2 & 0x3f);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    27
    } else {
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    28
      *aux = lead;
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    29
    }
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    30
    aux++;
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    31
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    32
326
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    33
  return (char*)ret;
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    34
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    35
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    36
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    37
/* Desc: convert ASCII -> UTF8
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    38
 * 
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    39
 * In  : ASCII string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    40
 * Out : UTF8 string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    41
 *
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    42
 * Note: it is up to the caller to free the returned string
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    43
 */
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    44
char *utf8_encode(const char *src)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    45
{
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    46
  unsigned char *ret, *aux;
326
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    47
  
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    48
  if (!src) return NULL;
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    49
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    50
  aux = ret = calloc(1, (strlen(src) * 2) + 1);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    51
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    52
  while (*src) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    53
    unsigned char ch = *src++;
34
f78ffe7ce43d [/trunk] Changeset 50 by mikael
mikael
parents: 24
diff changeset
    54
    if (ch < 0x80U) {
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    55
      *aux++ = ch;
48
f937475e9baa [/trunk] Changeset 64 by mikael
mikael
parents: 34
diff changeset
    56
    } else {  /* if (ch < 0x800U) { */
327
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    57
      *aux++ = 0xc0 | (ch >> 6);
53dfe6aa6a23 Fix previous fix... :-(
Mikael Berthe <mikael@lilotux.net>
parents: 326
diff changeset
    58
      *aux++ = 0x80 | (ch & 0x3f);
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    59
    }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    60
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    61
326
1bc374915787 Fix crash when utf8_decode parameter is NULL
Mikael Berthe <mikael@lilotux.net>
parents: 49
diff changeset
    62
  return (char*)ret;
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    63
}