From 499e09734bc6f4a121b3363d88aeb085bcfd9ce9 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Sun, 28 Aug 2011 23:29:53 -0500 Subject: 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 --- lib/libalpm/deps.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) (limited to 'lib') 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; -- cgit v1.2.3