1f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Copyright 2007-2010 Baptiste Lepilleur 2f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Distributed under MIT license, or public domain if desired and 3f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// recognized in your jurisdiction. 4f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE 5f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 6f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED 7f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III# define LIB_JSONCPP_JSON_TOOL_H_INCLUDED 8f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 9f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/* This header provides common string manipulation support, such as UTF-8, 10f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * portable conversion from/to string... 11f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * 12f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * It is an internal header that must not be exposed. 13f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 14f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 15f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIInamespace Json { 16f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 17f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// Converts a unicode code-point to UTF-8. 18f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline std::string 19f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIcodePointToUTF8(unsigned int cp) 20f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{ 21f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III std::string result; 22f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 23f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III // based on description from http://en.wikipedia.org/wiki/UTF-8 24f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 25f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III if (cp <= 0x7f) 26f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 27f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result.resize(1); 28f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[0] = static_cast<char>(cp); 29f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 30f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III else if (cp <= 0x7FF) 31f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 32f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result.resize(2); 33f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[1] = static_cast<char>(0x80 | (0x3f & cp)); 34f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[0] = static_cast<char>(0xC0 | (0x1f & (cp >> 6))); 35f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 36f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III else if (cp <= 0xFFFF) 37f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 38f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result.resize(3); 39f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[2] = static_cast<char>(0x80 | (0x3f & cp)); 40f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[1] = 0x80 | static_cast<char>((0x3f & (cp >> 6))); 41f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[0] = 0xE0 | static_cast<char>((0xf & (cp >> 12))); 42f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 43f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III else if (cp <= 0x10FFFF) 44f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 45f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result.resize(4); 46f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[3] = static_cast<char>(0x80 | (0x3f & cp)); 47f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[2] = static_cast<char>(0x80 | (0x3f & (cp >> 6))); 48f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 12))); 49f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III result[0] = static_cast<char>(0xF0 | (0x7 & (cp >> 18))); 50f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 51f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 52f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return result; 53f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} 54f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 55f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 56f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/// Returns true if ch is a control character (in range [0,32[). 57f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline bool 58f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIisControlCharacter(char ch) 59f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{ 60f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III return ch > 0 && ch <= 0x1F; 61f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} 62f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 63f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 64f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIenum { 65f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III /// Constant that specify the size of the buffer that must be passed to uintToString. 66f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III uintToStringBufferSize = 3*sizeof(LargestUInt)+1 67f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III}; 68f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 69f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III// Defines a char buffer for use with uintToString(). 70f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIItypedef char UIntToStringBuffer[uintToStringBufferSize]; 71f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 72f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 73f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III/** Converts an unsigned integer to string. 74f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * @param value Unsigned interger to convert to string 75f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * @param current Input/Output string buffer. 76f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III * Must have at least uintToStringBufferSize chars free. 77f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III */ 78f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIstatic inline void 79f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins IIIuintToString( LargestUInt value, 80f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III char *¤t ) 81f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III{ 82f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III *--current = 0; 83f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III do 84f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III { 85f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III *--current = char(value % 10) + '0'; 86f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III value /= 10; 87f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III } 88f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III while ( value != 0 ); 89f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} 90f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 91f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III} // namespace Json { 92f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III 93f59fb0e83fd0a4b41700d3f5eebdc8d21b173c2eLeon Scroggins III#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED 94