Simply tries to match the provided regex on a string and returns
the result. Useful if caller don't care about the matched substring
and want to just test if some pattern patches a string.
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
---
changes in v2:
- virStringMatch returns bool instead of int
src/libvirt_private.syms | 1 +
src/util/virstring.c | 33 +++++++++++++++++++++++++++++++++
src/util/virstring.h | 3 +++
tests/virstringtest.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 84 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index afb9100c50..d32c6e7549 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2621,6 +2621,7 @@ virStringListHasString;
virStringListJoin;
virStringListLength;
virStringListRemove;
+virStringMatch;
virStringReplace;
virStringSearch;
virStringSortCompare;
diff --git a/src/util/virstring.c b/src/util/virstring.c
index 335e773d78..c8d6b0ca02 100644
--- a/src/util/virstring.c
+++ b/src/util/virstring.c
@@ -979,6 +979,39 @@ virStringSearch(const char *str,
}
/**
+ * virStringMatch:
+ * @str: string to match
+ * @regexp: POSIX Extended regular expression pattern used for matching
+ *
+ * Performs a POSIX extended regex match against a string.
+ * Returns true on match, false on error or no match.
+ */
+bool
+virStringMatch(const char *str,
+ const char *regexp)
+{
+ regex_t re;
+ int rv;
+
+ VIR_DEBUG("match '%s' for '%s'", str, regexp);
+
+ if ((rv = regcomp(&re, regexp, REG_EXTENDED | REG_NOSUB)) != 0) {
+ char error[100];
+ regerror(rv, &re, error, sizeof(error));
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("error while compiling regular expression '%s': %s"),
+ regexp, error);
+ return false;
+ }
+
+ rv = regexec(&re, str, 0, NULL, 0);
+
+ regfree(&re);
+
+ return rv == 0;
+}
+
+/**
* virStringReplace:
* @haystack: the source string to process
* @oldneedle: the substring to locate
diff --git a/src/util/virstring.h b/src/util/virstring.h
index c545ca3f0d..0038a405b1 100644
--- a/src/util/virstring.h
+++ b/src/util/virstring.h
@@ -274,6 +274,9 @@ ssize_t virStringSearch(const char *str,
char ***matches)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4);
+bool virStringMatch(const char *str,
+ const char *regexp);
+
char *virStringReplace(const char *haystack,
const char *oldneedle,
const char *newneedle)
diff --git a/tests/virstringtest.c b/tests/virstringtest.c
index 96bc79f832..97c6e76dcb 100644
--- a/tests/virstringtest.c
+++ b/tests/virstringtest.c
@@ -480,6 +480,38 @@ testStringSearch(const void *opaque)
}
+struct stringMatchData {
+ const char *str;
+ const char *regexp;
+ bool expectMatch;
+};
+
+static int
+testStringMatch(const void *opaque)
+{
+ const struct stringMatchData *data = opaque;
+ bool match;
+
+ match = virStringMatch(data->str, data->regexp);
+
+ if (data->expectMatch) {
+ if (!match) {
+ fprintf(stderr, "expected match for '%s' on '%s' but got no match\n",
+ data->regexp, data->str);
+ return -1;
+ }
+ } else {
+ if (match) {
+ fprintf(stderr, "expected no match for '%s' on '%s' but got match\n",
+ data->regexp, data->str);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
struct stringReplaceData {
const char *haystack;
const char *oldneedle;
@@ -803,6 +835,21 @@ mymain(void)
const char *matches3[] = { "foo", "bar" };
TEST_SEARCH("1foo2bar3eek", "([a-z]+)", 2, 2, matches3, false);
+#define TEST_MATCH(s, r, m) \
+ do { \
+ struct stringMatchData data = { \
+ .str = s, \
+ .regexp = r, \
+ .expectMatch = m, \
+ }; \
+ if (virTestRun("virStringMatch " s, testStringMatch, &data) < 0) \
+ ret = -1; \
+ } while (0)
+
+ TEST_MATCH("foo", "foo", true);
+ TEST_MATCH("foobar", "f[o]+", true);
+ TEST_MATCH("foobar", "^f[o]+$", false);
+
#define TEST_REPLACE(h, o, n, r) \
do { \
struct stringReplaceData data = { \
--
2.13.0
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Fri, May 12, 2017 at 02:57:54PM +0200, Pavel Hrdina wrote:
>Simply tries to match the provided regex on a string and returns
>the result. Useful if caller don't care about the matched substring
>and want to just test if some pattern patches a string.
>
>Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
>---
>
>changes in v2:
> - virStringMatch returns bool instead of int
>
> src/libvirt_private.syms | 1 +
> src/util/virstring.c | 33 +++++++++++++++++++++++++++++++++
> src/util/virstring.h | 3 +++
> tests/virstringtest.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 84 insertions(+)
>
>diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
>index afb9100c50..d32c6e7549 100644
>--- a/src/libvirt_private.syms
>+++ b/src/libvirt_private.syms
>@@ -2621,6 +2621,7 @@ virStringListHasString;
> virStringListJoin;
> virStringListLength;
> virStringListRemove;
>+virStringMatch;
> virStringReplace;
> virStringSearch;
> virStringSortCompare;
>diff --git a/src/util/virstring.c b/src/util/virstring.c
>index 335e773d78..c8d6b0ca02 100644
>--- a/src/util/virstring.c
>+++ b/src/util/virstring.c
>@@ -979,6 +979,39 @@ virStringSearch(const char *str,
> }
>
> /**
>+ * virStringMatch:
>+ * @str: string to match
>+ * @regexp: POSIX Extended regular expression pattern used for matching
>+ *
>+ * Performs a POSIX extended regex match against a string.
>+ * Returns true on match, false on error or no match.
>+ */
>+bool
>+virStringMatch(const char *str,
>+ const char *regexp)
>+{
>+ regex_t re;
>+ int rv;
>+
>+ VIR_DEBUG("match '%s' for '%s'", str, regexp);
>+
>+ if ((rv = regcomp(&re, regexp, REG_EXTENDED | REG_NOSUB)) != 0) {
>+ char error[100];
>+ regerror(rv, &re, error, sizeof(error));
>+ virReportError(VIR_ERR_INTERNAL_ERROR,
>+ _("error while compiling regular expression '%s': %s"),
>+ regexp, error);
>+ return false;
Don't report the error, just return false. Or do VIR_WARN() if you
want. The conversion to bool was meant together with the fact that
lastError should not be set.
ACK with that.
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
On Fri, May 12, 2017 at 04:26:43PM +0200, Martin Kletzander wrote:
> On Fri, May 12, 2017 at 02:57:54PM +0200, Pavel Hrdina wrote:
> >Simply tries to match the provided regex on a string and returns
> >the result. Useful if caller don't care about the matched substring
> >and want to just test if some pattern patches a string.
> >
> >Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
> >---
> >
> >changes in v2:
> > - virStringMatch returns bool instead of int
> >
> > src/libvirt_private.syms | 1 +
> > src/util/virstring.c | 33 +++++++++++++++++++++++++++++++++
> > src/util/virstring.h | 3 +++
> > tests/virstringtest.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
> > 4 files changed, 84 insertions(+)
> >
> >diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> >index afb9100c50..d32c6e7549 100644
> >--- a/src/libvirt_private.syms
> >+++ b/src/libvirt_private.syms
> >@@ -2621,6 +2621,7 @@ virStringListHasString;
> > virStringListJoin;
> > virStringListLength;
> > virStringListRemove;
> >+virStringMatch;
> > virStringReplace;
> > virStringSearch;
> > virStringSortCompare;
> >diff --git a/src/util/virstring.c b/src/util/virstring.c
> >index 335e773d78..c8d6b0ca02 100644
> >--- a/src/util/virstring.c
> >+++ b/src/util/virstring.c
> >@@ -979,6 +979,39 @@ virStringSearch(const char *str,
> > }
> >
> > /**
> >+ * virStringMatch:
> >+ * @str: string to match
> >+ * @regexp: POSIX Extended regular expression pattern used for matching
> >+ *
> >+ * Performs a POSIX extended regex match against a string.
> >+ * Returns true on match, false on error or no match.
> >+ */
> >+bool
> >+virStringMatch(const char *str,
> >+ const char *regexp)
> >+{
> >+ regex_t re;
> >+ int rv;
> >+
> >+ VIR_DEBUG("match '%s' for '%s'", str, regexp);
> >+
> >+ if ((rv = regcomp(&re, regexp, REG_EXTENDED | REG_NOSUB)) != 0) {
> >+ char error[100];
> >+ regerror(rv, &re, error, sizeof(error));
> >+ virReportError(VIR_ERR_INTERNAL_ERROR,
> >+ _("error while compiling regular expression '%s': %s"),
> >+ regexp, error);
> >+ return false;
>
> Don't report the error, just return false. Or do VIR_WARN() if you
> want. The conversion to bool was meant together with the fact that
> lastError should not be set.
>
> ACK with that.
I'll go with VIR_WARN(), thanks.
Pavel
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
© 2016 - 2025 Red Hat, Inc.