lkml.org 
[lkml]   [2010]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH -tip 7/8] perf tools: Enhance glob string matching
    Date
    Enhance strglobmatch() for supporting character classes([CHARS],
    complementation and ranges are also supported) and escaped special
    characters (\*, \? etc).

    Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Mike Galbraith <efault@gmx.de>
    ---

    tools/perf/util/string.c | 65 +++++++++++++++++++++++++++++++++++++++++++---
    1 files changed, 61 insertions(+), 4 deletions(-)

    diff --git a/tools/perf/util/string.c b/tools/perf/util/string.c
    index 5352d7d..c397d4f 100644
    --- a/tools/perf/util/string.c
    +++ b/tools/perf/util/string.c
    @@ -227,16 +227,73 @@ fail:
    return NULL;
    }

    -/* Glob expression pattern matching */
    +/* Character class matching */
    +static bool __match_charclass(const char *pat, char c, const char **npat)
    +{
    + bool complement = false, ret = true;
    +
    + if (*pat == '!') {
    + complement = true;
    + pat++;
    + }
    + if (*pat++ == c) /* First character is special */
    + goto end;
    +
    + while (*pat && *pat != ']') { /* Matching */
    + if (*pat == '-' && *(pat + 1) != ']') { /* Range */
    + if (*(pat - 1) <= c && c <= *(pat + 1))
    + goto end;
    + if (*(pat - 1) > *(pat + 1))
    + goto error;
    + pat += 2;
    + } else if (*pat++ == c)
    + goto end;
    + }
    + if (!*pat)
    + goto error;
    + ret = false;
    +
    +end:
    + while (*pat && *pat != ']') /* Searching closing */
    + pat++;
    + if (!*pat)
    + goto error;
    + *npat = pat + 1;
    + return complement ? !ret : ret;
    +
    +error:
    + return false;
    +}
    +
    +/**
    + * strglobmatch - glob expression pattern matching
    + * @str: the target string to match
    + * @pat: the pattern string to match
    + *
    + * This returns true if the @str matches @pat. @pat can includes wildcards
    + * ('*','?') and character classes ([CHARS], complementation and ranges are
    + * also supported). Also, this supports escape character ('\') to use special
    + * characters as normal character.
    + *
    + * Note: if @pat syntax is broken, this always returns false.
    + */
    bool strglobmatch(const char *str, const char *pat)
    {
    while (*str && *pat && *pat != '*') {
    - if (*pat == '?') {
    + if (*pat == '?') { /* Matches any single character */
    str++;
    pat++;
    - } else
    - if (*str++ != *pat++)
    + continue;
    + } else if (*pat == '[') /* Character classes/Ranges */
    + if (__match_charclass(pat + 1, *str, &pat)) {
    + str++;
    + continue;
    + } else
    return false;
    + else if (*pat == '\\') /* Escaped char match as normal char */
    + pat++;
    + if (*str++ != *pat++)
    + return false;
    }
    /* Check wild card */
    if (*pat == '*') {

    --
    Masami Hiramatsu

    Software Engineer
    Hitachi Computer Products (America), Inc.
    Software Solutions Division

    e-mail: mhiramat@redhat.com


    \
     
     \ /
      Last update: 2010-01-05 23:45    [W:0.025 / U:61.624 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site