From: Michael Matz Date: Wed, 9 Apr 2008 09:03:34 +0000 (+0000) Subject: Make dataiterator_match available. X-Git-Tag: BASE-SuSE-Code-12_1-Branch~308^2~428 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=543f15768dc31ce2efa82f78f45dfe7e49973c0c;p=thirdparty%2Flibsolv.git Make dataiterator_match available. --- diff --git a/src/repo.h b/src/repo.h index 964652b2..ef460024 100644 --- a/src/repo.h +++ b/src/repo.h @@ -198,6 +198,7 @@ typedef struct _Dataiterator void dataiterator_init(Dataiterator *di, Repo *repo, Id p, Id keyname, const char *match, int flags); int dataiterator_step(Dataiterator *di); +int dataiterator_match(Dataiterator *di, int flags, const void *match); void dataiterator_skip_attribute(Dataiterator *di); void dataiterator_skip_solvable(Dataiterator *di); void dataiterator_skip_repo(Dataiterator *di); diff --git a/src/repodata.c b/src/repodata.c index 60fdee53..ec819f03 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -678,10 +678,10 @@ dataiterator_init(Dataiterator *di, Repo *repo, Id p, Id keyname, /* FIXME factor and merge with repo_matchvalue */ static int -dataiterator_match(Dataiterator *di, KeyValue *kv) +dataiterator_match_int_real(Dataiterator *di, int flags, const void *vmatch) { - int flags = di->flags; - + KeyValue *kv = &di->kv; + const char *match = vmatch; if ((flags & SEARCH_STRINGMASK) != 0) { switch (di->key->type) @@ -703,34 +703,34 @@ dataiterator_match(Dataiterator *di, KeyValue *kv) case SEARCH_SUBSTRING: if (flags & SEARCH_NOCASE) { - if (!strcasestr(kv->str, di->match)) + if (!strcasestr(kv->str, match)) return 0; } else { - if (!strstr(kv->str, di->match)) + if (!strstr(kv->str, match)) return 0; } break; case SEARCH_STRING: if (flags & SEARCH_NOCASE) { - if (strcasecmp(di->match, kv->str)) + if (strcasecmp(match, kv->str)) return 0; } else { - if (strcmp(di->match, kv->str)) + if (strcmp(match, kv->str)) return 0; } break; case SEARCH_GLOB: - if (fnmatch(di->match, kv->str, (flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0)) + if (fnmatch(match, kv->str, (flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0)) return 0; break; #if 0 case SEARCH_REGEX: - if (regexec(&di->regexp, kv->str, 0, NULL, 0)) + if (regexec((const regex_t *)vmatch, kv->str, 0, NULL, 0)) return 0; #endif default: @@ -740,6 +740,18 @@ dataiterator_match(Dataiterator *di, KeyValue *kv) return 1; } +static int +dataiterator_match_int(Dataiterator *di) +{ + return dataiterator_match_int_real(di, di->flags, di->match); +} + +int +dataiterator_match(Dataiterator *di, int flags, const void *vmatch) +{ + return dataiterator_match_int_real(di, flags, vmatch); +} + static Repokey solvablekeys[RPM_RPMDBID - SOLVABLE_NAME + 1] = { { SOLVABLE_NAME, REPOKEY_TYPE_ID, 0, KEY_STORAGE_SOLVABLE }, { SOLVABLE_ARCH, REPOKEY_TYPE_ID, 0, KEY_STORAGE_SOLVABLE }, @@ -947,7 +959,7 @@ skiprepo:; } weg2: if (!di->match - || dataiterator_match(di, &di->kv)) + || dataiterator_match_int(di)) break; } return 1;