ROOT logo
// @(#)root/base:$Id$
// Author: Eddy Offermann   24/06/05

/*************************************************************************
 * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TPRegexp
#define ROOT_TPRegexp

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TPRegexp                                                             //
//                                                                      //
// C++ Wrapper for the "Perl Compatible Regular Expressions" library    //
//  The PCRE lib can be found at:                                       //
//              http://www.pcre.org/                                    //
//                                                                      //
// Extensive documentation about Regular expressions in Perl can be     //
// found at :                                                           //
//              http://perldoc.perl.org/perlre.html                     //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_Rtypes
#include "Rtypes.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif
#ifndef ROOT_TArrayI
#include "TArrayI.h"
#endif

struct PCREPriv_t;


class TPRegexp {

protected:
   enum {
      kPCRE_GLOBAL     = 0x80000000,
      kPCRE_OPTIMIZE   = 0x40000000,
      kPCRE_DEBUG_MSGS = 0x20000000,
      kPCRE_INTMASK    = 0x0FFF
   };

   TString     fPattern;
   PCREPriv_t *fPriv;
   UInt_t      fPCREOpts;

   static Bool_t fgThrowAtCompileError;

   void     Compile();
   void     Optimize();
   UInt_t   ParseMods(const TString &mods) const;
   Int_t    ReplaceSubs(const TString &s, TString &final,
                        const TString &replacePattern,
                        Int_t *ovec, Int_t nmatch) const;

   Int_t    MatchInternal(const TString& s, Int_t start,
                          Int_t nMaxMatch, TArrayI *pos=0);

   Int_t    SubstituteInternal(TString &s, const TString &replace,
                               Int_t start, Int_t nMaxMatch0,
                               Bool_t doDollarSubst);

public:
   TPRegexp();
   TPRegexp(const TString &pat);
   TPRegexp(const TPRegexp &p);
   virtual ~TPRegexp();

   Bool_t     IsValid() const;

   Int_t      Match(const TString &s, const TString &mods="",
                    Int_t start=0, Int_t nMaxMatch=10, TArrayI *pos=0);
   TObjArray *MatchS(const TString &s, const TString &mods="",
                     Int_t start=0, Int_t nMaxMatch=10);
   Bool_t     MatchB(const TString &s, const TString &mods="",
                     Int_t start=0, Int_t nMaxMatch=10) {
                           return (Match(s,mods,start,nMaxMatch) > 0); }
   Int_t      Substitute(TString &s, const TString &replace,
                         const TString &mods="", Int_t start=0,
                         Int_t nMatchMax=10);

   TString GetPattern()   const { return fPattern; }
   TString GetModifiers() const;

   TPRegexp &operator=(const TPRegexp &p);

   static Bool_t GetThrowAtCompileError();
   static void   SetThrowAtCompileError(Bool_t throwp);

   ClassDef(TPRegexp,0)  // Perl Compatible Regular Expression Class
};


class TPMERegexp : protected TPRegexp {

private:
   TPMERegexp& operator=(const TPMERegexp&);  // Not implemented

protected:
   Int_t    fNMaxMatches;         // maximum number of matches
   Int_t    fNMatches;            // number of matches returned from last pcre_exec call
   TArrayI  fMarkers;             // last set of indexes of matches

   TString  fLastStringMatched;   // copy of the last TString matched
   void    *fAddressOfLastString; // used for checking for change of TString in global match

   Int_t    fLastGlobalPosition;  // end of last match when kPCRE_GLOBAL is set

public:
   TPMERegexp();
   TPMERegexp(const TString& s, const TString& opts = "", Int_t nMatchMax = 10);
   TPMERegexp(const TString& s, UInt_t opts, Int_t nMatchMax = 10);
   TPMERegexp(const TPMERegexp& r);

   virtual ~TPMERegexp() {}

   void    Reset(const TString& s, const TString& opts = "", Int_t nMatchMax = -1);
   void    Reset(const TString& s, UInt_t opts, Int_t nMatchMax = -1);

   Int_t   GetNMaxMatches()   const { return fNMaxMatches; }
   void    SetNMaxMatches(Int_t nm) { fNMaxMatches = nm; }

   Int_t   GetGlobalPosition() const { return fLastGlobalPosition; }
   void    AssignGlobalState(const TPMERegexp& re);
   void    ResetGlobalState();

   Int_t   Match(const TString& s, UInt_t start = 0);
   Int_t   Split(const TString& s, Int_t maxfields = 0);
   Int_t   Substitute(TString& s, const TString& r, Bool_t doDollarSubst=kTRUE);

   Int_t   NMatches() const { return fNMatches; }
   TString operator[](Int_t);

   virtual void Print(Option_t* option="");

   ClassDef(TPMERegexp, 0); // Wrapper for Perl-like regular expression matching.
};


class TStringToken : public TString {

protected:
   const TString fFullStr;
   TPRegexp      fSplitRe;
   Bool_t        fReturnVoid;
   Int_t         fPos;

public:
   TStringToken(const TString& fullStr, const TString& splitRe, Bool_t retVoid=kFALSE);
   virtual ~TStringToken() {}

   Bool_t NextToken();
   Bool_t AtEnd() const { return fPos >= fFullStr.Length(); }

   ClassDef(TStringToken,0) // String tokenizer using PCRE for finding next tokens.
};

#endif
 TPRegexp.h:1
 TPRegexp.h:2
 TPRegexp.h:3
 TPRegexp.h:4
 TPRegexp.h:5
 TPRegexp.h:6
 TPRegexp.h:7
 TPRegexp.h:8
 TPRegexp.h:9
 TPRegexp.h:10
 TPRegexp.h:11
 TPRegexp.h:12
 TPRegexp.h:13
 TPRegexp.h:14
 TPRegexp.h:15
 TPRegexp.h:16
 TPRegexp.h:17
 TPRegexp.h:18
 TPRegexp.h:19
 TPRegexp.h:20
 TPRegexp.h:21
 TPRegexp.h:22
 TPRegexp.h:23
 TPRegexp.h:24
 TPRegexp.h:25
 TPRegexp.h:26
 TPRegexp.h:27
 TPRegexp.h:28
 TPRegexp.h:29
 TPRegexp.h:30
 TPRegexp.h:31
 TPRegexp.h:32
 TPRegexp.h:33
 TPRegexp.h:34
 TPRegexp.h:35
 TPRegexp.h:36
 TPRegexp.h:37
 TPRegexp.h:38
 TPRegexp.h:39
 TPRegexp.h:40
 TPRegexp.h:41
 TPRegexp.h:42
 TPRegexp.h:43
 TPRegexp.h:44
 TPRegexp.h:45
 TPRegexp.h:46
 TPRegexp.h:47
 TPRegexp.h:48
 TPRegexp.h:49
 TPRegexp.h:50
 TPRegexp.h:51
 TPRegexp.h:52
 TPRegexp.h:53
 TPRegexp.h:54
 TPRegexp.h:55
 TPRegexp.h:56
 TPRegexp.h:57
 TPRegexp.h:58
 TPRegexp.h:59
 TPRegexp.h:60
 TPRegexp.h:61
 TPRegexp.h:62
 TPRegexp.h:63
 TPRegexp.h:64
 TPRegexp.h:65
 TPRegexp.h:66
 TPRegexp.h:67
 TPRegexp.h:68
 TPRegexp.h:69
 TPRegexp.h:70
 TPRegexp.h:71
 TPRegexp.h:72
 TPRegexp.h:73
 TPRegexp.h:74
 TPRegexp.h:75
 TPRegexp.h:76
 TPRegexp.h:77
 TPRegexp.h:78
 TPRegexp.h:79
 TPRegexp.h:80
 TPRegexp.h:81
 TPRegexp.h:82
 TPRegexp.h:83
 TPRegexp.h:84
 TPRegexp.h:85
 TPRegexp.h:86
 TPRegexp.h:87
 TPRegexp.h:88
 TPRegexp.h:89
 TPRegexp.h:90
 TPRegexp.h:91
 TPRegexp.h:92
 TPRegexp.h:93
 TPRegexp.h:94
 TPRegexp.h:95
 TPRegexp.h:96
 TPRegexp.h:97
 TPRegexp.h:98
 TPRegexp.h:99
 TPRegexp.h:100
 TPRegexp.h:101
 TPRegexp.h:102
 TPRegexp.h:103
 TPRegexp.h:104
 TPRegexp.h:105
 TPRegexp.h:106
 TPRegexp.h:107
 TPRegexp.h:108
 TPRegexp.h:109
 TPRegexp.h:110
 TPRegexp.h:111
 TPRegexp.h:112
 TPRegexp.h:113
 TPRegexp.h:114
 TPRegexp.h:115
 TPRegexp.h:116
 TPRegexp.h:117
 TPRegexp.h:118
 TPRegexp.h:119
 TPRegexp.h:120
 TPRegexp.h:121
 TPRegexp.h:122
 TPRegexp.h:123
 TPRegexp.h:124
 TPRegexp.h:125
 TPRegexp.h:126
 TPRegexp.h:127
 TPRegexp.h:128
 TPRegexp.h:129
 TPRegexp.h:130
 TPRegexp.h:131
 TPRegexp.h:132
 TPRegexp.h:133
 TPRegexp.h:134
 TPRegexp.h:135
 TPRegexp.h:136
 TPRegexp.h:137
 TPRegexp.h:138
 TPRegexp.h:139
 TPRegexp.h:140
 TPRegexp.h:141
 TPRegexp.h:142
 TPRegexp.h:143
 TPRegexp.h:144
 TPRegexp.h:145
 TPRegexp.h:146
 TPRegexp.h:147
 TPRegexp.h:148
 TPRegexp.h:149
 TPRegexp.h:150
 TPRegexp.h:151
 TPRegexp.h:152
 TPRegexp.h:153
 TPRegexp.h:154
 TPRegexp.h:155
 TPRegexp.h:156
 TPRegexp.h:157
 TPRegexp.h:158
 TPRegexp.h:159
 TPRegexp.h:160
 TPRegexp.h:161
 TPRegexp.h:162
 TPRegexp.h:163
 TPRegexp.h:164
 TPRegexp.h:165
 TPRegexp.h:166
 TPRegexp.h:167