Commit 6d713f06 authored by Dick Hollenbeck's avatar Dick Hollenbeck
Browse files

gear up for major use of ReadDelimitedText() by providing a better version

parent 62c9e7e0
Loading
Loading
Loading
Loading
+44 −0
Original line number Original line Diff line number Diff line
@@ -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 != '\\' )
+11 −0
Original line number Original line Diff line number Diff line
@@ -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
+2 −1
Original line number Original line Diff line number Diff line
@@ -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