Hi,

The patch enables building apr-iconv with the selected set of
prelinked modules. If the requested module is not found as prelinked,
then the existing mechanism (apr_dso_*) is used.

Right now the selected module list is static, so the next step would
be to make that customizable.
The prelinked modules are:

_tbl_simple, cp437, cp850, cp851, cp852,
iso-8859-1, iso-8859-2, iso-8859-5,
windows-1250, windows-1251, windows-1252

which might, or might not be the ones that are relevant, cause
for EBCDIC machines the ebcdic-* modules should be prelinked.


MT.
cvs server: Diffing ccs
Index: ccs/cp437.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/cp437.c,v
retrieving revision 1.2
diff -u -3 -r1.2 cp437.c
--- ccs/cp437.c 2 Dec 2002 22:47:48 -0000   1.2
+++ ccs/cp437.c 10 Mar 2003 10:39:06 -0000
@@ -339,7 +339,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(cp437) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/cp850.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/cp850.c,v
retrieving revision 1.2
diff -u -3 -r1.2 cp850.c
--- ccs/cp850.c 2 Dec 2002 22:47:48 -0000   1.2
+++ ccs/cp850.c 10 Mar 2003 10:39:06 -0000
@@ -234,7 +234,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(cp850) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/cp851.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/cp851.c,v
retrieving revision 1.2
diff -u -3 -r1.2 cp851.c
--- ccs/cp851.c 2 Dec 2002 22:47:48 -0000   1.2
+++ ccs/cp851.c 10 Mar 2003 10:39:07 -0000
@@ -234,7 +234,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(cp851) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/cp852.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/cp852.c,v
retrieving revision 1.2
diff -u -3 -r1.2 cp852.c
--- ccs/cp852.c 2 Dec 2002 22:47:48 -0000   1.2
+++ ccs/cp852.c 10 Mar 2003 10:39:08 -0000
@@ -234,7 +234,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(cp852) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/iso-8859-1.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/iso-8859-1.c,v
retrieving revision 1.2
diff -u -3 -r1.2 iso-8859-1.c
--- ccs/iso-8859-1.c    2 Dec 2002 22:47:48 -0000   1.2
+++ ccs/iso-8859-1.c    10 Mar 2003 10:39:09 -0000
@@ -129,7 +129,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(iso_8859_1) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/iso-8859-2.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/iso-8859-2.c,v
retrieving revision 1.2
diff -u -3 -r1.2 iso-8859-2.c
--- ccs/iso-8859-2.c    2 Dec 2002 22:47:48 -0000   1.2
+++ ccs/iso-8859-2.c    10 Mar 2003 10:39:09 -0000
@@ -199,7 +199,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(iso_8859_2) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/iso-8859-5.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/iso-8859-5.c,v
retrieving revision 1.2
diff -u -3 -r1.2 iso-8859-5.c
--- ccs/iso-8859-5.c    2 Dec 2002 22:47:48 -0000   1.2
+++ ccs/iso-8859-5.c    10 Mar 2003 10:39:10 -0000
@@ -199,7 +199,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(iso_8859_5) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/windows-1250.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/windows-1250.c,v
retrieving revision 1.2
diff -u -3 -r1.2 windows-1250.c
--- ccs/windows-1250.c  2 Dec 2002 22:47:50 -0000   1.2
+++ ccs/windows-1250.c  10 Mar 2003 10:39:11 -0000
@@ -269,7 +269,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(windows_1250) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/windows-1251.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/windows-1251.c,v
retrieving revision 1.2
diff -u -3 -r1.2 windows-1251.c
--- ccs/windows-1251.c  2 Dec 2002 22:47:50 -0000   1.2
+++ ccs/windows-1251.c  10 Mar 2003 10:39:12 -0000
@@ -234,7 +234,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(windows_1251) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
Index: ccs/windows-1252.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/ccs/windows-1252.c,v
retrieving revision 1.2
diff -u -3 -r1.2 windows-1252.c
--- ccs/windows-1252.c  2 Dec 2002 22:47:50 -0000   1.2
+++ ccs/windows-1252.c  10 Mar 2003 10:39:13 -0000
@@ -269,7 +269,7 @@
    convert_from_ucs, convert_to_ucs,
 };
 
-struct iconv_module_desc iconv_module = {
+ICONV_MOD_DECLARE(windows_1252) = {
    ICMOD_UC_CCS,
    apr_iconv_mod_noevent,
    NULL,
cvs server: Diffing ces
cvs server: Diffing include
cvs server: Diffing lib
Index: lib/iconv.h
===================================================================
RCS file: /home/cvspublic/apr-iconv/lib/iconv.h,v
retrieving revision 1.16
diff -u -3 -r1.16 iconv.h
--- lib/iconv.h 12 Feb 2003 20:36:11 -0000  1.16
+++ lib/iconv.h 10 Mar 2003 10:39:14 -0000
@@ -1,6 +1,6 @@
 /*-
  * Copyright (c) 1999,2000
- * Konstantin Chuguev.  All rights reserved.
+ *  Konstantin Chuguev.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -12,8 +12,8 @@
  *    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 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
@@ -49,28 +49,28 @@
 /*
  * 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 */
+#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
+#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_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;
+    int     md_type;
+    const char *    md_name;
+    const void *    md_data;
 };
 
 struct iconv_module;
@@ -80,38 +80,38 @@
 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;
+    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)}
+#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;
+    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)
+#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.
@@ -119,17 +119,17 @@
 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 *);
+    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;
+    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;
+    struct iconv_converter_desc *ic_desc;
+    void *      ic_data;
 };
 
 /*
@@ -137,44 +137,44 @@
  */
 
 #define UCS_CHAR_ZERO_WIDTH_NBSP 0xFEFF
-#define UCS_CHAR_INVALID    0xFFFE
-#define UCS_CHAR_NONE       0xFFFF
+#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] */
+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 */
+    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 */
+    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 */
+    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 */
+    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_7bit    _7bit;
+    iconv_ccs_convtable_8bit    _8bit;
+    iconv_ccs_convtable_14bit   _14bit;
+    iconv_ccs_convtable_16bit   _16bit;
 } iconv_ccs_convtable;
 
 /*
@@ -186,12 +186,12 @@
  * 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;
+    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;
 };
 
 /*
@@ -200,31 +200,31 @@
 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];
+    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];
+    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;
+    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;
+    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;
+    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;
+    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) \
@@ -238,11 +238,11 @@
 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 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,
@@ -253,21 +253,21 @@
     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;
+    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;
+    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);
@@ -285,23 +285,23 @@
  */
 #define apr_iconv_ces_open_zero (iconv_ces_open_t*)apr_iconv_ces_zero
 
-#define iconv_char32bit(ch)    ((ch) & 0xFFFF0000)
+#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_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)))
+        ((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)))
+        ((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
+        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
 
 /*
  ************************************************
@@ -310,8 +310,8 @@
  */
 
 typedef struct iconv_ces_euc_ccs {
-   const char  *prefix;
-   apr_size_t      prefixlen;
+    const char  *prefix;
+    apr_size_t      prefixlen;
 } iconv_ces_euc_ccs_t;
 
 ICONV_CES_DRIVER_DECL(euc);
@@ -322,19 +322,28 @@
 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;
+    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;
+    const int * shift_tab;
+    int     nccs;
+    const struct iconv_ces_iso2022_ccs *ccs;
 } iconv_ces_iso2022_data;
 
 ICONV_CES_DRIVER_DECL(iso2022);
 
+/*
+ * preloaded modules name confilct resolving
+ */
+#ifdef ICONV_MOD_STATIC
+#define ICONV_MOD_DECLARE(name)      struct iconv_module_desc 
iconv_##name##_module
+#define ICONV_MOD_PRELINK(name, mod) {name, &iconv_##mod##_module}
+#else
+#define ICONV_MOD_DECLARE(name)      struct iconv_module_desc iconv_module
+#endif
 
 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);
@@ -348,7 +357,7 @@
 
 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(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);
Index: lib/iconv_module.c
===================================================================
RCS file: /home/cvspublic/apr-iconv/lib/iconv_module.c,v
retrieving revision 1.14
diff -u -3 -r1.14 iconv_module.c
--- lib/iconv_module.c  17 Feb 2003 03:49:35 -0000  1.14
+++ lib/iconv_module.c  10 Mar 2003 10:39:15 -0000
@@ -11,8 +11,8 @@
  *    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 Boris Popov
- * and its contributors.
+ *  This product includes software developed by Boris Popov
+ *  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
@@ -49,13 +49,56 @@
 #include "charset_alias.h"
 #endif
 
+extern ICONV_MOD_DECLARE(_tbl_simple);
+extern ICONV_MOD_DECLARE(cp437);
+extern ICONV_MOD_DECLARE(cp850);
+extern ICONV_MOD_DECLARE(cp851);
+extern ICONV_MOD_DECLARE(cp852);
+extern ICONV_MOD_DECLARE(iso_8859_1);
+extern ICONV_MOD_DECLARE(iso_8859_2);
+extern ICONV_MOD_DECLARE(iso_8859_5);
+extern ICONV_MOD_DECLARE(windows_1250);
+extern ICONV_MOD_DECLARE(windows_1251);
+extern ICONV_MOD_DECLARE(windows_1252);
+
+static struct {
+    const char               *name;
+    struct iconv_module_desc *mdesc;
+} prelinked_modules[] = {
+    ICONV_MOD_PRELINK("_tbl_simple", _tbl_simple),
+    ICONV_MOD_PRELINK("cp437", cp437),
+    ICONV_MOD_PRELINK("cp850", cp850),
+    ICONV_MOD_PRELINK("cp851", cp851),
+    ICONV_MOD_PRELINK("cp852", cp852),
+    ICONV_MOD_PRELINK("iso-8859-1", iso_8859_1),
+    ICONV_MOD_PRELINK("iso-8859-2", iso_8859_2),
+    ICONV_MOD_PRELINK("iso-8859-5", iso_8859_5),
+    ICONV_MOD_PRELINK("windows-1250", windows_1250),
+    ICONV_MOD_PRELINK("windows-1251", windows_1251),
+    ICONV_MOD_PRELINK("windows-1252", windows_1252),
+    {NULL, NULL}
+};
+
+static int
+iconv_plopen(const char *name, struct iconv_module_desc **mdesc)
+{
+    int i; 
+    for (i = 0; prelinked_modules[i].name; i++)
+        if (!strcmp(name, prelinked_modules[i].name)) {
+            *mdesc = prelinked_modules[i].mdesc;
+            return 0;
+        }
+
+    return -1;
+}
+
 static apr_status_t
 iconv_getpathname(char *buffer, const char *dir, const char *name, apr_pool_t 
*ctx)
 {
         apr_status_t rv;
-   apr_finfo_t sb;
+    apr_finfo_t sb;
 
-   apr_snprintf(buffer, APR_PATH_MAX, "%s/%s.so", dir, name);
+    apr_snprintf(buffer, APR_PATH_MAX, "%s/%s.so", dir, name);
         rv = apr_stat(&sb, buffer, APR_FINFO_TYPE, ctx);
 #ifdef API_HAVE_CHARSET_ALIAS_TABLE
         /* If we didn't find the file, try again after looking in
@@ -77,18 +120,18 @@
 static apr_status_t
 iconv_getpath(char *buf, const char *name, apr_pool_t *ctx)
 {
-   char buffer[APR_PATH_MAX];
+    char buffer[APR_PATH_MAX];
         apr_array_header_t *pathelts;
         apr_pool_t *subpool;
         apr_status_t status;
-   char *ptr;
+    char *ptr;
 
         status = apr_pool_create(&subpool, ctx);
         if (status)
             return status;
 
-   if (apr_tolower(name[0]) == 'x' && name[1] == '-')
-       name += 2;
+    if (apr_tolower(name[0]) == 'x' && name[1] == '-')
+        name += 2;
         ptr = buffer;
         while (0 != (*ptr++ = apr_tolower(*name++)))
             ;
@@ -116,120 +159,122 @@
 static int
 iconv_dlopen(const char *name, const char *symbol, void **hpp, void **dpp, 
apr_pool_t *ctx)
 {
-   apr_dso_handle_t *handle;
-   void *data;
+    apr_dso_handle_t *handle;
+    void *data;
 
-   /* dlopen */
-   if (apr_dso_load(&handle, name, ctx) != APR_SUCCESS) {
-       return EINVAL;
-   }
-   /* dlsym */
-   if ( apr_dso_sym(&data, handle, symbol) == APR_SUCCESS) {
-       *hpp = handle;
-       *dpp = data;
-       return 0;
-   }
-   apr_dso_unload(handle);
-   return EINVAL;
+    /* dlopen */
+    if (apr_dso_load(&handle, name, ctx) != APR_SUCCESS) {
+        return EINVAL;
+    }
+    /* dlsym */
+    if ( apr_dso_sym(&data, handle, symbol) == APR_SUCCESS) {
+        *hpp = handle;
+        *dpp = data;
+        return 0;
+    }
+    apr_dso_unload(handle);
+    return EINVAL;
 }
 
 API_DECLARE_NONSTD(int)
 apr_iconv_mod_load(const char *modname, int modtype, const void *args,
-   struct iconv_module **modpp, apr_pool_t *ctx)
+    struct iconv_module **modpp, apr_pool_t *ctx)
 {
-   struct iconv_module_desc *mdesc;
-   struct iconv_module *mod, *depmod;
-   const struct iconv_module_depend *depend;
-   char buffer[APR_PATH_MAX];
-   void *handle;
-   int error;
-
-   if (iconv_getpath(buffer, modname, ctx) != 0)
-       return EINVAL;
-
-   error = iconv_dlopen(buffer, "iconv_module", &handle, (void**)&mdesc, ctx);
-   if (error)
-       return error;
-   if (modtype != ICMOD_ANY && mdesc->imd_type != modtype) {
-       apr_dso_unload(handle);
-       return APR_EFTYPE;
-   }
-   mod = malloc(sizeof(*mod));
-   if (mod == NULL) {
-       apr_dso_unload(handle);
-       return ENOMEM;
-   }
-   memset(mod, 0, sizeof(*mod));
-   mod->im_handle = handle;
-   mod->im_desc = mdesc;
-   mod->im_args = args;
-   depend = mdesc->imd_depend;
-   if (depend) {
-       while (depend->md_name) {
-           error = apr_iconv_mod_load(depend->md_name, 
-               depend->md_type, NULL, &depmod, ctx);
-           if (error)
-               goto bad;
-           depmod->im_depdata = depend->md_data;
-           depmod->im_next = mod->im_deplist;
-           mod->im_deplist = depmod;
-           depend++;
-       }
-   }
-   error = ICONV_MOD_DYN_LOAD(mod,ctx);
-   if (error)
-       goto bad;
-   depmod = mod->im_deplist;
-   while (depmod) {
-       mod->im_depcnt++;
-       depmod = depmod->im_next;
-   }
-   error = ICONV_MOD_LOAD(mod,ctx);
-   if (error)
-       goto bad;
-   mod->im_flags |= ICMODF_LOADED;
-   *modpp = mod;
-   return 0;
+    struct iconv_module_desc *mdesc;
+    struct iconv_module *mod, *depmod;
+    const struct iconv_module_depend *depend;
+    char buffer[APR_PATH_MAX];
+    void *handle = NULL;
+    int error;
+
+    if (iconv_plopen(modname, &mdesc)) {
+        if (iconv_getpath(buffer, modname, ctx) != 0)
+            return EINVAL;
+
+        error = iconv_dlopen(buffer, "iconv_module", &handle, (void**)&mdesc, 
ctx);
+        if (error)
+            return error;
+    }
+    if (modtype != ICMOD_ANY && mdesc->imd_type != modtype) {
+        if (handle) apr_dso_unload(handle);
+        return APR_EFTYPE;
+    }
+    mod = malloc(sizeof(*mod));
+    if (mod == NULL) {
+        if (handle) apr_dso_unload(handle);
+        return ENOMEM;
+    }
+    memset(mod, 0, sizeof(*mod));
+    mod->im_handle = handle;
+    mod->im_desc = mdesc;
+    mod->im_args = args;
+    depend = mdesc->imd_depend;
+    if (depend) {
+        while (depend->md_name) {
+            error = apr_iconv_mod_load(depend->md_name, 
+                depend->md_type, NULL, &depmod, ctx);
+            if (error)
+                goto bad;
+            depmod->im_depdata = depend->md_data;
+            depmod->im_next = mod->im_deplist;
+            mod->im_deplist = depmod;
+            depend++;
+        }
+    }
+    error = ICONV_MOD_DYN_LOAD(mod,ctx);
+    if (error)
+        goto bad;
+    depmod = mod->im_deplist;
+    while (depmod) {
+        mod->im_depcnt++;
+        depmod = depmod->im_next;
+    }
+    error = ICONV_MOD_LOAD(mod,ctx);
+    if (error)
+        goto bad;
+    mod->im_flags |= ICMODF_LOADED;
+    *modpp = mod;
+    return 0;
 bad:
-   apr_iconv_mod_unload(mod,ctx);
-   return error;
+    apr_iconv_mod_unload(mod,ctx);
+    return error;
 }
 
 API_DECLARE_NONSTD(int)
 apr_iconv_mod_unload(struct iconv_module *mod, apr_pool_t *ctx)
 {
-   struct iconv_module *deplist, *tmp;
-   int error = 0;
+    struct iconv_module *deplist, *tmp;
+    int error = 0;
 
-   if (mod == NULL)
-       return -1;
-   if (mod->im_flags & ICMODF_LOADED)
-       error = ICONV_MOD_UNLOAD(mod,ctx);
-   error = ICONV_MOD_DYN_UNLOAD(mod,ctx);
-   deplist = mod->im_deplist;
-   while (deplist) {
-       tmp = deplist->im_next;
-       apr_iconv_mod_unload(deplist,ctx);
-       deplist = tmp;
-   }
-   if (mod->im_handle != NULL)
-       if (apr_dso_unload(mod->im_handle) != APR_SUCCESS)
-           error = APR_EINVAL;
-   free(mod);
-   return error;
+    if (mod == NULL)
+        return -1;
+    if (mod->im_flags & ICMODF_LOADED)
+        error = ICONV_MOD_UNLOAD(mod,ctx);
+    error = ICONV_MOD_DYN_UNLOAD(mod,ctx);
+    deplist = mod->im_deplist;
+    while (deplist) {
+        tmp = deplist->im_next;
+        apr_iconv_mod_unload(deplist,ctx);
+        deplist = tmp;
+    }
+    if (mod->im_handle != NULL)
+        if (apr_dso_unload(mod->im_handle) != APR_SUCCESS)
+            error = APR_EINVAL;
+    free(mod);
+    return error;
 }
 
 API_DECLARE_NONSTD(int)
 apr_iconv_mod_noevent(struct iconv_module *mod, int event, apr_pool_t *ctx)
 {
-   switch (event) {
-       case ICMODEV_LOAD:
-       case ICMODEV_UNLOAD:
-       case ICMODEV_DYN_LOAD:
-       case ICMODEV_DYN_UNLOAD:
-       break;
-       default:
-       return APR_EINVAL;
-   }
-   return 0;
+    switch (event) {
+        case ICMODEV_LOAD:
+        case ICMODEV_UNLOAD:
+        case ICMODEV_DYN_LOAD:
+        case ICMODEV_DYN_UNLOAD:
+        break;
+        default:
+        return APR_EINVAL;
+    }
+    return 0;
 }

Reply via email to