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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }