#include "Err.h"
#include "Pattern.h"
#include "RPattern.h"
#include "Range.h"
#include "Data.h"
using namespace BPrivate::Storage::Sniffer;
RPattern::RPattern(Range range, Pattern* pattern)
:
fRange(range),
fPattern(pattern)
{
}
status_t
RPattern::InitCheck() const
{
status_t err = fRange.InitCheck();
if (!err)
err = fPattern ? B_OK : B_BAD_VALUE;
if (!err)
err = fPattern->InitCheck();
return err;
}
Err*
RPattern::GetErr() const
{
if (fRange.InitCheck() != B_OK) {
return fRange.GetErr();
} else if (fPattern) {
if (fPattern->InitCheck() != B_OK)
return fPattern->GetErr();
else
return NULL;
} else {
return new Err("Sniffer parser error: RPattern::RPattern() -- NULL pattern parameter", -1);
}
}
RPattern::~RPattern()
{
delete fPattern;
}
bool
RPattern::Sniff(const Data& data, bool caseInsensitive) const
{
if (!data.buffer || InitCheck() != B_OK)
return false;
else
return fPattern->Sniff(fRange, data, caseInsensitive);
}
ssize_t
RPattern::BytesNeeded() const
{
ssize_t result = InitCheck();
if (result == B_OK)
result = fPattern->BytesNeeded();
if (result >= 0)
result += fRange.End();
return result;
}