mirror of
https://github.com/YGGverse/xash3d-fwgs.git
synced 2025-01-22 21:04:14 +00:00
engine: move matchpattern from old engine
This commit is contained in:
parent
6f27d05361
commit
e700a7498e
@ -168,55 +168,6 @@ FILEMATCH COMMON SYSTEM
|
|||||||
|
|
||||||
=============================================================================
|
=============================================================================
|
||||||
*/
|
*/
|
||||||
static int matchpattern( const char *str, const char *cmp, qboolean caseinsensitive )
|
|
||||||
{
|
|
||||||
int c1, c2;
|
|
||||||
|
|
||||||
while( *cmp )
|
|
||||||
{
|
|
||||||
switch( *cmp )
|
|
||||||
{
|
|
||||||
case 0: return 1; // end of pattern
|
|
||||||
case '?': // match any single character
|
|
||||||
if( *str == 0 || *str == '/' || *str == '\\' || *str == ':' )
|
|
||||||
return 0; // no match
|
|
||||||
str++;
|
|
||||||
cmp++;
|
|
||||||
break;
|
|
||||||
case '*': // match anything until following string
|
|
||||||
if( !*str ) return 1; // match
|
|
||||||
cmp++;
|
|
||||||
while( *str )
|
|
||||||
{
|
|
||||||
if( *str == '/' || *str == '\\' || *str == ':' )
|
|
||||||
break;
|
|
||||||
// see if pattern matches at this offset
|
|
||||||
if( matchpattern( str, cmp, caseinsensitive ))
|
|
||||||
return 1;
|
|
||||||
// nope, advance to next offset
|
|
||||||
str++;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if( *str != *cmp )
|
|
||||||
{
|
|
||||||
if( !caseinsensitive )
|
|
||||||
return 0; // no match
|
|
||||||
c1 = Q_tolower( *str );
|
|
||||||
c2 = Q_tolower( *cmp );
|
|
||||||
if( c1 != c2 ) return 0; // no match
|
|
||||||
}
|
|
||||||
|
|
||||||
str++;
|
|
||||||
cmp++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// reached end of pattern but not end of input?
|
|
||||||
return (*str) ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void stringlistinit( stringlist_t *list )
|
static void stringlistinit( stringlist_t *list )
|
||||||
{
|
{
|
||||||
memset( list, 0, sizeof( *list ));
|
memset( list, 0, sizeof( *list ));
|
||||||
|
@ -885,3 +885,69 @@ void COM_ReplaceExtension( char *path, const char *extension )
|
|||||||
COM_StripExtension( path );
|
COM_StripExtension( path );
|
||||||
COM_DefaultExtension( path, extension );
|
COM_DefaultExtension( path, extension );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int matchpattern( const char *in, const char *pattern, qboolean caseinsensitive )
|
||||||
|
{
|
||||||
|
return matchpattern_with_separator( in, pattern, caseinsensitive, "/\\:", false );
|
||||||
|
}
|
||||||
|
|
||||||
|
// wildcard_least_one: if true * matches 1 or more characters
|
||||||
|
// if false * matches 0 or more characters
|
||||||
|
int matchpattern_with_separator( const char *in, const char *pattern, qboolean caseinsensitive, const char *separators, qboolean wildcard_least_one )
|
||||||
|
{
|
||||||
|
int c1, c2;
|
||||||
|
|
||||||
|
while( *pattern )
|
||||||
|
{
|
||||||
|
switch( *pattern )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return 1; // end of pattern
|
||||||
|
case '?': // match any single character
|
||||||
|
if( *in == 0 || Q_strchr( separators, *in ))
|
||||||
|
return 0; // no match
|
||||||
|
in++;
|
||||||
|
pattern++;
|
||||||
|
break;
|
||||||
|
case '*': // match anything until following string
|
||||||
|
if( wildcard_least_one )
|
||||||
|
{
|
||||||
|
if( *in == 0 || Q_strchr( separators, *in ))
|
||||||
|
return 0; // no match
|
||||||
|
in++;
|
||||||
|
}
|
||||||
|
pattern++;
|
||||||
|
while( *in )
|
||||||
|
{
|
||||||
|
if( Q_strchr(separators, *in ))
|
||||||
|
break;
|
||||||
|
// see if pattern matches at this offset
|
||||||
|
if( matchpattern_with_separator(in, pattern, caseinsensitive, separators, wildcard_least_one ))
|
||||||
|
return 1;
|
||||||
|
// nope, advance to next offset
|
||||||
|
in++;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if( *in != *pattern )
|
||||||
|
{
|
||||||
|
if( !caseinsensitive )
|
||||||
|
return 0; // no match
|
||||||
|
c1 = *in;
|
||||||
|
if( c1 >= 'A' && c1 <= 'Z' )
|
||||||
|
c1 += 'a' - 'A';
|
||||||
|
c2 = *pattern;
|
||||||
|
if( c2 >= 'A' && c2 <= 'Z' )
|
||||||
|
c2 += 'a' - 'A';
|
||||||
|
if( c1 != c2 )
|
||||||
|
return 0; // no match
|
||||||
|
}
|
||||||
|
in++;
|
||||||
|
pattern++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( *in )
|
||||||
|
return 0; // reached end of pattern but not end of input
|
||||||
|
return 1; // success
|
||||||
|
}
|
||||||
|
@ -81,5 +81,7 @@ void COM_ExtractFilePath( const char *path, char *dest );
|
|||||||
const char *COM_FileWithoutPath( const char *in );
|
const char *COM_FileWithoutPath( const char *in );
|
||||||
void COM_StripExtension( char *path );
|
void COM_StripExtension( char *path );
|
||||||
#define COM_CheckString( string ) ( ( !string || !*string ) ? 0 : 1 )
|
#define COM_CheckString( string ) ( ( !string || !*string ) ? 0 : 1 )
|
||||||
|
int matchpattern( const char *in, const char *pattern, qboolean caseinsensitive );
|
||||||
|
int matchpattern_with_separator( const char *in, const char *pattern, qboolean caseinsensitive, const char *separators, qboolean wildcard_least_one );
|
||||||
|
|
||||||
#endif//STDLIB_H
|
#endif//STDLIB_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user