gear up for major use of ReadDelimitedText() by providing a better version
This commit is contained in:
parent
62c9e7e0c2
commit
6d713f064b
|
@ -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 )
|
||||||
|
@ -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 != '\\' )
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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…
Reference in New Issue