1 /*
2 * Percepio Trace Recorder for Tracealyzer v4.10.3
3 * Copyright 2023 Percepio AB
4 * www.percepio.com
5 *
6 * SPDX-License-Identifier: Apache-2.0
7 *
8 * The interface for trace utility functions.
9 */
10 
11 #ifndef TRC_UTILITY_H
12 #define TRC_UTILITY_H
13 
14 /* These will align a size up or down to a specific alignment */
15 #define TRC_ALIGN_CEIL(size, alignment) ((((size) + (alignment) - 1) / (alignment)) * (alignment))
16 #define TRC_ALIGN_FLOOR(size, alignment) (((size) / (alignment)) * (alignment))
17 
18 #ifndef TRC_MEMCPY
19 #define TRC_MEMCPY(dst, src, size) \
20     { \
21         uint32_t __i; \
22         for (__i = 0; __i < size; __i++) { \
23             ((uint8_t*)(dst))[__i] = ((uint8_t*)(src))[__i]; \
24         } \
25     }
26 #endif
27 
28 #define TRC_STRCAT(dst, dst_size, pDstLength, src) \
29 	{ \
30 		TraceUnsignedBaseType_t uxTRC_STRCAT_INDEX = 0; \
31 		while (*(pDstLength) < (dst_size)) \
32 		{ \
33 			dst[*(pDstLength)] = src[uxTRC_STRCAT_INDEX]; \
34 			if (dst[*(pDstLength)] == 0) \
35 				break; \
36 			(*(pDstLength))++; \
37 			uxTRC_STRCAT_INDEX++; \
38 		} \
39 	}
40 #if (defined(TRC_CFG_USE_GCC_STATEMENT_EXPR) && TRC_CFG_USE_GCC_STATEMENT_EXPR == 1) || \
41 	(!defined(TRC_CFG_USE_GCC_STATEMENT_EXPR) && (__GNUC__ || __IAR_SYSTEMS_ICC__ || __TI_ARM__))
42 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_1(e1)								__extension__({e1;})
43 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(e1, e2)							__extension__({e1; e2;})
44 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3(e1, e2, e3)						__extension__({e1; e2; e3;})
45 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_4(e1, e2, e3, e4)					__extension__({e1; e2; e3; e4;})
46 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_5(e1, e2, e3, e4, e5)				__extension__({e1; e2; e3; e4; e5;})
47 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_6(e1, e2, e3, e4, e5, e6)			__extension__({e1; e2; e3; e4; e5; e6;})
48 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_7(e1, e2, e3, e4, e5, e6, e7)		__extension__({e1; e2; e3; e4; e5; e6; e7;})
49 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_8(e1, e2, e3, e4, e5, e6, e7, e8)	__extension__({e1; e2; e3; e4; e5; e6; e7; e8;})
50 #else
51 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_1(e1)								(e1)
52 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_2(e1, e2)							(e1, e2)
53 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_3(e1, e2, e3)						(e1, e2, e3)
54 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_4(e1, e2, e3, e4)					(e1, e2, e3, e4)
55 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_5(e1, e2, e3, e4, e5)				(e1, e2, e3, e4, e5)
56 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_6(e1, e2, e3, e4, e5, e6)			(e1, e2, e3, e4, e5, e6)
57 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_7(e1, e2, e3, e4, e5, e6, e7)		(e1, e2, e3, e4, e5, e6, e7)
58 	#define TRC_COMMA_EXPR_TO_STATEMENT_EXPR_8(e1, e2, e3, e4, e5, e6, e7, e8)	(e1, e2, e3, e4, e5, e6, e7, e8)
59 #endif
60 
61 #endif /* TRC_UTILITY_H */
62