aboutsummaryrefslogtreecommitdiffstats
path: root/lib/parser.c
diff options
context:
space:
mode:
authorDu, Changbin <changbin.du@gmail.com>2014-01-23 18:54:12 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-01-23 19:36:55 -0500
commitaace05097a0fd467230e39acb148be0fdaa90068 (patch)
treeca2e61621bcb24ad83f3f145987c8ffd5c28c65b /lib/parser.c
parent0d9dfc23f4d8c17365c84eb48ecca28b963ba192 (diff)
lib/parser.c: add match_wildcard() function
match_wildcard function is a simple implementation of wildcard matching algorithm. It only supports two usual wildcardes: '*' - matches zero or more characters '?' - matches one character This algorithm is safe since it is non-recursive. Signed-off-by: Du, Changbin <changbin.du@gmail.com> Cc: Jason Baron <jbaron@akamai.com> Cc: Joe Perches <joe@perches.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib/parser.c')
-rw-r--r--lib/parser.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/parser.c b/lib/parser.c
index 807b2aaa33fa..ee5295541cea 100644
--- a/lib/parser.c
+++ b/lib/parser.c
@@ -193,6 +193,56 @@ int match_hex(substring_t *s, int *result)
193} 193}
194 194
195/** 195/**
196 * match_wildcard: - parse if a string matches given wildcard pattern
197 * @pattern: wildcard pattern
198 * @str: the string to be parsed
199 *
200 * Description: Parse the string @str to check if matches wildcard
201 * pattern @pattern. The pattern may contain two type wildcardes:
202 * '*' - matches zero or more characters
203 * '?' - matches one character
204 * If it's matched, return true, else return false.
205 */
206bool match_wildcard(const char *pattern, const char *str)
207{
208 const char *s = str;
209 const char *p = pattern;
210 bool star = false;
211
212 while (*s) {
213 switch (*p) {
214 case '?':
215 s++;
216 p++;
217 break;
218 case '*':
219 star = true;
220 str = s;
221 if (!*++p)
222 return true;
223 pattern = p;
224 break;
225 default:
226 if (*s == *p) {
227 s++;
228 p++;
229 } else {
230 if (!star)
231 return false;
232 str++;
233 s = str;
234 p = pattern;
235 }
236 break;
237 }
238 }
239
240 if (*p == '*')
241 ++p;
242 return !*p;
243}
244
245/**
196 * match_strlcpy: - Copy the characters from a substring_t to a sized buffer 246 * match_strlcpy: - Copy the characters from a substring_t to a sized buffer
197 * @dest: where to copy to 247 * @dest: where to copy to
198 * @src: &substring_t to copy 248 * @src: &substring_t to copy
@@ -235,5 +285,6 @@ EXPORT_SYMBOL(match_token);
235EXPORT_SYMBOL(match_int); 285EXPORT_SYMBOL(match_int);
236EXPORT_SYMBOL(match_octal); 286EXPORT_SYMBOL(match_octal);
237EXPORT_SYMBOL(match_hex); 287EXPORT_SYMBOL(match_hex);
288EXPORT_SYMBOL(match_wildcard);
238EXPORT_SYMBOL(match_strlcpy); 289EXPORT_SYMBOL(match_strlcpy);
239EXPORT_SYMBOL(match_strdup); 290EXPORT_SYMBOL(match_strdup);