Return-Path: Delivered-To: apmail-apr-cvs-archive@apr.apache.org Received: (qmail 54879 invoked by uid 500); 17 Jul 2002 05:15:19 -0000 Mailing-List: contact cvs-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Reply-To: dev@apr.apache.org Delivered-To: mailing list cvs@apr.apache.org Received: (qmail 54868 invoked by uid 500); 17 Jul 2002 05:15:19 -0000 Delivered-To: apmail-apr-util-cvs@apache.org Date: 17 Jul 2002 05:15:18 -0000 Message-ID: <20020717051518.57717.qmail@icarus.apache.org> From: wrowe@apache.org To: apr-util-cvs@apache.org Subject: cvs commit: apr-util/xlate .cvsignore Makefile.in xlate.c X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N wrowe 2002/07/16 22:15:18 Modified: . apr.dsp configure.in libapr.dsp build nw_export.inc docs doxygen.conf include apr.h.in apr.hnw apr.hw . Makefile.in aprutil.dsp libaprutil.dsp Added: include apr_xlate.h xlate .cvsignore Makefile.in xlate.c Removed: i18n/unix .cvsignore Makefile.in xlate.c include apr_xlate.h Log: Changed APR_HAS_XLATE within apr to an APR_HAVE_ICONV feature test. Moved xlate.c into apr-util. Define APR_HAS_XLATE based on APR_HAVE_ICONV. It could become an APU_HAVE_ICONV test, but my configure.in.foo isn't that worthy. Revision Changes Path 1.111 +0 -8 apr/apr.dsp Index: apr.dsp =================================================================== RCS file: /home/cvs/apr/apr.dsp,v retrieving revision 1.110 retrieving revision 1.111 diff -u -r1.110 -r1.111 --- apr.dsp 17 Jul 2002 04:11:32 -0000 1.110 +++ apr.dsp 17 Jul 2002 05:15:17 -0000 1.111 @@ -155,10 +155,6 @@ # Begin Group "i18n" # PROP Default_Filter "" -# Begin Source File - -SOURCE=.\i18n\unix\xlate.c -# End Source File # End Group # Begin Group "locks" @@ -594,10 +590,6 @@ # Begin Source File SOURCE=.\include\apr_want.h -# End Source File -# Begin Source File - -SOURCE=.\include\apr_xlate.h # End Source File # End Group # End Target 1.463 +2 -2 apr/configure.in Index: configure.in =================================================================== RCS file: /home/cvs/apr/configure.in,v retrieving revision 1.462 retrieving revision 1.463 diff -u -r1.462 -r1.463 --- configure.in 11 Jul 2002 05:19:44 -0000 1.462 +++ configure.in 17 Jul 2002 05:15:17 -0000 1.463 @@ -851,7 +851,7 @@ if test "$crypt_r" = "1"; then APR_CHECK_CRYPT_R_STYLE fi -AC_CHECK_FUNCS(iconv, [ iconv="1" ], [ iconv="0" ]) +AC_CHECK_FUNCS(iconv, [ have_iconv="1" ], [ have_iconv="0" ]) if test "$iconv" = "1"; then APR_CHECK_ICONV_INBUF fi @@ -871,7 +871,7 @@ AC_SUBST(have_sigaction) AC_SUBST(have_setrlimit) AC_SUBST(have_getrlimit) -AC_SUBST(iconv) +AC_SUBST(have_iconv) AC_SUBST(mmap) AC_SUBST(have_memmove) 1.72 +0 -12 apr/libapr.dsp Index: libapr.dsp =================================================================== RCS file: /home/cvs/apr/libapr.dsp,v retrieving revision 1.71 retrieving revision 1.72 diff -u -r1.71 -r1.72 --- libapr.dsp 17 Jul 2002 04:11:32 -0000 1.71 +++ libapr.dsp 17 Jul 2002 05:15:17 -0000 1.72 @@ -158,14 +158,6 @@ SOURCE=.\file_io\win32\seek.c # End Source File # End Group -# Begin Group "i18n" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=.\i18n\unix\xlate.c -# End Source File -# End Group # Begin Group "locks" # PROP Default_Filter "" @@ -600,10 +592,6 @@ # Begin Source File SOURCE=.\include\apr_want.h -# End Source File -# Begin Source File - -SOURCE=.\include\apr_xlate.h # End Source File # End Group # Begin Source File 1.8 +1 -3 apr/build/nw_export.inc Index: nw_export.inc =================================================================== RCS file: /home/cvs/apr/build/nw_export.inc,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- nw_export.inc 11 Jul 2002 15:49:04 -0000 1.7 +++ nw_export.inc 17 Jul 2002 05:15:17 -0000 1.8 @@ -24,7 +24,6 @@ #include "apr_hash.h" #include "apr_inherit.h" #include "apr_lib.h" -#include "apr_md5.h" #include "apr_mmap.h" #include "apr_network_io.h" #include "apr_poll.h" @@ -43,10 +42,9 @@ #include "apr_thread_rwlock.h" #include "apr_time.h" #include "apr_user.h" -#include "apr_uuid.h" #include "apr_version.h" #include "apr_want.h" -#include "apr_xlate.h" + /* Must include apu.h first so that we can undefine the standard prototypes macros after it messes with 1.6 +0 -1 apr/docs/doxygen.conf Index: doxygen.conf =================================================================== RCS file: /home/cvs/apr/docs/doxygen.conf,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- doxygen.conf 8 May 2002 20:58:01 -0000 1.5 +++ doxygen.conf 17 Jul 2002 05:15:17 -0000 1.6 @@ -13,7 +13,6 @@ # not sure why this doesn't work as EXPAND_AS_DEFINED, it should! PREDEFINED="APR_DECLARE(x)=x" \ "APR_DECLARE_NONSTD(x)=x" \ - "APR_HAS_XLATE" \ "APR_HAS_THREADS" \ DOXYGEN= 1.112 +1 -1 apr/include/apr.h.in Index: apr.h.in =================================================================== RCS file: /home/cvs/apr/include/apr.h.in,v retrieving revision 1.111 retrieving revision 1.112 diff -u -r1.111 -r1.112 --- apr.h.in 17 Jul 2002 04:11:32 -0000 1.111 +++ apr.h.in 17 Jul 2002 05:15:17 -0000 1.112 @@ -99,6 +99,7 @@ #define APR_HAVE_CORKABLE_TCP @have_corkable_tcp@ #define APR_HAVE_GETRLIMIT @have_getrlimit@ +#define APR_HAVE_ICONV @have_iconv@ #define APR_HAVE_IN_ADDR @have_in_addr@ #define APR_HAVE_INET_ADDR @have_inet_addr@ #define APR_HAVE_INET_NETWORK @have_inet_network@ @@ -137,7 +138,6 @@ #define APR_HAS_MMAP @mmap@ #define APR_HAS_FORK @fork@ #define APR_HAS_RANDOM @rand@ -#define APR_HAS_XLATE @iconv@ #define APR_HAS_OTHER_CHILD @oc@ #define APR_HAS_DSO @aprdso@ #define APR_HAS_SO_ACCEPTFILTER @acceptfilter@ 1.18 +2 -2 apr/include/apr.hnw Index: apr.hnw =================================================================== RCS file: /home/cvs/apr/include/apr.hnw,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- apr.hnw 17 Jul 2002 04:11:32 -0000 1.17 +++ apr.hnw 17 Jul 2002 05:15:17 -0000 1.18 @@ -165,8 +165,9 @@ #define APR_HAVE_CORKABLE_TCP 0 #define APR_HAVE_GETRLIMIT 0 +#define APR_HAVE_ICONV 0 #define APR_HAVE_IN_ADDR 1 -#define APR_HAVE_INET_ADDR 1 +#define APR_HAVE_INET_ADDR 1 #define APR_HAVE_INET_NETWORK 0 #define APR_HAVE_IPV6 0 #define APR_HAVE_MEMCHR 1 @@ -200,7 +201,6 @@ #define APR_HAS_MMAP 0 #define APR_HAS_FORK 0 #define APR_HAS_RANDOM 1 -#define APR_HAS_XLATE 0 #define APR_HAS_OTHER_CHILD 0 #define APR_HAS_DSO 1 #define APR_HAS_SO_ACCEPTFILTER 0 1.97 +1 -1 apr/include/apr.hw Index: apr.hw =================================================================== RCS file: /home/cvs/apr/include/apr.hw,v retrieving revision 1.96 retrieving revision 1.97 diff -u -r1.96 -r1.97 --- apr.hw 17 Jul 2002 04:11:32 -0000 1.96 +++ apr.hw 17 Jul 2002 05:15:17 -0000 1.97 @@ -189,6 +189,7 @@ #define APR_HAVE_CORKABLE_TCP 0 #define APR_HAVE_GETRLIMIT 0 +#define APR_HAVE_ICONV 0 #define APR_HAVE_IN_ADDR 1 #define APR_HAVE_INET_ADDR 1 #define APR_HAVE_INET_NETWORK 0 @@ -280,7 +281,6 @@ #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 1.69 +1 -1 apr-util/Makefile.in Index: Makefile.in =================================================================== RCS file: /home/cvs/apr-util/Makefile.in,v retrieving revision 1.68 retrieving revision 1.69 diff -u -r1.68 -r1.69 --- Makefile.in 15 Jun 2002 06:00:15 -0000 1.68 +++ Makefile.in 17 Jul 2002 05:15:17 -0000 1.69 @@ -18,7 +18,7 @@ # bring in rules.mk for standard functionality @INCLUDE_RULES@ -SUBDIRS = buckets crypto dbm encoding hooks ldap uri xml misc strmatch +SUBDIRS = buckets crypto dbm encoding hooks ldap uri xml misc strmatch xlate CLEAN_SUBDIRS = . test CLEAN_TARGETS = 1.44 +12 -0 apr-util/aprutil.dsp Index: aprutil.dsp =================================================================== RCS file: /home/cvs/apr-util/aprutil.dsp,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- aprutil.dsp 17 Jul 2002 04:11:33 -0000 1.43 +++ aprutil.dsp 17 Jul 2002 05:15:17 -0000 1.44 @@ -269,6 +269,14 @@ SOURCE=.\uri\apr_uri.c # End Source File # End Group +# Begin Group "xlate" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\xlate\xlate.c +# End Source File +# End Group # Begin Group "xml" # PROP Default_Filter "" @@ -508,6 +516,10 @@ # Begin Source File SOURCE=.\include\apr_uuid.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_xlate.h # End Source File # Begin Source File 1.38 +12 -0 apr-util/libaprutil.dsp Index: libaprutil.dsp =================================================================== RCS file: /home/cvs/apr-util/libaprutil.dsp,v retrieving revision 1.37 retrieving revision 1.38 diff -u -r1.37 -r1.38 --- libaprutil.dsp 17 Jul 2002 04:11:33 -0000 1.37 +++ libaprutil.dsp 17 Jul 2002 05:15:17 -0000 1.38 @@ -275,6 +275,14 @@ SOURCE=.\uri\apr_uri.c # End Source File # End Group +# Begin Group "xlate" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\xlate\xlate.c +# End Source File +# End Group # Begin Group "xml" # PROP Default_Filter "" @@ -514,6 +522,10 @@ # Begin Source File SOURCE=.\include\apr_uuid.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_xlate.h # End Source File # Begin Source File 1.1 apr-util/include/apr_xlate.h Index: apr_xlate.h =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2002 The Apache Software Foundation. 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. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR * ITS 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ #ifndef APR_XLATE_H #define APR_XLATE_H #include "apu.h" #include "apr_pools.h" #include "apr_errno.h" #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /** * @file apr_xlate.h * @brief APR I18N translation library */ /** * @defgroup APR_XLATE I18N translation library * @ingroup APR * @{ */ /** * APR_HAS_XLATE determines whether or not useful implementations of * apr_xlate_open() et al are provided. * * If APR_HAS_XLATE is zero, apr_xlate_open() et al will all return * APR_ENOTIMPL at run-time. */ #define APR_HAS_XLATE APR_HAVE_ICONV typedef struct apr_xlate_t apr_xlate_t; /** * Set up for converting text from one charset to another. * @param convset The handle to be filled in by this function * @param topage The name of the target charset * @param frompage The name of the source charset * @param pool The pool to use * @remark * Specify APR_DEFAULT_CHARSET for one of the charset * names to indicate the charset of the source code at * compile time. This is useful if there are literal * strings in the source code which must be translated * according to the charset of the source code. * APR_DEFAULT_CHARSET is not useful if the source code * of the caller was not encoded in the same charset as * APR at compile time. * * @remark * Specify APR_LOCALE_CHARSET for one of the charset * names to indicate the charset of the current locale. * */ APR_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset, const char *topage, const char *frompage, apr_pool_t *pool); /** * This is to indicate the charset of the sourcecode at compile time * names to indicate the charset of the source code at * compile time. This is useful if there are literal * strings in the source code which must be translated * according to the charset of the source code. */ #define APR_DEFAULT_CHARSET (const char *)0 /** * To indicate charset names of the current locale */ #define APR_LOCALE_CHARSET (const char *)1 /** * Find out whether or not the specified conversion is single-byte-only. * @param convset The handle allocated by apr_xlate_open, specifying the * parameters of conversion * @param onoff Output: whether or not the conversion is single-byte-only */ APR_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff); /** @deprecated @see apr_xlate_sb_get */ APR_DECLARE(apr_status_t) apr_xlate_get_sb(apr_xlate_t *convset, int *onoff); /** * Convert a buffer of text from one codepage to another. * @param convset The handle allocated by apr_xlate_open, specifying * the parameters of conversion * @param inbuf The address of the source buffer * @param inbytes_left Input: the amount of input data to be translated * Output: the amount of input data not yet translated * @param outbuf The address of the destination buffer * @param outbytes_left Input: the size of the output buffer * Output: the amount of the output buffer not yet used */ 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); /* @see apr_file_io.h the comment in apr_file_io.h about this hack */ #ifdef APR_NOT_DONE_YET /** * The purpose of apr_xlate_conv_char is to translate one character * at a time. This needs to be written carefully so that it works * with double-byte character sets. * @param convset The handle allocated by apr_xlate_open, specifying the * parameters of conversion * @param inchar The character to convert * @param outchar The converted character */ APR_DECLARE(apr_status_t) apr_xlate_conv_char(apr_xlate_t *convset, char inchar, char outchar); #endif /** * Convert a single-byte character from one charset to another. * @param convset The handle allocated by apr_xlate_open, specifying the * parameters of conversion * @param inchar The single-byte character to convert. * @warning This only works when converting between single-byte character sets. * -1 will be returned if the conversion can't be performed. */ APR_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset, unsigned char inchar); /** * Close a codepage translation handle. * @param convset The codepage translation handle to close */ APR_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset); /** @} */ #ifdef __cplusplus } #endif #endif /* ! APR_XLATE_H */ 1.1 apr-util/xlate/.cvsignore Index: .cvsignore =================================================================== Makefile *.lo .libs .deps 1.1 apr-util/xlate/Makefile.in Index: Makefile.in =================================================================== VPATH = @srcdir@ INCLUDES = @APRUTIL_PRIV_INCLUDES@ @APR_INCLUDES@ @APRUTIL_INCLUDES@ TARGETS = xlate.lo SUBDIRS = @APR_ICONV_SUBDIRS@ # bring in rules.mk for standard functionality @INCLUDE_RULES@ 1.1 apr-util/xlate/xlate.c Index: xlate.c =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2002 The Apache Software Foundation. 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. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR * ITS 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. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * . */ #include "apr_private.h" #include "apr_lib.h" #include "apr_strings.h" #include "apr_xlate.h" /* If no implementation is available, don't generate code here since * apr_xlate.h emitted macros which return APR_ENOTIMPL. */ #if APR_HAS_XLATE #ifdef HAVE_STDDEF_H #include /* for NULL */ #endif #if APR_HAVE_STRING_H #include #endif #if APR_HAVE_STRINGS_H #include #endif #ifdef HAVE_LANGINFO_H #include #endif #ifdef HAVE_ICONV_H #include #endif #ifdef APR_ICONV_INBUF_CONST #define ICONV_INBUF_TYPE const char ** #else #define ICONV_INBUF_TYPE char ** #endif #ifndef min #define min(x,y) ((x) <= (y) ? (x) : (y)) #endif struct apr_xlate_t { apr_pool_t *pool; char *frompage; char *topage; char *sbcs_table; #ifdef HAVE_ICONV iconv_t ich; #endif }; /* get_default_charset() * * simple heuristic to determine codepage of source code so that * literal strings (e.g., "GET /\r\n") in source code can be translated * properly * * If appropriate, a symbol can be set at configure time to determine * this. On EBCDIC platforms, it will be important how the code was * unpacked. */ static const char *get_default_charset(void) { #ifdef __MVS__ # ifdef __CODESET__ return __CODESET__; # else return "IBM-1047"; # endif #endif if ('}' == 0xD0) { return "IBM-1047"; } if ('{' == 0xFB) { return "EDF04"; } if ('A' == 0xC1) { return "EBCDIC"; /* not useful */ } if ('A' == 0x41) { return "ISO8859-1"; /* not necessarily true */ } return "unknown"; } /* get_locale_charset() * * If possible on this system, get the charset of the locale. Otherwise, * defer to get_default_charset(). */ static const char *get_locale_charset(void) { #if defined(HAVE_NL_LANGINFO) && defined(HAVE_CODESET) const char *charset; charset = nl_langinfo(CODESET); if (charset) { return charset; } #endif return get_default_charset(); } static const char *handle_special_names(const char *page) { if (page == APR_DEFAULT_CHARSET) { return get_default_charset(); } else if (page == APR_LOCALE_CHARSET) { return get_locale_charset(); } else { return page; } } static apr_status_t apr_xlate_cleanup(void *convset) { #ifdef HAVE_ICONV apr_xlate_t *old = convset; if (old->ich != (iconv_t)-1) { if (iconv_close(old->ich)) { return errno; } } #endif return APR_SUCCESS; } #ifdef HAVE_ICONV static void check_sbcs(apr_xlate_t *convset) { char inbuf[256], outbuf[256]; char *inbufptr = inbuf; char *outbufptr = outbuf; apr_size_t inbytes_left, outbytes_left; int i; apr_size_t translated; for (i = 0; i < sizeof(inbuf); i++) { inbuf[i] = i; } inbytes_left = outbytes_left = sizeof(inbuf); translated = iconv(convset->ich, (ICONV_INBUF_TYPE)&inbufptr, &inbytes_left, &outbufptr, &outbytes_left); if (translated != (apr_size_t) -1 && inbytes_left == 0 && outbytes_left == 0) { /* hurray... this is simple translation; save the table, * close the iconv descriptor */ convset->sbcs_table = apr_palloc(convset->pool, sizeof(outbuf)); memcpy(convset->sbcs_table, outbuf, sizeof(outbuf)); iconv_close(convset->ich); convset->ich = (iconv_t)-1; /* TODO: add the table to the cache */ } } #endif /* HAVE_ICONV */ static void make_identity_table(apr_xlate_t *convset) { int i; convset->sbcs_table = apr_palloc(convset->pool, 256); for (i = 0; i < 256; i++) 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_status_t status; apr_xlate_t *new; int found = 0; *convset = NULL; topage = handle_special_names(topage); frompage = handle_special_names(frompage); new = (apr_xlate_t *)apr_pcalloc(pool, sizeof(apr_xlate_t)); if (!new) { return APR_ENOMEM; } new->pool = pool; new->topage = apr_pstrdup(pool, topage); new->frompage = apr_pstrdup(pool, frompage); if (!new->topage || !new->frompage) { return APR_ENOMEM; } #ifdef TODO /* search cache of codepage pairs; we may be able to avoid the * expensive iconv_open() */ set found to non-zero if found in the cache #endif if ((! found) && (strcmp(topage, frompage) == 0)) { /* to and from are the same */ found = 1; make_identity_table(new); } #ifdef HAVE_ICONV if (!found) { new->ich = iconv_open(topage, frompage); if (new->ich == (iconv_t)-1) { return errno; } found = 1; check_sbcs(new); } else new->ich = (iconv_t)-1; #endif /* HAVE_ICONV */ if (found) { *convset = new; apr_pool_cleanup_register(pool, (void *)new, apr_xlate_cleanup, apr_pool_cleanup_null); status = APR_SUCCESS; } else { status = EINVAL; /* same as what iconv() would return if it couldn't handle the pair */ } return status; } 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_status_t status = APR_SUCCESS; #ifdef HAVE_ICONV apr_size_t translated; if (convset->ich != (iconv_t)-1) { const char *inbufptr = inbuf; char *outbufptr = outbuf; translated = iconv(convset->ich, (ICONV_INBUF_TYPE)&inbufptr, inbytes_left, &outbufptr, outbytes_left); /* If everything went fine but we ran out of buffer, don't * report it as an error. Caller needs to look at the two * bytes-left values anyway. * * There are three expected cases where rc is -1. In each of * these cases, *inbytes_left != 0. * a) the non-error condition where we ran out of output * buffer * b) the non-error condition where we ran out of input (i.e., * the last input character is incomplete) * c) the error condition where the input is invalid */ if (translated == (apr_size_t)-1) { switch (errno) { case E2BIG: /* out of space on output */ status = 0; /* change table lookup code below if you make this an error */ break; case EINVAL: /* input character not complete (yet) */ status = APR_INCOMPLETE; break; case EILSEQ: /* bad input byte */ status = APR_EINVAL; break; default: status = errno; } } } else #endif { int to_convert = min(*inbytes_left, *outbytes_left); int converted = to_convert; char *table = convset->sbcs_table; while (to_convert) { *outbuf = table[(unsigned char)*inbuf]; ++outbuf; ++inbuf; --to_convert; } *inbytes_left -= converted; *outbytes_left -= converted; } return status; } apr_int32_t apr_xlate_conv_byte(apr_xlate_t *convset, unsigned char inchar) { if (convset->sbcs_table) { return convset->sbcs_table[inchar]; } else { return -1; } } apr_status_t apr_xlate_close(apr_xlate_t *convset) { return apr_pool_cleanup_run(convset->pool, convset, apr_xlate_cleanup); } #else /* !APR_HAS_XLATE */ APR_DECLARE(apr_status_t) apr_xlate_open(apr_xlate_t **convset, const char *topage, const char *frompage, apr_pool_t *pool) { return APR_ENOTIMPL; } APR_DECLARE(apr_status_t) apr_xlate_sb_get(apr_xlate_t *convset, int *onoff) { return APR_ENOTIMPL; } APR_DECLARE(apr_int32_t) apr_xlate_conv_byte(apr_xlate_t *convset, unsigned char inchar) { return (-1); } 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) { return APR_ENOTIMPL; } APR_DECLARE(apr_status_t) apr_xlate_close(apr_xlate_t *convset) { return APR_ENOTIMPL; } #endif /* APR_HAS_XLATE */ /* Deprecated */ APR_DECLARE(apr_status_t) apr_xlate_get_sb(apr_xlate_t *convset, int *onoff) { return apr_xlate_sb_get(convset, onoff); }