Tokenizer.cpp
Go to the documentation of this file.
1 //==============================================================================
2 // Tokenizer.h
3 //------------------------------------------------------------------------------
4 //
5 // Package : Kernel
6 // The LHCb definition package
7 //
8 // Author : M.Frank
9 //
10 // Changes : M.Frank , 01/10/00: Initiali version
11 //
12 //==============================================================================
13 #define KERNEL_TOKENIZER_CPP
14 #include "GaudiKernel/Tokenizer.h"
15 #include "GaudiKernel/Environment.h"
16 
17 #include <cstring>
18 
19 // Assignment operator
21  m_length=copy.m_length;
22  m_tag=copy.m_tag;
23  m_value=copy.m_value;
24  return *this;
25 }
26 
27 // Resolve value from environment
29  std::string res;
30  if ( System::resolveEnv(m_value, res).isSuccess() ) {
31  m_value = res;
32  }
33 }
34 
35 // Create tokens from string
36 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) {
37  m_tokens.clear();
38  if ( valEnd == 0 ) valEnd = valBegin;
39  long start = 0;
40  Token tok;
41  do {
42  tok.make(s, start, delim, tagBegin, tagEnd, eq, valBegin, valEnd);
43  if ( tok.length() > 0 ) {
44  start += tok.length();
45  m_tokens.push_back(tok);
46  }
47  else {
48  start += s.length();
49  }
50  } while ( start < long(s.length()) );
51  if ( m_resolve ) {
52  for(Items::iterator i=m_tokens.begin(); i != m_tokens.end(); ++i) {
53  (*i).resolveValue();
54  }
55  }
56 }
57 
58 // Create token from string
59 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) {
60  long lenTagBeg = ::strlen(tagBeg);
61  long lenTagEnd = ::strlen(tagEnd);
62  long lenValBeg = ::strlen(valBeg);
63  long lenValEnd = ::strlen(valEnd);
64  long lenDelim = ::strlen(delim);
65  long lenEq = ::strlen(eq);
66  long slen = s.length();
67  long start = st;
68  while(::strncmp(s.c_str()+start,delim,lenDelim)==0) start += lenDelim;
69  long posTag = (lenTagBeg>0) ? s.find(tagBeg, start) + lenTagBeg : start;
70  long posDelim = s.find(delim,posTag) > 0 ? s.find(delim,posTag) : slen;
71  long posEq = s.find(eq, posTag) > 0 ? s.find(eq, posTag) : posDelim-posTag;
72  long lenTag = (lenTagEnd>0) ? s.find(tagEnd, posTag)-posTag : (posEq>0) ? (posEq>posTag) ? posEq-posTag : posDelim-posTag : posDelim;
73  posEq = s.find(eq, posTag+lenTag+lenTagEnd)+lenEq;
74  long posVal = (lenValBeg>0) ? s.find(valBeg, posEq)+lenValBeg : posEq;
75  posDelim = (lenDelim>0) ? s.find(delim, posVal+lenValBeg) : slen;
76  long lenVal = (lenValEnd>0) ? s.find(valEnd, posVal)-posVal : ((posDelim>=0) ? posDelim : slen)-posVal;
77 
78  m_tag = m_value = "";
79  // Ooops: Valid tag found:
80  if ( start >= 0 && posTag >= 0 ) {
81  m_tag = s.substr(posTag, lenTag);
82  m_length = posTag+m_tag.length()+lenTagEnd-st;
83  }
84  // Ooops: there is also a value:
85  if ( posVal >= 0 && lenVal >= 0 ) {
86  m_value = s.substr(posVal, lenVal);
87  m_length = posVal+m_value.length()+lenValEnd-st;
88  }
89 
90  if (start + m_length >= long(s.size())) {
91  return;
92  }
93 
94  while(::strncmp(s.c_str()+start+m_length,delim,lenDelim)==0) {
95  m_length += lenDelim;
96  if (start + m_length >= long(s.size())) {
97  return;
98  }
99  }
100 }
101 
Token & operator=(const Token &copy)
Assignment operator.
Definition: Tokenizer.cpp:20
std::string m_value
Value variable.
Definition: Tokenizer.h:40
void resolveValue()
Resolve value from environment.
Definition: Tokenizer.cpp:28
Definition of the sub-class Token.
Definition: Tokenizer.h:34
long length() const
Total token length.
Definition: Tokenizer.h:60
void analyse(const std::string &s, const char *delim, const char *tagBegin, const char *tagEnd, const char *eq, const char *valBegin, const char *valEnd)
Analyse tokens from string.
Definition: Tokenizer.cpp:36
bool m_resolve
Flag to resolve environment.
Definition: Tokenizer.h:80
void make(const std::string &s, long st, const char *delim, const char *tagBegin, const char *tagEnd, const char *eq, const char *valBegin, const char *valEnd)
Create token from string.
Definition: Tokenizer.cpp:59
Items m_tokens
Assigned tokens within string.
Definition: Tokenizer.h:78
long m_length
Toke length.
Definition: Tokenizer.h:36
std::string m_tag
Tag variable.
Definition: Tokenizer.h:38
string s
Definition: gaudirun.py:244
list i
Definition: ana.py:128
GAUDI_API StatusCode resolveEnv(const std::string &var, std::string &res, int recusions=124)
Definition: Environment.cpp:51
tuple start
Definition: IOTest.py:88