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 *&current )
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