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