diff options
author | Dan McGee <dan@archlinux.org> | 2011-08-29 06:29:53 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-08-30 02:54:18 +0200 |
commit | 499e09734bc6f4a121b3363d88aeb085bcfd9ce9 (patch) | |
tree | 029709f8e021f17a6f9c57100af92e45b91ff87f | |
parent | b3c0ae5205ee9615af077ff00b1a01be3aab4eb6 (diff) | |
download | pacman-499e09734bc6f4a121b3363d88aeb085bcfd9ce9.tar.gz pacman-499e09734bc6f4a121b3363d88aeb085bcfd9ce9.tar.xz |
Streamline alpm_splitdep() comparisons
This reduces from 5 to 3 the number of searches needed on the string
looking for a comparison operator, since we can so a second quick
comparison looking for '=' if we find '<' or '>'. It also makes every
search doable with strchr() or memchr() rather than the slower strstr()
method.
In testing, only 10% of splitdep calls (~1600 / 16000) during an -Ss
database load found a version comparison operator, so optimizing the not
found path to be require less work makes sense.
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | lib/libalpm/deps.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c index e268157a..639f14ba 100644 --- a/lib/libalpm/deps.c +++ b/lib/libalpm/deps.c @@ -410,31 +410,37 @@ alpm_depend_t *_alpm_splitdep(const char *depstring) { alpm_depend_t *depend; const char *ptr, *version = NULL; + size_t deplen; if(depstring == NULL) { return NULL; } CALLOC(depend, 1, sizeof(alpm_depend_t), return NULL); + deplen = strlen(depstring); /* Find a version comparator if one exists. If it does, set the type and * increment the ptr accordingly so we can copy the right strings. */ - if((ptr = strstr(depstring, ">="))) { - depend->mod = ALPM_DEP_MOD_GE; - version = ptr + 2; - } else if((ptr = strstr(depstring, "<="))) { - depend->mod = ALPM_DEP_MOD_LE; - version = ptr + 2; - } else if((ptr = strstr(depstring, "="))) { + if((ptr = memchr(depstring, '<', deplen))) { + if(ptr[1] == '=') { + depend->mod = ALPM_DEP_MOD_LE; + version = ptr + 2; + } else { + depend->mod = ALPM_DEP_MOD_LT; + version = ptr + 1; + } + } else if((ptr = memchr(depstring, '>', deplen))) { + if(ptr[1] == '=') { + depend->mod = ALPM_DEP_MOD_GE; + version = ptr + 2; + } else { + depend->mod = ALPM_DEP_MOD_GT; + version = ptr + 1; + } + } else if((ptr = memchr(depstring, '=', deplen))) { /* Note: we must do =,<,> checks after <=, >= checks */ depend->mod = ALPM_DEP_MOD_EQ; version = ptr + 1; - } else if((ptr = strstr(depstring, "<"))) { - depend->mod = ALPM_DEP_MOD_LT; - version = ptr + 1; - } else if((ptr = strstr(depstring, ">"))) { - depend->mod = ALPM_DEP_MOD_GT; - version = ptr + 1; } else { /* no version specified, leave version and ptr NULL */ depend->mod = ALPM_DEP_MOD_ANY; |