Mercurial > hg > octave-nkf
diff liboctave/regex-match.cc @ 7779:791231dac333
Add regexp matching to Fwho and Fclear
author | David Bateman <dbateman@free.fr> |
---|---|
date | Sun, 18 May 2008 22:14:45 +0200 |
parents | |
children | d3a7882fa0b3 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/liboctave/regex-match.cc @@ -0,0 +1,153 @@ +/* + +Copyright (C) 2008 David Bateman + +This file is part of Octave. + +Octave 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 3 of the License, or (at your +option) any later version. + +Octave 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 Octave; see the file COPYING. If not, see +<http://www.gnu.org/licenses/>. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <vector> +#include <iostream> +#include <string> + +#include "regex-match.h" +#include "str-vec.h" + +regex_match& +regex_match::operator = (const regex_match& gm) +{ + if (this != &gm) + { +#if HAVE_REGEX + for (int i = 0; i < pat.length (); i++) + regfree (compiled +i); + delete [] compiled; +#endif + pat = gm.pat; + case_insen = gm.case_insen; + init (); + } + return *this; +} + +regex_match::~regex_match (void) +{ +#if HAVE_REGEX + for (int i = 0; i < pat.length (); i++) + regfree (compiled +i); + delete [] compiled; +#endif +} + + +void +regex_match::set_pattern (const std::string& p) +{ +#if HAVE_REGEX + for (int i = 0; i < pat.length (); i++) + regfree (compiled +i); + delete [] compiled; +#endif + pat = p; + init (); +} + +void +regex_match::set_pattern (const string_vector& p) +{ +#if HAVE_REGEX + for (int i = 0; i < pat.length (); i++) + regfree (compiled +i); + delete [] compiled; +#endif + pat = p; + init (); +} + +void +regex_match::init (void) +{ +#ifdef HAVE_REGEX + int npat = pat.length (); + int err; + int i; + + compiled = new regex_t [npat]; + + for (i = 0; i < npat; i++) + if (err = regcomp (compiled + i, pat(i).c_str (), + (REG_NOSUB | REG_EXTENDED | + (case_insen ? REG_ICASE : 0)))) + break; + + if (err) + { + int len = regerror(err, compiled + i, 0, 0); + OCTAVE_LOCAL_BUFFER (char, errmsg, len); + regerror(err, compiled + i, errmsg, len); + (*current_liboctave_error_handler) ("%s in pattern (%s)", errmsg, + pat(i).c_str()); + + for (int j = 0; j < i + 1; j++) + regfree(compiled + j); + } +#else + (*current_liboctave_error_handler) + ("regex not available in this version of Octave"); +#endif +} + +bool +regex_match::match (const std::string& s) +{ +#if HAVE_REGEX + int npat = pat.length (); + + const char *str = s.c_str (); + + for (int i = 0; i < npat; i++) + if (regexec(compiled + i, str, 0, 0, 0) == 0) + return true; +#endif + + return false; +} + +Array<bool> +regex_match::match (const string_vector& s) +{ + int n = s.length (); + + Array<bool> retval (n); + + for (int i = 0; i < n; i++) + retval(i) = match (s[i]); + + return retval; +} + + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; End: *** +*/ +