Branch data Line data Source code
1 : : /* Conversion UCS-4 to UTF-8.
2 : : Copyright (C) 2002, 2006-2007, 2009-2012 Free Software Foundation, Inc.
3 : : Written by Bruno Haible <bruno@clisp.org>, 2002.
4 : :
5 : : This program is free software: you can redistribute it and/or modify it
6 : : under the terms of the GNU General Public License as published
7 : : by the Free Software Foundation; either version 3 of the License, or
8 : : (at your option) any later version.
9 : :
10 : : This program is distributed in the hope that it will be useful,
11 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 : : General Public License for more details.
14 : :
15 : : You should have received a copy of the GNU General Public License
16 : : along with this program. If not, see <http://www.gnu.org/licenses/>. */
17 : :
18 : : #include <config.h>
19 : :
20 : : /* Specification. */
21 : : #include "unistr.h"
22 : :
23 : : int
24 : 165 : u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n)
25 : : {
26 : : int count;
27 : :
28 [ + + ]: 165 : if (uc < 0x80)
29 : : /* The case n >= 1 is already handled by the caller. */
30 : 128 : return -2;
31 [ + + ]: 37 : else if (uc < 0x800)
32 : 3 : count = 2;
33 [ + + ]: 34 : else if (uc < 0x10000)
34 : : {
35 [ + + ][ - + ]: 24 : if (uc < 0xd800 || uc >= 0xe000)
36 : 4 : count = 3;
37 : : else
38 : 20 : return -1;
39 : : }
40 : : #if 0
41 : : else if (uc < 0x200000)
42 : : count = 4;
43 : : else if (uc < 0x4000000)
44 : : count = 5;
45 : : else if (uc <= 0x7fffffff)
46 : : count = 6;
47 : : #else
48 [ + + ]: 10 : else if (uc < 0x110000)
49 : 5 : count = 4;
50 : : #endif
51 : : else
52 : 5 : return -1;
53 : :
54 [ + + ]: 12 : if (n < count)
55 : 9 : return -2;
56 : :
57 [ + + + - ]: 3 : switch (count) /* note: code falls through cases! */
58 : : {
59 : : #if 0
60 : : case 6: s[5] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x4000000;
61 : : case 5: s[4] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x200000;
62 : : #endif
63 : 1 : case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
64 : 2 : case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
65 : 3 : case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
66 : 3 : /*case 1:*/ s[0] = uc;
67 : : }
68 : 165 : return count;
69 : : }
|