Skip to content

Commit 80bc07c

Browse files
committed
fdsdump: add support for octetArray as an aggregation key
1 parent 8b62bff commit 80bc07c

File tree

8 files changed

+232
-96
lines changed

8 files changed

+232
-96
lines changed

src/tools/fdsdump/src/aggregator/aggregator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ load_view_value(const ViewField &view_field, fds_drec_field &drec_field, ViewVal
161161
value.i64 = FieldView(drec_field).as_int();
162162
break;
163163
case DataType::String128B:
164+
case DataType::Octets128B:
164165
memset(value.str, 0, 128);
165166
memcpy(value.str, drec_field.data, std::min<int>(drec_field.size, 128));
166167
break;

src/tools/fdsdump/src/aggregator/jsonPrinter.cpp

Lines changed: 87 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,14 @@ JSONPrinter::append_field(const ViewField &field, ViewValue *value)
7575
void
7676
JSONPrinter::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

src/tools/fdsdump/src/aggregator/jsonPrinter.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class JSONPrinter : public Printer
2626
private:
2727
void append_field(const ViewField &field, ViewValue *value);
2828
void append_value(const ViewField &field, ViewValue *value);
29+
void append_string_value(const ViewValue *value);
30+
void append_octet_value(const ViewValue *value);
2931

3032
ViewDefinition m_view_def;
3133
std::string m_buffer;

0 commit comments

Comments
 (0)