]>
Commit | Line | Data |
---|---|---|
04be94a8 | 1 | /* Access functions for JISX0208 conversion. |
085a4412 UD |
2 | Copyright (C) 1997,1998,1999,2000,2003,2005,2007 |
3 | Free Software Foundation, Inc. | |
04be94a8 UD |
4 | This file is part of the GNU C Library. |
5 | Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. | |
6 | ||
7 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
8 | modify it under the terms of the GNU Lesser General Public |
9 | License as published by the Free Software Foundation; either | |
10 | version 2.1 of the License, or (at your option) any later version. | |
04be94a8 UD |
11 | |
12 | The GNU C Library is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 15 | Lesser General Public License for more details. |
04be94a8 | 16 | |
41bdb6e2 | 17 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
18 | License along with the GNU C Library; if not, see |
19 | <http://www.gnu.org/licenses/>. */ | |
04be94a8 UD |
20 | |
21 | #ifndef _JIS0208_H | |
22 | #define _JIS0208_H 1 | |
23 | ||
24 | #include <gconv.h> | |
2aea1d79 | 25 | #include <stdint.h> |
04be94a8 | 26 | |
04be94a8 UD |
27 | /* Struct for table with indeces in UCS mapping table. */ |
28 | struct jisx0208_ucs_idx | |
29 | { | |
30 | uint16_t start; | |
31 | uint16_t end; | |
32 | uint16_t idx; | |
33 | }; | |
34 | ||
35 | ||
4bae262d UD |
36 | /* Conversion table. */ |
37 | extern const uint16_t __jis0208_to_ucs[]; | |
38 | ||
294bda1b UD |
39 | #define JIS0208_LAT1_MIN 0xa2 |
40 | #define JIS0208_LAT1_MAX 0xf7 | |
41 | extern const char __jisx0208_from_ucs4_lat1[JIS0208_LAT1_MAX + 1 | |
42 | - JIS0208_LAT1_MIN][2]; | |
4bae262d UD |
43 | extern const char __jisx0208_from_ucs4_greek[0xc1][2]; |
44 | extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; | |
45 | extern const char __jisx0208_from_ucs_tab[][2]; | |
46 | ||
47 | ||
8619129f | 48 | static inline uint32_t |
dd9423a6 | 49 | __attribute ((always_inline)) |
8619129f | 50 | jisx0208_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset) |
04be94a8 UD |
51 | { |
52 | unsigned char ch = *(*s); | |
53 | unsigned char ch2; | |
54 | int idx; | |
55 | ||
044ff622 | 56 | if (ch < offset || (ch - offset) <= 0x20) |
d64b6ad0 | 57 | return __UNKNOWN_10646_CHAR; |
04be94a8 UD |
58 | |
59 | if (avail < 2) | |
60 | return 0; | |
61 | ||
62 | ch2 = (*s)[1]; | |
2b474353 | 63 | if (ch2 < offset || (ch2 - offset) <= 0x20 || (ch2 - offset) >= 0x7f) |
d64b6ad0 | 64 | return __UNKNOWN_10646_CHAR; |
04be94a8 | 65 | |
2b474353 | 66 | idx = (ch - 0x21 - offset) * 94 + (ch2 - 0x21 - offset); |
04be94a8 | 67 | if (idx >= 0x1e80) |
d64b6ad0 | 68 | return __UNKNOWN_10646_CHAR; |
04be94a8 UD |
69 | |
70 | (*s) += 2; | |
71 | ||
d64b6ad0 | 72 | return __jis0208_to_ucs[idx] ?: ((*s) -= 2, __UNKNOWN_10646_CHAR); |
04be94a8 UD |
73 | } |
74 | ||
75 | ||
76 | static inline size_t | |
dd9423a6 | 77 | __attribute ((always_inline)) |
085a4412 | 78 | ucs4_to_jisx0208 (uint32_t wch, unsigned char *s, size_t avail) |
04be94a8 UD |
79 | { |
80 | unsigned int ch = (unsigned int) wch; | |
8619129f | 81 | const char *cp; |
04be94a8 UD |
82 | |
83 | if (avail < 2) | |
84 | return 0; | |
85 | ||
294bda1b UD |
86 | if (ch >= JIS0208_LAT1_MIN && ch <= JIS0208_LAT1_MAX) |
87 | cp = __jisx0208_from_ucs4_lat1[ch - JIS0208_LAT1_MIN]; | |
04be94a8 | 88 | else if (ch >= 0x391 && ch <= 0x451) |
5c2a0669 | 89 | cp = __jisx0208_from_ucs4_greek[ch - 0x391]; |
04be94a8 UD |
90 | else |
91 | { | |
8619129f | 92 | const struct jisx0208_ucs_idx *rp = __jisx0208_from_ucs_idx; |
04be94a8 | 93 | |
8619129f | 94 | if (ch >= 0xffff) |
d64b6ad0 | 95 | return __UNKNOWN_10646_CHAR; |
04be94a8 UD |
96 | while (ch > rp->end) |
97 | ++rp; | |
98 | if (ch >= rp->start) | |
8619129f UD |
99 | cp = __jisx0208_from_ucs_tab[rp->idx + ch - rp->start]; |
100 | else | |
d64b6ad0 | 101 | return __UNKNOWN_10646_CHAR; |
04be94a8 UD |
102 | } |
103 | ||
8619129f | 104 | if (cp[0] == '\0') |
d64b6ad0 | 105 | return __UNKNOWN_10646_CHAR; |
04be94a8 | 106 | |
2b474353 UD |
107 | s[0] = cp[0]; |
108 | s[1] = cp[1]; | |
04be94a8 UD |
109 | |
110 | return 2; | |
111 | } | |
112 | ||
113 | #endif /* jis0208.h */ |