9ceb218f80
Co-authored-by: Cursor <cursoragent@cursor.com>
160 lines
4.0 KiB
C
160 lines
4.0 KiB
C
#include "infra_config.h"
|
|
|
|
#ifdef INFRA_LOG_NETWORK_PAYLOAD
|
|
#include <string.h>
|
|
#include <stdarg.h>
|
|
#include "infra_log.h"
|
|
#if defined(INFRA_CJSON)
|
|
#include "infra_cjson.h"
|
|
#endif
|
|
|
|
#define JSON_NEWLINE "\r\n"
|
|
#define JSON_INDENT " "
|
|
|
|
#define JSON_PRINT_NEWSTR HAL_Printf("%s", newstr);
|
|
#define JSON_PRINT_NEWLINE \
|
|
do { \
|
|
HAL_Printf("%s", JSON_NEWLINE); \
|
|
if (mark == '>' || mark == '<' || mark == ':') { \
|
|
HAL_Printf("%c ", mark); \
|
|
} \
|
|
} while(0)
|
|
|
|
/* 31, red. 32, green. 33, yellow. 34, blue. 35, magenta. 36, cyan. 37, white. */
|
|
static char *_color[] = {
|
|
"[0m", "[1;31m", "[1;31m", "[1;35m", "[1;33m", "[1;36m", "[1;37m"
|
|
};
|
|
|
|
int iotx_facility_json_print(const char *str, int level, ...)
|
|
{
|
|
int length = 0;
|
|
char newstr[2];
|
|
int quoted = 0;
|
|
int escaped = 0;
|
|
int indent = 0;
|
|
int i = 0, j = 0;
|
|
#if defined(INFRA_CJSON)
|
|
int res = -1;
|
|
lite_cjson_t lite;
|
|
#endif
|
|
va_list ap;
|
|
int mark = ' ';
|
|
|
|
newstr[0] = 0x00;
|
|
newstr[1] = 0x00;
|
|
|
|
if (str == NULL || strlen(str) == 0) {
|
|
return -1;
|
|
}
|
|
|
|
#if defined(INFRA_CJSON)
|
|
res = lite_cjson_parse(str, strlen(str), &lite);
|
|
if (res != SUCCESS_RETURN || !lite_cjson_is_object(&lite)) {
|
|
return -2;
|
|
}
|
|
#endif
|
|
|
|
length = strlen(str);
|
|
HAL_Printf("%s%s", "\033", _color[level]);
|
|
va_start(ap, level);
|
|
mark = va_arg(ap, int);
|
|
JSON_PRINT_NEWLINE;
|
|
va_end(ap);
|
|
|
|
for (i = 0 ; i < length ; i++) {
|
|
char ch = str[i];
|
|
switch (ch) {
|
|
case '{':
|
|
case '[':
|
|
newstr[0] = ch;
|
|
JSON_PRINT_NEWSTR;
|
|
|
|
if (!quoted) {
|
|
JSON_PRINT_NEWLINE;
|
|
|
|
if (!(str[i + 1] == '}' || str[i + 1] == ']')) {
|
|
++indent;
|
|
|
|
for (j = 0 ; j < indent ; j++) {
|
|
HAL_Printf("%s", JSON_INDENT);
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case '}':
|
|
case ']':
|
|
if (!quoted) {
|
|
if ((i > 0) && (!(str[i - 1] == '{' || str[i - 1] == '['))) {
|
|
JSON_PRINT_NEWLINE;
|
|
--indent;
|
|
|
|
for (j = 0 ; j < indent ; j++) {
|
|
HAL_Printf("%s", JSON_INDENT);
|
|
}
|
|
} else if ((i > 0) && ((str[i - 1] == '[' && ch == ']') || (str[i - 1] == '{' && ch == '}'))) {
|
|
for (j = 0 ; j < indent ; j++) {
|
|
HAL_Printf("%s", JSON_INDENT);
|
|
}
|
|
}
|
|
}
|
|
|
|
newstr[0] = ch;
|
|
JSON_PRINT_NEWSTR;
|
|
|
|
break;
|
|
|
|
case '"':
|
|
newstr[0] = ch;
|
|
JSON_PRINT_NEWSTR;
|
|
escaped = 1;
|
|
|
|
if (i > 0 && str[i - 1] == '\\') {
|
|
escaped = !escaped;
|
|
}
|
|
|
|
if (!escaped) {
|
|
quoted = !quoted;
|
|
}
|
|
|
|
break;
|
|
|
|
case ',':
|
|
newstr[0] = ch;
|
|
JSON_PRINT_NEWSTR;
|
|
if (!quoted) {
|
|
JSON_PRINT_NEWLINE;
|
|
|
|
for (j = 0 ; j < indent ; j++) {
|
|
HAL_Printf("%s", JSON_INDENT);
|
|
}
|
|
}
|
|
|
|
break;
|
|
|
|
case ':':
|
|
newstr[0] = ch;
|
|
JSON_PRINT_NEWSTR;
|
|
if (!quoted) {
|
|
HAL_Printf("%s", " ");
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
newstr[0] = ch;
|
|
JSON_PRINT_NEWSTR;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
HAL_Printf("%s", JSON_NEWLINE JSON_NEWLINE);
|
|
HAL_Printf("%s", "\033[0m");
|
|
return 0;
|
|
}
|
|
|
|
#endif /* #ifdef INFRA_LOG_NETWORK_PAYLOAD */
|
|
|