diff options
author | Martin Mares <mj@ucw.cz> | 1998-11-29 14:47:24 +0000 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-11-29 14:47:24 +0000 |
commit | dee929d86844b1956b1c0f1d2c0289a787ab9226 (patch) | |
tree | 746052f1d258a7f471fee1bb8822a3d405bf747e | |
parent | bd5d0d62f10c65d56e1900014be5989a3feb8380 (diff) |
Added function for shell-like pattern matching. Will be used for
matching interface names in protocol-to-iface bindings.
-rw-r--r-- | lib/Modules | 1 | ||||
-rw-r--r-- | lib/patmatch.c | 54 | ||||
-rw-r--r-- | lib/string.h | 2 |
3 files changed, 57 insertions, 0 deletions
diff --git a/lib/Modules b/lib/Modules index 5657ee73..a1c1fd7f 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 00000000..15d5007a --- /dev/null +++ b/lib/patmatch.c @@ -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; +} diff --git a/lib/string.h b/lib/string.h index 202db0ab..03affacc 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 |