stringfunctions.cpp
来自「电驴的MAC源代码」· C++ 代码 · 共 315 行
CPP
315 行
//// This file is part of the aMule Project.//// Copyright (c) 2004-2008 Angel Vidal Veiga - Kry (kry@amule.org)// Copyright (c) 2003-2008 aMule Team ( admin@amule.org / http://www.amule.org )//// Any parts of this program derived from the xMule, lMule or eMule project,// or contributed by third-party developers are copyrighted by their// respective authors.//// This program is free software; you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation; either version 2 of the License, or// (at your option) any later version.//// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// // You should have received a copy of the GNU General Public License// along with this program; if not, write to the Free Software// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA//#define STRINGFUNCTIONS_CPP#include "StringFunctions.h"#include "Path.h"#include <wx/filename.h> // Needed for wxFileName#include <wx/uri.h> // Needed for wxURI// Implementation of the non-inlinesstatic byte base16Chars[17] = "0123456789ABCDEF";wxString URLEncode(const wxString& sIn){ wxString sOut; unsigned char curChar; for ( unsigned int i = 0; i < sIn.Length(); ++i ) { curChar = sIn.GetChar( i ); if ( isalnum( curChar ) ) { sOut += curChar; } else if( isspace ( curChar ) ) { sOut += wxT("+"); } else { sOut += wxT("%"); sOut += base16Chars[ curChar >> 4]; sOut += base16Chars[ curChar & 0xf]; } } return sOut;}wxString TruncateFilename(const CPath& filename, size_t length, bool isFilePath){ wxString file = filename.GetPrintable(); // Check if there's anything to do if (file.Length() <= length) return file; // If the filename is a path, then prefer to remove from the path, rather than the filename if ( isFilePath ) { wxString path = wxFileName(file).GetPath(); file = wxFileName(file).GetFullName(); if ( path.Length() >= length ) { path.Clear(); } else if ( file.Length() >= length ) { path.Clear(); } else { // Minus 6 for "[...]" + separator int pathlen = (int)(length - file.Length() - 6); if ( pathlen > 0 ) { path = wxT("[...]") + path.Right( pathlen ); } else { path.Clear(); } } file = JoinPaths(path, file); } if ( file.Length() > length ) { if ( length > 5 ) { file = file.Left( length - 5 ) + wxT("[...]"); } else { file.Clear(); } } return file;}wxString StripSeparators(wxString path, wxString::stripType type){ wxASSERT((type == wxString::leading) || (type == wxString::trailing)); const wxString seps = wxFileName::GetPathSeparators(); while (!path.IsEmpty()) { size_t pos = ((type == wxString::leading) ? 0 : path.Length() - 1); if (seps.Contains(path.GetChar(pos))) { path.Remove(pos, 1); } else { break; } } return path;}wxString JoinPaths(const wxString& path, const wxString& file){ if (path.IsEmpty()) { return file; } else if (file.IsEmpty()) { return path; } return StripSeparators(path, wxString::trailing) + wxFileName::GetPathSeparator() + StripSeparators(file, wxString::leading);}wxChar HexToDec( const wxString& hex ){ wxChar result = 0; wxString str = hex.Upper(); for ( size_t i = 0; i < str.Len(); ++i ) { result *= 16; wxChar cur = str.GetChar(i); if ( isdigit( cur ) ) { result += cur - wxT('0'); } else if ( cur >= wxT('A') && cur <= wxT('F') ) { result += cur - wxT('A') + 10; } else { return wxT('\0'); } } return result;}wxString UnescapeHTML( const wxString& str ){ wxString result; result.Alloc( str.Len() ); for ( size_t i = 0; i < str.Len(); ++i ) { if ( str.GetChar(i) == wxT('%') && ( i + 2 < str.Len() ) ) { wxChar unesc = HexToDec( str.Mid( i + 1, 2 ) ); if ( unesc ) { i += 2; result += unesc; } else { // If conversion failed, then we just add the escape-code // and continue past it like nothing happened. result += str.at(i); } } else { result += str.at(i); } } return result;}wxString validateURI(const wxString& url){ wxURI uri(url); return uri.BuildURI();}enum ECharType { ECTInteger, ECTText, ECTNone};inline wxString GetNextField(const wxString& str, size_t& cookie){ // These are taken to seperate "fields" static const wxChar* s_delims = wxT("\t\n\x0b\x0c\r !\"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~"); wxString field; ECharType curType = ECTNone; for (; cookie < str.Length(); ++cookie) { wxChar c = str[cookie]; if ((c >= wxT('0')) && (c <= wxT('9'))) { if (curType == ECTText) { break; } curType = ECTInteger; field += c; } else if (wxStrchr(s_delims, c)) { if (curType == ECTNone) { continue; } else { break; } } else { if (curType == ECTInteger) { break; } curType = ECTText; field += c; } } return field;}int FuzzyStrCmp(const wxString& a, const wxString& b){ size_t aCookie = 0, bCookie = 0; wxString aField, bField; do { aField = GetNextField(a, aCookie); bField = GetNextField(b, bCookie); if (aField.IsNumber() && bField.IsNumber()) { unsigned long aInteger = StrToULong(aField); unsigned long bInteger = StrToULong(bField); if (aInteger < bInteger) { return -1; } else if (aInteger > bInteger) { return 1; } } else if (aField < bField) { return -1; } else if (aField > bField) { return 1; } } while (!aField.IsEmpty() && !bField.IsEmpty()); return 0;}int FuzzyStrCaseCmp(const wxString& a, const wxString& b){ return FuzzyStrCmp(a.Lower(), b.Lower());} CSimpleTokenizer::CSimpleTokenizer(const wxString& str, wxChar token) : m_string(str), m_delim(token), m_ptr(m_string.c_str()), m_count(0){}wxString CSimpleTokenizer::next(){ const wxChar* start = m_ptr; const wxChar* end = m_string.c_str() + m_string.Len() + 1; for (; m_ptr < end; ++m_ptr) { if (*m_ptr == m_delim) { m_count++; break; } } // Return the token return m_string.Mid(start - m_string.c_str(), m_ptr++ - start);}wxString CSimpleTokenizer::remaining() const{ return m_string.Mid(m_ptr - m_string.c_str());}size_t CSimpleTokenizer::tokenCount() const{ return m_count;}// File_checked_for_headers
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?