iconv390transservice.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 607 行 · 第 1/2 页

CPP
607
字号
    while (*outPtr != 0) {	if ((*outPtr >= 0x41) && (*outPtr <= 0x5A))	    *outPtr = *outPtr + 0x20;	outPtr++;    }}// ---------------------------------------------------------------------------unsigned int Iconv390LCPTranscoder::calcRequiredSize(const char* const srcText                                                     , MemoryManager* const manager){    if (!srcText)        return 0;    unsigned charLen = ::mblen(srcText, MB_CUR_MAX);    if (charLen == -1)        return 0;    else if (charLen != 0)        charLen = strlen(srcText)/charLen;    if (charLen == -1)        return 0;    return charLen;}unsigned int Iconv390LCPTranscoder::calcRequiredSize(const XMLCh* const srcText                                                     , MemoryManager* const manager){    if (!srcText)        return 0;    unsigned int  wLent = getWideCharLength(srcText);    wchar_t       tmpWideCharArr[gTempBuffArraySize];    wchar_t*      allocatedArray = 0;    wchar_t*      wideCharBuf = 0;    if (wLent >= gTempBuffArraySize)        wideCharBuf = allocatedArray = (wchar_t*) manager->allocate        (            (wLent + 1) * sizeof(wchar_t)        );//new wchar_t[wLent + 1];    else        wideCharBuf = tmpWideCharArr;    for (unsigned int i = 0; i < wLent; i++)    {        wideCharBuf[i] = srcText[i];    }    wideCharBuf[wLent] = 0x00;    const unsigned int retVal = ::wcstombs(NULL, wideCharBuf, 0);    manager->deallocate(allocatedArray);//delete [] allocatedArray;    if (retVal == -1)        return 0;    return retVal;}char* Iconv390LCPTranscoder::transcode(const XMLCh* const toTranscode){    if (!toTranscode)        return 0;    char* retVal = 0;    if (*toTranscode)    {        unsigned int  wLent = getWideCharLength(toTranscode);	//	//  Translate the input from Unicode XMLCh format into	//  ibm-037 char format via the lookup table.	//        retVal = new char[wLent + 1];        const XMLCh *srcPtr = toTranscode;        char *outPtr = retVal;	while (*srcPtr != 0)	    *outPtr++ = gUnicodeToIBM037XlatTable[*srcPtr++];	*outPtr=0;    }    else    {        retVal = new char[1];        retVal[0] = 0;    }    return retVal;}char* Iconv390LCPTranscoder::transcode(const XMLCh* const toTranscode,                                       MemoryManager* const manager){    if (!toTranscode)        return 0;    char* retVal = 0;    if (*toTranscode)    {        unsigned int  wLent = getWideCharLength(toTranscode);	//	//  Translate the input from Unicode XMLCh format into	//  ibm-037 char format via the lookup table.	//        retVal = (char*) manager->allocate((wLent + 1) * sizeof(char));//new char[wLent + 1];        const XMLCh *srcPtr = toTranscode;        char *outPtr = retVal;	while (*srcPtr != 0)	    *outPtr++ = gUnicodeToIBM037XlatTable[*srcPtr++];	*outPtr=0;    }    else    {        retVal = (char*) manager->allocate(sizeof(char));//new char[1];        retVal[0] = 0;    }    return retVal;}bool Iconv390LCPTranscoder::transcode( const   XMLCh* const    toTranscode                                    ,       char* const     toFill                                    , const unsigned int    maxBytes                                    , MemoryManager* const  manager){    // Watch for a couple of pyscho corner cases    if (!toTranscode || !maxBytes)    {        toFill[0] = 0;        return true;    }    if (!*toTranscode)    {        toFill[0] = 0;        return true;    }    const XMLCh *srcPtr = toTranscode;    char *outPtr = toFill;    int bytectr = maxBytes;    while (bytectr-- && *srcPtr)       *outPtr++ = gUnicodeToIBM037XlatTable[*srcPtr++];    *outPtr=0;    return true;}XMLCh* Iconv390LCPTranscoder::transcode(const char* const toTranscode){    if (!toTranscode)        return 0;    XMLCh* retVal = 0;    if (*toTranscode)    {        const unsigned int len = calcRequiredSize(toTranscode);        if (len == 0)        {            retVal = new XMLCh[1];            retVal[0] = 0;            return retVal;        }        wchar_t       tmpWideCharArr[gTempBuffArraySize];        wchar_t*      allocatedArray = 0;        wchar_t*      wideCharBuf = 0;        retVal = new XMLCh[len + 1];        size_t retCode;        char *tmpInPtr = (char*) toTranscode;        char *tmpOutPtr = (char*) retVal;        size_t inByteLeft = len;        size_t outByteLeft = len*2;        {         XMLMutexLock lockConverter(&converter->fMutex);         retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);        }        if (retCode == -1) {            delete [] retVal;            return 0;        }        retVal[len] = 0x00;        delete [] allocatedArray;    }    else    {        retVal = new XMLCh[1];        retVal[0] = 0;    }    return retVal;}XMLCh* Iconv390LCPTranscoder::transcode(const char* const toTranscode,                                        MemoryManager* const manager){    if (!toTranscode)        return 0;    XMLCh* retVal = 0;    if (*toTranscode)    {        const unsigned int len = calcRequiredSize(toTranscode, manager);        if (len == 0)        {            retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];            retVal[0] = 0;            return retVal;        }        wchar_t       tmpWideCharArr[gTempBuffArraySize];        wchar_t*      allocatedArray = 0;        wchar_t*      wideCharBuf = 0;        retVal = (XMLCh*) manager->allocate((len + 1) * sizeof(XMLCh));//new XMLCh[len + 1];        size_t retCode;        char *tmpInPtr = (char*) toTranscode;        char *tmpOutPtr = (char*) retVal;        size_t inByteLeft = len;        size_t outByteLeft = len*2;        {         XMLMutexLock lockConverter(&converter->fMutex);         retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);        }        if (retCode == -1) {            manager->deallocate(retVal);//delete [] retVal;            return 0;        }        retVal[len] = 0x00;        manager->deallocate(allocatedArray);//delete [] allocatedArray;    }    else    {        retVal = (XMLCh*) manager->allocate(sizeof(XMLCh));//new XMLCh[1];        retVal[0] = 0;    }    return retVal;}bool Iconv390LCPTranscoder::transcode( const   char* const     toTranscode                                    ,       XMLCh* const    toFill                                    , const unsigned int    maxChars                                    , MemoryManager* const  manager){    // Check for a couple of psycho corner cases    if (!toTranscode || !maxChars)    {        toFill[0] = 0;        return true;    }    if (!*toTranscode)    {        toFill[0] = 0;        return true;    }    size_t retCode;    char *tmpInPtr = (char*) toTranscode;    char *tmpOutPtr = (char*) toFill;    size_t inByteLeft = maxChars;    size_t outByteLeft = maxChars*2;    {     XMLMutexLock lockConverter(&converter->fMutex);     retCode = iconv(converter->fIconv390Descriptor, &tmpInPtr, &inByteLeft, &tmpOutPtr, &outByteLeft);    }    if ( (retCode == -1) && (outByteLeft!=0) ) {        return false;    }    toFill[maxChars] = 0x00;    return true;}// ---------------------------------------------------------------------------//  Iconv390LCPTranscoder: Constructors and Destructor// ---------------------------------------------------------------------------Iconv390LCPTranscoder::Iconv390LCPTranscoder(){}Iconv390LCPTranscoder::Iconv390LCPTranscoder(iconvconverter_t* const toAdopt) :        converter (toAdopt){}Iconv390LCPTranscoder::~Iconv390LCPTranscoder(){    removeConverter(converter);    converter=0;}XERCES_CPP_NAMESPACE_END

⌨️ 快捷键说明

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