newlib-cygwin/newlib/libc/iconv/lib/local.h

274 lines
8.5 KiB
C

#ifndef __LOCAL_H__
#define __LOCAL_H__
#include <_ansi.h>
#include <reent.h>
#include <wchar.h>
#include <sys/types.h>
#ifndef NLS_ENVVAR_NAME
# define NLS_ENVVAR_NAME "NLSPATH"
#endif
#ifndef NLS_DEFAULT_NLSPATH
# define NLS_DEFAULT_NLSPATH "/usr/locale/"
#endif
/* void* type for K&R compilers compatability */
#define _VOID_PTR _PTR
/* Charset aliases file */
#define ICONV_ALIASES_FNAME "charset.aliases"
/* iconv CCS data path */
#define ICONV_DATA_PATH NLS_DEFAULT_NLSPATH"iconv_data/"
/* iconv data files extention */
#define ICONV_DATA_EXT ".cct"
/* Unicode character data types and constants. */
#define UCS_CHAR_ZERO_WIDTH_NBSP 0xFEFF
#define UCS_CHAR_INVALID 0xFFFE
#define UCS_CHAR_NONE 0xFFFF
typedef __uint16_t ucs2_t; /* Unicode character [D5] */
typedef __uint32_t ucs4_t; /* Unicode scalar character [D28] */
#define ucs_t ucs4_t
#define iconv_char32bit(ch) ((ch) & 0xFFFF0000)
/* CCS file descriptor */
typedef struct
{
void *mem;
size_t len;
} _iconv_fd_t;
char *
_EXFUN(_iconv_resolve_cs_name, (struct _reent *, _CONST char *, _CONST char *));
char *
_EXFUN(_iconv_resolve_alias, (struct _reent *, _CONST char *, _CONST char *,
int, _CONST char *));
int
_EXFUN(_iconv_load_file, (struct _reent *, _CONST char *, _iconv_fd_t *));
int
_EXFUN(_iconv_unload_file, (struct _reent *, _iconv_fd_t *));
/* Builtin CCS and CES data. */
typedef struct {
_CONST char *key;
_CONST _VOID_PTR value;
} iconv_builtin_table_t;
extern _CONST iconv_builtin_table_t _iconv_builtin_ccs[];
extern _CONST iconv_builtin_table_t _iconv_builtin_ces[];
extern _CONST char _iconv_builtin_aliases[];
/* Table-driven coded character set (CCS) definitions. */
struct iconv_ccs;
/* Basic CCS functions */
typedef ucs2_t
_EXFUN(iconv_ccs_convert_t, (_CONST _VOID_PTR table, ucs2_t ch));
typedef int
_EXFUN(iconv_ccs_close_t, (struct _reent *rptr, struct iconv_ccs *desc));
/* CCS structure */
struct iconv_ccs {
_CONST _VOID_PTR from_ucs; /* FROM table pointer */
_CONST _VOID_PTR to_ucs; /* TO table pointer */
iconv_ccs_convert_t *convert_from_ucs; /* converter */
iconv_ccs_convert_t *convert_to_ucs; /* functions */
iconv_ccs_close_t *close; /* close function */
_VOID_PTR extra; /* optional extra data */
unsigned int nbits; /* number of bits */
};
/* CCS initialisation function */
int
_EXFUN(_iconv_ccs_init, (struct _reent *rptr, struct iconv_ccs *ccs,
_CONST char *name));
/* CCS conversion macros */
#define ICONV_CCS_CONVERT_FROM_UCS(ccs, ch) \
((ccs)->convert_from_ucs((ccs)->from_ucs, (ch)))
#define ICONV_CCS_CONVERT_TO_UCS(ccs, ch) \
((ccs)->convert_to_ucs((ccs)->to_ucs, (ch)))
#define ICONV_CCS_NBITS
/* Module-driven character encoding scheme (CES) definitions */
struct iconv_ces;
/* Basic CES function types */
typedef int
_EXFUN(iconv_ces_init_t, (struct _reent *, _VOID_PTR *, /* void** */
_CONST char *, _CONST _VOID_PTR));
typedef int
_EXFUN(iconv_ces_close_t, (struct _reent *, _VOID_PTR));
typedef _VOID
_EXFUN(iconv_ces_reset_t, (_VOID_PTR));
typedef ssize_t
_EXFUN(iconv_ces_convert_from_ucs_t, (struct iconv_ces *data, ucs_t in,
unsigned char **outbuf,
size_t *outbytesleft));
typedef ucs_t
_EXFUN(iconv_ces_convert_to_ucs_t, (struct iconv_ces *data,
_CONST unsigned char **inbuf,
size_t *inbytesleft));
/* CES descriptor structure - CES class data */
struct iconv_ces_desc {
iconv_ces_init_t *init;
iconv_ces_close_t *close; /* class-specific close function */
iconv_ces_reset_t *reset;
iconv_ces_convert_from_ucs_t *convert_from_ucs;
iconv_ces_convert_to_ucs_t *convert_to_ucs;
_CONST _VOID_PTR data; /* optional specific CES class data */
};
/* explicit CES class for table (CCS) driven charsets */
extern _CONST struct iconv_ces_desc _iconv_ces_table_driven;
/* CES structure - CES instance data */
struct iconv_ces {
_CONST struct iconv_ces_desc *desc; /* descriptor/class pointer */
iconv_ces_close_t *close; /* instance-specific close function */
_VOID_PTR data; /* optional extra data */
_VOID_PTR handle; /* optional handle */
};
/* Basic CES functions and macros */
extern int
_EXFUN(_iconv_ces_init, (struct _reent *rptr, struct iconv_ces *ces,
_CONST char *name));
#define ICONV_CES_CLOSE(rptr, ces) ((ces)->close(rptr, ces))
#define ICONV_CES_RESET(ces) ((ces)->desc->reset((ces)->data))
#define ICONV_CES_CONVERT_FROM_UCS(cesd, in, outbuf, outbytes) \
((cesd)->desc->convert_from_ucs((cesd), (in), (outbuf), (outbytes)))
#define ICONV_CES_CONVERT_TO_UCS(cesd, inbuf, inbytes) \
((cesd)->desc->convert_to_ucs((cesd), (inbuf), (inbytes)))
/* Virtual CES initialisation function type */
typedef int
_EXFUN(iconv_ces_init_int_t, (struct _reent *rptr, _VOID_PTR* /* void ** */,
_CONST _VOID_PTR, size_t));
/* CES subclass macros (for EUC and ISO-2022) */
#define ICONV_CES_DRIVER_DECL(name) \
iconv_ces_init_int_t _iconv_##name##_init; \
iconv_ces_close_t _iconv_##name##_close; \
iconv_ces_reset_t _iconv_##name##_reset; \
iconv_ces_convert_from_ucs_t _iconv_##name##_convert_from_ucs; \
iconv_ces_convert_to_ucs_t _iconv_##name##_convert_to_ucs; \
/* CES functions and macros for stateless encodings */
iconv_ces_init_t _iconv_ces_init_null;
iconv_ces_close_t _iconv_ces_close_null;
iconv_ces_reset_t _iconv_ces_reset_null;
#define ICONV_CES_STATELESS_MODULE_DECL(name) \
_CONST struct iconv_ces_desc _iconv_ces_module_##name = { \
_iconv_ces_init_null, \
_iconv_ces_close_null, \
_iconv_ces_reset_null, \
convert_from_ucs, \
convert_to_ucs, \
NULL \
}
/* CES functions and macros for stateful (integer state) encodings */
iconv_ces_init_t _iconv_ces_init_state;
iconv_ces_close_t _iconv_ces_close_state;
iconv_ces_reset_t _iconv_ces_reset_state;
#define ICONV_CES_STATEFUL_MODULE_DECL(name) \
_CONST struct iconv_ces_desc _iconv_ces_module_##name = { \
_iconv_ces_init_state, \
_iconv_ces_close_state, \
_iconv_ces_reset_state, \
convert_from_ucs, \
convert_to_ucs, \
NULL \
}
/* CES functions and macros for other encodings */
#define ICONV_CES_MODULE_DECL(type, name) \
static int \
module_init(struct _reent *rptr, _VOID_PTR *data, /* void ** */ \
_CONST char *cs_name, _CONST _VOID_PTR desc_data) \
{ \
return _iconv_##type##_init(rptr, data, desc_data, \
sizeof(ccsattr) / \
sizeof(iconv_ces_##type##_ccs_t)); \
} \
\
_CONST struct iconv_ces_desc _iconv_ces_module_##name = { \
module_init, \
_iconv_##type##_close, \
_iconv_##type##_reset, \
_iconv_##type##_convert_from_ucs, \
_iconv_##type##_convert_to_ucs, \
&ccsattr \
}
/* EUC character encoding schemes and functions */
typedef struct {
_CONST char *name;
_CONST char *prefix;
size_t prefixlen;
} iconv_ces_euc_ccs_t;
ICONV_CES_DRIVER_DECL(euc);
#define _iconv_euc_reset _iconv_ces_reset_null
/* ISO-2022 character encoding schemes and functions. */
enum {ICONV_SHIFT_SI = 0, ICONV_SHIFT_SO, ICONV_SHIFT_SS2, ICONV_SHIFT_SS3};
typedef struct {
_CONST char *name;
_CONST char *designator;
size_t designatorlen;
int shift;
} iconv_ces_iso2022_ccs_t;
ICONV_CES_DRIVER_DECL(iso2022);
/* Converter structure and functions. */
typedef size_t
_EXFUN(iconv_conv_t, (struct _reent *, _VOID_PTR, _CONST unsigned char **,
size_t *, unsigned char **, size_t *));
typedef int
_EXFUN(iconv_close_t, (struct _reent *rptr, _VOID_PTR));
/* Generic converter structure. */
typedef struct {
iconv_conv_t *convert;
iconv_close_t *close;
}iconv_converter_t;
typedef struct {
struct iconv_ces from;
struct iconv_ces to;
ucs_t missing;
} unicode_converter_t;
/* Converter initialisers */
iconv_converter_t *
_EXFUN(_iconv_unicode_conv_init, (struct _reent *rptr, _CONST char *to,
_CONST char *from));
iconv_converter_t *
_EXFUN(_iconv_null_conv_init, (struct _reent *rptr, _CONST char *to,
_CONST char *from));
#endif /* __LOCAL_H__ */