171 lines
4.4 KiB
C
171 lines
4.4 KiB
C
/*
|
|
* This file has been copied from the zcbor library.
|
|
* Commit zcbor 0.8.1
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2023 Nordic Semiconductor ASA
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZCBOR_PRINT_H__
|
|
#define ZCBOR_PRINT_H__
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef ZCBOR_PRINT_FUNC
|
|
#include <stdio.h>
|
|
#define zcbor_do_print(...) printf(__VA_ARGS__)
|
|
#else
|
|
#define zcbor_do_print(...) ZCBOR_PRINT_FUNC(__VA_ARGS__)
|
|
#endif
|
|
|
|
#ifdef ZCBOR_VERBOSE
|
|
#define zcbor_trace_raw(state) (zcbor_do_print("rem: %zu, cur: 0x%x, ec: 0x%zx, err: %d",\
|
|
(size_t)state->payload_end - (size_t)state->payload, *state->payload, state->elem_count, \
|
|
state->constant_state ? state->constant_state->error : 0))
|
|
#define zcbor_trace(state, appendix) do { \
|
|
zcbor_trace_raw(state); \
|
|
zcbor_do_print(", %s\n", appendix); \
|
|
} while(0)
|
|
#define zcbor_trace_file(state) do { \
|
|
zcbor_trace_raw(state); \
|
|
zcbor_do_print(", %s:%d\n", __FILE__, __LINE__); \
|
|
} while(0)
|
|
|
|
#define zcbor_log_assert(expr, ...) \
|
|
do { \
|
|
zcbor_do_print("ASSERTION \n \"" #expr \
|
|
"\"\nfailed at %s:%d with message:\n ", \
|
|
__FILE__, __LINE__); \
|
|
zcbor_do_print(__VA_ARGS__);\
|
|
} while(0)
|
|
#define zcbor_log(...) zcbor_do_print(__VA_ARGS__)
|
|
#else
|
|
#define zcbor_trace(state, appendix)
|
|
#define zcbor_trace_file(state) ((void)state)
|
|
#define zcbor_log_assert(...)
|
|
#define zcbor_log(...)
|
|
#endif
|
|
|
|
#ifdef ZCBOR_ASSERTS
|
|
#define zcbor_assert(expr, ...) \
|
|
do { \
|
|
if (!(expr)) { \
|
|
zcbor_log_assert(expr, __VA_ARGS__); \
|
|
ZCBOR_FAIL(); \
|
|
} \
|
|
} while(0)
|
|
#define zcbor_assert_state(expr, ...) \
|
|
do { \
|
|
if (!(expr)) { \
|
|
zcbor_log_assert(expr, __VA_ARGS__); \
|
|
ZCBOR_ERR(ZCBOR_ERR_ASSERTION); \
|
|
} \
|
|
} while(0)
|
|
#else
|
|
#define zcbor_assert(expr, ...)
|
|
#define zcbor_assert_state(expr, ...)
|
|
#endif
|
|
|
|
__attribute__((used))
|
|
static void zcbor_print_compare_lines(const uint8_t *str1, const uint8_t *str2, size_t size)
|
|
{
|
|
for (size_t j = 0; j < size; j++) {
|
|
zcbor_do_print("%x ", str1[j]);
|
|
}
|
|
zcbor_do_print("\r\n");
|
|
for (size_t j = 0; j < size; j++) {
|
|
zcbor_do_print("%x ", str2[j]);
|
|
}
|
|
zcbor_do_print("\r\n");
|
|
for (size_t j = 0; j < size; j++) {
|
|
zcbor_do_print("%x ", str1[j] != str2[j]);
|
|
}
|
|
zcbor_do_print("\r\n");
|
|
zcbor_do_print("\r\n");
|
|
}
|
|
|
|
__attribute__((used))
|
|
static void zcbor_print_compare_strings(const uint8_t *str1, const uint8_t *str2, size_t size)
|
|
{
|
|
const size_t col_width = 16;
|
|
|
|
for (size_t i = 0; i <= size / col_width; i++) {
|
|
zcbor_do_print("line %zu (char %zu)\r\n", i, i*col_width);
|
|
zcbor_print_compare_lines(&str1[i*col_width], &str2[i*col_width],
|
|
MIN(col_width, (size - i*col_width)));
|
|
}
|
|
zcbor_do_print("\r\n");
|
|
}
|
|
|
|
__attribute__((used))
|
|
static void zcbor_print_compare_strings_diff(const uint8_t *str1, const uint8_t *str2, size_t size)
|
|
{
|
|
const size_t col_width = 16;
|
|
bool printed = false;
|
|
|
|
for (size_t i = 0; i <= size / col_width; i++) {
|
|
if (memcmp(&str1[i*col_width], &str2[i*col_width], MIN(col_width, (size - i*col_width))) != 0) {
|
|
zcbor_do_print("line %zu (char %zu)\r\n", i, i*col_width);
|
|
zcbor_print_compare_lines(&str1[i*col_width], &str2[i*col_width],
|
|
MIN(col_width, (size - i*col_width)));
|
|
printed = true;
|
|
}
|
|
}
|
|
if (printed) {
|
|
zcbor_do_print("\r\n");
|
|
}
|
|
}
|
|
|
|
__attribute__((used))
|
|
static const char *zcbor_error_str(int error)
|
|
{
|
|
#define ZCBOR_ERR_CASE(err) case err: \
|
|
return #err; /* The literal is static per C99 6.4.5 paragraph 5. */\
|
|
|
|
switch(error) {
|
|
ZCBOR_ERR_CASE(ZCBOR_SUCCESS)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_NO_BACKUP_MEM)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_NO_BACKUP_ACTIVE)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_LOW_ELEM_COUNT)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_HIGH_ELEM_COUNT)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_INT_SIZE)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_FLOAT_SIZE)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_ADDITIONAL_INVAL)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_NO_PAYLOAD)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_PAYLOAD_NOT_CONSUMED)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_WRONG_TYPE)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_WRONG_VALUE)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_WRONG_RANGE)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_ITERATIONS)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_ASSERTION)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_PAYLOAD_OUTDATED)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_ELEM_NOT_FOUND)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_MAP_MISALIGNED)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_ELEMS_NOT_PROCESSED)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_NOT_AT_END)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_MAP_FLAGS_NOT_AVAILABLE)
|
|
ZCBOR_ERR_CASE(ZCBOR_ERR_INVALID_VALUE_ENCODING)
|
|
}
|
|
#undef ZCBOR_ERR_CASE
|
|
|
|
return "ZCBOR_ERR_UNKNOWN";
|
|
}
|
|
|
|
__attribute__((used))
|
|
static void zcbor_print_error(int error)
|
|
{
|
|
zcbor_do_print("%s\r\n", zcbor_error_str(error));
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZCBOR_PRINT_H__ */
|