summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2013-03-14 17:24:28 +0000
committerAndrew Stitcher <astitcher@apache.org>2013-03-14 17:24:28 +0000
commitdb00c352f1ea3a7668a44aa3059e10d50025bef2 (patch)
tree2ae8d3d08e951238971c28f7b22a81ddcb46bd2d /cpp/src/qpid/sys
parentac6f378f909ef36d7e7a59d331025ceb40c005b9 (diff)
downloadqpid-python-db00c352f1ea3a7668a44aa3059e10d50025bef2.tar.gz
QPID-4622: Implement 'LIKE' string matching operations in selector
- This implements <expression> [NOT] LIKE <string> [ESCAPE <character>] - The implementation uses the posix regex library (in BRE mode) on Unix systems - It uses std::tr1::regex on Visual Studio (in std::tr1::regex::basic mode) git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1456561 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys')
-rw-r--r--cpp/src/qpid/sys/regex.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/cpp/src/qpid/sys/regex.h b/cpp/src/qpid/sys/regex.h
new file mode 100644
index 0000000000..2c5206112a
--- /dev/null
+++ b/cpp/src/qpid/sys/regex.h
@@ -0,0 +1,81 @@
+#ifndef QPID_SYS_REGEX_H
+#define QPID_SYS_REGEX_H
+
+/*
+ *
+ * Copyright (c) 2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifdef _POSIX_SOURCE
+# include <stdexcept>
+# include <string>
+# include <regex.h>
+#elif defined(_MSC_VER)
+# include <regex>
+#else
+#error "No known regex implementation"
+#endif
+
+// This is a very simple wrapper for Basic Regular Expression facilities either
+// provided by POSIX or C++ tr1
+//
+// Matching expressions are not supported and so the only useful operation is
+// a simple boolean match indicator.
+
+namespace qpid {
+namespace sys {
+
+#ifdef _POSIX_SOURCE
+
+class regex {
+ ::regex_t re;
+
+public:
+ regex(const std::string& s) {
+ int rc = ::regcomp(&re, s.c_str(), REG_NOSUB);
+ if (rc != 0) throw std::logic_error("Regular expression compilation error");
+ }
+
+ ~regex() {
+ ::regfree(&re);
+ }
+
+ friend bool regex_match(const std::string& s, const regex& re);
+};
+
+bool regex_match(const std::string& s, const regex& re) {
+ return ::regexec(&(re.re), s.c_str(), 0, 0, 0)==0;
+}
+
+#elif defined(_MSC_VER)
+
+class regex : public std::tr1::regex {
+public:
+ regex(const std::string& s) :
+ std::tr1::regex(s, std::tr1::regex::basic)
+ {}
+};
+
+using std::tr1::regex_match;
+
+#else
+#error "No known regex implementation"
+#endif
+
+}}
+
+
+#endif