//===========================================================================// // Purpose : Method definitions for the 'RegExp' class. // // Public methods include: // - RegExp, ~RegExp // - Index // - Match // - IsValidRE // //---------------------------------------------------------------------------// // _____ ___ _ ___ ___ ___ // U.S. Application Specific Products |_ _|_ _| /_\ / __|_ _/ __| // | | | | / _ \\__ \| | (__ // ASIC Software Engineering Services |_| |___| /_/ \_\___/___\___| // // Property of Texas Instruments -- For Unrestricted Use -- Unauthorized // reproduction and/or sale is strictly prohibited. This product is // protected under copyright law as an unpublished work. // // Created 2003, (C) Copyright 2003 Texas Instruments. // // All rights reserved. // // --------------------------------------------------------------------- // These commodities are under U.S. Government 'distribution // license' control. As such, they are not to be re-exported // without prior approval from the U.S. Department of Commerce. // --------------------------------------------------------------------- // //===========================================================================// #include "RegExp.h" #include //===========================================================================// // Method : RegExp // Author : Jon Sykes //---------------------------------------------------------------------------// // Version history // 04/22/03 jsykes: Original //===========================================================================// RegExp::RegExp( const char* expression, int options ) { this->pcreOptions_ = options; this->pszMatch_ = NULL; ppcreCode_ = pcre_compile( expression, options, &pszError, &errorOffset, 0 ); } //===========================================================================// // Method : ~RegExp // Author : Jon Sykes //---------------------------------------------------------------------------// // Version history // 04/22/03 jsykes: Original //===========================================================================// RegExp::~RegExp( void ) { if ( ppcreCode_ ) pcre_free( ppcreCode_ ); } //===========================================================================// // Method : Index // Author : Jon Sykes //---------------------------------------------------------------------------// // Version history // 04/22/03 jsykes: Original //===========================================================================// bool RegExp::Index( const char* subject, size_t* start, size_t* len ) { bool match = false; if ( !ppcreCode_ || !subject || !start || !len ) return( false ); int subjectLen = static_cast( strlen( subject ) ); int msize; pcre_fullinfo( ppcreCode_, 0, PCRE_INFO_CAPTURECOUNT, &msize); msize = 3 * ( msize + 1 ); int *m = new int[ msize ]; pcreRc_ = pcre_exec( ppcreCode_, NULL, subject, subjectLen, 0, pcreOptions_, m, msize ); if ( pcreRc_ >= 0 ) { *start = m[0]; *len = m[1] - m[0]; match = true; } delete[] m; return( match ); } //===========================================================================// // Method : Match // Author : Jon Sykes //---------------------------------------------------------------------------// // Version history // 04/22/03 jsykes: Original //===========================================================================// const char* RegExp::Match( const char* subject ) { size_t start, len; if ( this->Index( subject, &start, &len ) ) { if ( this->pszMatch_ ) delete[] this->pszMatch_; this->pszMatch_ = new char[ len + 1 ]; strncpy( this->pszMatch_, &subject[ start ], len ); this->pszMatch_[ len ] = 0; return( this->pszMatch_ ); } else return( NULL ); }