iconv_util.cpp
上传用户:zhuqijet
上传日期:2013-06-25
资源大小:10074k
文件大小:10k
源码类别:

词法分析

开发平台:

Visual C++

  1. /*
  2.  * The Apache Software License, Version 1.1
  3.  *
  4.  * Copyright (c) 1999-2001 The Apache Software Foundation.  All rights
  5.  * reserved.
  6.  *
  7.  * Redistribution and use in source and binary forms, with or without
  8.  * modification, are permitted provided that the following conditions
  9.  * are met:
  10.  *
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  *
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in
  16.  *    the documentation and/or other materials provided with the
  17.  *    distribution.
  18.  *
  19.  * 3. The end-user documentation included with the redistribution,
  20.  *    if any, must include the following acknowledgment:
  21.  *       "This product includes software developed by the
  22.  *        Apache Software Foundation (http://www.apache.org/)."
  23.  *    Alternately, this acknowledgment may appear in the software itself,
  24.  *    if and wherever such third-party acknowledgments normally appear.
  25.  *
  26.  * 4. The names "Xerces" and "Apache Software Foundation" must
  27.  *    not be used to endorse or promote products derived from this
  28.  *    software without prior written permission. For written
  29.  *    permission, please contact apache@apache.org.
  30.  *
  31.  * 5. Products derived from this software may not be called "Apache",
  32.  *    nor may "Apache" appear in their name, without prior written
  33.  *    permission of the Apache Software Foundation.
  34.  *
  35.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
  36.  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  37.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  38.  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
  39.  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  40.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  41.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  42.  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  43.  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  44.  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  45.  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  46.  * SUCH DAMAGE.
  47.  * ====================================================================
  48.  *
  49.  * This software consists of voluntary contributions made by many
  50.  * individuals on behalf of the Apache Software Foundation, and was
  51.  * originally based on software copyright (c) 1999, International
  52.  * Business Machines, Inc., http://www.ibm.com .  For more information
  53.  * on the Apache Software Foundation, please see
  54.  * <http://www.apache.org/>.
  55.  */
  56. /**
  57.  * $Log: iconv_util.cpp,v $
  58.  * Revision 1.2  2002/11/04 15:14:33  tng
  59.  * C++ Namespace Support.
  60.  *
  61.  * Revision 1.1.1.1  2002/02/01 22:22:36  peiyongz
  62.  * sane_include
  63.  *
  64.  * Revision 1.2  2001/10/24 14:06:59  peiyongz
  65.  * [Bug#880] patch to PlatformUtils:init()/term() and related. from Mark Weaver
  66.  *
  67.  * Revision 1.1  2001/06/25 16:19:56  tng
  68.  * Rename iconv_util.h to iconv_util.hpp.  AS400 changes by Linda Swan.
  69.  *
  70.  * Revision 1.1  2000/02/10 18:08:28  abagchi
  71.  * Initial checkin
  72.  *
  73.  */
  74. #include <iconv.h>
  75. #include <xercesc/util/Platforms/OS400/OS400PlatformUtils.hpp>
  76. #include <stdlib.h>
  77. #include <unistd.h>
  78. #include <iconv_util.hpp>
  79. #include <iconv_cnv.hpp>
  80. #include <ctype.h>
  81. XERCES_CPP_NAMESPACE_BEGIN
  82. #define COPYRIGHT_STRING_LENGTH  200
  83. #define MAX_STRLEN 0x00FFFFF
  84. #define CHARCCSIDSIZE 5
  85. static UConverter* _defaultConverter = NULL;
  86. static UErrorCode gErr = U_ZERO_ERROR;
  87. #include "utypes.h"
  88. void   shareConverterData (UConverterSharedData * data,char *InDescriptor) ;
  89. UConverterSharedData *getSharedConverterData(char *Descriptor);
  90. #define defaultConverter (_defaultConverter==NULL)?_defaultConverter=ucnv_open(NULL, &gErr):_defaultConverter
  91. /* Cleans up the default converter if it has been allocated.
  92.    This is a little messy, but I know the code well enough to
  93.    do anything neater.
  94.  */
  95. void cleanupDefaultConverter()
  96. {
  97. if (_defaultConverter != NULL) {
  98. ucnv_close(_defaultConverter);
  99. _defaultConverter = NULL;
  100. }
  101. }
  102. static char DEFAULT_CONVERTER_NAME[60] = "";
  103. const char* iconv_getDefaultCodepage()
  104. {
  105.   strcpy(DEFAULT_CONVERTER_NAME, "ibm037");
  106.   return DEFAULT_CONVERTER_NAME;
  107. }
  108. /* placeholder function to be deleted in 3_0 */
  109. /* used by String.c */
  110. int32_t
  111. u_strlen(const UChar *s)
  112. {
  113.   int32_t  i = 0;
  114.   while(*s++)
  115.     i++;
  116.   return  i;
  117. }
  118. /* note sure if needed -  think that this is needed in cnv.c */
  119. char* u_austrcpy(char *s1,
  120.          const UChar *ucs2 )
  121. {
  122.   char * anchor = s1;     /* save the start of result string */
  123.   UErrorCode err = U_ZERO_ERROR;
  124.   int32_t len;
  125.   len = ucnv_fromUChars(defaultConverter,
  126.                 s1,
  127.                 MAX_STRLEN,
  128.                 ucs2,
  129.                 &err);
  130.   s1[len] = '';
  131.   return s1;
  132. }
  133. /*Logic determines if the converter is Algorithmic AND/OR cached
  134.  *depending on that:
  135.  * -we either go to get data from disk and cache it (Data=TRUE, Cached=False)
  136.  * -Get it from a Hashphkramtable (Data=X, Cached=TRUE)
  137.  * -Call dataConverter initializer (Data=TRUE, Cached=TRUE)
  138.  * -Call AlgorithmicConverter initializer (Data=FALSE, Cached=TRUE)
  139.  */
  140. int QlgCvtTextDescToDesc(int,int,char *,int,char *,int,int);
  141. UConverter *
  142.   createConverter (const char *converterName, UErrorCode * err)
  143. {
  144.   char realName[MAX_CONVERTER_NAME_LENGTH];
  145.   char uppercased_converterName[MAX_CONVERTER_NAME_LENGTH];
  146.   UConverter *myUConverter = NULL;
  147.   UConverterSharedData *mySharedConverterData = NULL;
  148.   /* following parameters are passed to the convert text decscriptor
  149.      to descriptor          */
  150.   int  InType;
  151.   int  OutType=1;
  152.   char *InDescriptor;
  153.   int  InDescSize;
  154.   char OutDescriptor[CHARCCSIDSIZE]; /* 5 = size of a CCSID id on AS/400*/
  155.   int  OutDescSize;
  156.   int  JobCCSID=0;
  157.   char *inchar, *outchar; /* input and output conversion pointers*/
  158.   int tempchar;
  159.   if (U_FAILURE (*err))
  160.     return NULL;
  161. /******************************************************************/
  162. /* assume name is in EBCDIC. The convetername is assumed to be
  163. /* either upper/lower case ebcdic  and the text converter requires
  164. /* upper case - Since we do not know we will convert to upper case
  165. ** just in case
  166. /******************************************************************/
  167. inchar = (char*)converterName;
  168. outchar = &uppercased_converterName[0];
  169. while (*inchar) /*except for null terminator uppercase inputs*/
  170. {
  171.    tempchar = (int)(*inchar);
  172.    *outchar=(char)toupper(tempchar);
  173.    inchar ++;
  174.    outchar ++;
  175. }
  176.   if (outchar -&uppercased_converterName[0]<=MAX_CONVERTER_NAME_LENGTH)
  177.     *outchar = ''; /* replace the terminator                 */
  178.   if(!strcmp(uppercased_converterName, "IBM-37"))  /* We special-case this one */
  179.   {
  180.       memcpy(uppercased_converterName, "IBM-037", 7);
  181.       memset(uppercased_converterName + 7, '',1);
  182.   }
  183. /******************************************************************/
  184. /* convert name to AS/400 CCSID
  185. ** if CCSID is returned then we can complete building the converter
  186. ** otherwise we will return the same error as ICU converters
  187. */
  188. /******************************************************************/
  189.  InType = 11; /*set for IANA initially */
  190.  if (QlgCvtTextDescToDesc(InType, OutType,(char *)uppercased_converterName,                          strlen(uppercased_converterName),&OutDescriptor[0],sizeof(OutDescriptor),JobCCSID)<0)
  191.     {
  192.      InType = 3; /* change to AIX 4.1 if we fail above */
  193.      if (QlgCvtTextDescToDesc(InType, OutType,(char *)uppercased_converterName,                          strlen(uppercased_converterName),&OutDescriptor[0],sizeof(OutDescriptor),JobCCSID)<0)
  194.      {
  195.       *err = U_INVALID_TABLE_FILE;
  196.       send_message((char *)converterName,ICONV_CCSID_PROBLEM,'d');
  197.       return NULL;
  198.      }
  199.     }
  200. /*****************************************************************/
  201. /* create a new converter                                        */
  202. /*****************************************************************/
  203.  myUConverter = createNewConverter(&OutDescriptor[0], err);
  204.  if (U_FAILURE (*err) || (myUConverter == NULL))
  205.    {
  206.      return NULL;
  207.    }
  208.  return myUConverter;
  209. }
  210. UConverter* createNewConverter(const char *name, UErrorCode *err)
  211. {
  212.   char temp[33];
  213.   int32_t i = 0;
  214.   const int8_t *myByteArray = NULL;
  215.   const uint16_t *myIndexArray = NULL;
  216.   int32_t myValuesCount = 0;
  217.   int32_t myIndexCount = 0;
  218.   UConverter *myConverter = NULL;
  219.   int32_t myCheck;
  220.   int8_t errorLevel = 0;
  221.   char throwAway[COPYRIGHT_STRING_LENGTH];
  222.   char UNICODE_CCSID_ID_O[33]="IBMCCSID134880000000";
  223.   char UNICODE_CCSID_ID_I[33]="IBMCCSID13488";
  224.   char my_CCSID_ID[33]="";
  225.   char CONVERT_ID_START[9] ="IBMCCSID"; /* include null terminator for strcat */
  226.   char DEFAULTS[9] = "00000000";
  227.  if (U_FAILURE (*err))
  228.     return NULL;
  229. /* create the base shell for the converter */
  230.   myConverter = (UConverter *) malloc (sizeof (UConverter));
  231.   if (myConverter == NULL)
  232.     {
  233.       *err = U_MEMORY_ALLOCATION_ERROR;
  234.       return NULL;
  235.     }
  236. /* create the "shared area' and link into the shell */
  237.   myConverter->sharedData =
  238.     (UConverterSharedData *) malloc (sizeof (UConverterSharedData));
  239.   if (myConverter->sharedData == NULL)
  240.     {
  241.       free (myConverter);
  242.       *err = U_MEMORY_ALLOCATION_ERROR;
  243.       return NULL;
  244.     }
  245.   memset(my_CCSID_ID, '', 33);  /* sizeof(my_CCSID_ID)); */
  246.   memcpy(my_CCSID_ID,&CONVERT_ID_START[0],strlen(CONVERT_ID_START)+1);
  247.   memcpy(&my_CCSID_ID[8],&name[0],5);
  248.   memcpy(&my_CCSID_ID[13],&DEFAULTS[0],7);
  249.   memset(temp, '', 33);
  250.   memcpy(temp, my_CCSID_ID, 13);
  251.   myConverter->sharedData->toiconv_handle = iconv_open(UNICODE_CCSID_ID_I,my_CCSID_ID);
  252. /*  memset(&my_CCSID_ID[13],'0',19);  clear out the non necessary data to reverse */
  253.   my_CCSID_ID[13] = '';
  254.   myConverter->sharedData->fromiconv_handle = iconv_open(temp,UNICODE_CCSID_ID_O);
  255.   if ((myConverter->sharedData->toiconv_handle.return_value ==-1) ||(myConverter->sharedData->fromiconv_handle.return_value==-1))
  256.       {
  257. /*If it isn't any of the above, the file is invalid */
  258. *err = U_INVALID_TABLE_FILE;
  259. free (myConverter->sharedData);
  260. free (myConverter);
  261.       }
  262.   return myConverter;
  263. }
  264. XERCES_CPP_NAMESPACE_END