text: //===========================================================================//
  // 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 <string.h>
  
  //===========================================================================//
  // 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<int>( 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 );
  }
  