/* * Copyright (c) 2010-2012 Zmanda, Inc. All Rights Reserved. * Copyright (c) 2013-2016 Carbonite, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Contact information: Carbonite Inc., 756 N Pastoria Ave * Sunnyvale, CA 94085, or: http://www.zmanda.com */ #ifndef MATCH_H #define MATCH_H #include #include /* * Regular expressions */ /* The regular expressions used here are POSIX extended regular expressions; * see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html */ /* validate that REGEX is a valid POSIX regular expression by calling regcomp. * Returns a statically allocated error message on failure or NULL on success. */ char * validate_regexp(const char *regex); /* * Match the string "str" against POSIX regex "regex" with regexec(), with * REG_NEWLINE set (match_newline == TRUE) or not. * * REG_NEWLINE means two things: * - the dot won't match a newline; * - ^ and $ will match around \n in the input string (as well as the beginning * and end of the input). */ int do_match(const char *regex, const char *str, gboolean match_newline); #define match(regex, str) do_match(regex, str, TRUE) #define match_no_newline(regex, str) do_match(regex, str, FALSE) /* * Cleanup a regular expression by escaping all non alphanumeric characters, and * append beginning/end anchors if need be. Returns a dynamically allocated * string. It is the caller's responsibility to g_free() that string. * * @param str: the regular expression string * @param anchor: if true, the regex will be anchored at the beginning/end * (resp. with ^ and $) * @returns: the resulting regex */ char *clean_regex(const char *str, gboolean anchor); /* * Globs */ /* * A "glob expression" is similar to shell globs; it supports metacharacters * "*" and "?", as well as character classes like "[...]" and "[!...]" * (negated). The "*" and "?" do not match filename separators ("/"). The * entire expression is anchored, so it must match the string, not just a single * filename component. */ /* Validate that GLOB is a legal GLOB expression. Returns a statically * allocated error message on failure, or NULL on success. */ char * validate_glob(const char *glob); /* Convert a GLOB expression into a dynamically allocated regular expression */ char * glob_to_regex(const char *glob); /* Like match(), but with a glob expression */ int match_glob(const char *glob, const char *str); /* * Tar Patterns */ /* A "tar expression" is almost the same as a glob, except that "*" can match a * filename separator ("?" cannot). It is used by calcsize to emulate tar's exclude * list patterns, which are actually significantly more complicated than this. */ /* Like match(), but with a tar expression */ int match_tar(const char *glob, const char *str); /* * Host expressions */ /* Host expressions are described in amanda(8). */ /* Make an Amanda host expression that will match the given string exactly. * There is a little bit of fuzz here involving leading and trailing "." * chararacters, (so "host.org", "host.org.", and ".host.org" will all match * the same expressions) but DNS considers them equivalent, too. */ char * make_exact_host_expression(const char *host); /* Like match(), but using a host expression */ int match_host(const char *glob, const char *host); /* * Disk expressions */ /* Disk expressions are described in amanda(8) */ /* Make an Amanda disk expression that will match the given string exactly. */ char * make_exact_disk_expression(const char *disk); /* Like match(), but using a disk expression */ int match_disk(const char *glob, const char *disk); /* * Datestamp expressions */ /* Datestamp expressions are described in amanda(8) */ int match_datestamp(const char *dateexp, const char *datestamp); /* * Level expressions */ /* Level expressions are either prefix matches e.g., "1", which matches "1", "10", and "123", * absolute matches e.g., "3$" which only matches "3", or a range e.g., "3-5" which only * matches levels 3, 4, and 5. */ /* Like match(), but using a level expression */ int match_level(const char *levelexp, const char *level); /* * labelstr expressions */ int match_labelstr_template(const char *template, const char *label, const char *barcode, const char *meta, const char *storage); int match_labelstr(const labelstr_s *labelstr, const autolabel_t *autolabel, const char *label, const char *barcode, const char *meta, const char *storage); #endif /* MATCH_H */