//  This may look like C code, but it is really -*- C++ -*-

//  ------------------------------------------------------------------
//  The Goldware Library
//  Copyright (C) 1990-1999 Odinn Sorensen
//  ------------------------------------------------------------------
//  This library is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Library General Public
//  License as published by the Free Software Foundation; either
//  version 2 of the License, or (at your option) any later version.
//
//  This library 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
//  Library General Public License for more details.
//
//  You should have received a copy of the GNU Library General Public
//  License along with this program; if not, write to the Free
//  Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
//  MA 02111-1307, USA
//  ------------------------------------------------------------------
//  $Id$
//  ------------------------------------------------------------------
//  Regular expressions C++ wrapper class.
//  ------------------------------------------------------------------

#include <sys/types.h>
#include <cstddef>
#include <gregex.h>
#include <gmemdbg.h>


//  ------------------------------------------------------------------

gregex::gregex() {

  preg = NULL;
}


//  ------------------------------------------------------------------

gregex::~gregex() {

  reset();
}


//  ------------------------------------------------------------------

void gregex::reset() {

  if(preg) {
    regfree(preg);
    throw_delete(preg);
  }
}


//  ------------------------------------------------------------------

bool gregex::compile(const char* pattern, int cflags) {

  int cflgs = REG_NOSUB;
  if(cflags & extended) cflgs |= REG_EXTENDED;
  if(cflags & icase)    cflgs |= REG_ICASE;
  if(cflags & newline)  cflgs |= REG_NEWLINE;

  if(not preg) {
    preg = new regex_t;
    throw_new(preg);
  }

  return make_bool(regcomp(preg, pattern, cflgs));
}


//  ------------------------------------------------------------------

bool gregex::match(const char* str, int eflags) {

  int eflgs = 0;
  if(eflags & notbol) eflgs |= REG_NOTBOL;
  if(eflags & noteol) eflgs |= REG_NOTEOL;

  return not regexec(preg, str, 0, NULL, eflgs);
}


//  ------------------------------------------------------------------