summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan McGee <dan@archlinux.org>2011-08-29 06:29:53 +0200
committerDan McGee <dan@archlinux.org>2011-08-30 02:54:18 +0200
commit499e09734bc6f4a121b3363d88aeb085bcfd9ce9 (patch)
tree029709f8e021f17a6f9c57100af92e45b91ff87f
parentb3c0ae5205ee9615af077ff00b1a01be3aab4eb6 (diff)
downloadpacman-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.c32
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;