From 0bfe054e0e93cf0c0a19f63eb2cfb6b4afd88ef7 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Fri, 3 Jul 2015 15:52:18 -0400 Subject: Initial commit of the regex matcher MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wrap glibc’s regex engine to allow matching and group capture in POSIX extended regular expressions. It might be worth rewriting this in terms of the C++11 regex engine; it’s more featureful and more pleasant to use, although it would require more casting. (C can’t represent the std::regex type, so I’d need to use some void pointers.) --- src/regex__FFI.h | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/regex__FFI.h (limited to 'src/regex__FFI.h') diff --git a/src/regex__FFI.h b/src/regex__FFI.h new file mode 100644 index 0000000..ff2f13d --- /dev/null +++ b/src/regex__FFI.h @@ -0,0 +1,60 @@ +/* Copyright (C) 2015 the Massachusetts Institute of Technology + +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. */ + +#ifndef URWEB_REGEX__FFI_H +#define URWEB_REGEX__FFI_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include +#include + +typedef struct { + char* text; + regex_t* compiled; +} uw_Regex__FFI_regex; + +typedef struct { + char* haystack; + int succeeded; + unsigned n_matches; + regmatch_t* matches; +} uw_Regex__FFI_match; + +uw_Basis_bool uw_Regex__FFI_succeeded(struct uw_context*, + const uw_Regex__FFI_match); + +uw_Basis_int uw_Regex__FFI_n_subexpression_matches(struct uw_context*, + const uw_Regex__FFI_match); + +uw_Basis_string uw_Regex__FFI_subexpression_match(struct uw_context*, + const uw_Regex__FFI_match, + const uw_Basis_int); + +uw_Regex__FFI_regex uw_Regex__FFI_compile(struct uw_context*, + const uw_Basis_bool, + const uw_Basis_string); + +uw_Regex__FFI_match uw_Regex__FFI_do_match(struct uw_context*, + const uw_Regex__FFI_regex, + const uw_Basis_string); + +#ifdef __cplusplus +} +#endif + +#endif // URWEB_REGEX__FFI_H -- cgit v1.2.3