From dee929d86844b1956b1c0f1d2c0289a787ab9226 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 29 Nov 1998 14:47:24 +0000 Subject: Added function for shell-like pattern matching. Will be used for matching interface names in protocol-to-iface bindings. --- lib/patmatch.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 lib/patmatch.c (limited to 'lib/patmatch.c') diff --git a/lib/patmatch.c b/lib/patmatch.c new file mode 100644 index 0000000..15d5007 --- /dev/null +++ b/lib/patmatch.c @@ -0,0 +1,54 @@ +/* + * BIRD Library -- Generic Shell-Like Pattern Matching (currently only '?' and '*') + * + * (c) 1998 Martin Mares, + */ + +#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; +} -- cgit v1.2.3