char * stristr (const char * str1, const char * str2)
{
char *cp = (char *) str1;
char *s1, *s2;
if ( !*str2 )
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *) str2;
while ( *s1 && *s2 && toupper(*s1)==toupper(*s2) ){
s1++, s2++;
}
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
// Replace all occurrences of string 'pszOld' with string 'pszNew'
int replacei( const char * pszSrc, int iStart, const char * pszOld, const char * pszNew, char** ppszOut, int* pLenOut)
{
// can't have empty or NULL lpszOld
// nSourceLen is in XCHARs
int nSourceLen = strlen( pszOld );
if( nSourceLen == 0 )
return( 0 );
if(iStart < 0)
return( 0 );
// nReplacementLen is in XCHARs
int nReplacementLen = strlen( pszNew );
int nOldLength = strlen(pszSrc);
iStart = iStart > nOldLength ? nOldLength : iStart;
// loop once to figure out the size of the result string
int nCount = 0;
{
char * pszStart = (char *)pszSrc + iStart;
const char * pszEnd = pszStart + nOldLength - iStart;
while( pszStart < pszEnd )
{
char * pszTarget;
while( (pszTarget = stristr( pszStart, pszOld ) ) != NULL)
{
nCount++;
pszStart = pszTarget+nSourceLen;
}
pszStart = pszStart +1;
}
}
// if any changes were made, make them
if( nCount > 0 )
{
// if the buffer is too small, just
// allocate a new buffer (slow but sure)
int nNewLength = nOldLength+(nReplacementLen-nSourceLen)*nCount + 1;
*pLenOut = nNewLength;
char* pszBuffer = (char*)malloc(nNewLength);
*ppszOut = pszBuffer;
char* pszStart = (char *)pszSrc + iStart;
char* pszEnd = pszStart+nOldLength-iStart;
char* pszStartBuffer = pszBuffer;
// copy front string
memcpy(pszStartBuffer, pszSrc, iStart);
pszStartBuffer += iStart;
// loop again to actually do the work
while( pszStart < pszEnd )
{
char* pszTarget;
while( (pszTarget = stristr( pszStart, pszOld ) ) != NULL )
{
int nMove = pszTarget - pszStart;
memcpy(pszStartBuffer, pszStart, nMove);
memcpy(pszStartBuffer+nMove, pszNew, nReplacementLen);
pszStart = pszTarget+nSourceLen;
pszStartBuffer = pszStartBuffer+nMove+nReplacementLen;
*pszStartBuffer = 0;
}
memcpy(pszStartBuffer, pszStart, pszEnd-pszStart);
pszStartBuffer = pszStartBuffer+(pszEnd-pszStart);
*pszStartBuffer = 0;
pszStart = pszEnd;
}
}
else
{
if(nOldLength > 0)
{
*pLenOut = nOldLength;
*ppszOut = (char*)malloc(nOldLength+1);
memcpy(*ppszOut, pszSrc, nOldLength);
*(ppszOut + nOldLength) = 0;
}
}
return( nCount );
}
从微软CString::Replace抄的