iconv_util.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 267 行

CPP
267
字号
/* * Copyright 1999-2001,2004 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//** * $Log: iconv_util.cpp,v $ * Revision 1.4  2004/09/23 21:44:13  cargilld * Fixes to build on OS400.  Thanks to Patrick Townsend and Jay Hansen. * * Revision 1.3  2004/09/08 13:56:45  peiyongz * Apache License Version 2.0 * * Revision 1.2  2002/11/04 15:14:33  tng * C++ Namespace Support. * * Revision 1.1.1.1  2002/02/01 22:22:36  peiyongz * sane_include * * Revision 1.2  2001/10/24 14:06:59  peiyongz * [Bug#880] patch to PlatformUtils:init()/term() and related. from Mark Weaver * * Revision 1.1  2001/06/25 16:19:56  tng * Rename iconv_util.h to iconv_util.hpp.  AS400 changes by Linda Swan. * * Revision 1.1  2000/02/10 18:08:28  abagchi * Initial checkin * */#include <iconv.h>#include <xercesc/util/XercesDefs.hpp>#include <xercesc/util/Platforms/OS400/OS400PlatformUtils.hpp>#include <stdlib.h>#include <unistd.h>#include <iconv_util.hpp>#include <iconv_cnv.hpp>#include <ctype.h>XERCES_CPP_NAMESPACE_BEGIN#define COPYRIGHT_STRING_LENGTH  200#define MAX_STRLEN 0x00FFFFF#define CHARCCSIDSIZE 5static UConverter* _defaultConverter = NULL;static UErrorCode gErr = U_ZERO_ERROR;#include "utypes.h"void   shareConverterData (UConverterSharedData * data,char *InDescriptor) ;UConverterSharedData *getSharedConverterData(char *Descriptor);#define defaultConverter (_defaultConverter==NULL)?_defaultConverter=ucnv_open(NULL, &gErr):_defaultConverter/* Cleans up the default converter if it has been allocated.   This is a little messy, but I know the code well enough to   do anything neater. */void cleanupDefaultConverter(){	if (_defaultConverter != NULL) {		ucnv_close(_defaultConverter);		_defaultConverter = NULL;	}}static char DEFAULT_CONVERTER_NAME[60] = "";const char* iconv_getDefaultCodepage(){  strcpy(DEFAULT_CONVERTER_NAME, "ibm037");  return DEFAULT_CONVERTER_NAME;}/* placeholder function to be deleted in 3_0 *//* used by String.c */int32_tu_strlen(const UChar *s){  int32_t  i = 0;  while(*s++)    i++;  return  i;}/* note sure if needed -  think that this is needed in cnv.c */char* u_austrcpy(char *s1,         const UChar *ucs2 ){  char * anchor = s1;     /* save the start of result string */  UErrorCode err = U_ZERO_ERROR;  int32_t len;  len = ucnv_fromUChars(defaultConverter,                s1,                MAX_STRLEN,                ucs2,                &err);  s1[len] = '\0';  return s1;}/*Logic determines if the converter is Algorithmic AND/OR cached *depending on that: * -we either go to get data from disk and cache it (Data=TRUE, Cached=False) * -Get it from a Hashphkramtable (Data=X, Cached=TRUE) * -Call dataConverter initializer (Data=TRUE, Cached=TRUE) * -Call AlgorithmicConverter initializer (Data=FALSE, Cached=TRUE) */int QlgCvtTextDescToDesc(int,int,char *,int,char *,int,int);UConverter *  createConverter (const char *converterName, UErrorCode * err){  char realName[MAX_CONVERTER_NAME_LENGTH];  char uppercased_converterName[MAX_CONVERTER_NAME_LENGTH];  UConverter *myUConverter = NULL;  UConverterSharedData *mySharedConverterData = NULL;  /* following parameters are passed to the convert text decscriptor     to descriptor          */  int  InType;  int  OutType=1;  char *InDescriptor;  int  InDescSize;  char OutDescriptor[CHARCCSIDSIZE]; /* 5 = size of a CCSID id on AS/400*/  int  OutDescSize;  int  JobCCSID=0;  char *inchar, *outchar; /* input and output conversion pointers*/  int tempchar;  if (U_FAILURE (*err))    return NULL;/******************************************************************//* assume name is in EBCDIC. The convetername is assumed to be/* either upper/lower case ebcdic  and the text converter requires/* upper case - Since we do not know we will convert to upper case** just in case/******************************************************************/inchar = (char*)converterName;outchar = &uppercased_converterName[0];while (*inchar) /*except for null terminator uppercase inputs*/{   tempchar = (int)(*inchar);   *outchar=(char)toupper(tempchar);   inchar ++;   outchar ++;}  if (outchar -&uppercased_converterName[0]<=MAX_CONVERTER_NAME_LENGTH)    *outchar = '\0'; /* replace the terminator                 */  if(!strcmp(uppercased_converterName, "IBM-37"))  /* We special-case this one */  {      memcpy(uppercased_converterName, "IBM-037", 7);      memset(uppercased_converterName + 7, '\0',1);  }/******************************************************************//* convert name to AS/400 CCSID** if CCSID is returned then we can complete building the converter** otherwise we will return the same error as ICU converters*//******************************************************************/ InType = 11; /*set for IANA initially */ if (QlgCvtTextDescToDesc(InType, OutType,(char *)uppercased_converterName,                          strlen(uppercased_converterName),&OutDescriptor[0],sizeof(OutDescriptor),JobCCSID)<0)    {     InType = 3; /* change to AIX 4.1 if we fail above */     if (QlgCvtTextDescToDesc(InType, OutType,(char *)uppercased_converterName,                          strlen(uppercased_converterName),&OutDescriptor[0],sizeof(OutDescriptor),JobCCSID)<0)     {      *err = U_INVALID_TABLE_FILE;      send_message((char *)converterName,ICONV_CCSID_PROBLEM,'d');      return NULL;     }    }/*****************************************************************//* create a new converter                                        *//*****************************************************************/ myUConverter = createNewConverter(&OutDescriptor[0], err); if (U_FAILURE (*err) || (myUConverter == NULL))   {     return NULL;   } return myUConverter;}UConverter* createNewConverter(const char *name, UErrorCode *err){  char temp[33];  int32_t i = 0;  const int8_t *myByteArray = NULL;  const uint16_t *myIndexArray = NULL;  int32_t myValuesCount = 0;  int32_t myIndexCount = 0;  UConverter *myConverter = NULL;  int32_t myCheck;  int8_t errorLevel = 0;  char throwAway[COPYRIGHT_STRING_LENGTH];  char UNICODE_CCSID_ID_O[33]="IBMCCSID134880000000";  char UNICODE_CCSID_ID_I[33]="IBMCCSID13488";  char my_CCSID_ID[33]="\0";  char CONVERT_ID_START[9] ="IBMCCSID"; /* include null terminator for strcat */  char DEFAULTS[9] = "00000000"; if (U_FAILURE (*err))    return NULL;/* create the base shell for the converter */  myConverter = (UConverter *) malloc (sizeof (UConverter));  if (myConverter == NULL)    {      *err = U_MEMORY_ALLOCATION_ERROR;      return NULL;    }/* create the "shared area' and link into the shell */  myConverter->sharedData =    (UConverterSharedData *) malloc (sizeof (UConverterSharedData));  if (myConverter->sharedData == NULL)    {      free (myConverter);      *err = U_MEMORY_ALLOCATION_ERROR;      return NULL;    }  memset(my_CCSID_ID, '\0', 33);  /* sizeof(my_CCSID_ID)); */  memcpy(my_CCSID_ID,&CONVERT_ID_START[0],strlen(CONVERT_ID_START)+1);  memcpy(&my_CCSID_ID[8],&name[0],5);  memcpy(&my_CCSID_ID[13],&DEFAULTS[0],7);  memset(temp, '\0', 33);  memcpy(temp, my_CCSID_ID, 13);  myConverter->sharedData->toiconv_handle = iconv_open(UNICODE_CCSID_ID_I,my_CCSID_ID);/*  memset(&my_CCSID_ID[13],'0',19);  clear out the non necessary data to reverse */  my_CCSID_ID[13] = '\0';  myConverter->sharedData->fromiconv_handle = iconv_open(temp,UNICODE_CCSID_ID_O);  if ((myConverter->sharedData->toiconv_handle.return_value ==-1) ||(myConverter->sharedData->fromiconv_handle.return_value==-1))      {	/*If it isn't any of the above, the file is invalid */	*err = U_INVALID_TABLE_FILE;	free (myConverter->sharedData);	free (myConverter);      }  return myConverter;}XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?