/** @file
    $Id$
    $Date$
    $Author$
    @copy © Marc Wäckerlin
    @license LGPL, see file COPYING
    $Log$
    Revision 1.2  2004/12/16 13:09:31  marc
    possibility to evaluate and extract sub expressions
    Revision 1.1  2004/12/14 20:20:30  marc
    initial version
*/
#include 
#include 
#include 
namespace mrw {
  RegExp::RegExp(const std::string& pattern, bool hassub, int flags)
    throw(std::exception):
    _hassub(hassub) {
      if (flags&nosub) throw mrw::invalid_argument("nosub");
      if (regcomp(&_regex, pattern.c_str(), (_hassub?flags:(flags|nosub))))
        throw mrw::invalid_argument(pattern);
  }
  RegExp::~RegExp() throw() {
    regfree(&_regex);
  }
  bool RegExp::operator()(const std::string& text) throw(std::bad_exception) {
    if (_hassub)
      return !regexec(&_regex, (_text=text).c_str(), MAX_SUB, _sub, 0);
    else
      return !regexec(&_regex, text.c_str(), 0, 0, 0);
  }
  std::string RegExp::operator[](unsigned int n) const throw(std::exception) {
    if (!_hassub)
      throw mrw::invalid_argument("initialized with no sub expressions");
    if (n>=MAX_SUB || _sub[n].rm_so<0 || _sub[n].rm_eo<0)
      throw mrw::invalid_argument(mrw::string(n));
    return _text.substr(_sub[n].rm_so, _sub[n].rm_eo-_sub[n].rm_so);
  }
}