Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=7c63019df188ca8acf43ba905aeee796d44f2946

commit 7c63019df188ca8acf43ba905aeee796d44f2946
Author: Michel Hermier <[email protected]>
Date:   Thu Nov 7 21:28:17 2013 +0100

libpacman: Vectorise regexp matching in _pacman_db_search with a 
_pacman_reg_match_or_substring.

diff --git a/lib/libpacman/db.c b/lib/libpacman/db.c
index 16a5a0f..dc13d9d 100644
--- a/lib/libpacman/db.c
+++ b/lib/libpacman/db.c
@@ -89,71 +89,58 @@ int _pacman_db_cmp(const void *db1, const void *db2)
return(strcmp(((pmdb_t *)db1)->treename, ((pmdb_t *)db2)->treename));
}

+static
+int _pacman_reg_match_or_substring(const char *string, const char *pattern)
+{
+       int retval = _pacman_reg_match(string, pattern);
+
+       if(retval < 0) {
+               /* bad regexp */
+               return -1;
+       } else if(retval) {
+               return 1;
+       } else if (strstr(string, pattern) != NULL) {
+               return 1;
+       }
+       return 0;
+}
+
pmlist_t *_pacman_db_search(pmdb_t *db, pmlist_t *needles)
{
pmlist_t *i, *j, *k, *ret = NULL;

for(i = needles; i; i = i->next) {
-               char *targ;
-               int retval;
+               const char *targ;

if(i->data == NULL) {
continue;
}
-               targ = strdup(i->data);
+               targ = i->data;
_pacman_log(PM_LOG_DEBUG, "searching for target '%s'\n", targ);

for(j = _pacman_db_get_pkgcache(db); j; j = j->next) {
pmpkg_t *pkg = j->data;
-                       char *haystack, *ptr;
int match = 0;

/* check name */
-                       haystack = strdup(pkg->name);
-                       retval = _pacman_reg_match(haystack, targ);
-                       if(retval < 0) {
-                               /* bad regexp */
-                               FREE(haystack);
-                               return(NULL);
-                       } else if(retval) {
-                               _pacman_log(PM_LOG_DEBUG, "    search target 
'%s' matched '%s'", targ, haystack);
-                               match = 1;
-                       } else if (!match && (ptr = strstr(haystack, targ))) {
+                       if(_pacman_reg_match_or_substring(pkg->name, targ) == 
1) {
+                               _pacman_log(PM_LOG_DEBUG, "    search target 
'%s' matched '%s'", targ, pkg->name);
match = 1;
}
-                       FREE(haystack);

/* check description */
if(!match) {
-                               haystack = strdup(_pacman_pkg_getinfo(pkg, 
PM_PKG_DESC));
-                               retval = _pacman_reg_match(haystack, targ);
-                               if(retval < 0) {
-                                       /* bad regexp */
-                                       FREE(haystack);
-                                       return(NULL);
-                               } else if(retval) {
-                                       match = 1;
-                               } else if (!match && (ptr = strstr(haystack, 
targ))) {
+                               
if(_pacman_reg_match_or_substring(_pacman_pkg_getinfo(pkg, PM_PKG_DESC), targ) 
== 1) {
match = 1;
}
-                               FREE(haystack);
}

/* check provides */
if(!match) {
for(k = _pacman_pkg_getinfo(pkg, PM_PKG_PROVIDES); k; k = k->next) {
-                                       haystack = strdup(k->data);
-                                       retval = _pacman_reg_match(haystack, 
targ);
-                                       if(retval < 0) {
-                                               /* bad regexp */
-                                               FREE(haystack);
-                                               return(NULL);
-                                       } else if(retval) {
-                                               match = 1;
-                                       } else if (!match && (ptr = 
strstr(haystack, targ))) {
+                                       
if(_pacman_reg_match_or_substring(k->data, targ) == 1) {
match = 1;
}
-                                       FREE(haystack);
}
}

@@ -161,8 +148,6 @@ pmlist_t *_pacman_db_search(pmdb_t *db, pmlist_t *needles)
ret = _pacman_list_add(ret, pkg);
}
}
-
-               FREE(targ);
}

return(ret);
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to