// @(#)root/core:$Id$
// author: Lukasz Janyst <ljanyst@cern.ch>

#include "TSchemaRule.h"
#include "TSchemaRuleProcessor.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TNamed.h"
#include <utility>
#include <iostream>
#include <vector>
#include <list>
#include <string>
#include <cstdlib>
#include "TROOT.h"
#include "Riostream.h"

#include "RConversionRuleParser.h"

ClassImp(TSchemaRule)

using namespace ROOT;

namespace {
   static Bool_t IsIrrelevantCharacter(char c)
   {
      return (c == ' ' || c == '\n' || c == '\t');
   }

   static void AdvanceOverIrrelevantCharacter(const char*& str)
   {
      while (IsIrrelevantCharacter(*str)) {
         ++str;
      }
   }

   // check if lhs matches rhs if we ignore irelevant white space differences

   static Bool_t IsCodeEquivalent(const TString& lhs, const TString& rhs)
   {
      Bool_t result = kTRUE;

      if (lhs != rhs) {
         const char null = '\0';
         const char* left = lhs.Data();
         const char* right = rhs.Data();
         Bool_t literal = false;
         // skip initial white space
         AdvanceOverIrrelevantCharacter(left);
         AdvanceOverIrrelevantCharacter(right);

         while (*left != null || *right  != null) {
            // If both chars are white space, skip consecutive white space
            if (!literal && IsIrrelevantCharacter(*left) && IsIrrelevantCharacter(*right)) {
               AdvanceOverIrrelevantCharacter(left);
               AdvanceOverIrrelevantCharacter(right);
               continue;
            }
            // Check if one string has trailing white space, and the other doesn't.
            if (*left == null || *right == null) {
               AdvanceOverIrrelevantCharacter(left);
               AdvanceOverIrrelevantCharacter(right);
               result = (*left == null && *right == null);
               break;
            }

            if (*left != *right) {
               result = kFALSE;
               break;
            }

            if (*left == '"') {
               literal = !literal;
            }
            ++left;
            ++right;
         }
      }
      return result;
   }

}

//------------------------------------------------------------------------------
TSchemaRule::TSchemaRule(): fVersionVect( 0 ), fChecksumVect( 0 ),
                            fTargetVect( 0 ), fSourceVect( 0 ),
                            fIncludeVect( 0 ), fEmbed( kTRUE ),
                            fReadFuncPtr( 0 ), fReadRawFuncPtr( 0 ),
                            fRuleType( kNone )
{
   // Default Constructor.

}

//------------------------------------------------------------------------------
TSchemaRule::~TSchemaRule()
{
   // Destructor.

   delete fVersionVect;
   delete fChecksumVect;
   delete fTargetVect;
   delete fSourceVect;
   delete fIncludeVect;
}

//------------------------------------------------------------------------------
TSchemaRule::TSchemaRule( const TSchemaRule& rhs ): TObject( rhs ),
                            fVersionVect( 0 ), fChecksumVect( 0 ),
                            fTargetVect( 0 ), fSourceVect( 0 ),
                            fIncludeVect( 0 ), fEmbed( kTRUE ),
                            fReadFuncPtr( 0 ), fReadRawFuncPtr( 0 ),
                            fRuleType( kNone )
{
   // Copy Constructor.
   *this = rhs;
}

//------------------------------------------------------------------------------
TSchemaRule& TSchemaRule::operator = ( const TSchemaRule& rhs )
{
   // Copy operator.

   if( this != &rhs ) {
      fVersion        = rhs.fVersion;
      fChecksum       = rhs.fChecksum;
      fSourceClass    = rhs.fSourceClass;
      fTarget         = rhs.fTarget;
      fSource         = rhs.fSource;
      fInclude        = rhs.fInclude;
      fCode           = rhs.fCode;
      fEmbed          = rhs.fEmbed;
      fReadFuncPtr    = rhs.fReadFuncPtr;
      fReadRawFuncPtr = rhs.fReadRawFuncPtr;
      fRuleType       = rhs.fRuleType;
      fAttributes     = rhs.fAttributes;
   }
   return *this;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::operator == ( const TSchemaRule& rhs )
{
   // Return true if the rule have the same effects.

   if( this != &rhs ) {
      Bool_t result = ( fVersion == rhs.fVersion
                       && fChecksum == rhs.fChecksum
                       && fSourceClass == rhs.fSourceClass
                       && fTargetClass == rhs.fTargetClass
                       && fSource == rhs.fSource
                       && fTarget == rhs.fTarget
                       && fInclude == rhs.fInclude
                       && IsCodeEquivalent(fCode, rhs.fCode)
                       && fEmbed == rhs.fEmbed
                       && fRuleType == rhs.fRuleType
                       && fAttributes == rhs.fAttributes );
      if (result &&
          ( (fReadRawFuncPtr != rhs.fReadRawFuncPtr && fReadRawFuncPtr != 0 && rhs.fReadRawFuncPtr != 0)
           ||  (fReadFuncPtr != rhs.fReadFuncPtr && fReadFuncPtr != 0 && rhs.fReadFuncPtr != 0) ) )
      {
         result = kFALSE;
      }

      return result;
   }
   return kTRUE;
}

//------------------------------------------------------------------------------
void TSchemaRule::ls(Option_t *targetname) const
{
   // The ls function lists the contents of a class on stdout. Ls output
   // is typically much less verbose then Dump().

   TROOT::IndentLevel();
   std::cout << "Schema Evolution Rule: ";
   if (fRuleType==kReadRule) std::cout <<  "read ";
   else if (fRuleType==kReadRawRule) std::cout << "readraw ";
   std::cout << "\n";
   TROOT::IncreaseDirLevel();
   TROOT::IndentLevel();
   std::cout << "sourceClass=\"" << fSourceClass << "\" ";
   if (fVersion.Length())  std::cout << "version=\"" << fVersion << "\" ";
   if (fChecksum.Length()) std::cout << "checksum=\"" << fChecksum << "\" ";
   if (targetname && targetname[0]) std::cout << "targetClass=\"" << targetname << "\" ";
   else std::cout << "targetClass\"" << fTargetClass << "\" ";
   std::cout << "\n";
   TROOT::IndentLevel();
   std::cout << "source=\"" << fSource << "\" ";
   std::cout << "target=\"" << fTarget << "\" ";
   std::cout << "\n";
   if (fInclude.Length()) {
      TROOT::IndentLevel();
      std::cout << "include=\"" << fInclude << "\" " << "\n";
   }
   if (fAttributes.Length()) {
      TROOT::IndentLevel();
      std::cout << "attributes=\"" << fAttributes << "\"" << "\n";
   }
   if (fCode.Length()) {
      TROOT::IndentLevel();
      std::cout << "code=\"{" << fCode << "}\" "
      << "\n";
   }
   TROOT::DecreaseDirLevel();
}

//------------------------------------------------------------------------------
void TSchemaRule::AsString(TString &out, const char *options) const
{
   // Add to the string 'out' the string representation of the rule.
   // if options contains:
   //  's' : add the short form of the rule is possible
   //  'x' : add the xml form of the rule

   TString opt(options);
   opt.ToLower();
   Bool_t shortform = opt.Contains('s');
   Bool_t xmlform = opt.Contains('x');

   TString end;
   if (xmlform) {
      /*
       <read sourceClass="ClassA" version="[2]" targetClass="ClassA" source="int m_unit;" target="m_unit" >
       <![CDATA[ { m_unit = 10*onfile.m_unit; } ]]>
       </read>
       */
      shortform = kFALSE;
      out += "<";
      if (fRuleType==kReadRule) { out += "read "; end = "</read>"; }
      else if (fRuleType==kReadRawRule) { out += "readraw "; end = "</readraw>"; }
      else { out += "-- "; end = "-->"; }

   } else {
      if (!shortform || fRuleType!=kReadRule) {
         out += "type=";
         if (fRuleType==kReadRule) out += "read ";
         else if (fRuleType==kReadRawRule) out += "readraw ";
         else out += " ";
      }
   }
   if (!shortform || (fSourceClass != fTargetClass) ) {
      out += "sourceClass=\"" + fSourceClass + "\" ";
      out += "targetClass=\"" + fTargetClass + "\" ";
   } else {
      out += fSourceClass + " ";
   }
   if (shortform && fTarget == fSource) {
      out += fSource + " ";
   }
   if (!shortform || (fVersion != "[1-]")) {
      if (fVersion.Length())  out += "version=\""     + fVersion + "\" ";
   }
   if (fChecksum.Length()) out += "checksum=\""    + fChecksum + "\" ";
   if (!shortform || fTarget != fSource) {
      out += "source=\""      + fSource + "\" ";
      out += "target=\""      + fTarget + "\" ";
   }
   if (fInclude.Length())  out += "include=\""     + fInclude + "\" ";
   if (fAttributes.Length()) out += "attributes=\"" + fAttributes + "\" ";
   if (xmlform) {
      out += "> ";
   }
   if (xmlform) {
      if (fCode.Length()) {
         out += "\n<![CDATA[ { " + fCode + " ]]>\n ";
      } else if (fReadFuncPtr) {
         // Can we guess?
         // out += "code=\" + nameof(fReadFuncPtr) + "\" ";
      } else if (fReadRawFuncPtr) {
         // Can we guess?
         // out += "code=\" + nameof(fReadRawFuncPtr) + "\" ";
      }
   } else {
      if (fCode.Length()) {
         out += "code=\"{" + fCode + "}\" ";
      } else if (fReadFuncPtr) {
         // Can we guess?
         // out += "code=\" + nameof(fReadFuncPtr) + "\" ";
      } else if (fReadRawFuncPtr) {
         // Can we guess?
         // out += "code=\" + nameof(fReadRawFuncPtr) + "\" ";
      }
   }
   if (xmlform) {
      out += end;
   }
}

//------------------------------------------------------------------------------
void TSchemaRule::Clear( const char * /* option */)
{
   // Zero out this rule object.

   fVersion.Clear();
   fChecksum.Clear();
   fSourceClass.Clear();
   fTarget.Clear();
   fSource.Clear();
   fInclude.Clear();
   fCode.Clear();
   fAttributes.Clear();
   fReadRawFuncPtr = 0;
   fReadFuncPtr = 0;
   fRuleType = kNone;
   delete fVersionVect;   fVersionVect = 0;
   delete fChecksumVect;  fChecksumVect = 0;
   delete fTargetVect;    fTargetVect = 0;
   delete fSourceVect;    fSourceVect = 0;
   delete fIncludeVect;   fIncludeVect = 0;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::SetFromRule( const char *rule )
{
   // Set the content fot this object from the rule
   // See TClass::AddRule for details on the syntax.

   //-----------------------------------------------------------------------
   // Parse the rule and check it's validity
   //-----------------------------------------------------------------------
   ROOT::MembersMap_t rule_values;

   std::string error_string;
   if( !ParseRule( rule, rule_values, error_string) ) {
      Error("SetFromRule","The rule (%s) is invalid: %s",rule,error_string.c_str());
      return kFALSE;
   }
   ROOT::MembersMap_t ::const_iterator it1;

   it1 = rule_values.find( "type" );
   if( it1 != rule_values.end() ) {
      if (it1->second == "read" || it1->second == "Read") {
         SetRuleType( TSchemaRule::kReadRule );
      } else if (it1->second == "readraw" || it1->second == "ReadRaw") {
         SetRuleType( TSchemaRule::kReadRawRule );
      } else {
         SetRuleType( TSchemaRule::kNone );
      }
   } else {
      // Default to read.
      SetRuleType( TSchemaRule::kReadRule );
   }
   it1 = rule_values.find( "targetClass" );
   if( it1 != rule_values.end() ) SetTargetClass( it1->second );
   it1 = rule_values.find( "sourceClass" );
   if( it1 != rule_values.end() ) SetSourceClass( it1->second );
   it1 = rule_values.find( "target" );
   if( it1 != rule_values.end() ) SetTarget( it1->second );
   it1 = rule_values.find( "source" );
   if( it1 != rule_values.end() ) SetSource( it1->second );
   it1 = rule_values.find( "version" );
   if( it1 != rule_values.end() ) SetVersion( it1->second );
   it1 = rule_values.find( "checksum" );
   if( it1 != rule_values.end() ) SetChecksum( it1->second );
   it1 = rule_values.find( "embed" );
   if( it1 != rule_values.end() ) SetEmbed( it1->second == "false" ? false : true );
   it1 = rule_values.find( "include" );
   if( it1 != rule_values.end() ) SetInclude( it1->second );
   it1 = rule_values.find( "attributes" );
   if( it1 != rule_values.end() ) SetAttributes( it1->second );
   it1 = rule_values.find( "code" );
   if( it1 != rule_values.end() ) SetCode( it1->second );
   // if (code is functioname) {
   // switch (ruleobj->GetRuleType() ) {
   // case kRead: SetReadFunctionPointer(  )
   // case kReadRewa: SetReadRawFunctionPointer( )
   // }

   return kTRUE;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::SetVersion( const TString& version )
{
   // Set the version string - returns kFALSE if the format is incorrect

   fVersion = "";
   Bool_t ret = ProcessVersion( version );
   if( ret )
      fVersion = version;
   return ret;
}

//------------------------------------------------------------------------------
const char *TSchemaRule::GetVersion() const
{
   // Get the version string.

   return fVersion;
}


//------------------------------------------------------------------------------
Bool_t TSchemaRule::TestVersion( Int_t version ) const
{
   // Check if given version number is defined in this rule

   if( fVersion == "" )
      return kFALSE;

   if( !fVersionVect )
      ProcessVersion( fVersion ); // At this point the version string should always be correct

   if (version == -1) {
      version = 1;
   }

   std::vector<std::pair<Int_t, Int_t> >::iterator it;
   for( it = fVersionVect->begin(); it != fVersionVect->end(); ++it ) {
      if( version >= it->first && version <= it->second )
         return kTRUE;
   }
   return kFALSE;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::SetChecksum( const TString& checksum )
{
   // Set the checksum string - returns kFALSE if the format is incorrect
   fChecksum = "";
   Bool_t ret = ProcessChecksum( checksum );
   if( ret )
      fChecksum = checksum;
   return ret;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::TestChecksum( UInt_t checksum ) const
{
   // Check if given checksum is defined in this rule

   if( fChecksum == "" )
      return kFALSE;

   if( !fChecksumVect )
      ProcessChecksum( fChecksum ); // At this point the checksum string should always be correct

   std::vector<UInt_t>::iterator it;
   for( it = fChecksumVect->begin(); it != fChecksumVect->end(); ++it ) {
      if( checksum == *it )
         return kTRUE;
   }
   return kFALSE;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetSourceClass( const TString& classname )
{
   // Set the source class of this rule (i.e. the onfile class).

   fSourceClass = classname;
}

//------------------------------------------------------------------------------
const char *TSchemaRule::GetSourceClass() const
{
   // Get the source class of this rule (i.e. the onfile class).

   return fSourceClass;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetTargetClass( const TString& classname )
{
   // Set the target class of this rule (i.e. the in memory class).

   fTargetClass = classname;
}

//------------------------------------------------------------------------------
const char *TSchemaRule::GetTargetClass() const
{
   // Get the targte class of this rule (i.e. the in memory class).

   return fTargetClass;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetTarget( const TString& target )
{
   // Set the target member of this rule (i.e. the in memory data member).

   fTarget = target;

   if( target == "" ) {
      delete fTargetVect;
      fTargetVect = 0;
      return;
   }

   if( !fTargetVect ) {
      fTargetVect = new TObjArray();
      fTargetVect->SetOwner();
   }
   ProcessList( fTargetVect, target );
}

//------------------------------------------------------------------------------
const char *TSchemaRule::GetTargetString() const
{
   // Get the target data members of this rule as a simple string (i.e. the in memory data member).

   return fTarget;
}

//------------------------------------------------------------------------------
const TObjArray*  TSchemaRule::GetTarget() const
{
   // Get the target data members of this rule (i.e. the in memory data member).

   if( fTarget == "" )
      return 0;

   if( !fTargetVect ) {
      fTargetVect = new TObjArray();
      fTargetVect->SetOwner();
      ProcessList( fTargetVect, fTarget );
   }

   return fTargetVect;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetSource( const TString& source )
{
   // Set the list of source members.  This should be in the form of a declaration:
   //     Int_t fOldMember; TNamed fName;

   fSource = source;

   if( source == "" ) {
      delete fSourceVect;
      fSourceVect = 0;
      return;
   }

   if( !fSourceVect ) {
      fSourceVect = new TObjArray();
      fSourceVect->SetOwner();
   }

   ProcessDeclaration( fSourceVect, source );
}

//------------------------------------------------------------------------------
const TObjArray* TSchemaRule::GetSource() const
{
   // Get the list of source members as a TObjArray of TNamed object,
   // with the name being the member name and the title being its type.

   if( fSource == "" )
      return 0;

   if( !fSourceVect ) {
      fSourceVect = new TObjArray();
      fSourceVect->SetOwner();
      ProcessDeclaration( fSourceVect, fSource );
   }
   return fSourceVect;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetInclude( const TString& incl )
{
   // Set the comma separated list of header files to include to be able
   // to compile this rule.

   fInclude = incl;

   if( incl == "" ) {
      delete fIncludeVect;
      fIncludeVect = 0;
      return;
   }

   if( !fIncludeVect ) {
      fIncludeVect = new TObjArray();
      fIncludeVect->SetOwner();
   }

   ProcessList( fIncludeVect, incl );
}

//------------------------------------------------------------------------------
const TObjArray* TSchemaRule::GetInclude() const
{
   // Return the list of header files to include to be able to
   // compile this rule as a TObjArray of TObjString

   if( fInclude == "" )
      return 0;

   if( !fIncludeVect ) {
      fIncludeVect = new TObjArray();
      fIncludeVect->SetOwner();
      ProcessList( fIncludeVect, fInclude );
   }

   return fIncludeVect;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetEmbed( Bool_t embed )
{
   // Set whether this rule should be save in the ROOT file (if true)

   fEmbed = embed;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::GetEmbed() const
{
   // Return true if this rule should be saved in the ROOT File.

   return fEmbed;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::IsValid() const
{
   // Return kTRUE if this rule is valid.

   return (fVersionVect || fChecksumVect) && (fSourceClass.Length() != 0);
}

//------------------------------------------------------------------------------
void TSchemaRule::SetCode( const TString& code )
{
   // Set the source code of this rule.

   fCode = code;
}

//------------------------------------------------------------------------------
const char *TSchemaRule::GetCode() const
{
   // Get the source code of this rule.

   return fCode;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetAttributes( const TString& attributes )
{
   // Set the attributes code of this rule.

   fAttributes = attributes;
}

//------------------------------------------------------------------------------
const char *TSchemaRule::GetAttributes() const
{
   // Get the attributes code of this rule.

   return fAttributes;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::HasTarget( const TString& target ) const
{
   // Return true if one of the rule's data member target  is 'target'.

   if( !fTargetVect )
      return kFALSE;

   TObject*      obj;
   TObjArrayIter it( fTargetVect );
   while( (obj = it.Next()) ) {
      TObjString* str = (TObjString*)obj;
      if( str->GetString() == target )
         return kTRUE;
   }
   return kFALSE;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::HasSource( const TString& source ) const
{
   // Return true if one of the rule's data member source is 'source'
   if( !fSourceVect )
      return kFALSE;

   TObject*      obj;
   TObjArrayIter it( fSourceVect );
   while( (obj = it.Next()) ) {
      TSources* var = (TSources*)obj;
      if( var->GetName() == source )
         return kTRUE;
   }
   return kFALSE;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetReadFunctionPointer( TSchemaRule::ReadFuncPtr_t ptr )
{
   // Set the pointer to the function to be run for the rule (if it is a read rule).

   fReadFuncPtr = ptr;
}

//------------------------------------------------------------------------------
TSchemaRule::ReadFuncPtr_t TSchemaRule::GetReadFunctionPointer() const
{
   // Get the pointer to the function to be run for the rule (if it is a read rule).

   return fReadFuncPtr;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetReadRawFunctionPointer( TSchemaRule::ReadRawFuncPtr_t ptr )
{
   // Set the pointer to the function to be run for the rule (if it is a raw read rule).

   fReadRawFuncPtr = ptr;
}

//------------------------------------------------------------------------------
TSchemaRule::ReadRawFuncPtr_t TSchemaRule::GetReadRawFunctionPointer() const
{
   // Get the pointer to the function to be run for the rule (if it is a raw read rule).

   return fReadRawFuncPtr;
}

//------------------------------------------------------------------------------
void TSchemaRule::SetRuleType( TSchemaRule::RuleType_t type )
{
   // Set the type of the rule.

   fRuleType = type;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::IsAliasRule() const
{
   // Return kTRUE if the rule is a strict renaming of one of the data member of the class.

   return fSourceClass != "" && (fVersion != "" || fChecksum != "") && fTarget == "" && fSource == "" && fInclude == "" && fCode == "" && fAttributes == "";
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::IsRenameRule() const
{
   // Return kTRUE if the rule is a strict renaming of the class to a new name.

   return fSourceClass != "" && (fVersion != "" || fChecksum != "") && fTarget != "" && fSource != "" && fInclude == "" && fCode == "" && fAttributes == "";
}

//------------------------------------------------------------------------------
TSchemaRule::RuleType_t TSchemaRule::GetRuleType() const
{
   // Return the type of the rule.

   return fRuleType;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::Conflicts( const TSchemaRule* rule ) const
{
   // Check if this rule conflicts with the given one.

   //---------------------------------------------------------------------------
   // If the rules have different sources then the don't conflict
   //---------------------------------------------------------------------------
   if( fSourceClass != rule->fSourceClass )
      return kFALSE;

   //---------------------------------------------------------------------------
   // Check if the rules have common target
   //---------------------------------------------------------------------------
   if( !rule->GetTarget() )
      return kFALSE;

   Bool_t         haveCommonTargets = kFALSE;
   TObjArrayIter  titer( rule->GetTarget() );
   TObjString    *str;
   TObject       *obj;

   while( (obj = titer.Next() ) ) {
      str = (TObjString*)obj;
      if( HasTarget( str->String() ) )
         haveCommonTargets = kTRUE;
   }

   if( !haveCommonTargets )
      return kFALSE;

   //---------------------------------------------------------------------------
   // Check if there are conflicting checksums
   //---------------------------------------------------------------------------
   if( fChecksumVect ) {
      std::vector<UInt_t>::iterator it;
      for( it = fChecksumVect->begin(); it != fChecksumVect->end(); ++it )
         if( rule->TestChecksum( *it ) )
            return kTRUE;
   }

   //---------------------------------------------------------------------------
   // Check if there are conflicting versions
   //---------------------------------------------------------------------------
   if( fVersionVect && rule->fVersionVect )
   {
      std::vector<std::pair<Int_t, Int_t> >::iterator it1;
      std::vector<std::pair<Int_t, Int_t> >::iterator it2;
      for( it1 = fVersionVect->begin(); it1 != fVersionVect->end(); ++it1 ) {
         for( it2 = rule->fVersionVect->begin();
              it2 != rule->fVersionVect->end(); ++it2 ) {
            //------------------------------------------------------------------
            // the rules conflict it their version ranges intersect
            //------------------------------------------------------------------
            if( it1->first >= it2->first && it1->first <= it2->second )
               return kTRUE;

            if( it1->first < it2->first && it1->second >= it2->first )
               return kTRUE;
         }
      }
   }
   return kFALSE;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::ProcessVersion( const TString& version ) const
{
   // Check if specified version string is correct and build version vector.

   //---------------------------------------------------------------------------
   // Check if we have valid list
   //---------------------------------------------------------------------------
   if( version[0] != '[' || version[version.Length()-1] != ']' )
      return kFALSE;
   std::string ver = version.Data();

   std::list<std::string> versions;
   ROOT::TSchemaRuleProcessor::SplitList( ver.substr( 1, ver.size()-2), versions );

   if( versions.empty() )
   {
      delete fVersionVect;
      fVersionVect = 0;
      return kFALSE;
   }

   if( !fVersionVect )
      fVersionVect = new std::vector<std::pair<Int_t, Int_t> >;
   fVersionVect->clear();

   //---------------------------------------------------------------------------
   // Check the validity of each list element
   //---------------------------------------------------------------------------
   std::list<std::string>::iterator it;
   for( it = versions.begin(); it != versions.end(); ++it ) {
      std::pair<Int_t, Int_t> verpair;
      if( !ROOT::TSchemaRuleProcessor::ProcessVersion( *it, verpair ) )
      {
         delete fVersionVect;
         fVersionVect = 0;
         return kFALSE;
      }
      fVersionVect->push_back( verpair );
   }
   return kTRUE;
}

//------------------------------------------------------------------------------
Bool_t TSchemaRule::ProcessChecksum( const TString& checksum ) const
{
   // Check if specified checksum string is correct and build checksum vector.

   //---------------------------------------------------------------------------
   // Check if we have valid list
   //---------------------------------------------------------------------------
   if (!checksum[0])
      return kFALSE;
   std::string chk = (const char*)checksum;
   if( chk[0] != '[' || chk[chk.size()-1] != ']' )
      return kFALSE;

   std::list<std::string> checksums;
   ROOT::TSchemaRuleProcessor::SplitList( chk.substr( 1, chk.size()-2), checksums );

   if( checksums.empty() ) {
      delete fChecksumVect;
      fChecksumVect = 0;
      return kFALSE;
   }

   if( !fChecksumVect )
      fChecksumVect = new std::vector<UInt_t>;
   fChecksumVect->clear();

   //---------------------------------------------------------------------------
   // Check the validity of each list element
   //---------------------------------------------------------------------------
   std::list<std::string>::iterator it;
   for( it = checksums.begin(); it != checksums.end(); ++it ) {
      if( !ROOT::TSchemaRuleProcessor::IsANumber( *it ) ) {
         delete fChecksumVect;
         fChecksumVect = 0;
         return kFALSE;
      }
      fChecksumVect->push_back( atoi( it->c_str() ) );
   }
   return kTRUE;
}

//------------------------------------------------------------------------------
void TSchemaRule::ProcessList( TObjArray* array, const TString& list )
{
   // Split the list as a comma separated list into a TObjArray of TObjString.

   std::list<std::string>           elems;
   std::list<std::string>::iterator it;
   ROOT::TSchemaRuleProcessor::SplitList( (const char*)list, elems );

   array->Clear();

   if( elems.empty() )
      return;

   for( it = elems.begin(); it != elems.end(); ++it ) {
      TObjString *str = new TObjString;
      *str = it->c_str();
      array->Add( str );
   }
}

//------------------------------------------------------------------------------
void TSchemaRule::ProcessDeclaration( TObjArray* array, const TString& list )
{
   // Split the list as a declaration into as a TObjArray of TNamed(name,type).

   std::list<std::pair<ROOT::TSchemaType,std::string> >           elems;
   std::list<std::pair<ROOT::TSchemaType,std::string> >::iterator it;
   ROOT::TSchemaRuleProcessor::SplitDeclaration( (const char*)list, elems );

   array->Clear();

   if( elems.empty() )
      return;

   for( it = elems.begin(); it != elems.end(); ++it ) {
      TSources *type = new TSources( it->second.c_str(), it->first.fType.c_str(), it->first.fDimensions.c_str() ) ;
      array->Add( type );
   }
}

#if 0
//------------------------------------------------------------------------------
Bool_t TSchemaRule::GenerateFor( TStreamerInfo *info )
{
   // Generate the actual function for the rule.

   String funcname = fSourceClass + "_to_" + fTargetClass;
   if (info) funcname += "_v" + info->GetClassVersion();
   TString names = fSource + "_" + fTarget;
   name.ReplaceAll(',','_');
   name.ReplaceAll(':','_');
   funcname += "_" + name;

   String filename = funcname + ".C";
   if (!false) {
      filename += '+';
   }

   std::ofstream fileout(filename);


      ROOT::WriteReadRawRuleFunc( *rIt, 0, mappedname, nameTypeMap, fileout );
      ROOT::WriteReadRuleFunc( *rIt, 0, mappedname, nameTypeMap, fileout );

   gROOT->LoadMacro(filename);
}

#endif
 TSchemaRule.cxx:1
 TSchemaRule.cxx:2
 TSchemaRule.cxx:3
 TSchemaRule.cxx:4
 TSchemaRule.cxx:5
 TSchemaRule.cxx:6
 TSchemaRule.cxx:7
 TSchemaRule.cxx:8
 TSchemaRule.cxx:9
 TSchemaRule.cxx:10
 TSchemaRule.cxx:11
 TSchemaRule.cxx:12
 TSchemaRule.cxx:13
 TSchemaRule.cxx:14
 TSchemaRule.cxx:15
 TSchemaRule.cxx:16
 TSchemaRule.cxx:17
 TSchemaRule.cxx:18
 TSchemaRule.cxx:19
 TSchemaRule.cxx:20
 TSchemaRule.cxx:21
 TSchemaRule.cxx:22
 TSchemaRule.cxx:23
 TSchemaRule.cxx:24
 TSchemaRule.cxx:25
 TSchemaRule.cxx:26
 TSchemaRule.cxx:27
 TSchemaRule.cxx:28
 TSchemaRule.cxx:29
 TSchemaRule.cxx:30
 TSchemaRule.cxx:31
 TSchemaRule.cxx:32
 TSchemaRule.cxx:33
 TSchemaRule.cxx:34
 TSchemaRule.cxx:35
 TSchemaRule.cxx:36
 TSchemaRule.cxx:37
 TSchemaRule.cxx:38
 TSchemaRule.cxx:39
 TSchemaRule.cxx:40
 TSchemaRule.cxx:41
 TSchemaRule.cxx:42
 TSchemaRule.cxx:43
 TSchemaRule.cxx:44
 TSchemaRule.cxx:45
 TSchemaRule.cxx:46
 TSchemaRule.cxx:47
 TSchemaRule.cxx:48
 TSchemaRule.cxx:49
 TSchemaRule.cxx:50
 TSchemaRule.cxx:51
 TSchemaRule.cxx:52
 TSchemaRule.cxx:53
 TSchemaRule.cxx:54
 TSchemaRule.cxx:55
 TSchemaRule.cxx:56
 TSchemaRule.cxx:57
 TSchemaRule.cxx:58
 TSchemaRule.cxx:59
 TSchemaRule.cxx:60
 TSchemaRule.cxx:61
 TSchemaRule.cxx:62
 TSchemaRule.cxx:63
 TSchemaRule.cxx:64
 TSchemaRule.cxx:65
 TSchemaRule.cxx:66
 TSchemaRule.cxx:67
 TSchemaRule.cxx:68
 TSchemaRule.cxx:69
 TSchemaRule.cxx:70
 TSchemaRule.cxx:71
 TSchemaRule.cxx:72
 TSchemaRule.cxx:73
 TSchemaRule.cxx:74
 TSchemaRule.cxx:75
 TSchemaRule.cxx:76
 TSchemaRule.cxx:77
 TSchemaRule.cxx:78
 TSchemaRule.cxx:79
 TSchemaRule.cxx:80
 TSchemaRule.cxx:81
 TSchemaRule.cxx:82
 TSchemaRule.cxx:83
 TSchemaRule.cxx:84
 TSchemaRule.cxx:85
 TSchemaRule.cxx:86
 TSchemaRule.cxx:87
 TSchemaRule.cxx:88
 TSchemaRule.cxx:89
 TSchemaRule.cxx:90
 TSchemaRule.cxx:91
 TSchemaRule.cxx:92
 TSchemaRule.cxx:93
 TSchemaRule.cxx:94
 TSchemaRule.cxx:95
 TSchemaRule.cxx:96
 TSchemaRule.cxx:97
 TSchemaRule.cxx:98
 TSchemaRule.cxx:99
 TSchemaRule.cxx:100
 TSchemaRule.cxx:101
 TSchemaRule.cxx:102
 TSchemaRule.cxx:103
 TSchemaRule.cxx:104
 TSchemaRule.cxx:105
 TSchemaRule.cxx:106
 TSchemaRule.cxx:107
 TSchemaRule.cxx:108
 TSchemaRule.cxx:109
 TSchemaRule.cxx:110
 TSchemaRule.cxx:111
 TSchemaRule.cxx:112
 TSchemaRule.cxx:113
 TSchemaRule.cxx:114
 TSchemaRule.cxx:115
 TSchemaRule.cxx:116
 TSchemaRule.cxx:117
 TSchemaRule.cxx:118
 TSchemaRule.cxx:119
 TSchemaRule.cxx:120
 TSchemaRule.cxx:121
 TSchemaRule.cxx:122
 TSchemaRule.cxx:123
 TSchemaRule.cxx:124
 TSchemaRule.cxx:125
 TSchemaRule.cxx:126
 TSchemaRule.cxx:127
 TSchemaRule.cxx:128
 TSchemaRule.cxx:129
 TSchemaRule.cxx:130
 TSchemaRule.cxx:131
 TSchemaRule.cxx:132
 TSchemaRule.cxx:133
 TSchemaRule.cxx:134
 TSchemaRule.cxx:135
 TSchemaRule.cxx:136
 TSchemaRule.cxx:137
 TSchemaRule.cxx:138
 TSchemaRule.cxx:139
 TSchemaRule.cxx:140
 TSchemaRule.cxx:141
 TSchemaRule.cxx:142
 TSchemaRule.cxx:143
 TSchemaRule.cxx:144
 TSchemaRule.cxx:145
 TSchemaRule.cxx:146
 TSchemaRule.cxx:147
 TSchemaRule.cxx:148
 TSchemaRule.cxx:149
 TSchemaRule.cxx:150
 TSchemaRule.cxx:151
 TSchemaRule.cxx:152
 TSchemaRule.cxx:153
 TSchemaRule.cxx:154
 TSchemaRule.cxx:155
 TSchemaRule.cxx:156
 TSchemaRule.cxx:157
 TSchemaRule.cxx:158
 TSchemaRule.cxx:159
 TSchemaRule.cxx:160
 TSchemaRule.cxx:161
 TSchemaRule.cxx:162
 TSchemaRule.cxx:163
 TSchemaRule.cxx:164
 TSchemaRule.cxx:165
 TSchemaRule.cxx:166
 TSchemaRule.cxx:167
 TSchemaRule.cxx:168
 TSchemaRule.cxx:169
 TSchemaRule.cxx:170
 TSchemaRule.cxx:171
 TSchemaRule.cxx:172
 TSchemaRule.cxx:173
 TSchemaRule.cxx:174
 TSchemaRule.cxx:175
 TSchemaRule.cxx:176
 TSchemaRule.cxx:177
 TSchemaRule.cxx:178
 TSchemaRule.cxx:179
 TSchemaRule.cxx:180
 TSchemaRule.cxx:181
 TSchemaRule.cxx:182
 TSchemaRule.cxx:183
 TSchemaRule.cxx:184
 TSchemaRule.cxx:185
 TSchemaRule.cxx:186
 TSchemaRule.cxx:187
 TSchemaRule.cxx:188
 TSchemaRule.cxx:189
 TSchemaRule.cxx:190
 TSchemaRule.cxx:191
 TSchemaRule.cxx:192
 TSchemaRule.cxx:193
 TSchemaRule.cxx:194
 TSchemaRule.cxx:195
 TSchemaRule.cxx:196
 TSchemaRule.cxx:197
 TSchemaRule.cxx:198
 TSchemaRule.cxx:199
 TSchemaRule.cxx:200
 TSchemaRule.cxx:201
 TSchemaRule.cxx:202
 TSchemaRule.cxx:203
 TSchemaRule.cxx:204
 TSchemaRule.cxx:205
 TSchemaRule.cxx:206
 TSchemaRule.cxx:207
 TSchemaRule.cxx:208
 TSchemaRule.cxx:209
 TSchemaRule.cxx:210
 TSchemaRule.cxx:211
 TSchemaRule.cxx:212
 TSchemaRule.cxx:213
 TSchemaRule.cxx:214
 TSchemaRule.cxx:215
 TSchemaRule.cxx:216
 TSchemaRule.cxx:217
 TSchemaRule.cxx:218
 TSchemaRule.cxx:219
 TSchemaRule.cxx:220
 TSchemaRule.cxx:221
 TSchemaRule.cxx:222
 TSchemaRule.cxx:223
 TSchemaRule.cxx:224
 TSchemaRule.cxx:225
 TSchemaRule.cxx:226
 TSchemaRule.cxx:227
 TSchemaRule.cxx:228
 TSchemaRule.cxx:229
 TSchemaRule.cxx:230
 TSchemaRule.cxx:231
 TSchemaRule.cxx:232
 TSchemaRule.cxx:233
 TSchemaRule.cxx:234
 TSchemaRule.cxx:235
 TSchemaRule.cxx:236
 TSchemaRule.cxx:237
 TSchemaRule.cxx:238
 TSchemaRule.cxx:239
 TSchemaRule.cxx:240
 TSchemaRule.cxx:241
 TSchemaRule.cxx:242
 TSchemaRule.cxx:243
 TSchemaRule.cxx:244
 TSchemaRule.cxx:245
 TSchemaRule.cxx:246
 TSchemaRule.cxx:247
 TSchemaRule.cxx:248
 TSchemaRule.cxx:249
 TSchemaRule.cxx:250
 TSchemaRule.cxx:251
 TSchemaRule.cxx:252
 TSchemaRule.cxx:253
 TSchemaRule.cxx:254
 TSchemaRule.cxx:255
 TSchemaRule.cxx:256
 TSchemaRule.cxx:257
 TSchemaRule.cxx:258
 TSchemaRule.cxx:259
 TSchemaRule.cxx:260
 TSchemaRule.cxx:261
 TSchemaRule.cxx:262
 TSchemaRule.cxx:263
 TSchemaRule.cxx:264
 TSchemaRule.cxx:265
 TSchemaRule.cxx:266
 TSchemaRule.cxx:267
 TSchemaRule.cxx:268
 TSchemaRule.cxx:269
 TSchemaRule.cxx:270
 TSchemaRule.cxx:271
 TSchemaRule.cxx:272
 TSchemaRule.cxx:273
 TSchemaRule.cxx:274
 TSchemaRule.cxx:275
 TSchemaRule.cxx:276
 TSchemaRule.cxx:277
 TSchemaRule.cxx:278
 TSchemaRule.cxx:279
 TSchemaRule.cxx:280
 TSchemaRule.cxx:281
 TSchemaRule.cxx:282
 TSchemaRule.cxx:283
 TSchemaRule.cxx:284
 TSchemaRule.cxx:285
 TSchemaRule.cxx:286
 TSchemaRule.cxx:287
 TSchemaRule.cxx:288
 TSchemaRule.cxx:289
 TSchemaRule.cxx:290
 TSchemaRule.cxx:291
 TSchemaRule.cxx:292
 TSchemaRule.cxx:293
 TSchemaRule.cxx:294
 TSchemaRule.cxx:295
 TSchemaRule.cxx:296
 TSchemaRule.cxx:297
 TSchemaRule.cxx:298
 TSchemaRule.cxx:299
 TSchemaRule.cxx:300
 TSchemaRule.cxx:301
 TSchemaRule.cxx:302
 TSchemaRule.cxx:303
 TSchemaRule.cxx:304
 TSchemaRule.cxx:305
 TSchemaRule.cxx:306
 TSchemaRule.cxx:307
 TSchemaRule.cxx:308
 TSchemaRule.cxx:309
 TSchemaRule.cxx:310
 TSchemaRule.cxx:311
 TSchemaRule.cxx:312
 TSchemaRule.cxx:313
 TSchemaRule.cxx:314
 TSchemaRule.cxx:315
 TSchemaRule.cxx:316
 TSchemaRule.cxx:317
 TSchemaRule.cxx:318
 TSchemaRule.cxx:319
 TSchemaRule.cxx:320
 TSchemaRule.cxx:321
 TSchemaRule.cxx:322
 TSchemaRule.cxx:323
 TSchemaRule.cxx:324
 TSchemaRule.cxx:325
 TSchemaRule.cxx:326
 TSchemaRule.cxx:327
 TSchemaRule.cxx:328
 TSchemaRule.cxx:329
 TSchemaRule.cxx:330
 TSchemaRule.cxx:331
 TSchemaRule.cxx:332
 TSchemaRule.cxx:333
 TSchemaRule.cxx:334
 TSchemaRule.cxx:335
 TSchemaRule.cxx:336
 TSchemaRule.cxx:337
 TSchemaRule.cxx:338
 TSchemaRule.cxx:339
 TSchemaRule.cxx:340
 TSchemaRule.cxx:341
 TSchemaRule.cxx:342
 TSchemaRule.cxx:343
 TSchemaRule.cxx:344
 TSchemaRule.cxx:345
 TSchemaRule.cxx:346
 TSchemaRule.cxx:347
 TSchemaRule.cxx:348
 TSchemaRule.cxx:349
 TSchemaRule.cxx:350
 TSchemaRule.cxx:351
 TSchemaRule.cxx:352
 TSchemaRule.cxx:353
 TSchemaRule.cxx:354
 TSchemaRule.cxx:355
 TSchemaRule.cxx:356
 TSchemaRule.cxx:357
 TSchemaRule.cxx:358
 TSchemaRule.cxx:359
 TSchemaRule.cxx:360
 TSchemaRule.cxx:361
 TSchemaRule.cxx:362
 TSchemaRule.cxx:363
 TSchemaRule.cxx:364
 TSchemaRule.cxx:365
 TSchemaRule.cxx:366
 TSchemaRule.cxx:367
 TSchemaRule.cxx:368
 TSchemaRule.cxx:369
 TSchemaRule.cxx:370
 TSchemaRule.cxx:371
 TSchemaRule.cxx:372
 TSchemaRule.cxx:373
 TSchemaRule.cxx:374
 TSchemaRule.cxx:375
 TSchemaRule.cxx:376
 TSchemaRule.cxx:377
 TSchemaRule.cxx:378
 TSchemaRule.cxx:379
 TSchemaRule.cxx:380
 TSchemaRule.cxx:381
 TSchemaRule.cxx:382
 TSchemaRule.cxx:383
 TSchemaRule.cxx:384
 TSchemaRule.cxx:385
 TSchemaRule.cxx:386
 TSchemaRule.cxx:387
 TSchemaRule.cxx:388
 TSchemaRule.cxx:389
 TSchemaRule.cxx:390
 TSchemaRule.cxx:391
 TSchemaRule.cxx:392
 TSchemaRule.cxx:393
 TSchemaRule.cxx:394
 TSchemaRule.cxx:395
 TSchemaRule.cxx:396
 TSchemaRule.cxx:397
 TSchemaRule.cxx:398
 TSchemaRule.cxx:399
 TSchemaRule.cxx:400
 TSchemaRule.cxx:401
 TSchemaRule.cxx:402
 TSchemaRule.cxx:403
 TSchemaRule.cxx:404
 TSchemaRule.cxx:405
 TSchemaRule.cxx:406
 TSchemaRule.cxx:407
 TSchemaRule.cxx:408
 TSchemaRule.cxx:409
 TSchemaRule.cxx:410
 TSchemaRule.cxx:411
 TSchemaRule.cxx:412
 TSchemaRule.cxx:413
 TSchemaRule.cxx:414
 TSchemaRule.cxx:415
 TSchemaRule.cxx:416
 TSchemaRule.cxx:417
 TSchemaRule.cxx:418
 TSchemaRule.cxx:419
 TSchemaRule.cxx:420
 TSchemaRule.cxx:421
 TSchemaRule.cxx:422
 TSchemaRule.cxx:423
 TSchemaRule.cxx:424
 TSchemaRule.cxx:425
 TSchemaRule.cxx:426
 TSchemaRule.cxx:427
 TSchemaRule.cxx:428
 TSchemaRule.cxx:429
 TSchemaRule.cxx:430
 TSchemaRule.cxx:431
 TSchemaRule.cxx:432
 TSchemaRule.cxx:433
 TSchemaRule.cxx:434
 TSchemaRule.cxx:435
 TSchemaRule.cxx:436
 TSchemaRule.cxx:437
 TSchemaRule.cxx:438
 TSchemaRule.cxx:439
 TSchemaRule.cxx:440
 TSchemaRule.cxx:441
 TSchemaRule.cxx:442
 TSchemaRule.cxx:443
 TSchemaRule.cxx:444
 TSchemaRule.cxx:445
 TSchemaRule.cxx:446
 TSchemaRule.cxx:447
 TSchemaRule.cxx:448
 TSchemaRule.cxx:449
 TSchemaRule.cxx:450
 TSchemaRule.cxx:451
 TSchemaRule.cxx:452
 TSchemaRule.cxx:453
 TSchemaRule.cxx:454
 TSchemaRule.cxx:455
 TSchemaRule.cxx:456
 TSchemaRule.cxx:457
 TSchemaRule.cxx:458
 TSchemaRule.cxx:459
 TSchemaRule.cxx:460
 TSchemaRule.cxx:461
 TSchemaRule.cxx:462
 TSchemaRule.cxx:463
 TSchemaRule.cxx:464
 TSchemaRule.cxx:465
 TSchemaRule.cxx:466
 TSchemaRule.cxx:467
 TSchemaRule.cxx:468
 TSchemaRule.cxx:469
 TSchemaRule.cxx:470
 TSchemaRule.cxx:471
 TSchemaRule.cxx:472
 TSchemaRule.cxx:473
 TSchemaRule.cxx:474
 TSchemaRule.cxx:475
 TSchemaRule.cxx:476
 TSchemaRule.cxx:477
 TSchemaRule.cxx:478
 TSchemaRule.cxx:479
 TSchemaRule.cxx:480
 TSchemaRule.cxx:481
 TSchemaRule.cxx:482
 TSchemaRule.cxx:483
 TSchemaRule.cxx:484
 TSchemaRule.cxx:485
 TSchemaRule.cxx:486
 TSchemaRule.cxx:487
 TSchemaRule.cxx:488
 TSchemaRule.cxx:489
 TSchemaRule.cxx:490
 TSchemaRule.cxx:491
 TSchemaRule.cxx:492
 TSchemaRule.cxx:493
 TSchemaRule.cxx:494
 TSchemaRule.cxx:495
 TSchemaRule.cxx:496
 TSchemaRule.cxx:497
 TSchemaRule.cxx:498
 TSchemaRule.cxx:499
 TSchemaRule.cxx:500
 TSchemaRule.cxx:501
 TSchemaRule.cxx:502
 TSchemaRule.cxx:503
 TSchemaRule.cxx:504
 TSchemaRule.cxx:505
 TSchemaRule.cxx:506
 TSchemaRule.cxx:507
 TSchemaRule.cxx:508
 TSchemaRule.cxx:509
 TSchemaRule.cxx:510
 TSchemaRule.cxx:511
 TSchemaRule.cxx:512
 TSchemaRule.cxx:513
 TSchemaRule.cxx:514
 TSchemaRule.cxx:515
 TSchemaRule.cxx:516
 TSchemaRule.cxx:517
 TSchemaRule.cxx:518
 TSchemaRule.cxx:519
 TSchemaRule.cxx:520
 TSchemaRule.cxx:521
 TSchemaRule.cxx:522
 TSchemaRule.cxx:523
 TSchemaRule.cxx:524
 TSchemaRule.cxx:525
 TSchemaRule.cxx:526
 TSchemaRule.cxx:527
 TSchemaRule.cxx:528
 TSchemaRule.cxx:529
 TSchemaRule.cxx:530
 TSchemaRule.cxx:531
 TSchemaRule.cxx:532
 TSchemaRule.cxx:533
 TSchemaRule.cxx:534
 TSchemaRule.cxx:535
 TSchemaRule.cxx:536
 TSchemaRule.cxx:537
 TSchemaRule.cxx:538
 TSchemaRule.cxx:539
 TSchemaRule.cxx:540
 TSchemaRule.cxx:541
 TSchemaRule.cxx:542
 TSchemaRule.cxx:543
 TSchemaRule.cxx:544
 TSchemaRule.cxx:545
 TSchemaRule.cxx:546
 TSchemaRule.cxx:547
 TSchemaRule.cxx:548
 TSchemaRule.cxx:549
 TSchemaRule.cxx:550
 TSchemaRule.cxx:551
 TSchemaRule.cxx:552
 TSchemaRule.cxx:553
 TSchemaRule.cxx:554
 TSchemaRule.cxx:555
 TSchemaRule.cxx:556
 TSchemaRule.cxx:557
 TSchemaRule.cxx:558
 TSchemaRule.cxx:559
 TSchemaRule.cxx:560
 TSchemaRule.cxx:561
 TSchemaRule.cxx:562
 TSchemaRule.cxx:563
 TSchemaRule.cxx:564
 TSchemaRule.cxx:565
 TSchemaRule.cxx:566
 TSchemaRule.cxx:567
 TSchemaRule.cxx:568
 TSchemaRule.cxx:569
 TSchemaRule.cxx:570
 TSchemaRule.cxx:571
 TSchemaRule.cxx:572
 TSchemaRule.cxx:573
 TSchemaRule.cxx:574
 TSchemaRule.cxx:575
 TSchemaRule.cxx:576
 TSchemaRule.cxx:577
 TSchemaRule.cxx:578
 TSchemaRule.cxx:579
 TSchemaRule.cxx:580
 TSchemaRule.cxx:581
 TSchemaRule.cxx:582
 TSchemaRule.cxx:583
 TSchemaRule.cxx:584
 TSchemaRule.cxx:585
 TSchemaRule.cxx:586
 TSchemaRule.cxx:587
 TSchemaRule.cxx:588
 TSchemaRule.cxx:589
 TSchemaRule.cxx:590
 TSchemaRule.cxx:591
 TSchemaRule.cxx:592
 TSchemaRule.cxx:593
 TSchemaRule.cxx:594
 TSchemaRule.cxx:595
 TSchemaRule.cxx:596
 TSchemaRule.cxx:597
 TSchemaRule.cxx:598
 TSchemaRule.cxx:599
 TSchemaRule.cxx:600
 TSchemaRule.cxx:601
 TSchemaRule.cxx:602
 TSchemaRule.cxx:603
 TSchemaRule.cxx:604
 TSchemaRule.cxx:605
 TSchemaRule.cxx:606
 TSchemaRule.cxx:607
 TSchemaRule.cxx:608
 TSchemaRule.cxx:609
 TSchemaRule.cxx:610
 TSchemaRule.cxx:611
 TSchemaRule.cxx:612
 TSchemaRule.cxx:613
 TSchemaRule.cxx:614
 TSchemaRule.cxx:615
 TSchemaRule.cxx:616
 TSchemaRule.cxx:617
 TSchemaRule.cxx:618
 TSchemaRule.cxx:619
 TSchemaRule.cxx:620
 TSchemaRule.cxx:621
 TSchemaRule.cxx:622
 TSchemaRule.cxx:623
 TSchemaRule.cxx:624
 TSchemaRule.cxx:625
 TSchemaRule.cxx:626
 TSchemaRule.cxx:627
 TSchemaRule.cxx:628
 TSchemaRule.cxx:629
 TSchemaRule.cxx:630
 TSchemaRule.cxx:631
 TSchemaRule.cxx:632
 TSchemaRule.cxx:633
 TSchemaRule.cxx:634
 TSchemaRule.cxx:635
 TSchemaRule.cxx:636
 TSchemaRule.cxx:637
 TSchemaRule.cxx:638
 TSchemaRule.cxx:639
 TSchemaRule.cxx:640
 TSchemaRule.cxx:641
 TSchemaRule.cxx:642
 TSchemaRule.cxx:643
 TSchemaRule.cxx:644
 TSchemaRule.cxx:645
 TSchemaRule.cxx:646
 TSchemaRule.cxx:647
 TSchemaRule.cxx:648
 TSchemaRule.cxx:649
 TSchemaRule.cxx:650
 TSchemaRule.cxx:651
 TSchemaRule.cxx:652
 TSchemaRule.cxx:653
 TSchemaRule.cxx:654
 TSchemaRule.cxx:655
 TSchemaRule.cxx:656
 TSchemaRule.cxx:657
 TSchemaRule.cxx:658
 TSchemaRule.cxx:659
 TSchemaRule.cxx:660
 TSchemaRule.cxx:661
 TSchemaRule.cxx:662
 TSchemaRule.cxx:663
 TSchemaRule.cxx:664
 TSchemaRule.cxx:665
 TSchemaRule.cxx:666
 TSchemaRule.cxx:667
 TSchemaRule.cxx:668
 TSchemaRule.cxx:669
 TSchemaRule.cxx:670
 TSchemaRule.cxx:671
 TSchemaRule.cxx:672
 TSchemaRule.cxx:673
 TSchemaRule.cxx:674
 TSchemaRule.cxx:675
 TSchemaRule.cxx:676
 TSchemaRule.cxx:677
 TSchemaRule.cxx:678
 TSchemaRule.cxx:679
 TSchemaRule.cxx:680
 TSchemaRule.cxx:681
 TSchemaRule.cxx:682
 TSchemaRule.cxx:683
 TSchemaRule.cxx:684
 TSchemaRule.cxx:685
 TSchemaRule.cxx:686
 TSchemaRule.cxx:687
 TSchemaRule.cxx:688
 TSchemaRule.cxx:689
 TSchemaRule.cxx:690
 TSchemaRule.cxx:691
 TSchemaRule.cxx:692
 TSchemaRule.cxx:693
 TSchemaRule.cxx:694
 TSchemaRule.cxx:695
 TSchemaRule.cxx:696
 TSchemaRule.cxx:697
 TSchemaRule.cxx:698
 TSchemaRule.cxx:699
 TSchemaRule.cxx:700
 TSchemaRule.cxx:701
 TSchemaRule.cxx:702
 TSchemaRule.cxx:703
 TSchemaRule.cxx:704
 TSchemaRule.cxx:705
 TSchemaRule.cxx:706
 TSchemaRule.cxx:707
 TSchemaRule.cxx:708
 TSchemaRule.cxx:709
 TSchemaRule.cxx:710
 TSchemaRule.cxx:711
 TSchemaRule.cxx:712
 TSchemaRule.cxx:713
 TSchemaRule.cxx:714
 TSchemaRule.cxx:715
 TSchemaRule.cxx:716
 TSchemaRule.cxx:717
 TSchemaRule.cxx:718
 TSchemaRule.cxx:719
 TSchemaRule.cxx:720
 TSchemaRule.cxx:721
 TSchemaRule.cxx:722
 TSchemaRule.cxx:723
 TSchemaRule.cxx:724
 TSchemaRule.cxx:725
 TSchemaRule.cxx:726
 TSchemaRule.cxx:727
 TSchemaRule.cxx:728
 TSchemaRule.cxx:729
 TSchemaRule.cxx:730
 TSchemaRule.cxx:731
 TSchemaRule.cxx:732
 TSchemaRule.cxx:733
 TSchemaRule.cxx:734
 TSchemaRule.cxx:735
 TSchemaRule.cxx:736
 TSchemaRule.cxx:737
 TSchemaRule.cxx:738
 TSchemaRule.cxx:739
 TSchemaRule.cxx:740
 TSchemaRule.cxx:741
 TSchemaRule.cxx:742
 TSchemaRule.cxx:743
 TSchemaRule.cxx:744
 TSchemaRule.cxx:745
 TSchemaRule.cxx:746
 TSchemaRule.cxx:747
 TSchemaRule.cxx:748
 TSchemaRule.cxx:749
 TSchemaRule.cxx:750
 TSchemaRule.cxx:751
 TSchemaRule.cxx:752
 TSchemaRule.cxx:753
 TSchemaRule.cxx:754
 TSchemaRule.cxx:755
 TSchemaRule.cxx:756
 TSchemaRule.cxx:757
 TSchemaRule.cxx:758
 TSchemaRule.cxx:759
 TSchemaRule.cxx:760
 TSchemaRule.cxx:761
 TSchemaRule.cxx:762
 TSchemaRule.cxx:763
 TSchemaRule.cxx:764
 TSchemaRule.cxx:765
 TSchemaRule.cxx:766
 TSchemaRule.cxx:767
 TSchemaRule.cxx:768
 TSchemaRule.cxx:769
 TSchemaRule.cxx:770
 TSchemaRule.cxx:771
 TSchemaRule.cxx:772
 TSchemaRule.cxx:773
 TSchemaRule.cxx:774
 TSchemaRule.cxx:775
 TSchemaRule.cxx:776
 TSchemaRule.cxx:777
 TSchemaRule.cxx:778
 TSchemaRule.cxx:779
 TSchemaRule.cxx:780
 TSchemaRule.cxx:781
 TSchemaRule.cxx:782
 TSchemaRule.cxx:783
 TSchemaRule.cxx:784
 TSchemaRule.cxx:785
 TSchemaRule.cxx:786
 TSchemaRule.cxx:787
 TSchemaRule.cxx:788
 TSchemaRule.cxx:789
 TSchemaRule.cxx:790
 TSchemaRule.cxx:791
 TSchemaRule.cxx:792
 TSchemaRule.cxx:793
 TSchemaRule.cxx:794
 TSchemaRule.cxx:795
 TSchemaRule.cxx:796
 TSchemaRule.cxx:797
 TSchemaRule.cxx:798
 TSchemaRule.cxx:799
 TSchemaRule.cxx:800
 TSchemaRule.cxx:801
 TSchemaRule.cxx:802
 TSchemaRule.cxx:803
 TSchemaRule.cxx:804
 TSchemaRule.cxx:805
 TSchemaRule.cxx:806
 TSchemaRule.cxx:807
 TSchemaRule.cxx:808
 TSchemaRule.cxx:809
 TSchemaRule.cxx:810
 TSchemaRule.cxx:811
 TSchemaRule.cxx:812
 TSchemaRule.cxx:813
 TSchemaRule.cxx:814
 TSchemaRule.cxx:815
 TSchemaRule.cxx:816
 TSchemaRule.cxx:817
 TSchemaRule.cxx:818
 TSchemaRule.cxx:819
 TSchemaRule.cxx:820
 TSchemaRule.cxx:821
 TSchemaRule.cxx:822
 TSchemaRule.cxx:823
 TSchemaRule.cxx:824
 TSchemaRule.cxx:825
 TSchemaRule.cxx:826
 TSchemaRule.cxx:827
 TSchemaRule.cxx:828
 TSchemaRule.cxx:829
 TSchemaRule.cxx:830
 TSchemaRule.cxx:831
 TSchemaRule.cxx:832
 TSchemaRule.cxx:833
 TSchemaRule.cxx:834
 TSchemaRule.cxx:835
 TSchemaRule.cxx:836
 TSchemaRule.cxx:837
 TSchemaRule.cxx:838
 TSchemaRule.cxx:839
 TSchemaRule.cxx:840
 TSchemaRule.cxx:841
 TSchemaRule.cxx:842
 TSchemaRule.cxx:843
 TSchemaRule.cxx:844
 TSchemaRule.cxx:845
 TSchemaRule.cxx:846
 TSchemaRule.cxx:847
 TSchemaRule.cxx:848
 TSchemaRule.cxx:849
 TSchemaRule.cxx:850
 TSchemaRule.cxx:851
 TSchemaRule.cxx:852
 TSchemaRule.cxx:853
 TSchemaRule.cxx:854
 TSchemaRule.cxx:855
 TSchemaRule.cxx:856
 TSchemaRule.cxx:857
 TSchemaRule.cxx:858
 TSchemaRule.cxx:859
 TSchemaRule.cxx:860
 TSchemaRule.cxx:861
 TSchemaRule.cxx:862
 TSchemaRule.cxx:863
 TSchemaRule.cxx:864
 TSchemaRule.cxx:865
 TSchemaRule.cxx:866
 TSchemaRule.cxx:867
 TSchemaRule.cxx:868
 TSchemaRule.cxx:869
 TSchemaRule.cxx:870
 TSchemaRule.cxx:871
 TSchemaRule.cxx:872
 TSchemaRule.cxx:873
 TSchemaRule.cxx:874
 TSchemaRule.cxx:875
 TSchemaRule.cxx:876
 TSchemaRule.cxx:877
 TSchemaRule.cxx:878
 TSchemaRule.cxx:879
 TSchemaRule.cxx:880
 TSchemaRule.cxx:881
 TSchemaRule.cxx:882
 TSchemaRule.cxx:883
 TSchemaRule.cxx:884
 TSchemaRule.cxx:885
 TSchemaRule.cxx:886
 TSchemaRule.cxx:887
 TSchemaRule.cxx:888
 TSchemaRule.cxx:889
 TSchemaRule.cxx:890
 TSchemaRule.cxx:891
 TSchemaRule.cxx:892
 TSchemaRule.cxx:893
 TSchemaRule.cxx:894
 TSchemaRule.cxx:895
 TSchemaRule.cxx:896
 TSchemaRule.cxx:897
 TSchemaRule.cxx:898
 TSchemaRule.cxx:899
 TSchemaRule.cxx:900
 TSchemaRule.cxx:901
 TSchemaRule.cxx:902
 TSchemaRule.cxx:903
 TSchemaRule.cxx:904
 TSchemaRule.cxx:905
 TSchemaRule.cxx:906
 TSchemaRule.cxx:907
 TSchemaRule.cxx:908
 TSchemaRule.cxx:909
 TSchemaRule.cxx:910
 TSchemaRule.cxx:911
 TSchemaRule.cxx:912
 TSchemaRule.cxx:913
 TSchemaRule.cxx:914
 TSchemaRule.cxx:915
 TSchemaRule.cxx:916
 TSchemaRule.cxx:917
 TSchemaRule.cxx:918
 TSchemaRule.cxx:919
 TSchemaRule.cxx:920
 TSchemaRule.cxx:921
 TSchemaRule.cxx:922
 TSchemaRule.cxx:923
 TSchemaRule.cxx:924
 TSchemaRule.cxx:925
 TSchemaRule.cxx:926
 TSchemaRule.cxx:927
 TSchemaRule.cxx:928
 TSchemaRule.cxx:929
 TSchemaRule.cxx:930
 TSchemaRule.cxx:931
 TSchemaRule.cxx:932
 TSchemaRule.cxx:933
 TSchemaRule.cxx:934
 TSchemaRule.cxx:935
 TSchemaRule.cxx:936
 TSchemaRule.cxx:937
 TSchemaRule.cxx:938
 TSchemaRule.cxx:939
 TSchemaRule.cxx:940
 TSchemaRule.cxx:941
 TSchemaRule.cxx:942
 TSchemaRule.cxx:943
 TSchemaRule.cxx:944
 TSchemaRule.cxx:945
 TSchemaRule.cxx:946
 TSchemaRule.cxx:947
 TSchemaRule.cxx:948
 TSchemaRule.cxx:949
 TSchemaRule.cxx:950
 TSchemaRule.cxx:951
 TSchemaRule.cxx:952
 TSchemaRule.cxx:953
 TSchemaRule.cxx:954
 TSchemaRule.cxx:955
 TSchemaRule.cxx:956
 TSchemaRule.cxx:957
 TSchemaRule.cxx:958
 TSchemaRule.cxx:959
 TSchemaRule.cxx:960
 TSchemaRule.cxx:961
 TSchemaRule.cxx:962
 TSchemaRule.cxx:963
 TSchemaRule.cxx:964
 TSchemaRule.cxx:965
 TSchemaRule.cxx:966
 TSchemaRule.cxx:967
 TSchemaRule.cxx:968
 TSchemaRule.cxx:969
 TSchemaRule.cxx:970
 TSchemaRule.cxx:971
 TSchemaRule.cxx:972
 TSchemaRule.cxx:973
 TSchemaRule.cxx:974
 TSchemaRule.cxx:975
 TSchemaRule.cxx:976
 TSchemaRule.cxx:977