📄 iconv.h
字号:
/*- * Copyright (c) 1999,2000 * Konstantin Chuguev. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by Konstantin Chuguev * and its contributors. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */#ifndef _ICONV_H_#define _ICONV_H_#include "apr.h"#include "apr_pools.h"#include "apr_iconv.h"#ifdef WIN32#define ICONV_DEFAULT_PATH "iconv"#define API_USE_BUILTIN_ALIASES /* Use the built-in charset alias table */#else#include "apr_iconv_private.h" /* contains ICONV_DEFAULT_PATH */#endif#include <stddef.h>#ifdef ICONV_INTERNAL/* * iconv module types */#define ICMOD_ANY 0#define ICMOD_LIB 1#define ICMOD_UC_CCS 0x100 /* UC - CCS for CES */#define ICMOD_UC_CES 0x101 /* UC - CES *//* * iconv module flags */#define ICMODF_LOADED 0x8000/* * iconv module handler events */#define ICMODEV_LOAD 1 /* module load. after dependencies resolved */#define ICMODEV_UNLOAD 2 /* module unload */#define ICMODEV_DYN_LOAD 3 /* load dynamic dependencies */#define ICMODEV_DYN_UNLOAD 4 /* unload dynamic dependencies */struct iconv_module_depend { int md_type; const char * md_name; const void * md_data;};struct iconv_module;/* _tbl_simple.c table_load_ccs() calls apr_iconv_mod_load(...ctx) */typedef int iconv_mod_event_t(struct iconv_module *, int, apr_pool_t *ctx);struct iconv_module_desc { int imd_type; iconv_mod_event_t *imd_event; const struct iconv_module_depend *imd_depend; const void * imd_data;};#define END_ICONV_MODULE_DEPEND {0, NULL, NULL}#define ICONV_MODULE(type,data) struct iconv_module_desc iconv_module \ {(type), (data)}struct iconv_module { int im_flags; void * im_handle; struct iconv_module_desc *im_desc; struct iconv_module *im_next; struct iconv_module *im_deplist; int im_depcnt; const void * im_methods; void * im_data; const void * im_depdata; /* data if module loaded from dependency */ const void * im_args; /* This is module-private data. Nothing outside the module itself may touch it. */ void *im_private;};#define ICONV_MOD_LOAD(mod,ctx) (mod)->im_desc->imd_event(mod, ICMODEV_LOAD,ctx)#define ICONV_MOD_UNLOAD(mod,ctx) (mod)->im_desc->imd_event(mod, ICMODEV_UNLOAD,ctx)#define ICONV_MOD_DYN_LOAD(mod,ctx) (mod)->im_desc->imd_event(mod, ICMODEV_DYN_LOAD,ctx)#define ICONV_MOD_DYN_UNLOAD(mod,ctx) (mod)->im_desc->imd_event(mod, ICMODEV_DYN_UNLOAD,ctx)/* * iconv converter definitions. */typedef int iconv_open_t(const char *, const char *, void **, apr_pool_t *);typedef int iconv_close_t(void *, apr_pool_t *);typedef apr_status_t iconv_conv_t(void *, const unsigned char **, apr_size_t *, unsigned char **, apr_size_t *, apr_size_t *);struct iconv_converter_desc { iconv_open_t * icd_open; iconv_close_t * icd_close; iconv_conv_t * icd_conv;};struct iconv_converter { struct iconv_converter_desc *ic_desc; void * ic_data;};/* * internal data types and functions used by charset conversion modules */#define UCS_CHAR_ZERO_WIDTH_NBSP 0xFEFF#define UCS_CHAR_INVALID 0xFFFE#define UCS_CHAR_NONE 0xFFFFtypedef apr_uint16_t ucs2_t; /* Unicode character [D5] */typedef apr_uint32_t ucs4_t; /* Unicode scalar character [D28] */#define ucs_t ucs4_t/* * one-level coded character set conversion tables */typedef struct { apr_uint16_t data[128];} iconv_ccs_convtable_7bit; /* 7-bit charset to Unicode */typedef struct { apr_uint16_t data[256];} iconv_ccs_convtable_8bit; /* 8-bit charset to Unicode *//* * two-level coded character set conversion tables */typedef struct { const iconv_ccs_convtable_7bit *data[128];} iconv_ccs_convtable_14bit; /* 14-bit charset to Unicode */typedef struct { const iconv_ccs_convtable_8bit *data[256];} iconv_ccs_convtable_16bit; /* 16-bit charset to Unicode; * Unicode to any charset *//* * abstract coded character set conversion table */typedef union { iconv_ccs_convtable_7bit _7bit; iconv_ccs_convtable_8bit _8bit; iconv_ccs_convtable_14bit _14bit; iconv_ccs_convtable_16bit _16bit;} iconv_ccs_convtable;/* * function for table-driven conversion */typedef ucs2_t iconv_ccs_converter_t (ucs2_t ch);/* * charset conversion module descriptor */struct iconv_ccs_desc { const char * const * names; int nbits; const iconv_ccs_convtable * from_ucs; const iconv_ccs_convtable * to_ucs; iconv_ccs_converter_t * convert_from_ucs; iconv_ccs_converter_t * convert_to_ucs;};/* * inline functions for use in charset conversion modules */static APR_INLINE ucs2_ticonv_ccs_convert_7bit(const iconv_ccs_convtable *table, ucs2_t ch){ return ch & 0x80 ? UCS_CHAR_INVALID : table->_7bit.data[ch];}static APR_INLINE ucs2_ticonv_ccs_convert_8bit(const iconv_ccs_convtable *table, ucs2_t ch){ return table->_8bit.data[ch];}static APR_INLINE ucs2_ticonv_ccs_convert_14bit(const iconv_ccs_convtable *table, ucs2_t ch){ const iconv_ccs_convtable_7bit *sub_table; sub_table = ch & 0x8080 ? NULL : table->_14bit.data[ch >> 8]; return sub_table ? sub_table->data[ch & 0x7F] : UCS_CHAR_INVALID;}static APR_INLINE ucs2_ticonv_ccs_convert_16bit(const iconv_ccs_convtable *table, ucs2_t ch){ const iconv_ccs_convtable_8bit *sub_table; sub_table = table->_16bit.data[ch >> 8]; return sub_table ? sub_table->data[ch & 0xFF] : UCS_CHAR_INVALID;}#define ICONV_CCS_CONVERT_FROM_UCS(ccsd, ch) \ ((ccsd)->convert_from_ucs(ch))#define ICONV_CCS_CONVERT_TO_UCS(ccsd, ch) \ ((ccsd)->convert_to_ucs(ch))/* * generic character encoding schemes and functions */struct iconv_ces;typedef int iconv_ces_open_t(struct iconv_ces *, apr_pool_t *);typedef int iconv_ces_close_t(struct iconv_ces *);typedef void iconv_ces_reset_t(struct iconv_ces *);typedef const char * const *iconv_ces_names_t(struct iconv_ces *);typedef int iconv_ces_nbits_t(struct iconv_ces *);typedef int iconv_ces_nbytes_t(struct iconv_ces *);typedef apr_ssize_t iconv_ces_convert_from_ucs_t (struct iconv_ces *data, ucs_t in, unsigned char **outbuf, apr_size_t *outbytesleft);typedef ucs_t iconv_ces_convert_to_ucs_t (struct iconv_ces *data, const unsigned char **inbuf, apr_size_t *inbytesleft);struct iconv_ces_desc { iconv_ces_open_t * open; iconv_ces_close_t * close; iconv_ces_reset_t * reset; iconv_ces_names_t * names; iconv_ces_nbits_t * nbits; iconv_ces_nbytes_t * nbytes; iconv_ces_convert_from_ucs_t * convert_from_ucs; iconv_ces_convert_to_ucs_t * convert_to_ucs; const void *data;};struct iconv_ces { struct iconv_ces_desc * desc; void * data; struct iconv_module * mod;};API_DECLARE_NONSTD(int) apr_iconv_ces_open(const char *ces_name, struct iconv_ces **cespp, apr_pool_t *ctx);API_DECLARE_NONSTD(int) apr_iconv_ces_close(struct iconv_ces *ces, apr_pool_t *ctx);API_DECLARE_NONSTD(int) apr_iconv_ces_open_func(struct iconv_ces *ces, apr_pool_t *ctx);API_DECLARE_NONSTD(int) apr_iconv_ces_close_func(struct iconv_ces *ces);API_DECLARE_NONSTD(void) apr_iconv_ces_reset_func(struct iconv_ces *ces);API_DECLARE_NONSTD(void) apr_iconv_ces_no_func(struct iconv_ces *ces);API_DECLARE_NONSTD(int) apr_iconv_ces_nbits7(struct iconv_ces *ces);API_DECLARE_NONSTD(int) apr_iconv_ces_nbits8(struct iconv_ces *ces);API_DECLARE_NONSTD(int) apr_iconv_ces_zero(struct iconv_ces *ces);/* Safe for _NONSTD APIs since the C caller pops the stack and the * apr_pool_t *cxt arg is simply ignored: */#define apr_iconv_ces_open_zero (iconv_ces_open_t*)apr_iconv_ces_zero#define iconv_char32bit(ch) ((ch) & 0xFFFF0000)#define ICONV_CES_OPEN(ces,ctx) (ces)->desc->open(ces,ctx)#define ICONV_CES_CLOSE(ces) (ces)->desc->close(ces)#define ICONV_CES_RESET(ces) (ces)->desc->reset(ces)#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)))#define ICONV_CES_DRIVER_DECL(name) \ iconv_ces_open_t iconv_##name##_open; \ iconv_ces_close_t iconv_##name##_close; \ iconv_ces_reset_t iconv_##name##_reset; \ iconv_ces_nbits_t iconv_##name##_nbits; \ iconv_ces_convert_from_ucs_t iconv_##name##_convert_from_ucs; \ iconv_ces_convert_to_ucs_t iconv_##name##_convert_to_ucs/* ************************************************ * EUC character encoding schemes and functions * ************************************************ */typedef struct iconv_ces_euc_ccs { const char *prefix; apr_size_t prefixlen;} iconv_ces_euc_ccs_t;ICONV_CES_DRIVER_DECL(euc);/* * ISO-2022 character encoding schemes and functions */enum { ICONV_SHIFT_SI = 0, ICONV_SHIFT_SO, ICONV_SHIFT_SS2, ICONV_SHIFT_SS3 };typedef struct iconv_ces_iso2022_ccs { int shift; const char * designator; apr_size_t designatorlen;} iconv_ces_iso2022_ccs_t;typedef struct { const int * shift_tab; int nccs; const struct iconv_ces_iso2022_ccs *ccs;} iconv_ces_iso2022_data;ICONV_CES_DRIVER_DECL(iso2022);API_DECLARE_NONSTD(int) apr_iconv_mod_load(const char *, int, const void *, struct iconv_module **, apr_pool_t *);API_DECLARE_NONSTD(int) apr_iconv_mod_unload(struct iconv_module *,apr_pool_t *ctx);API_DECLARE_NONSTD(int) apr_iconv_mod_noevent(struct iconv_module *mod, int event, apr_pool_t *ctx);API_DECLARE_NONSTD(int) apr_iconv_ccs_event(struct iconv_module *mod, int event, apr_pool_t *ctx);int iconv_malloc(apr_size_t size, void **pp);extern struct iconv_converter_desc iconv_uc_desc;API_DECLARE_NONSTD(apr_status_t) apr_iconv_euc_open(struct iconv_ces *ces, apr_pool_t *ctx);API_DECLARE_NONSTD(apr_status_t) apr_iconv_euc_close(struct iconv_ces *ces);API_DECLARE_NONSTD(apr_ssize_t) apr_iconv_euc_convert_from_ucs(struct iconv_ces *ces, ucs_t in, unsigned char **outbuf, apr_size_t *outbytesleft);API_DECLARE_NONSTD(ucs_t) apr_iconv_euc_convert_to_ucs(struct iconv_ces *ces, const unsigned char **inbuf, apr_size_t *inbytesleft);API_DECLARE_NONSTD(apr_status_t) apr_iconv_iso2022_open(struct iconv_ces *ces, apr_pool_t *ctx);API_DECLARE_NONSTD(int) apr_iconv_iso2022_close(struct iconv_ces *ces);API_DECLARE_NONSTD(void) apr_iconv_iso2022_reset(struct iconv_ces *ces);API_DECLARE_NONSTD(apr_ssize_t) apr_iconv_iso2022_convert_from_ucs(struct iconv_ces *ces, ucs_t in, unsigned char **outbuf, apr_size_t *outbytesleft);API_DECLARE_NONSTD(ucs_t) apr_iconv_iso2022_convert_to_ucs(struct iconv_ces *ces, const unsigned char **inbuf, apr_size_t *inbytesleft);#endif /* ICONV_INTERNAL */#endif /* _ICONV_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -