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/Modules | 1 + lib/patmatch.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/string.h | 2 ++ 3 files changed, 57 insertions(+) create mode 100644 lib/patmatch.c diff --git a/lib/Modules b/lib/Modules index 5657ee7..a1c1fd7 100644 --- a/lib/Modules +++ b/lib/Modules @@ -19,3 +19,4 @@ unaligned.h xmalloc.c printf.c string.h +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; +} diff --git a/lib/string.h b/lib/string.h index 202db0a..03affac 100644 --- a/lib/string.h +++ b/lib/string.h @@ -16,4 +16,6 @@ int bvsprintf(char *str, const char *fmt, va_list args); int bsnprintf(char *str, int size, const char *fmt, ...); int bvsnprintf(char *str, int size, const char *fmt, va_list args); +int patmatch(byte *pat, byte *str); + #endif -- cgit v1.2.3