88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/private/json.h
 | 
						|
// Purpose:     Helper functions to handle JSON data
 | 
						|
// Author:      Tobias Taschner
 | 
						|
// Created:     2020-01-17
 | 
						|
// Copyright:   (c) 2020 wxWidgets development team
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_PRIVATE_JSON_H_
 | 
						|
#define _WX_PRIVATE_JSON_H_
 | 
						|
 | 
						|
namespace wxJSON
 | 
						|
{
 | 
						|
 | 
						|
// Decode a string literal including escape sequences
 | 
						|
// Returns false if the input string is not a valid JSON string
 | 
						|
bool DecodeString(const wxString& in, wxString* out)
 | 
						|
{
 | 
						|
    const wxWCharBuffer buf = in.wc_str();
 | 
						|
    const wchar_t* ch = buf.data();
 | 
						|
    // String has to chart with a quote
 | 
						|
    if (*(ch++) != '"')
 | 
						|
        return false;
 | 
						|
    out->reserve(buf.length());
 | 
						|
    const wchar_t* end = buf.data() + buf.length() - 1;
 | 
						|
    for (; ch < end; ++ch)
 | 
						|
    {
 | 
						|
        if (*ch == '\\')
 | 
						|
        {
 | 
						|
            switch (*(++ch))
 | 
						|
            {
 | 
						|
            case 'b':
 | 
						|
                out->append('\b');
 | 
						|
                break;
 | 
						|
            case 'n':
 | 
						|
                out->append('\n');
 | 
						|
                break;
 | 
						|
            case 'r':
 | 
						|
                out->append('\r');
 | 
						|
                break;
 | 
						|
            case 't':
 | 
						|
                out->append('\t');
 | 
						|
                break;
 | 
						|
            case 'f':
 | 
						|
                out->append('\f');
 | 
						|
                break;
 | 
						|
            case '/':
 | 
						|
                out->append('/');
 | 
						|
                break;
 | 
						|
            case '"':
 | 
						|
                out->append('"');
 | 
						|
                break;
 | 
						|
            case '\\':
 | 
						|
                out->append('\\');
 | 
						|
                break;
 | 
						|
            case 'u':
 | 
						|
#if SIZEOF_WCHAR_T == 2
 | 
						|
                            // In this case, we handle surrogates without doing anything special was wchar_t strings use UTF-17 encoding.
 | 
						|
                if (wxIsxdigit(ch[1]) && wxIsxdigit(ch[2]) &&
 | 
						|
                    wxIsxdigit(ch[3]) && wxIsxdigit(ch[4]))
 | 
						|
                {
 | 
						|
                    wchar_t uchar = wxHexToDec(wxString(&ch[3], 2)) |
 | 
						|
                        wxHexToDec(wxString(&ch[1], 2)) >> 8;
 | 
						|
                    out->append(uchar);
 | 
						|
                    ch += 4;
 | 
						|
                }
 | 
						|
#else
 | 
						|
    #error Implement correct surrogate handling.
 | 
						|
#endif
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                return false;
 | 
						|
                break;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else
 | 
						|
            out->append(*ch);
 | 
						|
    }
 | 
						|
 | 
						|
    // String has to end with a quote
 | 
						|
    return (*ch) == '"';
 | 
						|
}
 | 
						|
 | 
						|
} // namespace JSON
 | 
						|
 | 
						|
#endif // _WX_PRIVATE_JSON_H_
 |