// // Handler // INT_32 FnMBTruncate::Handler(CDT * aArguments, const UINT_32 iArgNum, CDT & oCDTRetVal, Logger & oLogger) { if (iArgNum == 2) { const UINT_32 iMaxLen = UINT_32(aArguments[0].GetInt()); const STLW::string sData = aArguments[1].GetString(); CCHAR_P szStart = sData.data(); CCHAR_P szEnd = sData.data() + sData.size(); INT_32 iPos = 0; UINT_32 iCharPos = 0; for(;;) { INT_32 iCharLen = utf_charlen(szStart + iPos, szEnd); if (iCharLen == -3) { break; } // Check character length if (iCharLen < 0) { iCharLen = 1; } // Skip errors else { ++iCharPos; } iPos += iCharLen; if (iCharPos >= iMaxLen) { break; } } if (iCharPos == iMaxLen) { oCDTRetVal = STLW::string(sData, 0, iPos); } else { oCDTRetVal = sData; } return 0; } else if (iArgNum == 3) { const UINT_32 iMaxLen = UINT_32(aArguments[1].GetInt()); STLW::string sData = aArguments[2].GetString(); CCHAR_P szStart = sData.data(); CCHAR_P szEnd = sData.data() + sData.size(); INT_32 iPos = 0; UINT_32 iCharPos = 0; for(;;) { INT_32 iCharLen = utf_charlen(szStart + iPos, szEnd); if (iCharLen == -3) { break; } // Check character length if (iCharLen < 0) { iCharLen = 1; } // Skip errors else { ++iCharPos; } iPos += iCharLen; if (iCharPos >= iMaxLen) { break; } } if (iCharPos >= iMaxLen) { sData = STLW::string(sData, 0, iPos); sData.append(aArguments[0].GetString()); } oCDTRetVal = sData; return 0; } oLogger.Emerg("Usage: MB_TRUNCATE(data, offset) or MB_TRUNCATE(data, offset, add_on)"); return -1; }
// // Handler // INT_32 FnMBSubstring::Handler(CDT * aArguments, const UINT_32 iArgNum, CDT & oCDTRetVal, Logger & oLogger) { // Check number of parameters if (iArgNum == 0) { oCDTRetVal = ""; return 0; } // substr('foobar', 2) -> 'obar' if (iArgNum == 2) { const UINT_32 iOffset = UINT_32(aArguments[0].GetInt()); const STLW::string sResult = aArguments[1].GetString(); CCHAR_P szStart = sResult.data(); CCHAR_P szEnd = sResult.data() + sResult.size(); INT_32 iPos = 0; UINT_32 iCharPos = 0; for(;;) { INT_32 iCharLen = utf_charlen(szStart + iPos, szEnd); if (iCharLen == -3) { break; } // Check character length if (iCharLen < 0) { iCharLen = 1; } // Skip errors else { ++iCharPos; } iPos += iCharLen; if (iCharPos >= iOffset) { break; } } if (iCharPos < iOffset) { oCDTRetVal = ""; } else { oCDTRetVal = sResult.substr(iPos); } return 0; } // substr('foobar', 2, 3) -> 'oba' if (iArgNum == 3) { const UINT_32 iBytes = UINT_32(aArguments[0].GetInt()); const UINT_32 iOffset = UINT_32(aArguments[1].GetInt()); const STLW::string sResult = aArguments[2].GetString(); CCHAR_P szStart = sResult.data(); CCHAR_P szEnd = sResult.data() + sResult.size(); INT_32 iPos = 0; UINT_32 iCharOffset = 0; UINT_32 iCharPos = 0; for(;;) { INT_32 iCharLen = utf_charlen(szStart + iPos, szEnd); if (iCharLen == -3) { break; } // Check character length if (iCharLen < 0) { iCharLen = 1; } // Skip errors else { ++iCharPos; } iPos += iCharLen; if (iCharPos == iOffset) { iCharOffset = iPos; } if (iCharPos == iOffset + iBytes) { break; } } if (sResult.size() < iCharOffset) { oCDTRetVal = ""; } else { oCDTRetVal = sResult.substr(iCharOffset, iPos - iCharOffset); } return 0; } // substr('foobar', 2, 3, '1234567') -> 'fo1234567r' if (iArgNum == 4) { STLW::string sReplacement = aArguments[0].GetString(); const UINT_32 iBytes = UINT_32(aArguments[1].GetInt()); const UINT_32 iOffset = UINT_32(aArguments[2].GetInt()); const STLW::string sTMP = aArguments[3].GetString(); CCHAR_P szStart = sTMP.data(); CCHAR_P szEnd = sTMP.data() + sTMP.size(); UINT_32 iPos = 0; UINT_32 iCharOffset = 0; UINT_32 iCharPos = 0; for(;;) { INT_32 iCharLen = utf_charlen(szStart + iPos, szEnd); if (iCharLen == -3) { break; } // Check character length if (iCharLen < 0) { iCharLen = 1; } // Skip errors else { ++iCharPos; } iPos += iCharLen; if (iCharPos == iOffset) { iCharOffset = iPos; } if (iCharPos == iOffset + iBytes) { break; } } if (sTMP.size() < iCharOffset) { oCDTRetVal = ""; return 0; } STLW::string sResult(sTMP, 0, iCharOffset); sResult.append(sReplacement); if (iPos == sTMP.size()) { oCDTRetVal = sResult; return 0; } sResult.append(sTMP, iPos, STLW::string::npos); oCDTRetVal = sResult; return 0; } oLogger.Emerg("Usage: MB_SUBSTR(x, offset[, bytes[, y]]])"); return -1; }