Right. Here's the patch that adds support for apr_xlate_* on Win32. I'd like to get some feedback and independent testing before I check this in.
For APR:


   * cd to the top of the APR sources
   * unzip apr-winiconv.zip (new dirs and files there)
   * apply apr-winiconv.patch

For Apache:

   * cd to the top of the httpd-2.0 sources
   * apply httpd-winiconv.patch to Makefile.win (this is just so that
     iconv.dll gets installed in Apache's bin directory).

To enable the apr_xlate_* stuff, drop the libiconv sources into i18n/win32/libiconv (I'm testing this with libiconv-1.8), and rebuild APR/httpd/whatever.


Karl, about the file name conversions in Subversion: remember what I said about APR using UTF-8 file names directly on some platforms? Well, the conversions in SVN should probably be coded like this:


   char *utf8_filename = (something);
   char *native_filename;
 #ifdef WIN32
 # if APR_HAS_UNICODE_FS
   IF_WIN_OS_IS_UNICODE
   {
     native_filename = utf8_filename;
   }
 # endif
 # if APR_HAS_ANSI_FS
   ELSE_WIN_OS_IS_ANSI
   {
     native_filename = convert_utf8_to_locale_charset(utf8_filename);
   }
 # endif
 #else  /* !WIN32 */
   native_filename = convert_utf8_to_locale_charset(utf8_filename);
 #endif /* !WIN32 */




-- Brane Äibej <[EMAIL PROTECTED]> http://www.xbc.nu/brane/
Index: apr.dsp
===================================================================
RCS file: /home/cvs/apr/apr.dsp,v
retrieving revision 1.107
diff -u -p -r1.107 apr.dsp
--- apr.dsp     11 Jul 2002 15:32:17 -0000      1.107
+++ apr.dsp     17 Jul 2002 00:46:12 -0000
@@ -41,7 +41,7 @@ RSC=rc.exe
 # PROP Intermediate_Dir "LibR"
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
-# ADD CPP /nologo /MD /W3 /O2 /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /D "NDEBUG" /D 
"APR_DECLARE_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibR\apr" /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /I 
"./i18n/win32/libiconv/include" /D "NDEBUG" /D "APR_DECLARE_STATIC" /D "WIN32" 
/D "_WINDOWS" /Fd"LibR\apr" /FD /c
 # ADD BASE RSC /l 0x409
 # ADD RSC /l 0x409
 BSC32=bscmake.exe
@@ -65,7 +65,7 @@ LIB32=link.exe -lib
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 
"_WINDOWS" /FD /c
-# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /D "_DEBUG" /D 
"APR_DECLARE_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibD\apr" /FD /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /I 
"./i18n/win32/libiconv/include" /D "_DEBUG" /D "APR_DECLARE_STATIC" /D "WIN32" 
/D "_WINDOWS" /Fd"LibD\apr" /FD /c
 # ADD BASE RSC /l 0x409
 # ADD RSC /l 0x409
 BSC32=bscmake.exe
@@ -157,6 +157,35 @@ SOURCE=.\file_io\win32\seek.c
 # PROP Default_Filter ""
 # Begin Source File
 
+SOURCE=.\i18n\win32\libiconv.c
+
+!IF  "$(CFG)" == "apr - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build - Building iconv.lib
+InputPath=.\i18n\win32\libiconv.c
+
+".\LibR\iconv.lib" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genlib librel
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "apr - Win32 Debug"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build - Building iconv.lib
+InputPath=.\i18n\win32\libiconv.c
+
+".\LibD\iconv.lib" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genlib libdbg
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
 SOURCE=.\i18n\unix\utf8_ucs2.c
 # End Source File
 # Begin Source File
@@ -470,6 +499,7 @@ SOURCE=.\include\apr.hw
 
 !IF  "$(CFG)" == "apr - Win32 Release"
 
+USERDEP__APR_H=".\include\apr_config_iconv.h"  
 # Begin Custom Build - Creating apr.h from apr.hw 
 InputPath=.\include\apr.hw
 
@@ -480,6 +510,7 @@ InputPath=.\include\apr.hw
 
 !ELSEIF  "$(CFG)" == "apr - Win32 Debug"
 
+USERDEP__APR_H=".\include\apr_config_iconv.h"  
 # Begin Custom Build - Creating apr.h from apr.hw 
 InputPath=.\include\apr.hw
 
@@ -494,6 +525,33 @@ InputPath=.\include\apr.hw
 # Begin Source File
 
 SOURCE=.\include\apr_compat.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\include\apr_config_iconv.hw
+
+!IF  "$(CFG)" == "apr - Win32 Release"
+
+# Begin Custom Build - Creating apr_config_iconv.h from apr_config_iconv.hw
+InputPath=.\include\apr_config_iconv.hw
+
+".\include\apr_config_iconv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genhdr
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "apr - Win32 Debug"
+
+# Begin Custom Build - Creating apr_config_iconv.h from apr_config_iconv.hw
+InputPath=.\include\apr_config_iconv.hw
+
+".\include\apr_config_iconv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genhdr
+
+# End Custom Build
+
+!ENDIF 
+
 # End Source File
 # Begin Source File
 
Index: libapr.dsp
===================================================================
RCS file: /home/cvs/apr/libapr.dsp,v
retrieving revision 1.68
diff -u -p -r1.68 libapr.dsp
--- libapr.dsp  11 Jul 2002 15:32:17 -0000      1.68
+++ libapr.dsp  17 Jul 2002 00:46:12 -0000
@@ -43,7 +43,7 @@ RSC=rc.exe
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
-# ADD CPP /nologo /MD /W3 /O2 /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /D "NDEBUG" /D 
"APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /Fd"Release\apr" /FD /c
+# ADD CPP /nologo /MD /W3 /O2 /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /I 
"./i18n/win32/libiconv/include" /D "NDEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" 
/D "_WINDOWS" /Fd"Release\apr" /FD /c
 # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL"
 # ADD BASE RSC /l 0x409 /d "NDEBUG"
@@ -69,7 +69,7 @@ LINK32=link.exe
 # PROP Ignore_Export_Lib 0
 # PROP Target_Dir ""
 # ADD BASE CPP /nologo /MDd /W3 /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D 
"_WINDOWS" /FD /c
-# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /D "_DEBUG" /D 
"APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /Fd"Debug\apr" /FD /c
+# ADD CPP /nologo /MDd /W3 /GX /Zi /Od /I "./include" /I "./include/arch" /I 
"./include/arch/win32" /I "./include/arch/unix" /I 
"./i18n/win32/libiconv/include" /D "_DEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" 
/D "_WINDOWS" /Fd"Debug\apr" /FD /c
 # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL"
 # ADD BASE RSC /l 0x409 /d "_DEBUG"
@@ -163,6 +163,35 @@ SOURCE=.\file_io\win32\seek.c
 # PROP Default_Filter ""
 # Begin Source File
 
+SOURCE=.\i18n\win32\libiconv.c
+
+!IF  "$(CFG)" == "libapr - Win32 Release"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build - Building iconv.lib and iconv.dll
+InputPath=.\i18n\win32\libiconv.c
+
+".\Release\iconv.lib" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genlib dllrel
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "libapr - Win32 Debug"
+
+# PROP Ignore_Default_Tool 1
+# Begin Custom Build - Building iconv.lib and iconv.dll
+InputPath=.\i18n\win32\libiconv.c
+
+".\Debug\iconv.lib" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genlib dlldbg
+
+# End Custom Build
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
 SOURCE=.\i18n\unix\utf8_ucs2.c
 # End Source File
 # Begin Source File
@@ -476,6 +505,7 @@ SOURCE=.\include\apr.hw
 
 !IF  "$(CFG)" == "libapr - Win32 Release"
 
+USERDEP__APR_H=".\include\apr_config_iconv.h"   
 # Begin Custom Build - Creating apr.h from apr.hw 
 InputPath=.\include\apr.hw
 
@@ -486,6 +516,7 @@ InputPath=.\include\apr.hw
 
 !ELSEIF  "$(CFG)" == "libapr - Win32 Debug"
 
+USERDEP__APR_H=".\include\apr_config_iconv.h"   
 # Begin Custom Build - Creating apr.h from apr.hw 
 InputPath=.\include\apr.hw
 
@@ -500,6 +531,33 @@ InputPath=.\include\apr.hw
 # Begin Source File
 
 SOURCE=.\include\apr_compat.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\include\apr_config_iconv.hw
+
+!IF  "$(CFG)" == "libapr - Win32 Release"
+
+# Begin Custom Build - Creating apr_config_iconv.h from apr_config_iconv.hw
+InputPath=.\include\apr_config_iconv.hw
+
+".\include\apr_config_iconv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genhdr
+
+# End Custom Build
+
+!ELSEIF  "$(CFG)" == "libapr - Win32 Debug"
+
+# Begin Custom Build - Creating apr_config_iconv.h from apr_config_iconv.hw
+InputPath=.\include\arch\win32\apr_config_iconv.hw
+
+".\include\apr_config_iconv.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
+       call .\build\win32iconv.bat genhdr
+
+# End Custom Build
+
+!ENDIF 
+
 # End Source File
 # Begin Source File
 
Index: i18n/unix/xlate.c
===================================================================
RCS file: /home/cvs/apr/i18n/unix/xlate.c,v
retrieving revision 1.28
diff -u -p -r1.28 xlate.c
--- i18n/unix/xlate.c   15 Jul 2002 19:21:01 -0000      1.28
+++ i18n/unix/xlate.c   17 Jul 2002 00:46:12 -0000
@@ -146,9 +146,21 @@ static const char *get_default_charset(v
  * defer to get_default_charset().
  */
 
-static const char *get_locale_charset(void)
+static const char *get_locale_charset(apr_pool_t *pool)
 {
-#if defined(HAVE_NL_LANGINFO) && defined(HAVE_CODESET)
+#ifdef WIN32
+    /* ### Yes, this is a hack and doesn't belong in this file.
+           Will fix soonest. --brane */
+    LCID locale = GetThreadLocale();
+    int len = GetLocaleInfo(locale, LOCALE_IDEFAULTANSICODEPAGE, NULL, 0);
+    char *cp = apr_palloc(pool, len + 2);
+    if (0 < GetLocaleInfo(locale, LOCALE_IDEFAULTANSICODEPAGE, cp + 2, len))
+    {
+        cp[0] = 'C';
+        cp[1] = 'P';
+        return cp;
+    }
+#elif defined(HAVE_NL_LANGINFO) && defined(HAVE_CODESET)
     const char *charset;
     charset = nl_langinfo(CODESET);
     if (charset) {
@@ -158,13 +170,13 @@ static const char *get_locale_charset(vo
     return get_default_charset();
 }
 
-static const char *handle_special_names(const char *page)
+static const char *handle_special_names(const char *page, apr_pool_t *pool)
 {
     if (page == APR_DEFAULT_CHARSET) {
         return get_default_charset();
     }
     else if (page == APR_LOCALE_CHARSET) {
-        return get_locale_charset();
+        return get_locale_charset(pool);
     }
     else {
         return page;
@@ -227,8 +239,10 @@ static void make_identity_table(apr_xlat
       convset->sbcs_table[i] = i;
 }
 
-apr_status_t apr_xlate_open(apr_xlate_t **convset, const char *topage,
-                            const char *frompage, apr_pool_t *pool)
+APR_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset,
+                                         const char *topage,
+                                         const char *frompage,
+                                         apr_pool_t *pool)
 {
     apr_status_t status;
     apr_xlate_t *new;
@@ -236,8 +250,8 @@ apr_status_t apr_xlate_open(apr_xlate_t 
 
     *convset = NULL;
 
-    topage = handle_special_names(topage);
-    frompage = handle_special_names(frompage);
+    topage = handle_special_names(topage, pool);
+    frompage = handle_special_names(frompage, pool);
     
     new = (apr_xlate_t *)apr_pcalloc(pool, sizeof(apr_xlate_t));
     if (!new) {
@@ -291,15 +305,17 @@ apr_status_t apr_xlate_open(apr_xlate_t 
     return status;
 }
 
-apr_status_t apr_xlate_sb_get(apr_xlate_t *convset, int *onoff)
+APR_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff)
 {
     *onoff = convset->sbcs_table != NULL;
     return APR_SUCCESS;
 } 
 
-apr_status_t apr_xlate_conv_buffer(apr_xlate_t *convset, const char *inbuf,
-                                   apr_size_t *inbytes_left, char *outbuf,
-                                   apr_size_t *outbytes_left)
+APR_DECLARE(apr_status_t) apr_xlate_conv_buffer(apr_xlate_t *convset,
+                                                const char *inbuf,
+                                                apr_size_t *inbytes_left,
+                                                char *outbuf,
+                                                apr_size_t *outbytes_left)
 {
     apr_status_t status = APR_SUCCESS;
 #ifdef HAVE_ICONV
@@ -360,7 +376,8 @@ apr_status_t apr_xlate_conv_buffer(apr_x
     return status;
 }
 
-apr_int32_t apr_xlate_conv_byte(apr_xlate_t *convset, unsigned char inchar)
+APR_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset,
+                                             unsigned char inchar)
 {
     if (convset->sbcs_table) {
         return convset->sbcs_table[inchar];
@@ -370,7 +387,7 @@ apr_int32_t apr_xlate_conv_byte(apr_xlat
     }
 }
 
-apr_status_t apr_xlate_close(apr_xlate_t *convset)
+APR_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset)
 {
     return apr_pool_cleanup_run(convset->pool, convset, apr_xlate_cleanup);
 }
Index: include/apr.hw
===================================================================
RCS file: /home/cvs/apr/include/apr.hw,v
retrieving revision 1.95
diff -u -p -r1.95 apr.hw
--- include/apr.hw      8 Jul 2002 17:30:56 -0000       1.95
+++ include/apr.hw      17 Jul 2002 00:46:14 -0000
@@ -280,7 +280,6 @@ extern "C" {
 #define APR_HAS_MMAP              1
 #define APR_HAS_FORK              0
 #define APR_HAS_RANDOM            1
-#define APR_HAS_XLATE             0
 #define APR_HAS_OTHER_CHILD       1
 #define APR_HAS_DSO               1
 #define APR_HAS_SO_ACCEPTFILTER   0
@@ -444,6 +443,9 @@ struct iovec {
 #if defined(_MSC_VER) && _MSC_VER >= 1200
 #pragma warning(pop)
 #endif
+
+/* libiconv/apr_xlate stuff */
+#include "apr_config_iconv.h"
 
 #endif /* APR_H */
 
Index: include/arch/win32/apr_private.h
===================================================================
RCS file: /home/cvs/apr/include/arch/win32/apr_private.h,v
retrieving revision 1.31
diff -u -p -r1.31 apr_private.h
--- include/arch/win32/apr_private.h    13 Mar 2002 20:39:19 -0000      1.31
+++ include/arch/win32/apr_private.h    17 Jul 2002 00:46:14 -0000
@@ -177,5 +177,11 @@ APR_DECLARE_DATA int errno;
 #define ENOSPC 1
 #endif
 
+
+#define APR_WIN32_CONFIG_ICONV_PRIVATE
+#include "apr_config_iconv.h"
+#undef  APR_WIN32_CONFIG_ICONV_PRIVATE
+
+
 #endif  /*APR_PRIVATE_H*/
 #endif  /*WIN32*/

<<attachment: apr-winiconv.zip>>

Index: Makefile.win
===================================================================
RCS file: /home/cvspublic/httpd-2.0/Makefile.win,v
retrieving revision 1.108
diff -u -p -r1.108 Makefile.win
--- Makefile.win        13 Jul 2002 06:01:10 -0000      1.108
+++ Makefile.win        17 Jul 2002 00:49:26 -0000
@@ -351,6 +351,7 @@ _install:
        copy $(LONG)\Apache.exe "$(INSTDIR)\bin" <.y
        copy $(LONG)\libhttpd.dll "$(INSTDIR)\bin" <.y
        copy srclib\apr\$(LONG)\libapr.dll "$(INSTDIR)\bin" <.y
+       copy srclib\apr\$(LONG)\iconv.dll "$(INSTDIR)\bin" <.y
        copy srclib\apr-util\$(LONG)\libaprutil.dll "$(INSTDIR)\bin" <.y
        copy modules\aaa\$(LONG)\mod_access.so "$(INSTDIR)\modules" <.y
        copy modules\aaa\$(LONG)\mod_auth.so "$(INSTDIR)\modules" <.y

Reply via email to