#ifndef _SYS_KICONV_CCK_COMMON_H
#define _SYS_KICONV_CCK_COMMON_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#define KICONV_EUC_START (0xA1)
#define KICONV_IS_VALID_EUC_BYTE(v) ((v) >= 0xA1 && (v) <= 0xFE)
#define KICONV_IS_ASCII(c) (((uchar_t)(c)) <= 0x7F)
#define KICONV_UTF8_REPLACEMENT_CHAR1 (0xEF)
#define KICONV_UTF8_REPLACEMENT_CHAR2 (0xBF)
#define KICONV_UTF8_REPLACEMENT_CHAR3 (0xBD)
#define KICONV_UTF8_REPLACEMENT_CHAR (0xefbfbd)
#define KICONV_UTF8_REPLACEMENT_CHAR_LEN (3)
#define KICONV_IS_INVALID_UTF8_SECOND_BYTE(second, first) \
((second) < u8_valid_min_2nd_byte[(first)] || \
(second) > u8_valid_max_2nd_byte[(first)])
#define KICONV_CHECK_UTF8_BOM(ib, ibtail) \
if (((kiconv_state_t)kcd)->bom_processed == 0 && \
((ibtail) - (ib)) >= 3 && *(ib) == 0xef && \
*((ib) + 1) == 0xbb && *((ib) + 2) == 0xbf) { \
(ib) += 3; \
} \
((kiconv_state_t)kcd)->bom_processed = 1
#define KICONV_CHECK_UTF8_BOM_WITHOUT_STATE(ib, ibtail) \
if (((ibtail) - (ib)) >= 3 && *(ib) == 0xef && \
*((ib) + 1) == 0xbb && *((ib) + 2) == 0xbf) { \
(ib) += 3; \
}
#define KICONV_SET_ERRNO_AND_BREAK(err) \
*errno = (err); \
ret_val = (size_t)-1; \
break
#define KICONV_SET_ERRNO_WITH_FLAG(advance, err) \
if (flag & KICONV_REPLACE_INVALID) { \
ib += (advance); \
goto REPLACE_INVALID; \
} \
KICONV_SET_ERRNO_AND_BREAK((err))
typedef struct {
uint32_t key;
uint32_t value;
} kiconv_table_t;
typedef struct {
uint32_t key;
uchar_t u8[4];
} kiconv_table_array_t;
typedef int8_t (*kiconv_utf8tocck_t)(uint32_t utf8, uchar_t **ib,
uchar_t *ibtail, uchar_t *ob, uchar_t *obtail, size_t *ret_val);
void * kiconv_open_to_cck(void);
int kiconv_close_to_cck(void *);
size_t kiconv_binsearch(uint32_t key, void *tbl, size_t nitems);
size_t kiconv_utf8_to_cck(void *kcd, char **inbuf, size_t *inbytesleft,
char **outbuf, size_t *outbytesleft, int *errno,
kiconv_utf8tocck_t ptr_utf8tocck);
size_t kiconvstr_utf8_to_cck(uchar_t *inarray, size_t *inlen,
uchar_t *outarray, size_t *outlen, int flag, int *errno,
kiconv_utf8tocck_t ptr_utf8tocck);
extern const int8_t u8_number_of_bytes[];
extern const uint8_t u8_valid_min_2nd_byte[];
extern const uint8_t u8_valid_max_2nd_byte[];
#endif
#ifdef __cplusplus
}
#endif
#endif