Mercurial > dovecot > core-2.2
annotate src/lib/wildcard-match.c @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | 740935acc0f8 |
children |
rev | line source |
---|---|
10941
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 * This code would not have been possible without the prior work and |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 * suggestions of various sourced. Special thanks to Robey for |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 * all his time/help tracking down bugs and his ever-helpful advice. |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 * |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 * 04/09: Fixed the "*\*" against "*a" bug (caused an endless loop) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 * |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 * Chris Fuller (aka Fred1@IRC & Fwitz@IRC) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 * crf@cfox.bchs.uh.edu |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 * |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 * I hereby release this code into the public domain |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 * |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "lib.h" |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "wildcard-match.h" |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <ctype.h> |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 #define WILDS '*' /* matches 0 or more characters (including spaces) */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 #define WILDQ '?' /* matches ecactly one character */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 #define NOMATCH 0 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 #define MATCH (match+sofar) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 static int wildcard_match_int(const char *data, const char *mask, int icase) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 { |
17354
c31bd0065d91
lib: wildcard-match - use NULL not 0 for pointers
Phil Carmody <phil@dovecot.fi>
parents:
10941
diff
changeset
|
28 const char *ma = mask, *na = data, *lsm = NULL, *lsn = NULL; |
10941
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 int match = 1; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 int sofar = 0; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
17726
2ca346d91310
lib: wildcard_match() should have matched "*" wildcard against an empty "" string also.
Timo Sirainen <tss@iki.fi>
parents:
17354
diff
changeset
|
32 if (na[0] == '\0') { |
2ca346d91310
lib: wildcard_match() should have matched "*" wildcard against an empty "" string also.
Timo Sirainen <tss@iki.fi>
parents:
17354
diff
changeset
|
33 /* empty string can match only "*" wildcard(s) */ |
2ca346d91310
lib: wildcard_match() should have matched "*" wildcard against an empty "" string also.
Timo Sirainen <tss@iki.fi>
parents:
17354
diff
changeset
|
34 while (ma[0] == '*') ma++; |
2ca346d91310
lib: wildcard_match() should have matched "*" wildcard against an empty "" string also.
Timo Sirainen <tss@iki.fi>
parents:
17354
diff
changeset
|
35 return ma[0] == '\0' ? MATCH : NOMATCH; |
2ca346d91310
lib: wildcard_match() should have matched "*" wildcard against an empty "" string also.
Timo Sirainen <tss@iki.fi>
parents:
17354
diff
changeset
|
36 } |
10941
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 /* find the end of each string */ |
18891
740935acc0f8
lib: Fixed read buffer overflow in wildcard_match*()
Timo Sirainen <tss@iki.fi>
parents:
17726
diff
changeset
|
38 while (*(mask++)); |
740935acc0f8
lib: Fixed read buffer overflow in wildcard_match*()
Timo Sirainen <tss@iki.fi>
parents:
17726
diff
changeset
|
39 mask-=2; |
740935acc0f8
lib: Fixed read buffer overflow in wildcard_match*()
Timo Sirainen <tss@iki.fi>
parents:
17726
diff
changeset
|
40 while (*(data++)); |
740935acc0f8
lib: Fixed read buffer overflow in wildcard_match*()
Timo Sirainen <tss@iki.fi>
parents:
17726
diff
changeset
|
41 data-=2; |
10941
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 while (data >= na) { |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 /* If the mask runs out of chars before the string, fall back on |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 * a wildcard or fail. */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 if (mask < ma) { |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 if (lsm) { |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 data = --lsn; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 mask = lsm; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 if (data < na) |
17354
c31bd0065d91
lib: wildcard-match - use NULL not 0 for pointers
Phil Carmody <phil@dovecot.fi>
parents:
10941
diff
changeset
|
51 lsm = NULL; |
10941
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 sofar = 0; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 else |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 return NOMATCH; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 switch (*mask) { |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 case WILDS: /* Matches anything */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 do |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 mask--; /* Zap redundant wilds */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 while ((mask >= ma) && (*mask == WILDS)); |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 lsm = mask; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 lsn = data; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 match += sofar; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 sofar = 0; /* Update fallback pos */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 if (mask < ma) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 return MATCH; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 continue; /* Next char, please */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 case WILDQ: |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 mask--; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 data--; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 continue; /* '?' always matches */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 if (icase ? (i_toupper(*mask) == i_toupper(*data)) : |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 (*mask == *data)) { /* If matching char */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 mask--; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 data--; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 sofar++; /* Tally the match */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 continue; /* Next char, please */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 if (lsm) { /* To to fallback on '*' */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 data = --lsn; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 mask = lsm; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 if (data < na) |
17354
c31bd0065d91
lib: wildcard-match - use NULL not 0 for pointers
Phil Carmody <phil@dovecot.fi>
parents:
10941
diff
changeset
|
86 lsm = NULL; /* Rewind to saved pos */ |
10941
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 sofar = 0; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 continue; /* Next char, please */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 return NOMATCH; /* No fallback=No match */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 while ((mask >= ma) && (*mask == WILDS)) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 mask--; /* Zap leftover %s & *s */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 return (mask >= ma) ? NOMATCH : MATCH; /* Start of both = match */ |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 bool wildcard_match(const char *data, const char *mask) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 { |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 return wildcard_match_int(data, mask, FALSE) != 0; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 } |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 bool wildcard_match_icase(const char *data, const char *mask) |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 { |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 return wildcard_match_int(data, mask, TRUE) != 0; |
f7d14405de09
Added wildcard_match*() for matching strings with '*' and '?' wildcards.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 } |