From 53faea431638ee5c0013a2c888215c751fa6437b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 31 Jan 2000 18:38:12 +0000 Subject: [PATCH] new wxStringTokenizer git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5763 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/tokenzr.cpp | 121 +++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 76 deletions(-) diff --git a/src/common/tokenzr.cpp b/src/common/tokenzr.cpp index 6b5d18e178..95eb0d5860 100644 --- a/src/common/tokenzr.cpp +++ b/src/common/tokenzr.cpp @@ -2,7 +2,7 @@ // Name: tokenzr.cpp // Purpose: String tokenizer // Author: Guilhem Lavaux -// Modified by: +// Modified by: Gregory Pietsch // Created: 04/22/98 // RCS-ID: $Id$ // Copyright: (c) Guilhem Lavaux @@ -29,110 +29,79 @@ wxStringTokenizer::wxStringTokenizer(const wxString& to_tokenize, m_string = to_tokenize; m_delims = delims; m_retdelims = ret_delims; + m_pos = 0; } wxStringTokenizer::~wxStringTokenizer() { } -off_t wxStringTokenizer::FindDelims(const wxString& str, const wxString& delims) const -{ - for ( size_t i = 0; i < str.Length(); i++ ) - { - wxChar c = str[i]; - - for ( size_t j = 0; j < delims.Length() ; j++ ) - { - if ( delims[j] == c ) - return i; - } - } - - return -1; -} - int wxStringTokenizer::CountTokens() const { - wxString p_string = m_string; - bool found = TRUE; - int pos, count = 1; - - if (p_string.Length() == 0) - return 0; - - while (found) - { - pos = FindDelims(p_string, m_delims); - if (pos != -1) + size_t pos = 0; + int count = 0; + bool at_delim; + + while (pos < m_string.length()) { + // while we're still counting ... + at_delim = (m_delims.find(m_string.at(pos)) < m_delims.length()); + // are we at a delimiter? if so, move to the next nondelimiter; + // if not, move to the next delimiter. If the find_first_of + // and find_first_not_of methods fail, pos will be assigned + // npos (0xFFFFFFFF) which will terminate the loop on the next + // go-round unless we have a really long string, which is unlikely + pos = at_delim ? m_string.find_first_not_of(m_delims, pos) + : m_string.find_first_of(m_delims, pos); + if (m_retdelims) { + // if we're retaining delimiters, increment count count++; - p_string = p_string(pos+1, p_string.Length()); } else { - found = FALSE; + // if we're not retaining delimiters and at a token, inc count + count += (!at_delim); } } - return count; } bool wxStringTokenizer::HasMoreTokens() { - return !m_string.IsEmpty(); -} - -// needed to fix leading whitespace / mult. delims bugs -void wxStringTokenizer::EatLeadingDelims() -{ - int pos; - - // while leading delims trim 'em from the left - while ( ( pos = FindDelims(m_string, m_delims)) == 0 ) - { - m_string = m_string.Mid((size_t)1); - } + return (m_retdelims + ? !m_string.IsEmpty() + : m_string.find_first_not_of(m_delims) < m_string.length()); } wxString wxStringTokenizer::NextToken() { - off_t pos, pos2; + size_t pos; wxString r_string; if ( m_string.IsEmpty() ) return m_string; - - if ( !m_retdelims ) - EatLeadingDelims(); - - pos = FindDelims(m_string, m_delims); - if (pos == -1) - { - r_string = m_string; - m_string = wxEmptyString; - - return r_string; + pos = m_string.find_first_not_of(m_delims); + if ( m_retdelims ) { + // we're retaining delimiters (unusual behavior, IMHO) + if (pos == 0) + // first char is a non-delimiter + pos = m_string.find_first_of(m_delims); + } else { + // we're not retaining delimiters + m_string.erase(0, pos); + m_pos += pos; + if (m_string.IsEmpty()) + return m_string; + pos = m_string.find_first_of(m_delims); } - - if (m_retdelims) - { - if (!pos) - { - pos++; - pos2 = 1; - } - else - { - pos2 = pos; - } - } - else - { - pos2 = pos + 1; + if (pos <= m_string.length()) { + r_string = m_string.substr(0, pos); + m_string.erase(0, pos); + m_pos += pos; + } else { + r_string = m_string; + m_pos += m_string.length(); + m_string.Empty(); } - - r_string = m_string.Left((size_t)pos); - m_string = m_string.Mid((size_t)pos2); - return r_string; } -- 2.45.2