1 /*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7
8 #include <stdint.h>
9 #include <stdbool.h>
10 #include <stddef.h>
11 #include <inttypes.h>
12 #include <zcbor_common.h>
13 #include <zcbor_decode.h>
14 #include <zcbor_print.h>
15
16
zcbor_print_compare_lines(const uint8_t * str1,const uint8_t * str2,size_t size)17 void zcbor_print_compare_lines(const uint8_t *str1, const uint8_t *str2, size_t size)
18 {
19 for (size_t j = 0; j < size; j++) {
20 zcbor_do_print("%x ", str1[j]);
21 }
22 zcbor_do_print("\r\n");
23 for (size_t j = 0; j < size; j++) {
24 zcbor_do_print("%x ", str2[j]);
25 }
26 zcbor_do_print("\r\n");
27 for (size_t j = 0; j < size; j++) {
28 zcbor_do_print("%x ", str1[j] != str2[j]);
29 }
30 zcbor_do_print("\r\n");
31 zcbor_do_print("\r\n");
32 }
33
34
zcbor_print_compare_strings(const uint8_t * str1,const uint8_t * str2,size_t size)35 void zcbor_print_compare_strings(const uint8_t *str1, const uint8_t *str2, size_t size)
36 {
37 const size_t col_width = 16;
38
39 for (size_t i = 0; i <= size / col_width; i++) {
40 zcbor_do_print("line %zu (char %zu)\r\n", i, i*col_width);
41 zcbor_print_compare_lines(&str1[i*col_width], &str2[i*col_width],
42 MIN(col_width, (size - i*col_width)));
43 }
44 zcbor_do_print("\r\n");
45 }
46
47
zcbor_print_compare_strings_diff(const uint8_t * str1,const uint8_t * str2,size_t size)48 void zcbor_print_compare_strings_diff(const uint8_t *str1, const uint8_t *str2, size_t size)
49 {
50 const size_t col_width = 16;
51 bool printed = false;
52
53 for (size_t i = 0; i <= size / col_width; i++) {
54 if (memcmp(&str1[i*col_width], &str2[i*col_width], MIN(col_width, (size - i*col_width))) != 0) {
55 zcbor_do_print("line %zu (char %zu)\r\n", i, i*col_width);
56 zcbor_print_compare_lines(&str1[i*col_width], &str2[i*col_width],
57 MIN(col_width, (size - i*col_width)));
58 printed = true;
59 }
60 }
61 if (printed) {
62 zcbor_do_print("\r\n");
63 }
64 }
65
66
zcbor_error_str(int error)67 const char *zcbor_error_str(int error)
68 {
69 #define ZCBOR_ERR_CASE(err) case err: \
70 return #err; /* The literal is static per C99 6.4.5 paragraph 5. */\
71
72 switch(error) {
73 ZCBOR_ERR_CASE(ZCBOR_SUCCESS)
74 ZCBOR_ERR_CASE(ZCBOR_ERR_NO_BACKUP_MEM)
75 ZCBOR_ERR_CASE(ZCBOR_ERR_NO_BACKUP_ACTIVE)
76 ZCBOR_ERR_CASE(ZCBOR_ERR_LOW_ELEM_COUNT)
77 ZCBOR_ERR_CASE(ZCBOR_ERR_HIGH_ELEM_COUNT)
78 ZCBOR_ERR_CASE(ZCBOR_ERR_INT_SIZE)
79 ZCBOR_ERR_CASE(ZCBOR_ERR_FLOAT_SIZE)
80 ZCBOR_ERR_CASE(ZCBOR_ERR_ADDITIONAL_INVAL)
81 ZCBOR_ERR_CASE(ZCBOR_ERR_NO_PAYLOAD)
82 ZCBOR_ERR_CASE(ZCBOR_ERR_PAYLOAD_NOT_CONSUMED)
83 ZCBOR_ERR_CASE(ZCBOR_ERR_WRONG_TYPE)
84 ZCBOR_ERR_CASE(ZCBOR_ERR_WRONG_VALUE)
85 ZCBOR_ERR_CASE(ZCBOR_ERR_WRONG_RANGE)
86 ZCBOR_ERR_CASE(ZCBOR_ERR_ITERATIONS)
87 ZCBOR_ERR_CASE(ZCBOR_ERR_ASSERTION)
88 ZCBOR_ERR_CASE(ZCBOR_ERR_PAYLOAD_OUTDATED)
89 ZCBOR_ERR_CASE(ZCBOR_ERR_ELEM_NOT_FOUND)
90 ZCBOR_ERR_CASE(ZCBOR_ERR_MAP_MISALIGNED)
91 ZCBOR_ERR_CASE(ZCBOR_ERR_ELEMS_NOT_PROCESSED)
92 ZCBOR_ERR_CASE(ZCBOR_ERR_NOT_AT_END)
93 ZCBOR_ERR_CASE(ZCBOR_ERR_MAP_FLAGS_NOT_AVAILABLE)
94 ZCBOR_ERR_CASE(ZCBOR_ERR_INVALID_VALUE_ENCODING)
95 ZCBOR_ERR_CASE(ZCBOR_ERR_CONSTANT_STATE_MISSING)
96 }
97 #undef ZCBOR_ERR_CASE
98
99 return "ZCBOR_ERR_UNKNOWN";
100 }
101
102
zcbor_print_error(int error)103 void zcbor_print_error(int error)
104 {
105 zcbor_do_print("%s\r\n", zcbor_error_str(error));
106 }
107