~registry/dolphin-emu/triforce

« back to all changes in this revision

Viewing changes to Externals/libiconv-1.14/lib/c99.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) 1999-2002 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
 * C99
 
23
 * This is ASCII with \uXXXX and \UXXXXXXXX escape sequences, denoting Unicode
 
24
 * characters. See ISO/IEC 9899:1999, section 6.4.3.
 
25
 * The treatment of control characters in the range U+0080..U+009F is not
 
26
 * specified; we pass them through unmodified.
 
27
 */
 
28
 
 
29
static int
 
30
c99_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
 
31
{
 
32
  unsigned char c;
 
33
  ucs4_t wc;
 
34
  int i;
 
35
 
 
36
  c = s[0];
 
37
  if (c < 0xa0) {
 
38
    if (c != '\\') {
 
39
      *pwc = c;
 
40
      return 1;
 
41
    }
 
42
    if (n < 2)
 
43
      return RET_TOOFEW(0);
 
44
    c = s[1];
 
45
    if (c == 'u') {
 
46
      wc = 0;
 
47
      for (i = 2; i < 6; i++) {
 
48
        if (n <= i)
 
49
          return RET_TOOFEW(0);
 
50
        c = s[i];
 
51
        if (c >= '0' && c <= '9')
 
52
          c -= '0';
 
53
        else if (c >= 'A' && c <= 'Z')
 
54
          c -= 'A'-10;
 
55
        else if (c >= 'a' && c <= 'z')
 
56
          c -= 'a'-10;
 
57
        else
 
58
          goto simply_backslash;
 
59
        wc |= (ucs4_t) c << (4 * (5-i));
 
60
      }
 
61
      if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000))
 
62
          || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) {
 
63
        *pwc = wc;
 
64
        return 6;
 
65
      }
 
66
    } else if (c == 'U') {
 
67
      wc = 0;
 
68
      for (i = 2; i < 10; i++) {
 
69
        if (n <= i)
 
70
          return RET_TOOFEW(0);
 
71
        c = s[i];
 
72
        if (c >= '0' && c <= '9')
 
73
          c -= '0';
 
74
        else if (c >= 'A' && c <= 'Z')
 
75
          c -= 'A'-10;
 
76
        else if (c >= 'a' && c <= 'z')
 
77
          c -= 'a'-10;
 
78
        else
 
79
          goto simply_backslash;
 
80
        wc |= (ucs4_t) c << (4 * (9-i));
 
81
      }
 
82
      if ((wc >= 0x00a0 && !(wc >= 0xd800 && wc < 0xe000))
 
83
          || wc == 0x0024 || wc == 0x0040 || wc == 0x0060) {
 
84
        *pwc = wc;
 
85
        return 10;
 
86
      }
 
87
    } else
 
88
      goto simply_backslash;
 
89
  }
 
90
  return RET_ILSEQ;
 
91
simply_backslash:
 
92
  *pwc = '\\';
 
93
  return 1;
 
94
}
 
95
 
 
96
static int
 
97
c99_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
 
98
{
 
99
  if (wc < 0xa0) {
 
100
    *r = wc;
 
101
    return 1;
 
102
  } else {
 
103
    int result;
 
104
    unsigned char u;
 
105
    if (wc < 0x10000) {
 
106
      result = 6;
 
107
      u = 'u';
 
108
    } else {
 
109
      result = 10;
 
110
      u = 'U';
 
111
    }
 
112
    if (n >= result) {
 
113
      int count;
 
114
      r[0] = '\\';
 
115
      r[1] = u;
 
116
      r += 2;
 
117
      for (count = result-3; count >= 0; count--) {
 
118
        unsigned int i = (wc >> (4*count)) & 0x0f;
 
119
        *r++ = (i < 10 ? '0'+i : 'a'-10+i);
 
120
      }
 
121
      return result;
 
122
    } else
 
123
      return RET_TOOSMALL;
 
124
  }
 
125
}