format.cpp
来自「wxWidgets写的电驴」· C++ 代码 · 共 268 行
CPP
268 行
//// This file is part of the aMule Project.//// Copyright (C) 2005-2006aMule 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//#include "Format.h"#include <cctype> // Needed for isalpha()/** * Returns true if the char is a format-type. */bool isTypeChar( wxChar c ){ switch ( c ) { case wxT('s'): // String of characters case wxT('u'): // Unsigned decimal integer case wxT('i'): // Signed decimal integer case wxT('d'): // Signed decimal integer case wxT('x'): // Unsigned hexadecimal integer case wxT('c'): // Character case wxT('e'): // Scientific notation (mantise/exponent) using e character case wxT('f'): // Decimal floating point case wxT('F'): // Decimal floating point case wxT('X'): // Unsigned hexadecimal integer (capital letters) case wxT('o'): // Unsigned octal case wxT('E'): // Scientific notation (mantise/exponent) using E character case wxT('g'): // Use shorter %e or %f case wxT('G'): // Use shorter %E or %f case wxT('p'): // Not supported, still needs to be caught though case wxT('n'): // Not supported, still needs to be caught though return true; } return false;}CFormat::Modifiers CFormat::getModifier( const wxString& str ){ switch ( str.GetChar( str.Len() - 2 ) ) { case wxT('h'): // short int (integer types). return modShort; case wxT('l'): // long int (interger types) or double (floating point types). if ( str.Len() > 3 && str.GetChar( str.Len() - 3 ) == wxT('l') ) { return modLongLong; } else { return modLong; } case wxT('L'): // long double (floating point types). return modLongDouble; default: return modNone; }}CFormat::CFormat( const wxChar* str ){ m_index = 0; m_indexEnd = 0; SetString( str );}void CFormat::SetString( const wxChar* str ){ m_format = str; ResetString(); // Initialize to the first format-string. if (!m_format.IsEmpty()) { SetCurrentField( wxEmptyString ); }}bool CFormat::IsReady() const{ return (m_index == m_format.Len());}const wxString& CFormat::GetString() const{ MULE_VALIDATE_STATE(IsReady(), wxT("Called GetString() before all values were passed: ") + m_format); return m_result;}void CFormat::ResetString(){ m_index = 0; m_indexEnd = 0; m_result.Clear(); m_result.Alloc( m_format.Len() * 2 ); }wxString CFormat::GetCurrentField(){ MULE_VALIDATE_STATE(m_index < m_format.Len(), wxT("Value passed to already completed string.")); m_indexEnd = m_index + 1; for (; m_indexEnd < m_format.Len(); m_indexEnd++) { wxChar c = m_format.GetChar(m_indexEnd); MULE_VALIDATE_STATE(c != wxT('*'), wxT("'*' precision not supported.")); if (isTypeChar(c)) { break; } } MULE_VALIDATE_STATE(m_indexEnd < m_format.Len(), wxT("Invalid format string, unknown type.")); m_indexEnd++; // Extract the field return wxString(m_format.c_str() + m_index, m_indexEnd - m_index);}CFormat& CFormat::SetCurrentField(const wxString& str){ m_result += str; size_t length = m_format.Length(); MULE_ASSERT_MSG(m_index != length, wxT("Invalid operation: SetCurrentField on completed string.")); MULE_ASSERT(m_index <= m_indexEnd); // Locate the next format-string const wxChar* start = m_format.c_str() + m_indexEnd; const wxChar* end = m_format.c_str() + length; const wxChar* ptr = start; for ( ; ptr < end; ++ptr ) { if ( *ptr == wxT('%') ) { MULE_VALIDATE_STATE(ptr + 1 < end, wxT("Incomplete format-string found.")); if ( *(ptr + 1) != wxT('%') ) { break; } else { m_result.Append( start, ptr - start + 1 ); start = ptr + 2; ++ptr; } } } if ( ptr > start ) { m_result.Append( start, ptr - start ); } m_index = ptr - m_format.c_str(); return *this;}wxString CFormat::GetIntegerField(const wxChar* fieldType){ wxString field = GetCurrentField(); wxChar type = field.Last(); // Drop type and modifier while (isalpha(field.Last())) { field.RemoveLast(); } // Set the correct integer type field += fieldType; switch (type) { case wxT('o'): // Unsigned octal case wxT('x'): // Unsigned hexadecimal integer case wxT('X'): // Unsigned hexadecimal integer (capital letters) // Override the default type field.Last() = type; case wxT('d'): // Signed decimal integer case wxT('i'): // Signed decimal integer case wxT('u'): // Unsigned decimal integer return field; default: MULE_VALIDATE_PARAMS(false, wxT("Integer value passed to non-integer format string.")); }}CFormat& CFormat::operator%(double value){ wxString field = GetCurrentField(); switch ( field.Last() ) { case wxT('e'): // Scientific notation (mantise/exponent) using e character case wxT('E'): // Scientific notation (mantise/exponent) using E character case wxT('f'): // Decimal floating point case wxT('F'): // Decimal floating point case wxT('g'): // Use shorter %e or %f case wxT('G'): // Use shorter %E or %f MULE_VALIDATE_PARAMS(getModifier(field) == modNone, wxT("Invalid modifier specified for floating-point format.")); return SetCurrentField(wxString::Format(field, value)); default: MULE_VALIDATE_PARAMS(false, wxT("Floating-point value passed to non-float format string.") ); }}CFormat& CFormat::operator%(wxChar value){ wxString field = GetCurrentField(); MULE_VALIDATE_PARAMS(field.Last() == wxT('c'), wxT("Char value passed to non-char format string.")); return SetCurrentField(wxString::Format(field, value));}CFormat& CFormat::operator%( const wxChar* val ){ wxString field = GetCurrentField(); MULE_VALIDATE_PARAMS(field.Last() == wxT('s'), wxT("String value passed to non-string format string.")); // Check if a max-length is specified if (field.GetChar(1) == wxT('.')) { wxString size = field.Mid( 2, field.Len() - 3 ); long lSize = 0; // Try to convert the length-field. if ((size.IsEmpty() || size.ToLong(&lSize)) && (lSize >= 0)) { SetCurrentField(wxString(val).Left(lSize)); } else { MULE_VALIDATE_STATE(false, wxT("Invalid value found in 'precision' field.")); } } else if (field.GetChar(1) == wxT('s')) { // No limit on size, just set the string SetCurrentField( val ); } else { MULE_VALIDATE_STATE(false, wxT("Malformed string format field.")); } return *this;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?