Class to track data flow and detect a specific pattern

PatternFinder.h

Committer:
chris215
Date:
2016-01-13
Revision:
1:038d0018a542
Parent:
0:b8cca837d413

File content as of revision 1:038d0018a542:

#ifndef PATTERN_FINDER_H
#define PATTERN_FINDER_H
#include <stdint.h>
#include <string.h>

class PatternFinder
{
    private:
    uint8_t*    m_RefPattern;
    uint8_t*    m_CurDataStream;
    uint32_t    m_PatternSize;
    uint32_t    m_PatternElementSize;
    void        ShiftDataInStream(void* data);
    bool        IsPatternFound(void);
    
    public:
    PatternFinder(void* PatternData, uint32_t PatternLength, uint32_t PatternElementSize = 1);
    ~PatternFinder();  
    bool CheckPattern(void* data);  //returns true if pattern was found in the stream
};
inline void PatternFinder::ShiftDataInStream(void* data)
{
    uint8_t *src;
    uint8_t *dst;
    for(int element = (m_PatternSize-1);element > 0; element--)
    {
        dst = m_CurDataStream + element*m_PatternElementSize;
        src = m_CurDataStream + (element-1)*m_PatternElementSize;
        memcpy(dst,src,m_PatternElementSize);
    }
    src = (uint8_t*)data;
    dst = &m_CurDataStream[0];
    memcpy(dst,src,m_PatternElementSize);
}

inline bool PatternFinder::IsPatternFound(void)
{
    uint32_t NumberOfIdenticalElementsFoundInPattern = 0;
    for(int x = 0;x < m_PatternSize*m_PatternElementSize;x++)
    {
        if(m_CurDataStream[x] == m_RefPattern[x])
        {
            NumberOfIdenticalElementsFoundInPattern++;
        }
    }
    return (NumberOfIdenticalElementsFoundInPattern == (m_PatternSize*m_PatternElementSize));
}

inline bool PatternFinder::CheckPattern(void* data)
{
    ShiftDataInStream(data);
    return IsPatternFound();
}
#endif