commit: 54a6bc76557216d67a21673b8f0e479efae21a79 Author: Mike Frysinger <vapier <AT> gentoo <DOT> org> AuthorDate: Mon Feb 22 17:41:41 2016 +0000 Commit: Mike Frysinger <vapier <AT> gentoo <DOT> org> CommitDate: Mon Feb 22 17:41:41 2016 +0000 URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=54a6bc76
qcheck: precompile ignore regexes This should speed things up a bit. qsize.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/qsize.c b/qsize.c index 7a2503a..3a11842 100644 --- a/qsize.c +++ b/qsize.c @@ -38,7 +38,7 @@ int qsize_main(int argc, char **argv) q_vdb_ctx *ctx; q_vdb_cat_ctx *cat_ctx; q_vdb_pkg_ctx *pkg_ctx; - int i; + size_t i; char search_all = 0; struct stat st; char fs_size = 0, summary = 0, summary_only = 0; @@ -50,7 +50,7 @@ int qsize_main(int argc, char **argv) size_t buflen; char *buf; char filename[_Q_PATH_MAX], *filename_root; - queue *ignore_regexp = NULL; + DECLARE_ARRAY(ignore_regexp); while ((i = GETOPT_LONG(QSIZE, qsize, "")) != -1) { switch (i) { @@ -62,7 +62,12 @@ int qsize_main(int argc, char **argv) case 'm': disp_units = MEGABYTE; str_disp_units = "MiB"; break; case 'k': disp_units = KILOBYTE; str_disp_units = "KiB"; break; case 'b': disp_units = 1; str_disp_units = "bytes"; break; - case 'i': ignore_regexp = add_set(optarg, ignore_regexp); break; + case 'i': { + regex_t regex; + xregcomp(®ex, optarg, REG_EXTENDED|REG_NOSUB); + xarraypush(ignore_regexp, ®ex, sizeof(regex)); + break; + } } } if ((argc == optind) && !search_all) @@ -105,19 +110,18 @@ int qsize_main(int argc, char **argv) num_ignored = num_files = num_nonfiles = num_bytes = 0; while (getline(&buf, &buflen, fp) != -1) { contents_entry *e; - queue *ll; + regex_t *regex; int ok = 0; e = contents_parse_line(buf); if (!e) continue; - for (ll = ignore_regexp; ll != NULL; ll = ll->next) { - if (rematch(ll->name, e->name, REG_EXTENDED) == 0) { + array_for_each(ignore_regexp, i, regex) + if (!regexec(regex, buf, 0, NULL, 0)) { num_ignored += 1; ok = 1; } - } if (ok) continue; @@ -174,7 +178,7 @@ int qsize_main(int argc, char **argv) decimal_point, (unsigned long)(((num_all_bytes%MEGABYTE)*1000)/MEGABYTE)); } - free_sets(ignore_regexp); + xarrayfree(ignore_regexp); return EXIT_SUCCESS; }