2 * Copyright (c) 2003-2004, Artem B. Bityuckiy
3 * Copyright (c) 1999,2000, Konstantin Chuguev. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 #if defined (ICONV_TO_UCS_CES_UCS_4) \
29 || defined (ICONV_FROM_UCS_CES_UCS_4)
35 #include <sys/types.h>
36 #include "../lib/local.h"
37 #include "../lib/ucsconv.h"
38 #include "../lib/endian.h"
41 * BOM isn't supported. UCS-4 is Big Endian. Bad codes are rejected.
42 * Bad codes: 0x0000FFFF, 0x0000FFFE, 0x0000D800-0x0000DFFF,
43 * 0x7FFFFFFF-0xFFFFFFFF.
46 #define UCS_4_BIG_ENDIAN 0
47 #define UCS_4_LITTLE_ENDIAN 1
50 #define UCS_4BE "ucs_4be"
51 #define UCS_4LE "ucs_4le"
54 ucs_4_init (struct _reent
*rptr
,
59 if ((data
= (int *)_malloc_r (rptr
, sizeof(int))) == NULL
)
62 if (strcmp (encoding
, UCS_4LE
) == 0)
63 *data
= UCS_4_LITTLE_ENDIAN
;
65 *data
= UCS_4_BIG_ENDIAN
;
71 ucs_4_close (struct _reent
*rptr
,
79 #if defined (ICONV_FROM_UCS_CES_UCS_4)
81 ucs_4_convert_from_ucs (void *data
,
83 unsigned char **outbuf
,
86 if ((in
>= 0x0000D800 && in
<= 0x0000DFFF) /* Surrogate character */
87 || in
> 0x7FFFFFFF || in
== 0x0000FFFF || in
== 0x0000FFFE)
88 return (size_t)ICONV_CES_INVALID_CHARACTER
;
90 if (*outbytesleft
< sizeof (ucs4_t
))
91 return (size_t)ICONV_CES_NOSPACE
;
93 if (*((int *)data
) == UCS_4_BIG_ENDIAN
)
94 *((ucs4_t
*)(*outbuf
)) = ICONV_HTOBEL (in
);
96 *((ucs4_t
*)(*outbuf
)) = ICONV_HTOLEL (in
);
98 *outbuf
+= sizeof (ucs4_t
);
99 *outbytesleft
-= sizeof (ucs4_t
);
101 return sizeof (ucs4_t
);
103 #endif /* ICONV_FROM_UCS_CES_UCS_4 */
105 #if defined (ICONV_TO_UCS_CES_UCS_4)
107 ucs_4_convert_to_ucs (void *data
,
108 const unsigned char **inbuf
,
113 if (*inbytesleft
< sizeof (ucs4_t
))
114 return (ucs4_t
)ICONV_CES_BAD_SEQUENCE
;
116 if (*((int *)data
) == UCS_4_BIG_ENDIAN
)
117 res
= ICONV_BETOHL (*((ucs4_t
*)(*inbuf
)));
119 res
= ICONV_LETOHL (*((ucs4_t
*)(*inbuf
)));
121 if ((res
>= 0x0000D800 && res
<= 0x0000DFFF) /* Surrogate character */
122 || res
> 0x7FFFFFFF || res
== 0x0000FFFF || res
== 0x0000FFFE)
123 return (ucs4_t
)ICONV_CES_INVALID_CHARACTER
;
125 *inbytesleft
-= sizeof (ucs4_t
);
126 *inbuf
+= sizeof(ucs4_t
);
130 #endif /* ICONV_TO_UCS_CES_UCS_4 */
133 ucs_4_get_mb_cur_max (void *data
)
138 #if defined (ICONV_TO_UCS_CES_UCS_4)
139 const iconv_to_ucs_ces_handlers_t
140 _iconv_to_ucs_ces_handlers_ucs_4
=
144 ucs_4_get_mb_cur_max
,
152 #if defined (ICONV_FROM_UCS_CES_UCS_4)
153 const iconv_from_ucs_ces_handlers_t
154 _iconv_from_ucs_ces_handlers_ucs_4
=
158 ucs_4_get_mb_cur_max
,
162 ucs_4_convert_from_ucs
166 #endif /* ICONV_TO_UCS_CES_UCS_4 || ICONV_FROM_UCS_CES_UCS_4 */