mirror of
https://gitlab.labs.nic.cz/labs/bird.git
synced 2024-05-11 16:54:54 +00:00
Added function for shell-like pattern matching. Will be used for
matching interface names in protocol-to-iface bindings.
This commit is contained in:
54
lib/patmatch.c
Normal file
54
lib/patmatch.c
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* BIRD Library -- Generic Shell-Like Pattern Matching (currently only '?' and '*')
|
||||
*
|
||||
* (c) 1998 Martin Mares, <mj@atrey.karlin.mff.cuni.cz>
|
||||
*/
|
||||
|
||||
#include "nest/bird.h"
|
||||
#include "lib/string.h"
|
||||
|
||||
#ifndef MATCH_FUNC_NAME
|
||||
#define MATCH_FUNC_NAME patmatch
|
||||
#endif
|
||||
|
||||
#ifndef Convert
|
||||
#define Convert(x) x
|
||||
#endif
|
||||
|
||||
int
|
||||
MATCH_FUNC_NAME(byte *p, byte *s)
|
||||
{
|
||||
while (*p)
|
||||
{
|
||||
if (*p == '?' && *s)
|
||||
p++, s++;
|
||||
else if (*p == '*')
|
||||
{
|
||||
int z = p[1];
|
||||
|
||||
if (!z)
|
||||
return 1;
|
||||
if (z == '\\' && p[2])
|
||||
z = p[2];
|
||||
z = Convert(z);
|
||||
for(;;)
|
||||
{
|
||||
while (*s && Convert(*s) != z)
|
||||
s++;
|
||||
if (!*s)
|
||||
return 0;
|
||||
if (MATCH_FUNC_NAME(p+1, s))
|
||||
return 1;
|
||||
s++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (*p == '\\' && p[1])
|
||||
p++;
|
||||
if (Convert(*p++) != Convert(*s++))
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return !*s;
|
||||
}
|
||||
Reference in New Issue
Block a user