Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

Tokenizer.cpp

Go to the documentation of this file.
00001 // $Header: /nfs/slac/g/glast/ground/cvs/GaudiKernel/src/Lib/Tokenizer.cpp,v 1.1.1.1 2001/04/18 18:14:18 tlindner Exp $
00002 //==============================================================================
00003 // Tokenizer.h
00004 //------------------------------------------------------------------------------
00005 //
00006 // Package : Kernel
00007 //             The LHCb definition package
00008 //
00009 // Author  : M.Frank
00010 //
00011 // Changes : M.Frank ,  01/10/00: Initiali version
00012 //
00013 //==============================================================================
00014 #define KERNEL_TOKENIZER_CPP
00015 #include "GaudiKernel/Tokenizer.h"
00016 
00017 // Assignment operator
00018 Tokenizer::Token& Tokenizer::Token::operator=(const Token& copy)     {
00019   m_length=copy.m_length;
00020   m_tag=copy.m_tag;
00021   m_value=copy.m_value;
00022   return *this;
00023 }
00024 
00025 // Create tokens from string
00026 void Tokenizer::analyse(const std::string& s, const char* delim, const char* tagBegin, const char* tagEnd, const char* eq, const char* valBegin, const char* valEnd)    {
00027   m_tokens.erase(m_tokens.begin(), m_tokens.end());
00028   if ( valEnd == 0 ) valEnd = valBegin;
00029   long start = 0;
00030   Token tok;
00031   do {
00032     tok.make(s, start, delim, tagBegin, tagEnd, eq, valBegin, valEnd);
00033     if ( tok.length() > 0 )   {
00034       start += tok.length();
00035       m_tokens.push_back(tok);
00036     }
00037     else  { 
00038       start += s.length();
00039     }
00040   } while ( start < long(s.length()) );
00041 }
00042 
00043 // Create token from string
00044 void Tokenizer::Token::make(const std::string& s, long st, const char* delim, const char* tagBeg, const char* tagEnd, const char* eq, const char* valBeg, const char* valEnd)    {
00045   long lenTagBeg   = ::strlen(tagBeg);
00046   long lenTagEnd   = ::strlen(tagEnd);
00047   long lenValBeg   = ::strlen(valBeg);
00048   long lenValEnd   = ::strlen(valEnd);
00049   long lenDelim    = ::strlen(delim);
00050   long lenEq       = ::strlen(eq);
00051   long slen        = s.length();
00052   long start       = st;
00053   while(::strncmp(s.c_str()+start,delim,lenDelim)==0) start += lenDelim;
00054   long posTag      = (lenTagBeg>0) ? s.find(tagBeg, start) + lenTagBeg : start;
00055   long posDelim    = s.find(delim,posTag) > 0 ? s.find(delim,posTag) : slen;
00056   long posEq       = s.find(eq, posTag)   > 0 ? s.find(eq, posTag) : posDelim-posTag;
00057   long lenTag      = (lenTagEnd>0)   ? s.find(tagEnd, posTag)-posTag : (posEq>0) ? (posEq>posTag) ? posEq-posTag : posDelim-posTag : posDelim;
00058   posEq            = s.find(eq, posTag+lenTag+lenTagEnd)+lenEq;
00059   long posVal      = (lenValBeg>0)   ? s.find(valBeg, posEq)+lenValBeg : posEq;
00060   posDelim         = (lenDelim>0)    ? s.find(delim, posVal+lenValBeg) : slen;
00061   long lenVal      = (lenValEnd>0)   ? s.find(valEnd, posVal)-posVal : ((posDelim>=0) ? posDelim : slen)-posVal;
00062 
00063   m_tag = m_value  = "";
00064   // Ooops: Valid tag found:
00065   if ( start  >= 0 && posTag >= 0 )   {
00066     m_tag    = s.substr(posTag, lenTag);
00067     m_length = posTag+m_tag.length()+lenTagEnd-st;
00068   }
00069   // Ooops: there is also a value:
00070   if ( posVal >= 0 && lenVal >= 0 )   {
00071     m_value  = s.substr(posVal, lenVal);
00072     m_length = posVal+m_value.length()+lenValEnd-st;
00073   }
00074   while(::strncmp(s.c_str()+start+m_length,delim,lenDelim)==0) m_length += lenDelim;
00075 }
00076 

Generated at Wed Nov 21 12:22:06 2001 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000