wrowe       2002/07/20 15:28:19

  Added:       include  apr_iconv.h
  Log:
    Step 1... copied from lib/iconv.h ... Step 2 will be eliminating all the
    private foo from within this public header
  
  Revision  Changes    Path
  1.1                  apr-iconv/include/apr_iconv.h
  
  Index: apr_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"
  #ifdef WIN32
  #define ICONV_DEFAULT_PATH "iconv"
  #else
  #include "apr_iconv_private.h" /* contains ICONV_DEFAULT_PATH */
  #endif
  
  #include <stddef.h>
  
  /* apr additions */
  #define issetugid() 0
  /* apr additions */
  
  /**
   * APR_DECLARE_EXPORT is defined when building the APR dynamic library,
   * so that all public symbols are exported.
   *
   * APR_DECLARE_STATIC is defined when including the APR public headers,
   * to provide static linkage when the dynamic library may be unavailable.
   *
   * APR_DECLARE_STATIC and APR_DECLARE_EXPORT are left undefined when
   * including the APR public headers, to import and link the symbols from the 
   * dynamic APR library and assure appropriate indirection and calling 
   * conventions at compile time.
   */
  
  #if !defined(WIN32)
  /**
   * The public APR functions are declared with APR_DECLARE(), so they may
   * use the most appropriate calling convention.  Public APR functions with 
   * variable arguments must use APR_DECLARE_NONSTD().
   *
   * @deffunc APR_DECLARE(rettype) apr_func(args);
   */
  #define API_DECLARE(type)            type
  /**
   * The public APR variables are declared with AP_MODULE_DECLARE_DATA.
   * This assures the appropriate indirection is invoked at compile time.
   *
   * @deffunc APR_DECLARE_DATA type apr_variable;
   * @tip extern APR_DECLARE_DATA type apr_variable; syntax is required for
   * declarations within headers to properly import the variable.
   */
  #define API_DECLARE_DATA
  #elif defined(API_DECLARE_STATIC)
  #define API_DECLARE(type)            type __stdcall
  #define API_DECLARE_DATA
  #elif defined(API_DECLARE_EXPORT)
  #define API_DECLARE(type)            __declspec(dllexport) type __stdcall
  #define API_DECLARE_DATA             __declspec(dllexport)
  #else
  #define API_DECLARE(type)            __declspec(dllimport) type __stdcall
  #define API_DECLARE_DATA             __declspec(dllimport)
  #endif
  
  /*
   * iconv_t:   charset conversion descriptor type
   */
  typedef void *iconv_t;
  
  /* __BEGIN_DECLS */
  
  API_DECLARE(apr_status_t) apr_iconv_open(const char *, const char *, 
apr_pool_t *, iconv_t *);
  API_DECLARE(apr_status_t) apr_iconv(iconv_t, const char **, apr_size_t *, 
char **, apr_size_t *, apr_size_t *);
  API_DECLARE(apr_status_t) apr_iconv_close(iconv_t, apr_pool_t *);
  
  /* __END_DECLS */
  
  
  #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_DYNDEPS 3       /* load 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 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       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;
  };
  
  #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_DYNDEPS(mod,ctx)      (mod)->im_desc->imd_event(mod, 
ICMODEV_DYNDEPS,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          0xFFFF
  
  typedef 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_t
  iconv_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_t
  iconv_ccs_convert_8bit(const iconv_ccs_convtable *table, ucs2_t ch)
  {
        return table->_8bit.data[ch];
  }
  
  static APR_INLINE ucs2_t
  iconv_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_t
  iconv_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;
  };
  
  int  iconv_ces_open(const char *ces_name, struct iconv_ces **cespp, 
apr_pool_t *ctx);
  int  iconv_ces_close(struct iconv_ces *ces, apr_pool_t *ctx);
  int  iconv_ces_open_func(struct iconv_ces *ces);
  int  iconv_ces_close_func(struct iconv_ces *ces);
  void iconv_ces_reset_func(struct iconv_ces *ces);
  void iconv_ces_no_func(struct iconv_ces *ces);
  int  iconv_ces_nbits7(struct iconv_ces *ces);
  int  iconv_ces_nbits8(struct iconv_ces *ces);
  int  iconv_ces_zero(struct iconv_ces *ces);
  
  #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);
  
  
  int  iconv_mod_load(const char *, int, const void *, struct iconv_module **, 
apr_pool_t *);
  int  iconv_mod_unload(struct iconv_module *,apr_pool_t *ctx);
  iconv_mod_event_t iconv_mod_noevent;
  
  iconv_mod_event_t iconv_ccs_event;
  
  int  iconv_malloc(apr_size_t size, void **pp);
  
  extern struct iconv_converter_desc iconv_uc_desc;
  
  #endif /* ICONV_INTERNAL */
  
  #endif /* _ICONV_H_ */
  
  
  

Reply via email to