From 8ff8b027828b1201b18af6dd2e37b1d72b45d0f3 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 16 Jun 2021 15:48:09 +0200 Subject: [PATCH] hardlink: small regex stuff refactoring Signed-off-by: Karel Zak --- misc-utils/hardlink.c | 70 +++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/misc-utils/hardlink.c b/misc-utils/hardlink.c index 8918b326a..5d4f2e799 100644 --- a/misc-utils/hardlink.c +++ b/misc-utils/hardlink.c @@ -118,6 +118,13 @@ static struct statistics { struct timeval start_time; } stats; + +struct hdl_regex { + regex_t re; /* POSIX compatible regex handler */ + + struct hdl_regex *next; +}; + /** * struct options - Processed command-line options * @include: A linked list of regular expressions for the --include option @@ -135,10 +142,8 @@ static struct statistics { * @min_size: Minimum size of files to consider. (default = 1 byte) */ static struct options { - struct regex_link { - regex_t preg; - struct regex_link *next; - } *include, *exclude; + struct hdl_regex *include; + struct hdl_regex *exclude; signed int verbosity; unsigned int respect_mode:1; @@ -207,17 +212,41 @@ static void jlog(enum log_level level, const char *format, ...) #define CMP(a, b) ((a) > (b) ? 1 : ((a) < (b) ? -1 : 0)) /** - * regexec_any - Match against multiple regular expressions + * register_regex - Compile and insert a regular expression into list + * @pregs: Pointer to a linked list of regular expressions + * @regex: String containing the regular expression to be compiled + */ +static void register_regex(struct hdl_regex **pregs, const char *regex) +{ + struct hdl_regex *link; + int err; + + link = xmalloc(sizeof(*link)); + + if ((err = regcomp(&link->re, regex, REG_NOSUB | REG_EXTENDED)) != 0) { + size_t size = regerror(err, &link->re, NULL, 0); + char *buf = xmalloc(size + 1); + + regerror(err, &link->re, buf, size); + + errx(EXIT_FAILURE, _("could not compile regular expression %s: %s"), + regex, buf); + } + link->next = *pregs; *pregs = link; +} + +/** + * match_any_regex - Match against multiple regular expressions * @pregs: A linked list of regular expressions * @what: The string to match against * * Checks whether any of the regular expressions in the list matches the * string. */ -static int regexec_any(struct regex_link *pregs, const char *what) +static int match_any_regex(struct hdl_regex *pregs, const char *what) { for (; pregs != NULL; pregs = pregs->next) { - if (regexec(&pregs->preg, what, 0, NULL, 0) == 0) + if (regexec(&pregs->re, what, 0, NULL, 0) == 0) return TRUE; } return FALSE; @@ -744,8 +773,8 @@ static int inserter(const char *fpath, const struct stat *sb, if (typeflag != FTW_F || !S_ISREG(sb->st_mode)) return 0; - included = regexec_any(opts.include, fpath); - excluded = regexec_any(opts.exclude, fpath); + included = match_any_regex(opts.include, fpath); + excluded = match_any_regex(opts.exclude, fpath); if ((opts.exclude && excluded && !included) || (!opts.exclude && opts.include && !included)) @@ -906,29 +935,6 @@ static void __attribute__((__noreturn__)) usage(void) exit(EXIT_SUCCESS); } -/** - * register_regex - Compile and insert a regular expression into list - * @pregs: Pointer to a linked list of regular expressions - * @regex: String containing the regular expression to be compiled - */ -static void register_regex(struct regex_link **pregs, const char *regex) -{ - struct regex_link *link; - int err; - - link = xmalloc(sizeof(*link)); - - if ((err = regcomp(&link->preg, regex, REG_NOSUB | REG_EXTENDED)) != 0) { - size_t size = regerror(err, &link->preg, NULL, 0); - char *buf = xmalloc(size + 1); - - regerror(err, &link->preg, buf, size); - - errx(EXIT_FAILURE, _("could not compile regular expression %s: %s"), - regex, buf); - } - link->next = *pregs; *pregs = link; -} /** * parse_options - Parse the command line options