mirror of
https://github.com/tribes2/engine.git
synced 2026-01-20 11:44:46 +00:00
115 lines
2.7 KiB
C++
115 lines
2.7 KiB
C++
//-----------------------------------------------------------------------------
|
|
// V12 Engine
|
|
//
|
|
// Copyright (c) 2001 GarageGames.Com
|
|
// Portions Copyright (c) 2001 by Sierra Online, Inc.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#include "Platform/platform.h"
|
|
#include "Core/findMatch.h"
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// NAME
|
|
// FindMatch::FindMatch( const char *_expression, S32 maxNumMatches )
|
|
//
|
|
// DESCRIPTION
|
|
// Class to match regular expressions (file names)
|
|
// only works with '*','?', and 'chars'
|
|
//
|
|
// ARGUMENTS
|
|
// _expression - The regular expression you intend to match (*.??abc.bmp)
|
|
// _maxMatches - The maximum number of strings you wish to match.
|
|
//
|
|
// RETURNS
|
|
//
|
|
// NOTES
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
FindMatch::FindMatch( U32 _maxMatches )
|
|
{
|
|
VECTOR_SET_ASSOCIATION(matchList);
|
|
|
|
expression = NULL;
|
|
maxMatches = _maxMatches;
|
|
matchList.reserve( maxMatches );
|
|
}
|
|
|
|
FindMatch::FindMatch( char *_expression, U32 _maxMatches )
|
|
{
|
|
VECTOR_SET_ASSOCIATION(matchList);
|
|
|
|
expression = NULL;
|
|
setExpression( _expression );
|
|
maxMatches = _maxMatches;
|
|
matchList.reserve( maxMatches );
|
|
}
|
|
|
|
FindMatch::~FindMatch()
|
|
{
|
|
delete [] expression;
|
|
matchList.clear();
|
|
}
|
|
|
|
void FindMatch::setExpression( const char *_expression )
|
|
{
|
|
delete [] expression;
|
|
|
|
expression = new char[dStrlen(_expression) + 1];
|
|
dStrcpy(expression, _expression);
|
|
dStrupr(expression);
|
|
}
|
|
|
|
bool FindMatch::findMatch( const char *str, bool caseSensitive )
|
|
{
|
|
if ( isFull() )
|
|
return false;
|
|
|
|
char nstr[512];
|
|
dStrcpy( nstr,str );
|
|
dStrupr(nstr);
|
|
if ( isMatch( expression, nstr, caseSensitive ) )
|
|
{
|
|
matchList.push_back( (char*)str );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool FindMatch::isMatch( const char *exp, const char *str, bool caseSensitive )
|
|
{
|
|
const char *e=exp;
|
|
const char *s=str;
|
|
bool match=true;
|
|
|
|
while ( match && *e && *s )
|
|
{
|
|
switch( *e )
|
|
{
|
|
case '*':
|
|
e++;
|
|
match = false;
|
|
while( ((s=dStrchr(s,*e)) !=NULL) && !match )
|
|
{
|
|
match = isMatch( e, s, caseSensitive );
|
|
s++;
|
|
}
|
|
return( match );
|
|
case '?':
|
|
e++;
|
|
s++;
|
|
break;
|
|
default:
|
|
if (caseSensitive) match = ( *e++ == *s++ );
|
|
else match = ( dToupper(*e++) == dToupper(*s++) );
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (*e != *s) // both exp and str should be at '\0' if match was successfull
|
|
match = false;
|
|
|
|
return ( match );
|
|
}
|