@@ -75,19 +75,14 @@ JSONPrinter::append_field(const ViewField &field, ViewValue *value)
7575void
7676JSONPrinter::append_value (const ViewField &field, ViewValue *value)
7777{
78- char tmp[256 ];
79- print_value (field, *value, tmp, false );
80-
8178 switch (field.data_type ) {
82- case DataType::Unassigned:
8379 case DataType::IPAddress:
8480 case DataType::IPv4Address:
8581 case DataType::IPv6Address:
8682 case DataType::MacAddress:
8783 case DataType::DateTime:
88- case DataType::String128B:
8984 m_buffer.push_back (' "' );
90- m_buffer. append (tmp );
85+ print_value (field, *value, m_buffer );
9186 m_buffer.push_back (' "' );
9287 return ;
9388 case DataType::Unsigned8:
@@ -98,8 +93,93 @@ JSONPrinter::append_value(const ViewField &field, ViewValue *value)
9893 case DataType::Signed32:
9994 case DataType::Unsigned64:
10095 case DataType::Signed64:
101- m_buffer. append (tmp );
96+ print_value (field, *value, m_buffer );
10297 return ;
98+ case DataType::String128B:
99+ m_buffer.push_back (' "' );
100+ append_string_value (value);
101+ m_buffer.push_back (' "' );
102+ return ;
103+ case DataType::Octets128B:
104+ m_buffer.push_back (' "' );
105+ append_octet_value (value);
106+ m_buffer.push_back (' "' );
107+ return ;
108+ case DataType::Unassigned:
109+ m_buffer.append (" null" );
110+ return ;
111+ }
112+ }
113+
114+ void
115+ JSONPrinter::append_string_value (const ViewValue *value)
116+ {
117+ size_t last_byte;
118+
119+ for (last_byte = sizeof (value->str ); last_byte > 0 ; --last_byte) {
120+ if (value->str [last_byte - 1 ] != 0 ) {
121+ break ;
122+ }
123+ }
124+
125+ for (size_t i = 0 ; i < last_byte; ++i) {
126+ const char byte = value->str [i];
127+
128+ // Escape characters
129+ switch (byte) {
130+ case ' "' :
131+ m_buffer.append (" \\\" " );
132+ continue ;
133+ case ' \' ' :
134+ m_buffer.append (" \\\\ " );
135+ continue ;
136+ case ' /' :
137+ m_buffer.append (" \\ /" );
138+ continue ;;
139+ case ' \b ' :
140+ m_buffer.append (" \\ b" );
141+ continue ;
142+ case ' \f ' :
143+ m_buffer.append (" \\ f" );
144+ continue ;
145+ case ' \n ' :
146+ m_buffer.append (" \\ n" );
147+ continue ;
148+ case ' \r ' :
149+ m_buffer.append (" \\ r" );
150+ continue ;
151+ case ' \t ' :
152+ m_buffer.append (" \\ t" );
153+ continue ;
154+ default :
155+ break ;
156+ }
157+
158+ if (byte >= ' \x00 ' && byte <= ' \x1F ' ) {
159+ m_buffer.append (char2hex (byte));
160+ } else {
161+ m_buffer.append (1 , byte);
162+ }
163+ }
164+ }
165+
166+ void
167+ JSONPrinter::append_octet_value (const ViewValue *value)
168+ {
169+ size_t last_byte;
170+
171+ m_buffer.append (" 0x" );
172+
173+ // Find first non-zero byte from the end (at least one byte must be printed)
174+ for (last_byte = sizeof (value->str ); last_byte > 1 ; --last_byte) {
175+ if (value->str [last_byte - 1 ] != 0 ) {
176+ break ;
177+ }
178+ }
179+
180+ for (size_t i = 0 ; i < last_byte; ++i) {
181+ const char byte = value->str [i];
182+ m_buffer.append (char2hex (byte));
103183 }
104184}
105185
0 commit comments