source: trunk/libs/newlib/src/newlib/iconvdata/jis0212.h @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.7 KB
Line 
1/* Access functions for JISX0212 conversion.
2   Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc.
3   This file is part of the GNU C Library.
4   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
5
6   The GNU C Library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Lesser General Public
8   License as published by the Free Software Foundation; either
9   version 2.1 of the License, or (at your option) any later version.
10
11   The GNU C Library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with the GNU C Library; if not, write to the Free
18   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19   02111-1307 USA.  */
20
21#ifndef _JIS0212_H
22#define _JIS0212_H      1
23
24#include <gconv.h>
25#include <stdint.h>
26
27
28/* Struct for table with indeces in mapping table.  */
29struct jisx0212_idx
30{
31  uint16_t start;
32  uint16_t end;
33  uint16_t idx;
34};
35
36/* Conversion table.  */
37extern const struct jisx0212_idx __jisx0212_to_ucs_idx[];
38extern const uint16_t __jisx0212_to_ucs[];
39
40extern const struct jisx0212_idx __jisx0212_from_ucs_idx[];
41extern const char __jisx0212_from_ucs[][2];
42
43
44static inline uint32_t
45jisx0212_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset)
46{
47  const struct jisx0212_idx *rp = __jisx0212_to_ucs_idx;
48  unsigned char ch = *(*s);
49  unsigned char ch2;
50  uint32_t wch = 0;
51  int idx;
52
53  if (ch < offset || (ch - offset) < 0x22 || (ch - offset) > 0x6d)
54    return __UNKNOWN_10646_CHAR;
55
56  if (avail < 2)
57    return 0;
58
59  ch2 = (*s)[1];
60  if (ch2 < offset || (ch2 - offset) <= 0x20 || (ch2 - offset) >= 0x7f)
61    return __UNKNOWN_10646_CHAR;
62
63  idx = (ch - offset - 0x21) * 94 + (ch2 - offset - 0x21);
64
65  while (idx > rp->end)
66    ++rp;
67  if (idx >= rp->start)
68    wch = __jisx0212_to_ucs[rp->idx + idx - rp->start];
69
70  if (wch != L'\0')
71    (*s) += 2;
72  else
73    wch = __UNKNOWN_10646_CHAR;
74
75  return wch;
76}
77
78
79static inline size_t
80ucs4_to_jisx0212 (uint32_t wch, char *s, size_t avail)
81{
82  const struct jisx0212_idx *rp = __jisx0212_from_ucs_idx;
83  unsigned int ch = (unsigned int) wch;
84  const char *cp;
85
86  if (ch >= 0xffff)
87    return __UNKNOWN_10646_CHAR;
88  while (ch > rp->end)
89    ++rp;
90  if (ch >= rp->start)
91    cp = __jisx0212_from_ucs[rp->idx + ch - rp->start];
92  else
93    return __UNKNOWN_10646_CHAR;
94
95  if (cp[0] == '\0')
96    return __UNKNOWN_10646_CHAR;
97
98  s[0] = cp[0];
99  if (cp[1] != '\0')
100    {
101      if (avail < 2)
102        return 0;
103
104      s[1] = cp[1];
105    }
106
107  return 2;
108}
109
110#endif /* jis0212.h */
Note: See TracBrowser for help on using the repository browser.