123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- /*
- * Copyright (c) 2021 Nordic Semiconductor ASA
- *
- * SPDX-License-Identifier: Apache-2.0
- */
- #ifndef ZEPHYR_INCLUDE_SYS_CBPRINTF_CXX_H_
- #define ZEPHYR_INCLUDE_SYS_CBPRINTF_CXX_H_
- #ifdef __cplusplus
- /* C++ version for detecting a pointer to a string. */
- static inline int z_cbprintf_cxx_is_pchar(char *)
- {
- return 1;
- }
- static inline int z_cbprintf_cxx_is_pchar(const char *)
- {
- return 1;
- }
- static inline int z_cbprintf_cxx_is_pchar(volatile char *)
- {
- return 1;
- }
- static inline int z_cbprintf_cxx_is_pchar(const volatile char *)
- {
- return 1;
- }
- static inline int z_cbprintf_cxx_is_pchar(wchar_t *)
- {
- return 1;
- }
- static inline int z_cbprintf_cxx_is_pchar(const wchar_t *)
- {
- return 1;
- }
- static inline int z_cbprintf_cxx_is_pchar(volatile wchar_t *)
- {
- return 1;
- }
- static inline int z_cbprintf_cxx_is_pchar(const volatile wchar_t *)
- {
- return 1;
- }
- template < typename T >
- static inline int z_cbprintf_cxx_is_pchar(T arg)
- {
- _Pragma("GCC diagnostic push")
- _Pragma("GCC diagnostic ignored \"-Wpointer-arith\"")
- return 0;
- _Pragma("GCC diagnostic pop")
- }
- /* C++ version for calculating argument size. */
- static inline size_t z_cbprintf_cxx_arg_size(float f)
- {
- ARG_UNUSED(f);
- return sizeof(double);
- }
- static inline size_t z_cbprintf_cxx_arg_size(void *p)
- {
- ARG_UNUSED(p);
- return sizeof(void *);
- }
- template < typename T >
- static inline size_t z_cbprintf_cxx_arg_size(T arg)
- {
- return sizeof(arg + 0);
- }
- /* C++ version for storing arguments. */
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, float arg)
- {
- double d = (double)arg;
- void *p = &d;
- z_cbprintf_wcpy((int *)dst, (int *)p, sizeof(d) / sizeof(int));
- }
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, void *p)
- {
- z_cbprintf_wcpy((int *)dst, (int *)&p, sizeof(p) / sizeof(int));
- }
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, char arg)
- {
- int tmp = arg + 0;
- z_cbprintf_wcpy((int *)dst, &tmp, 1);
- }
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, unsigned char arg)
- {
- int tmp = arg + 0;
- z_cbprintf_wcpy((int *)dst, &tmp, 1);
- }
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, signed char arg)
- {
- int tmp = arg + 0;
- z_cbprintf_wcpy((int *)dst, &tmp, 1);
- }
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, short arg)
- {
- int tmp = arg + 0;
- z_cbprintf_wcpy((int *)dst, &tmp, 1);
- }
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, unsigned short arg)
- {
- int tmp = arg + 0;
- z_cbprintf_wcpy((int *)dst, &tmp, 1);
- }
- template < typename T >
- static inline void z_cbprintf_cxx_store_arg(uint8_t *dst, T arg)
- {
- size_t wlen = z_cbprintf_cxx_arg_size(arg) / sizeof(int);
- void *p = &arg;
- z_cbprintf_wcpy((int *)dst, (int *)p, wlen);
- }
- /* C++ version for long double detection. */
- static inline int z_cbprintf_cxx_is_longdouble(long double arg)
- {
- ARG_UNUSED(arg);
- return 1;
- }
- template < typename T >
- static inline int z_cbprintf_cxx_is_longdouble(T arg)
- {
- ARG_UNUSED(arg);
- return 0;
- }
- /* C++ version for caluculating argument alignment. */
- static inline size_t z_cbprintf_cxx_alignment(float arg)
- {
- ARG_UNUSED(arg);
- return VA_STACK_ALIGN(double);
- }
- static inline size_t z_cbprintf_cxx_alignment(double arg)
- {
- ARG_UNUSED(arg);
- return VA_STACK_ALIGN(double);
- }
- static inline size_t z_cbprintf_cxx_alignment(long double arg)
- {
- ARG_UNUSED(arg);
- return VA_STACK_ALIGN(long double);
- }
- static inline size_t z_cbprintf_cxx_alignment(long long arg)
- {
- ARG_UNUSED(arg);
- return VA_STACK_ALIGN(long long);
- }
- static inline size_t z_cbprintf_cxx_alignment(unsigned long long arg)
- {
- ARG_UNUSED(arg);
- return VA_STACK_ALIGN(long long);
- }
- template < typename T >
- static inline size_t z_cbprintf_cxx_alignment(T arg)
- {
- return MAX(__alignof__(arg), VA_STACK_MIN_ALIGN);
- }
- #endif /* __cplusplus */
- #endif /* ZEPHYR_INCLUDE_SYS_CBPRINTF_CXX_H_ */
|