~registry/dolphin-emu/triforce

« back to all changes in this revision

Viewing changes to Externals/libiconv-1.14/lib/cp936.h

  • Committer: Sérgio Benjamim
  • Date: 2015-02-13 05:54:40 UTC
  • Revision ID: sergio_br2@yahoo.com.br-20150213055440-ey2rt3sjpy27km78
Dolphin Triforce branch from code.google, commit b957980 (4.0-315).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2005 Free Software Foundation, Inc.
 
3
 * This file is part of the GNU LIBICONV Library.
 
4
 *
 
5
 * The GNU LIBICONV Library is free software; you can redistribute it
 
6
 * and/or modify it under the terms of the GNU Library General Public
 
7
 * License as published by the Free Software Foundation; either version 2
 
8
 * of the License, or (at your option) any later version.
 
9
 *
 
10
 * The GNU LIBICONV Library is distributed in the hope that it will be
 
11
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
13
 * Library General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU Library General Public
 
16
 * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
 
17
 * If not, write to the Free Software Foundation, Inc., 51 Franklin Street,
 
18
 * Fifth Floor, Boston, MA 02110-1301, USA.
 
19
 */
 
20
 
 
21
/*
 
22
 * CP936
 
23
 */
 
24
 
 
25
/*
 
26
 * The IANA has CP936 as an alias of GBK. But GBK is an official Chinese
 
27
 * specification, whereas CP936 is de-facto maintained by Microsoft. And,
 
28
 * of course, Microsoft modified CP936 since 1999.
 
29
 *
 
30
 * The differences from GBK are:
 
31
 *
 
32
 * 1. A single character:
 
33
 *
 
34
 *    code   CP936.TXT
 
35
 *    0x80   0x20AC # EURO SIGN
 
36
 *
 
37
 * Some variants of CP936 (in JDK, Windows-2000, ICU) also add:
 
38
 *
 
39
 * 2. Private area mappings:
 
40
 *
 
41
 *              code                 Unicode
 
42
 *    0x{A1..A2}{40..7E,80..A0}  U+E4C6..U+E585
 
43
 *    0x{AA..AF,F8..FE}{A1..FE}  U+E000..U+E4C5
 
44
 *
 
45
 * We add them too because, although there are backward compatibility problems
 
46
 * when a character from a private area is moved to an official Unicode code
 
47
 * point, they are useful for some people in practice.
 
48
 */
 
49
 
 
50
static int
 
51
cp936_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
 
52
{
 
53
  /* Try GBK first. */
 
54
  {
 
55
    int ret = ces_gbk_mbtowc(conv,pwc,s,n);
 
56
    if (ret != RET_ILSEQ)
 
57
      return ret;
 
58
  }
 
59
  /* Then handle the additional mappings. */
 
60
  {
 
61
    unsigned char c = *s;
 
62
    if (c == 0x80) {
 
63
      *pwc = 0x20ac;
 
64
      return 1;
 
65
    }
 
66
    /* User-defined characters */
 
67
    if (c >= 0xa1 && c <= 0xa2) {
 
68
      if (n < 2)
 
69
        return RET_TOOFEW(0);
 
70
      {
 
71
        unsigned char c2 = s[1];
 
72
        if ((c2 >= 0x40 && c2 < 0x7f) || (c2 >= 0x80 && c2 < 0xa1)) {
 
73
          *pwc = 0xe4c6 + 96 * (c - 0xa1) + (c2 - (c2 >= 0x80 ? 0x41 : 0x40));
 
74
          return 2;
 
75
        }
 
76
      }
 
77
    } else if ((c >= 0xaa && c < 0xb0) || (c >= 0xf8 && c < 0xff)) {
 
78
      if (n < 2)
 
79
        return RET_TOOFEW(0);
 
80
      {
 
81
        unsigned char c2 = s[1];
 
82
        if (c2 >= 0xa1 && c2 < 0xff) {
 
83
          *pwc = 0xe000 + 94 * (c - (c >= 0xf8 ? 0xf2 : 0xaa)) + (c2 - 0xa1);
 
84
          return 2;
 
85
        }
 
86
      }
 
87
    }
 
88
  }
 
89
  return RET_ILSEQ;
 
90
}
 
91
 
 
92
static int
 
93
cp936_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
 
94
{
 
95
  /* Try GBK first. */
 
96
  {
 
97
    int ret = ces_gbk_wctomb(conv,r,wc,n);
 
98
    if (ret != RET_ILUNI)
 
99
      return ret;
 
100
  }
 
101
  /* Then handle the additional mappings. */
 
102
  if (wc >= 0xe000 && wc < 0xe586) {
 
103
    /* User-defined characters */
 
104
    if (n < 2)
 
105
      return RET_TOOFEW(0);
 
106
    if (wc < 0xe4c6) {
 
107
      unsigned int i = wc - 0xe000;
 
108
      unsigned int c1 = i / 94;
 
109
      unsigned int c2 = i % 94;
 
110
      r[0] = c1 + (c1 < 6 ? 0xaa : 0xf2);
 
111
      r[1] = c2 + 0xa1;
 
112
      return 2;
 
113
    } else {
 
114
      unsigned int i = wc - 0xe4c6;
 
115
      unsigned int c1 = i / 96;
 
116
      unsigned int c2 = i % 96;
 
117
      r[0] = c1 + 0xa1;
 
118
      r[1] = c2 + (c2 < 0x3f ? 0x40 : 0x41);
 
119
      return 2;
 
120
    }
 
121
  } else if (wc == 0x20ac) {
 
122
    r[0] = 0x80;
 
123
    return 1;
 
124
  }
 
125
  return RET_ILUNI;
 
126
}