• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/ap/gpl/timemachine/gettext-0.17/gettext-tools/libgettextpo/unistr/
1/* Conversion UCS-4 to UTF-8.
2   Copyright (C) 2002, 2006-2007 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   Lesser 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
23int
24u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n)
25{
26  int count;
27
28  if (uc < 0x80)
29    /* The case n >= 1 is already handled by the caller.  */
30    return -2;
31  else if (uc < 0x800)
32    count = 2;
33  else if (uc < 0x10000)
34    {
35      if (uc < 0xd800 || uc >= 0xe000)
36	count = 3;
37      else
38	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  else if (uc < 0x110000)
49    count = 4;
50#endif
51  else
52    return -1;
53
54  if (n < count)
55    return -2;
56
57  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    case 4: s[3] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x10000;
64    case 3: s[2] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0x800;
65    case 2: s[1] = 0x80 | (uc & 0x3f); uc = uc >> 6; uc |= 0xc0;
66  /*case 1:*/ s[0] = uc;
67    }
68  return count;
69}
70