]> git.ipfire.org Git - thirdparty/bird.git/blob - lib/patmatch.c
Aggregator: Fixed hashing of adata
[thirdparty/bird.git] / lib / patmatch.c
1 /*
2 * BIRD Library -- Generic Shell-Like Pattern Matching (currently only '?' and '*')
3 *
4 * (c) 1998--2000 Martin Mares <mj@ucw.cz>
5 */
6
7 #include "nest/bird.h"
8 #include "lib/string.h"
9
10 #ifndef MATCH_FUNC_NAME
11 #define MATCH_FUNC_NAME patmatch
12 #endif
13
14 #ifndef Convert
15 #define Convert(x) x
16 #endif
17
18 int
19 MATCH_FUNC_NAME(const byte *p, const byte *s)
20 {
21 while (*p)
22 {
23 if (*p == '?' && *s)
24 p++, s++;
25 else if (*p == '*')
26 {
27 int z = p[1];
28
29 if (!z)
30 return 1;
31 if (z == '\\' && p[2])
32 z = p[2];
33 z = Convert(z);
34 for(;;)
35 {
36 while (*s && Convert(*s) != z)
37 s++;
38 if (!*s)
39 return 0;
40 if (MATCH_FUNC_NAME(p+1, s))
41 return 1;
42 s++;
43 }
44 }
45 else
46 {
47 if (*p == '\\' && p[1])
48 p++;
49 if (Convert(*p++) != Convert(*s++))
50 return 0;
51 }
52 }
53 return !*s;
54 }
55
56 #if 0
57 /**
58 * patmatch - match shell-like patterns
59 * @p: pattern
60 * @s: string
61 *
62 * patmatch() returns whether given string @s matches the given shell-like
63 * pattern @p. The patterns consist of characters (which are matched literally),
64 * question marks which match any single character, asterisks which match any
65 * (possibly empty) string of characters and backslashes which are used to
66 * escape any special characters and force them to be treated literally.
67 *
68 * The matching process is not optimized with respect to time, so please
69 * avoid using this function for complex patterns.
70 */
71 int
72 patmatch(byte *p, byte *s)
73 { DUMMY; }
74 #endif