Loading common/string.cpp +44 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,48 @@ #include "kicad_string.h" #include "kicad_string.h" int ReadDelimitedText( wxString* aDest, const char* aSource ) { std::string utf8; // utf8 but without escapes and quotes. bool inside = false; const char* start = aSource; char cc; while( (cc = *aSource++) != 0 ) { if( cc == '"' ) { if( inside ) break; // 2nd double quote is end of delimited text inside = true; // first delimiter found, make note, do not copy } else if( inside ) { if( cc == '\\' ) { cc = *aSource++; if( !cc ) break; // do no copy the escape byte if it is followed by \ or " if( cc != '"' && cc != '\\' ) utf8 += '\\'; utf8 += cc; } else utf8 += cc; } } *aDest = FROM_UTF8( utf8.c_str() ); return aSource - start; } int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ) int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ) { { if( aDestSize <= 0 ) if( aDestSize <= 0 ) Loading @@ -33,6 +75,8 @@ int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ) if( cc == '\\' ) if( cc == '\\' ) { { cc = *aSource++; cc = *aSource++; if( !cc ) break; // do no copy the escape byte if it is followed by \ or " // do no copy the escape byte if it is followed by \ or " if( cc != '"' && cc != '\\' ) if( cc != '"' && cc != '\\' ) Loading include/kicad_string.h +11 −0 Original line number Original line Diff line number Diff line Loading @@ -26,9 +26,20 @@ char* strlower( char* Text ); * @param aDestSize is the size of the destination byte buffer. * @param aDestSize is the size of the destination byte buffer. * @return int - the number of bytes read from source, which may be more than * @return int - the number of bytes read from source, which may be more than * the number copied, due to escaping of double quotes and the escape byte itself. * the number copied, due to escaping of double quotes and the escape byte itself. * @deprecated should use the one which fetches a wxString, below. */ */ int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ); int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ); /** * Function ReadDelimitedText * copies bytes from @a aSource delimited string segment to @a aDest wxString. * * @param aDest is the destination wxString * @param aSource is the source C string holding utf8 encoded bytes. * @return int - the number of bytes read from source, which may be more than * the number copied, due to escaping of double quotes and the escape byte itself. */ int ReadDelimitedText( wxString* aDest, const char* aSource ); /** /** * Function EscapedUTF8 * Function EscapedUTF8 Loading include/macros.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -20,13 +20,14 @@ * converts a UTF8 encoded C string to a wxString for all wxWidgets build modes. * converts a UTF8 encoded C string to a wxString for all wxWidgets build modes. */ */ //#define FROM_UTF8( cstring ) wxString::FromUTF8( cstring ) //#define FROM_UTF8( cstring ) wxString::FromUTF8( cstring ) inline wxString FROM_UTF8( const char* cstring ) static inline wxString FROM_UTF8( const char* cstring ) { { wxString line = wxString::FromUTF8( cstring ); wxString line = wxString::FromUTF8( cstring ); if( line.IsEmpty() ) // happens when cstring is not a valid UTF8 sequence if( line.IsEmpty() ) // happens when cstring is not a valid UTF8 sequence line = wxConvCurrent->cMB2WC( cstring ); // try to use locale conversion line = wxConvCurrent->cMB2WC( cstring ); // try to use locale conversion return line; return line; } } /** /** * Function GetChars * Function GetChars * returns a wxChar* to the actual character data within a wxString, and is * returns a wxChar* to the actual character data within a wxString, and is Loading Loading
common/string.cpp +44 −0 Original line number Original line Diff line number Diff line Loading @@ -8,6 +8,48 @@ #include "kicad_string.h" #include "kicad_string.h" int ReadDelimitedText( wxString* aDest, const char* aSource ) { std::string utf8; // utf8 but without escapes and quotes. bool inside = false; const char* start = aSource; char cc; while( (cc = *aSource++) != 0 ) { if( cc == '"' ) { if( inside ) break; // 2nd double quote is end of delimited text inside = true; // first delimiter found, make note, do not copy } else if( inside ) { if( cc == '\\' ) { cc = *aSource++; if( !cc ) break; // do no copy the escape byte if it is followed by \ or " if( cc != '"' && cc != '\\' ) utf8 += '\\'; utf8 += cc; } else utf8 += cc; } } *aDest = FROM_UTF8( utf8.c_str() ); return aSource - start; } int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ) int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ) { { if( aDestSize <= 0 ) if( aDestSize <= 0 ) Loading @@ -33,6 +75,8 @@ int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ) if( cc == '\\' ) if( cc == '\\' ) { { cc = *aSource++; cc = *aSource++; if( !cc ) break; // do no copy the escape byte if it is followed by \ or " // do no copy the escape byte if it is followed by \ or " if( cc != '"' && cc != '\\' ) if( cc != '"' && cc != '\\' ) Loading
include/kicad_string.h +11 −0 Original line number Original line Diff line number Diff line Loading @@ -26,9 +26,20 @@ char* strlower( char* Text ); * @param aDestSize is the size of the destination byte buffer. * @param aDestSize is the size of the destination byte buffer. * @return int - the number of bytes read from source, which may be more than * @return int - the number of bytes read from source, which may be more than * the number copied, due to escaping of double quotes and the escape byte itself. * the number copied, due to escaping of double quotes and the escape byte itself. * @deprecated should use the one which fetches a wxString, below. */ */ int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ); int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize ); /** * Function ReadDelimitedText * copies bytes from @a aSource delimited string segment to @a aDest wxString. * * @param aDest is the destination wxString * @param aSource is the source C string holding utf8 encoded bytes. * @return int - the number of bytes read from source, which may be more than * the number copied, due to escaping of double quotes and the escape byte itself. */ int ReadDelimitedText( wxString* aDest, const char* aSource ); /** /** * Function EscapedUTF8 * Function EscapedUTF8 Loading
include/macros.h +2 −1 Original line number Original line Diff line number Diff line Loading @@ -20,13 +20,14 @@ * converts a UTF8 encoded C string to a wxString for all wxWidgets build modes. * converts a UTF8 encoded C string to a wxString for all wxWidgets build modes. */ */ //#define FROM_UTF8( cstring ) wxString::FromUTF8( cstring ) //#define FROM_UTF8( cstring ) wxString::FromUTF8( cstring ) inline wxString FROM_UTF8( const char* cstring ) static inline wxString FROM_UTF8( const char* cstring ) { { wxString line = wxString::FromUTF8( cstring ); wxString line = wxString::FromUTF8( cstring ); if( line.IsEmpty() ) // happens when cstring is not a valid UTF8 sequence if( line.IsEmpty() ) // happens when cstring is not a valid UTF8 sequence line = wxConvCurrent->cMB2WC( cstring ); // try to use locale conversion line = wxConvCurrent->cMB2WC( cstring ); // try to use locale conversion return line; return line; } } /** /** * Function GetChars * Function GetChars * returns a wxChar* to the actual character data within a wxString, and is * returns a wxChar* to the actual character data within a wxString, and is Loading