From f3ba4629d01aa70f5dd0a655ac7985c68ba62530 Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Thu, 29 Nov 2012 11:32:34 +0100 Subject: [PATCH] simplify datamatcher code, use datamatcher_checkbasename also in repo_search --- src/dataiterator.h | 1 + src/repo.c | 3 ++ src/repodata.c | 86 ++++++++++++------------------------------------------ 3 files changed, 23 insertions(+), 67 deletions(-) diff --git a/src/dataiterator.h b/src/dataiterator.h index cf10fd9..6f8fd32 100644 --- a/src/dataiterator.h +++ b/src/dataiterator.h @@ -74,6 +74,7 @@ typedef struct _Datamatcher { int datamatcher_init(Datamatcher *ma, const char *match, int flags); void datamatcher_free(Datamatcher *ma); int datamatcher_match(Datamatcher *ma, const char *str); +int datamatcher_checkbasename(Datamatcher *ma, const char *str); /* diff --git a/src/repo.c b/src/repo.c index 2cc386a..c5a4a2d 100644 --- a/src/repo.c +++ b/src/repo.c @@ -844,6 +844,9 @@ repo_matchvalue(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValu if (md->matcher.match) { + if (key->name == SOLVABLE_FILELIST && key->type == REPOKEY_TYPE_DIRSTRARRAY && (md->matcher.flags & SEARCH_FILES) != 0) + if (!datamatcher_checkbasename(&md->matcher, kv->str)) + return 0; if (!repodata_stringify(md->pool, data, key, kv, md->flags)) return 0; if (!datamatcher_match(&md->matcher, kv->str)) diff --git a/src/repodata.c b/src/repodata.c index 6cdf17b..9d3bb6b 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -1064,16 +1064,11 @@ datamatcher_init(Datamatcher *ma, const char *match, int flags) if ((flags & SEARCH_FILES) != 0 && match) { /* prepare basename check */ - if ((flags & SEARCH_STRINGMASK) == SEARCH_STRING) + if ((flags & SEARCH_STRINGMASK) == SEARCH_STRING || (flags & SEARCH_STRINGMASK) == SEARCH_STRINGEND) { const char *p = strrchr(match, '/'); ma->matchdata = (void *)(p ? p + 1 : match); } - else if ((flags & SEARCH_STRINGMASK) == SEARCH_STRINGEND) - { - const char *p = strrchr(match, '/'); - ma->matchdata = (void *)(p ? p + 1 : 0); - } else if ((flags & SEARCH_STRINGMASK) == SEARCH_GLOB) { const char *p; @@ -1105,96 +1100,55 @@ datamatcher_match(Datamatcher *ma, const char *str) { case SEARCH_SUBSTRING: if (ma->flags & SEARCH_NOCASE) - { - if (!strcasestr(str, ma->match)) - return 0; - } + return strcasestr(str, ma->match) != 0; else - { - if (!strstr(str, ma->match)) - return 0; - } - break; + return strstr(str, ma->match) != 0; case SEARCH_STRING: if (ma->flags & SEARCH_NOCASE) - { - if (strcasecmp(ma->match, str)) - return 0; - } + return !strcasecmp(ma->match, str); else - { - if (strcmp(ma->match, str)) - return 0; - } - break; + return !strcmp(ma->match, str); case SEARCH_STRINGSTART: if (ma->flags & SEARCH_NOCASE) - { - if (strncasecmp(ma->match, str, strlen(ma->match))) - return 0; - } + return !strncasecmp(ma->match, str, strlen(ma->match)); else - { - if (strncmp(ma->match, str, strlen(ma->match))) - return 0; - } - break; + return !strncmp(ma->match, str, strlen(ma->match)); case SEARCH_STRINGEND: l = strlen(str) - strlen(ma->match); if (l < 0) return 0; if (ma->flags & SEARCH_NOCASE) - { - if (strcasecmp(ma->match, str + l)) - return 0; - } + return !strcasecmp(ma->match, str + l); else - { - if (strcmp(ma->match, str + l)) - return 0; - } - break; + return !strcmp(ma->match, str + l); case SEARCH_GLOB: - if (fnmatch(ma->match, str, (ma->flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0)) - return 0; - break; + return !fnmatch(ma->match, str, (ma->flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0); case SEARCH_REGEX: - if (regexec((const regex_t *)ma->matchdata, str, 0, NULL, 0)) - return 0; - break; + return !regexec((const regex_t *)ma->matchdata, str, 0, NULL, 0); default: return 0; } - return 1; } /* check if the matcher can match the provides basename */ -static int +int datamatcher_checkbasename(Datamatcher *ma, const char *basename) { int l; - const char *match = ma->match; + const char *match = ma->matchdata; + if (!match) + return 1; switch (ma->flags & SEARCH_STRINGMASK) { case SEARCH_STRING: - match = ma->matchdata; break; case SEARCH_STRINGEND: - if (ma->matchdata) - { - match = ma->matchdata; /* have slash */ - break; - } - l = strlen(basename) - strlen(match); - if (l < 0) - return 0; - basename += l; - break; + if (match != ma->match) + break; /* had slash, do exact match on basename */ + /* FALLTHROUGH */ case SEARCH_GLOB: - match = ma->matchdata; - if (!match) - return 1; + /* check if the basename ends with match */ l = strlen(basename) - strlen(match); if (l < 0) return 0; @@ -1203,8 +1157,6 @@ datamatcher_checkbasename(Datamatcher *ma, const char *basename) default: return 1; /* maybe matches */ } - if (!match) - return 1; if ((ma->flags & SEARCH_NOCASE) != 0) return !strcasecmp(match, basename); else -- 2.7.4