static HB_SIZE hb_strAtI( PHB_CODEPAGE cdp, const char * szSub, HB_SIZE nSubLen, const char * szText, HB_SIZE nLen ) { HB_TRACE( HB_TR_DEBUG, ( "hb_strAtI(%p, %s, %" HB_PFS "u, %s, %" HB_PFS "u)", cdp, szSub, nSubLen, szText, nLen ) ); if( nSubLen > 0 && nLen >= nSubLen ) { HB_SIZE nPos = 0, nIndex = 0; do { HB_SIZE nSubPos = 0, nPrev = nPos; if( hb_cdpCharCaseEq( cdp, szText, nLen, &nPos, szSub, nSubLen, &nSubPos ) ) { HB_SIZE nBack = nPos; do { if( nSubPos >= nSubLen ) return ( HB_CDP_ISCHARIDX( cdp ) ? nIndex : nPrev ) + 1; } while( hb_cdpCharCaseEq( cdp, szText, nLen, &nPos, szSub, nSubLen, &nSubPos ) ); nPos = nBack; } ++nIndex; } while( nPos < nLen ); } return 0; }
static HB_BOOL hb_strMatchWildCDP( const char * szString, const char * szPattern, HB_BOOL fExact, HB_BOOL fCase, HB_BOOL fFile, PHB_CODEPAGE cdp ) { HB_BOOL fMatch = HB_TRUE, fAny = HB_FALSE; HB_SIZE pnBufPosP[ HB_MAX_WILDPATTERN ], pnBufPosV[ HB_MAX_WILDPATTERN ], nBufSize = HB_MAX_WILDPATTERN; HB_SIZE * nAnyPosP = pnBufPosP, * nAnyPosV = pnBufPosV, nSize, nLen, nAny, nPosP, nPosV; nPosP = nPosV = nAny = 0; nLen = strlen( szString ); nSize = strlen( szPattern ); while( nPosP < nSize || ( fExact && ! fAny && nPosV < nLen ) ) { if( nPosP < nSize && szPattern[ nPosP ] == '*' ) { fAny = HB_TRUE; nPosP++; continue; } if( nPosV < nLen && nPosP < nSize ) { HB_SIZE nPP = nPosP, nPV = nPosV; if( szPattern[ nPosP ] == '?' ) { nPosP++; nPosV += hb_cdpTextPos( cdp, szString + nPosV, nLen - nPosV, 1 ); } else if( fCase ) { if( ! hb_cdpCharCaseEq( cdp, szString, nLen, &nPosV, szPattern, nSize, &nPosP ) ) { nPosV = nPV; nPosP = nPP; } } else { if( ! hb_cdpCharEq( cdp, szString, nLen, &nPosV, szPattern, nSize, &nPosP ) ) { nPosV = nPV; nPosP = nPP; } } if( nPP != nPosP ) { if( fAny ) { if( nAny >= nBufSize ) { if( ( nBufSize <<= 1 ) == ( HB_MAX_WILDPATTERN << 1 ) ) { nAnyPosP = ( HB_SIZE * ) hb_xgrab( nBufSize * sizeof( HB_SIZE ) ); nAnyPosV = ( HB_SIZE * ) hb_xgrab( nBufSize * sizeof( HB_SIZE ) ); memcpy( nAnyPosP, pnBufPosP, HB_MAX_WILDPATTERN * sizeof( HB_SIZE ) ); memcpy( nAnyPosV, pnBufPosV, HB_MAX_WILDPATTERN * sizeof( HB_SIZE ) ); } else { nAnyPosP = ( HB_SIZE * ) hb_xrealloc( nAnyPosP, nBufSize * sizeof( HB_SIZE ) ); nAnyPosV = ( HB_SIZE * ) hb_xrealloc( nAnyPosV, nBufSize * sizeof( HB_SIZE ) ); } } nAnyPosP[ nAny ] = nPP; nAnyPosV[ nAny ] = nPosV; nAny++; fAny = HB_FALSE; } continue; } } if( fFile && nPosV == nLen && nPosP < nSize && szPattern[ nPosP ] == '.' && ( nPosP + 1 == nSize || ( nPosP + 2 == nSize && szPattern[ nPosP + 1 ] == '*' ) ) ) { break; } else if( fAny && nPosV < nLen ) { nPosV += hb_cdpTextPos( cdp, szString + nPosV, nLen - nPosV, 1 ); } else if( nAny > 0 ) { nAny--; nPosP = nAnyPosP[ nAny ]; nPosV = nAnyPosV[ nAny ]; fAny = HB_TRUE; } else { fMatch = HB_FALSE; break; } } if( nBufSize > HB_MAX_WILDPATTERN ) { hb_xfree( nAnyPosP ); hb_xfree( nAnyPosV ); } return fMatch; }