Initial commit
This commit is contained in:
142
Torque/SDK/engine/core/findMatch.cc
Normal file
142
Torque/SDK/engine/core/findMatch.cc
Normal file
@@ -0,0 +1,142 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Torque Game Engine
|
||||
// Copyright (C) GarageGames.com, 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 );
|
||||
}
|
||||
|
||||
|
||||
bool FindMatch::isMatchMultipleExprs( const char *exps, const char *str, bool caseSensitive )
|
||||
{
|
||||
char *tok = 0;
|
||||
int len = dStrlen(exps);
|
||||
|
||||
char *e = new char[len+1];
|
||||
dStrcpy(e,exps);
|
||||
|
||||
// allow for either tab or space seperated.
|
||||
for(int i=0;i<len;i++)
|
||||
{
|
||||
if(e[i]=='\t')
|
||||
e[i]=' ';
|
||||
}
|
||||
|
||||
// search for each expression. return true soon as we see one.
|
||||
for( tok = dStrtok(e," "); tok != NULL; tok = dStrtok(NULL," "))
|
||||
{
|
||||
if( isMatch( tok, str, caseSensitive) )
|
||||
{
|
||||
delete []e;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
delete []e;
|
||||
return false;
|
||||
}
|
||||
Reference in New Issue
Block a user