]>
Commit | Line | Data |
---|---|---|
1 | ///////////////////////////////////////////////////////////////////////////// | |
2 | // Name: tokenzr.cpp | |
3 | // Purpose: String tokenizer | |
4 | // Author: Guilhem Lavaux | |
5 | // Modified by: | |
6 | // Created: 04/22/98 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) Guilhem Lavaux | |
9 | // Licence: wxWindows licence | |
10 | ///////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | #ifdef __GNUG__ | |
13 | #pragma implementation "tokenzr.h" | |
14 | #endif | |
15 | ||
16 | // For compilers that support precompilation, includes "wx.h". | |
17 | #include "wx/wxprec.h" | |
18 | ||
19 | #ifdef __BORLANDC__ | |
20 | #pragma hdrstop | |
21 | #endif | |
22 | ||
23 | #include "wx/tokenzr.h" | |
24 | ||
25 | wxStringTokenizer::wxStringTokenizer(const wxString& to_tokenize, | |
26 | const wxString& delims, | |
27 | bool ret_delims) | |
28 | { | |
29 | m_string = to_tokenize; | |
30 | m_delims = delims; | |
31 | m_retdelims = ret_delims; | |
32 | } | |
33 | ||
34 | wxStringTokenizer::~wxStringTokenizer() | |
35 | { | |
36 | } | |
37 | ||
38 | off_t wxStringTokenizer::FindDelims(const wxString& str, const wxString& delims) const | |
39 | { | |
40 | for ( size_t i = 0; i < str.Length(); i++ ) | |
41 | { | |
42 | wxChar c = str[i]; | |
43 | ||
44 | for ( size_t j = 0; j < delims.Length() ; j++ ) | |
45 | { | |
46 | if ( delims[j] == c ) | |
47 | return i; | |
48 | } | |
49 | } | |
50 | ||
51 | return -1; | |
52 | } | |
53 | ||
54 | int wxStringTokenizer::CountTokens() const | |
55 | { | |
56 | wxString p_string = m_string; | |
57 | bool found = TRUE; | |
58 | int pos, count = 1; | |
59 | ||
60 | if (p_string.Length() == 0) | |
61 | return 0; | |
62 | ||
63 | while (found) | |
64 | { | |
65 | pos = FindDelims(p_string, m_delims); | |
66 | if (pos != -1) | |
67 | { | |
68 | count++; | |
69 | p_string = p_string(pos+1, p_string.Length()); | |
70 | } | |
71 | else | |
72 | { | |
73 | found = FALSE; | |
74 | } | |
75 | } | |
76 | ||
77 | return count; | |
78 | } | |
79 | ||
80 | bool wxStringTokenizer::HasMoreTokens() | |
81 | { | |
82 | return !m_string.IsEmpty(); | |
83 | } | |
84 | ||
85 | // needed to fix leading whitespace / mult. delims bugs | |
86 | void wxStringTokenizer::EatLeadingDelims() | |
87 | { | |
88 | int pos; | |
89 | ||
90 | // while leading delims trim 'em from the left | |
91 | while ( ( pos = FindDelims(m_string, m_delims)) == 0 ) | |
92 | { | |
93 | m_string = m_string.Mid((size_t)1); | |
94 | } | |
95 | } | |
96 | ||
97 | wxString wxStringTokenizer::NextToken() | |
98 | { | |
99 | off_t pos, pos2; | |
100 | wxString r_string; | |
101 | ||
102 | if ( m_string.IsEmpty() ) | |
103 | return m_string; | |
104 | ||
105 | if ( !m_retdelims ) | |
106 | EatLeadingDelims(); | |
107 | ||
108 | pos = FindDelims(m_string, m_delims); | |
109 | if (pos == -1) | |
110 | { | |
111 | r_string = m_string; | |
112 | m_string = wxEmptyString; | |
113 | ||
114 | return r_string; | |
115 | } | |
116 | ||
117 | if (m_retdelims) | |
118 | { | |
119 | if (!pos) | |
120 | { | |
121 | pos++; | |
122 | pos2 = 1; | |
123 | } | |
124 | else | |
125 | { | |
126 | pos2 = pos; | |
127 | } | |
128 | } | |
129 | else | |
130 | { | |
131 | pos2 = pos + 1; | |
132 | } | |
133 | ||
134 | r_string = m_string.Left((size_t)pos); | |
135 | m_string = m_string.Mid((size_t)pos2); | |
136 | ||
137 | return r_string; | |
138 | } |