Subversion Repositories public

Rev

Rev 45 | Rev 67 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 45 Rev 55
Line 18... Line 18...
18
 * please visit http://www.gnu.org/licenses/license-list.html.
18
 * please visit http://www.gnu.org/licenses/license-list.html.
19
 *
19
 *
20
 */
20
 */
21
21
22
22
23
#include "strtok.h"
23
#include <sstream>
24
24
25
typedef std::string::size_type SIZE;
25
#include "strtok.h"
26
26
27
StringTokenizer::StringTokenizer(const std::string& rStr, char cDelim)
27
StringTokenizer::StringTokenizer(const std::string& rStr, char cDelim, char cPrefix)
28
{
28
{
29
  m_str = rStr;
29
  m_str = rStr;
30
  m_cDelim = cDelim;
30
  m_cDelim = cDelim;
-
 
31
  m_cPrefix = cPrefix;
31
  m_pos = 0;
32
  m_pos = 0;
32
  m_len = rStr.length();
33
  m_len = rStr.length();
33
}
34
}
34
   
35
   
35
std::string StringTokenizer::GetNextToken()
36
std::string StringTokenizer::GetNextToken(bool fSkipEmpty)
-
 
37
{
-
 
38
  std::string s;
-
 
39
 
-
 
40
  do {
-
 
41
    _GetNextToken(s, true);
-
 
42
  } while (fSkipEmpty && s.empty() && m_pos < m_len);
-
 
43
 
-
 
44
  return s;
-
 
45
}
-
 
46
-
 
47
std::string StringTokenizer::GetNextTokenRaw(bool fSkipEmpty)
36
{
48
{
37
  std::string s;
49
  std::string s;
38
 
50
 
-
 
51
  do {
-
 
52
    _GetNextToken(s, false);
-
 
53
  } while (fSkipEmpty && s.empty() && m_pos < m_len);
-
 
54
 
-
 
55
  return s;
-
 
56
}
-
 
57
-
 
58
std::string StringTokenizer::GetRemainder()
-
 
59
{
-
 
60
  return  m_cPrefix == '\0'
-
 
61
      ?   m_str.substr(m_pos)
-
 
62
      :   StripPrefix(m_str.c_str() + m_pos, m_len - m_pos);
-
 
63
}
-
 
64
-
 
65
std::string StringTokenizer::StripPrefix(const char* s, SIZE cnt)
-
 
66
{
-
 
67
  std::ostringstream stream;
-
 
68
  SIZE pos = 0;
-
 
69
  while (pos < cnt) {
-
 
70
    if (s[pos] == m_cPrefix) {
-
 
71
      if ((pos < cnt - 1) && s[pos+1] == m_cPrefix) {
-
 
72
        stream << m_cPrefix;
-
 
73
        pos++;
-
 
74
      }
-
 
75
    }
-
 
76
    else {
-
 
77
      stream << s[pos];
-
 
78
    }
-
 
79
   
-
 
80
    pos++;
-
 
81
  }
-
 
82
 
-
 
83
  return stream.str();
-
 
84
}
-
 
85
-
 
86
void StringTokenizer::_GetNextToken(std::string& rToken, bool fStripPrefix)
-
 
87
{
-
 
88
  if (m_cPrefix == '\0') {
-
 
89
    _GetNextTokenNoPrefix(rToken);
-
 
90
  }
-
 
91
  else {
-
 
92
    _GetNextTokenWithPrefix(rToken);
-
 
93
    if (fStripPrefix)
-
 
94
      rToken = StripPrefix(rToken.c_str(), rToken.length());
-
 
95
  }
-
 
96
}
-
 
97
-
 
98
void StringTokenizer::_GetNextTokenNoPrefix(std::string& rToken)
-
 
99
{
39
  for (SIZE i=m_pos; i<m_len; i++) {
100
  for (SIZE i=m_pos; i<m_len; i++) {
40
    if (m_str[i] == m_cDelim) {
101
    if (m_str[i] == m_cDelim) {
41
      s = m_str.substr(m_pos, i - m_pos);
102
      rToken = m_str.substr(m_pos, i - m_pos);
42
      m_pos = i + 1;
103
      m_pos = i + 1;
43
      return s;
104
      return;
44
    }    
105
    }    
45
  }
106
  }
46
 
107
 
47
  s = m_str.substr(m_pos);
108
  rToken = m_str.substr(m_pos);
48
  m_pos = m_len;
109
  m_pos = m_len;
49
  return s;
-
 
50
}
110
}
-
 
111
 
-
 
112
void StringTokenizer::_GetNextTokenWithPrefix(std::string& rToken)
-
 
113
{
-
 
114
  int pref = 0;
-
 
115
  for (SIZE i=m_pos; i<m_len; i++) {
-
 
116
    if (m_str[i] == m_cDelim) {
-
 
117
      if (pref == 0) {
-
 
118
        rToken = m_str.substr(m_pos, i - m_pos);
-
 
119
        m_pos = i + 1;
-
 
120
        return;
-
 
121
      }
-
 
122
      else {
-
 
123
        pref = 0;
-
 
124
      }
-
 
125
    }
-
 
126
    else if (m_str[i] == m_cPrefix) {
-
 
127
      if (pref == 1)
-
 
128
        pref = 0;
-
 
129
      else
-
 
130
        pref = 1;
-
 
131
    }
-
 
132
    else {
-
 
133
      pref = 0;
-
 
134
    }
-
 
135
  }
-
 
136
 
-
 
137
  rToken = m_str.substr(m_pos);
-
 
138
  m_pos = m_len;
-
 
139
}
-
 
140