Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}