//
// HtRegex.cc
//
// HtRegex: A simple C++ wrapper class for the system regex routines.
//
// Part of the ht://Dig package
// Copyright (c) 1999-2004 The ht://Dig Group
// For copyright details, see the file COPYING in your distribution
// or the GNU Library General Public License (LGPL) version 2 or later
//
//
// $Id: HtRegex.cc,v 1.13 2004/05/28 13:15:21 lha Exp $
//
#ifdef HAVE_CONFIG_H
#include "htconfig.h"
#endif /* HAVE_CONFIG_H */
#include "HtRegex.h"
#include
HtRegex::HtRegex() : compiled(0) { }
HtRegex::HtRegex(const char *str, int case_sensitive) : compiled(0)
{
set(str, case_sensitive);
}
HtRegex::~HtRegex()
{
if (compiled != 0) regfree(&re);
compiled = 0;
}
const String &HtRegex::lastError()
{
return lastErrorMessage;
}
int
HtRegex::set(const char * str, int case_sensitive)
{
if (compiled != 0) regfree(&re);
int err;
compiled = 0;
if (str == NULL) return 0;
if (strlen(str) <= 0) return 0;
if (err = regcomp(&re, str, case_sensitive ? REG_EXTENDED : (REG_EXTENDED|REG_ICASE)), err == 0)
{
compiled = 1;
}
else
{
size_t len = regerror(err, &re, 0, 0);
char *buf = new char[len];
regerror(err, &re, buf, len);
lastErrorMessage = buf;
delete buf;
}
return compiled;
}
int
HtRegex::setEscaped(StringList &list, int case_sensitive)
{
String *str;
String transformedLimits;
list.Start_Get();
while ((str = (String *) list.Get_Next()))
{
if (str->indexOf('[') == 0 && str->lastIndexOf(']') == str->length()-1)
{
transformedLimits << str->sub(1,str->length()-2).get();
}
else // Backquote any regex special characters
{
for (int pos = 0; pos < str->length(); pos++)
{
if (strchr("^.[$()|*+?{\\", str->Nth(pos)))
transformedLimits << '\\';
transformedLimits << str->Nth(pos);
}
}
transformedLimits << "|";
}
transformedLimits.chop(1);
return set(transformedLimits, case_sensitive);
}
int
HtRegex::match(const char * str, int nullpattern, int nullstr)
{
int rval;
if (compiled == 0) return(nullpattern);
if (str == NULL) return(nullstr);
if (strlen(str) <= 0) return(nullstr);
rval = regexec(&re, str, (size_t) 0, NULL, 0);
if (rval == 0) return(1);
else return(0);
}