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 + -
显示快捷键?