annotate mcabber/src/utf8.c @ 364:33b8e801ffa6

Merge changeset 315 (65aa05520556)
author Mikael Berthe <mikael@lilotux.net>
date Sun, 24 Jul 2005 15:13:53 +0100
parents 53dfe6aa6a23 18a03a69f5e4
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
26 *aux = ((lead & 0x1f) << 6) | (ch2 & 0x3f);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
27 } else {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
28 *aux = lead;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
29 }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
30 aux++;
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) {
f78ffe7ce43d [/trunk] Changeset 50 by mikael
mikael
parents: 24
diff changeset
55 *aux++ = ch;
48
f937475e9baa [/trunk] Changeset 64 by mikael
mikael
parents: 34
diff changeset
56 } else { /* if (ch < 0x800U) { */
34
f78ffe7ce43d [/trunk] Changeset 50 by mikael
mikael
parents: 24
diff changeset
57 *aux++ = 0xc0 | (ch >> 6);
f78ffe7ce43d [/trunk] Changeset 50 by mikael
mikael
parents: 24
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 }