]>
Commit | Line | Data |
---|---|---|
dee929d8 MM |
1 | /* |
2 | * BIRD Library -- Generic Shell-Like Pattern Matching (currently only '?' and '*') | |
3 | * | |
7722938d | 4 | * (c) 1998--2000 Martin Mares <mj@ucw.cz> |
dee929d8 MM |
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(byte *p, 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 | } | |
7722938d MM |
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 |