#ifndef BU_REG_EX_ENGINE_H #define BU_REG_EX_ENGINE_H #include "bu/sharedcore.h" #include "bu/array.h" #include "bu/sio.h" namespace Bu { template class RegExEngine; template class RegExEngineCore { friend class RegExEngine; friend class SharedCore, RegExEngineCore >; private: RegExEngineCore() { } virtual ~RegExEngineCore() { } class Range { public: Range( chr cLower, chr cUpper, int iTrgState ) : cLower( cLower ), cUpper( cUpper ), iTrgState( iTrgState ) { } chr cLower; chr cUpper; int iTrgState; }; class State { public: Bu::Array aRange; }; int addState() { aState.append( State() ); return aState.getSize()-1; } void addCompletion( int iState, chr cLower, chr cUpper, int iTrgState ) { aState[iState].aRange.append( Range( cLower, cUpper, iTrgState ) ); } template bool match( const str &sIn, int &iSize, int &iCompletion ) { bool bMatch; int iState = 0; iSize = 0; for( typename str::const_iterator i = sIn.begin(); i; i++ ) { Bu::sio << "Finding char " << *i << " in state " << iState << ":" << Bu::sio.nl; bMatch = false; for( typename Bu::Array::iterator j = aState[iState].aRange.begin(); j; j++ ) { Bu::sio << " Testing range " << (*j).cLower << " - " << (*j).cUpper << Bu::sio.nl; if( *i >= (*j).cLower && *i <= (*j).cUpper ) { iState = (*j).iTrgState; bMatch = true; iSize++; if( iState < 0 ) { iCompletion = iState; return true; } } } if( bMatch == false ) { return false; } } iCompletion = 0; return true; } typedef Bu::Array StateArray; StateArray aState; }; template class RegExEngine : public SharedCore, RegExEngineCore > { private: typedef class RegExEngine MyType; typedef class RegExEngineCore Core; typedef class Core::Range Range; typedef class Core::State State; protected: using SharedCore::core; using SharedCore::_hardCopy; using SharedCore::_resetCore; using SharedCore::_allocateCore; public: RegExEngine() { } virtual ~RegExEngine() { } int addState() { return core->addState(); } void addCompletion( int iState, chr cLower, chr cUpper, int iTrgState ) { core->addCompletion( iState, cLower, cUpper, iTrgState ); } template bool match( const str &sIn, int &iSize, int &iCompletion ) { return core->match( sIn, iSize, iCompletion ); } private: }; }; #endif