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