//
// HtRegexList.cc
//
// HtRegex: A list of HtRegex objects for handling large regex patterns
//
// 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: HtRegexList.cc,v 1.5 2004/05/28 13:15:21 lha Exp $
//
#ifdef HAVE_CONFIG_H
#include "htconfig.h"
#endif /* HAVE_CONFIG_H */
#include "HtRegexList.h"
#include
class listnode
{
public:
listnode *next;
Object *object;
};
HtRegexList::HtRegexList()
{
compiled = 0;
}
HtRegexList::~HtRegexList()
{
compiled = 0;
}
const String &HtRegexList::lastError()
{
return lastErrorMessage;
}
int
HtRegexList::setEscaped(StringList &list, int case_sensitive)
{
if (list.Count() == 0)
{
compiled = false;
return true;
}
String *str;
String transformedLimits, currentPattern, prevPattern;
HtRegex *limit = new HtRegex;
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
{
transformedLimits = 0;
for (int pos = 0; pos < str->length(); pos++)
{
if (strchr("^.[$()|*+?{\\", str->Nth(pos)))
transformedLimits << '\\';
transformedLimits << str->Nth(pos);
}
}
if (!currentPattern.empty())
currentPattern << "|";
currentPattern << transformedLimits;
if (!limit->set(currentPattern.get(), case_sensitive))
{
if (prevPattern.empty()) // we haven't set anything yet!
{
lastErrorMessage = limit->lastError();
compiled = 0;
return false;
}
limit->set(prevPattern.get(), case_sensitive); // Go back a step
Add(limit);
limit = new HtRegex;
currentPattern = transformedLimits;
if (!limit->set(currentPattern.get(), case_sensitive))
{
lastErrorMessage = limit->lastError();
compiled = 0;
return false;
}
}
prevPattern = currentPattern;
}
Add(limit); // OK, we're done so just add the last compiled pattern
compiled = 1;
return true;
}
int
HtRegexList::match(const char * str, int nullpattern, int nullstr)
{
HtRegex *regx;
if (compiled == 0) return(nullpattern);
if (str == NULL) return(nullstr);
if (strlen(str) <= 0) return(nullstr);
if (number == 0) return(1); // An empty pattern matches everything
Start_Get();
while ((regx = (HtRegex *) Get_Next()))
{
if (regx->match(str, nullpattern, nullstr))
{
// Move this one to the front and update pointers
if (cursor.current_index != -1)
{
if (cursor.prev)
cursor.prev->next = cursor.current->next;
cursor.prev = 0;
cursor.current->next = head;
head = cursor.current;
cursor.current = head;
cursor.current_index = -1;
}
return(1);
}
}
return(0);
}