summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/sys/regex.h
diff options
context:
space:
mode:
Diffstat (limited to 'qpid/cpp/src/qpid/sys/regex.h')
-rw-r--r--qpid/cpp/src/qpid/sys/regex.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/qpid/cpp/src/qpid/sys/regex.h b/qpid/cpp/src/qpid/sys/regex.h
new file mode 100644
index 0000000000..77de6a7f5c
--- /dev/null
+++ b/qpid/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.
+ *
+ */
+
+#if defined(_POSIX_SOURCE) || defined(__unix__)
+# 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 {
+
+#if defined(_POSIX_SOURCE) || defined(__unix__)
+
+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);
+};
+
+inline 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