apr-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From wr...@apache.org
Subject cvs commit: apr-util/xlate .cvsignore Makefile.in xlate.c
Date Wed, 17 Jul 2002 05:15:18 GMT
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
   * <http://www.apache.org/>.
   */
  
  #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.
   * </PRE>
   */
  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
   * <http://www.apache.org/>.
   */
  
  #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 <stddef.h> /* for NULL */
  #endif
  #if APR_HAVE_STRING_H
  #include <string.h>
  #endif
  #if APR_HAVE_STRINGS_H
  #include <strings.h>
  #endif
  #ifdef HAVE_LANGINFO_H
  #include <langinfo.h>
  #endif
  #ifdef HAVE_ICONV_H
  #include <iconv.h>
  #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);
  }
  
  
  

Mime
View raw message