63a834c801a63190a2c6e188b5260055fbc6ae1a
[crypto.git] / apps / irssi / src / fe-text / utf8.c
1
2 #define UTF8_COMPUTE(Char, Mask, Len)                                         \
3   if (Char < 128)                                                             \
4     {                                                                         \
5       Len = 1;                                                                \
6       Mask = 0x7f;                                                            \
7     }                                                                         \
8   else if ((Char & 0xe0) == 0xc0)                                             \
9     {                                                                         \
10       Len = 2;                                                                \
11       Mask = 0x1f;                                                            \
12     }                                                                         \
13   else if ((Char & 0xf0) == 0xe0)                                             \
14     {                                                                         \
15       Len = 3;                                                                \
16       Mask = 0x0f;                                                            \
17     }                                                                         \
18   else if ((Char & 0xf8) == 0xf0)                                             \
19     {                                                                         \
20       Len = 4;                                                                \
21       Mask = 0x07;                                                            \
22     }                                                                         \
23   else if ((Char & 0xfc) == 0xf8)                                             \
24     {                                                                         \
25       Len = 5;                                                                \
26       Mask = 0x03;                                                            \
27     }                                                                         \
28   else if ((Char & 0xfe) == 0xfc)                                             \
29     {                                                                         \
30       Len = 6;                                                                \
31       Mask = 0x01;                                                            \
32     }                                                                         \
33   else                                                                        \
34     Len = -1;
35
36 #define UTF8_GET(Result, Chars, Count, Mask, Len)                             \
37   (Result) = (Chars)[0] & (Mask);                                             \
38   for ((Count) = 1; (Count) < (Len); ++(Count))                               \
39     {                                                                         \
40       if (((Chars)[(Count)] & 0xc0) != 0x80)                                  \
41         {                                                                     \
42           (Result) = -1;                                                      \
43           break;                                                              \
44         }                                                                     \
45       (Result) <<= 6;                                                         \
46       (Result) |= ((Chars)[(Count)] & 0x3f);                                  \
47     }
48
49 void get_utf8_char(const unsigned char **ptr)
50 {
51         int i, mask = 0, len;
52         unsigned int result;
53         unsigned char c = (unsigned char) **ptr;
54
55         UTF8_COMPUTE(c, mask, len);
56         if (len == -1)
57                 return;
58
59         UTF8_GET(result, *ptr, i, mask, len);
60         if (result == -1)
61                 return;
62
63         *ptr += len-1;
64 }