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; }
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* IconvGNULCPTranscoder::transcode(const XMLCh* const toTranscode, MemoryManager* const manager) { if (!toTranscode) return 0; char* retVal = 0; if (*toTranscode) { unsigned int wLent = getWideCharLength(toTranscode); // Calc needed size. const size_t neededLen = calcRequiredSize (toTranscode, manager); if (neededLen == 0) return 0; // allocate output buffer retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char));//new char[neededLen + 1]; if (retVal == NULL) return 0; // prepare the original char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) manager->allocate(len * sizeof(char));//new char[len]; if (wBufPtr == NULL) return 0; wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); } else wideCharBuf = (char *) toTranscode; // perform conversion wLent *= uChSize(); char *ptr = retVal; size_t rc = iconvTo(wideCharBuf, (size_t *) &wLent, &ptr, neededLen); if (rc == (size_t)-1) { if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; return 0; } if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; retVal[neededLen] = 0; } else { retVal = (char*) manager->allocate(sizeof(char));//new char[1]; if (retVal == NULL) return 0; retVal[0] = 0; } return retVal; }
bool IconvGNULCPTranscoder::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; } unsigned int wLent = getWideCharLength(toTranscode); if (wLent > maxBytes) wLent = maxBytes; // Fill the "unicode" string char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) manager->allocate ( len * sizeof(char) );//new char[len]; if (wBufPtr == NULL) return 0; wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; xmlToMbs (toTranscode, wLent, wideCharBuf, wLent); } else wideCharBuf = (char *) toTranscode; // Ok, go ahead and try the transcoding. If it fails, then ... char *ptr = toFill; size_t rc = iconvTo(wideCharBuf, &len, &ptr, maxBytes); if (rc == (size_t)-1) { if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; return false; } if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; // Cap it off *ptr = 0; return true; }
char* IconvGNULCPTranscoder::transcode(const XMLCh* const toTranscode, MemoryManager* const manager) { if (!toTranscode) return 0; char* retVal = 0; if (!*toTranscode) { retVal = (char*) manager->allocate(sizeof(char));//new char[1]; retVal[0] = 0; return retVal; } XMLSize_t wLent = getWideCharLength(toTranscode); // Calc needed size. XMLSize_t neededLen = calcRequiredSize (toTranscode, manager); if (neededLen == 0) return 0; // allocate output buffer retVal = (char*) manager->allocate((neededLen + 1) * sizeof(char));//new char[neededLen + 1]; // prepare the original char tmpWBuff[gTempBuffArraySize]; char *wideCharBuf = 0; char *wBufPtr = 0; ArrayJanitor<char> janBuf(wBufPtr, manager); size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) manager->allocate(len * sizeof(char));//new char[len]; janBuf.reset(wBufPtr, manager); wideCharBuf = wBufPtr; } else wideCharBuf = tmpWBuff; xmlToMbs (toTranscode, wideCharBuf, wLent); } else wideCharBuf = (char *) toTranscode; // perform conversion char* ptr = retVal; size_t rc; { XMLMutexLock lockConverter(&fMutex); rc = iconvTo(wideCharBuf, &len, &ptr, neededLen); } if (rc == (size_t)-1) { return 0; } retVal[neededLen] = 0; return retVal; }
unsigned int IconvGNULCPTranscoder::calcRequiredSize(const XMLCh* const srcText , MemoryManager* const manager) { if (!srcText) return 0; unsigned int wLent = getWideCharLength(srcText); if (wLent == 0) return 0; char tmpWBuff[gTempBuffArraySize]; char *wBuf = 0; char *wBufPtr = 0; size_t len = wLent * uChSize(); if (uChSize() != sizeof(XMLCh) || UBO() != BYTE_ORDER) { if (len > gTempBuffArraySize) { wBufPtr = (char*) manager->allocate ( len * sizeof(char) );//new char[len]; if (wBufPtr == NULL) return 0; wBuf = wBufPtr; } else wBuf = tmpWBuff; xmlToMbs (srcText, wLent, wBuf, wLent); } else wBuf = (char *) srcText; char tmpBuff[gTempBuffArraySize]; size_t totalLen = 0; char *srcEnd = wBuf + wLent * uChSize(); for (;;) { char *pTmpArr = tmpBuff; const char *ptr = srcEnd - len; size_t rc = iconvTo(ptr, &len, &pTmpArr, gTempBuffArraySize); if (rc == (size_t) -1 && errno != E2BIG) { if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; ThrowXMLwithMemMgr(TranscodingException, XMLExcepts::Trans_BadSrcSeq, manager); /* return 0; */ } rc = pTmpArr - tmpBuff; totalLen += rc; if (rc == 0 || len == 0) break; } if (wBufPtr) manager->deallocate(wBufPtr);//delete [] wBufPtr; return totalLen; }