Zephyr Project API 3.7.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
cbprintf.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_SYS_CBPRINTF_H_
8#define ZEPHYR_INCLUDE_SYS_CBPRINTF_H_
9
10#include <stdarg.h>
11#include <stddef.h>
12#include <stdint.h>
13#include <zephyr/toolchain.h>
14#include <string.h>
15
16#ifdef CONFIG_CBPRINTF_LIBC_SUBSTS
17#include <stdio.h>
18#endif /* CONFIG_CBPRINTF_LIBC_SUBSTS */
19
20/* Determine if _Generic is supported using macro from toolchain.h.
21 *
22 * @note Z_C_GENERIC is also set for C++ where functionality is implemented
23 * using overloading and templates.
24 */
25#ifndef Z_C_GENERIC
26#if defined(__cplusplus) || TOOLCHAIN_HAS_C_GENERIC
27#define Z_C_GENERIC 1
28#else
29#define Z_C_GENERIC 0
30#endif
31#endif
32
33#ifdef __xtensa__
34#define Z_PKG_HDR_EXT_XTENSA_ALIGNMENT 8
35#ifdef CONFIG_CBPRINTF_PACKAGE_HEADER_STORE_CREATION_FLAGS
36#define Z_PKG_DESC_XTENSA_PADDING 1
37#else
38#define Z_PKG_DESC_XTENSA_PADDING 0
39#endif
40#endif /* __xtensa__ */
41
48
51
54
57
58#ifdef CONFIG_CBPRINTF_PACKAGE_HEADER_STORE_CREATION_FLAGS
60 uint32_t pkg_flags;
61#endif
62#ifdef __xtensa__
63 /*
64 * On Xtensa, the first argument needs to be aligned to 8-byte.
65 * With 32-bit pointers, we need another 4 bytes padding so
66 * that whole struct cbprintf_package_hdr_ext is of multiple of
67 * 8 bytes.
68 */
69 uint32_t xtensa_padding[Z_PKG_DESC_XTENSA_PADDING];
70#endif
71
72} __packed;
73
81
82 void *raw;
83
84#if defined(CONFIG_CBPRINTF_PACKAGE_HEADER_STORE_CREATION_FLAGS) && !defined(CONFIG_64BIT)
85 void *raw2[2];
86#endif
87
88} __packed;
89
90
91
99
101 char *fmt;
102
103 /*
104 * When extending this struct, make sure this align
105 * to pointer size.
106 */
107} __packed;
108
109
115#ifdef __xtensa__
116BUILD_ASSERT(sizeof(struct cbprintf_package_hdr_ext) % Z_PKG_HDR_EXT_XTENSA_ALIGNMENT == 0,
117 "Package header size on Xtensa must be aligned");
118#endif
123/* Z_C_GENERIC is used there */
125
126#ifdef __cplusplus
127extern "C" {
128#endif
129
137#ifdef __xtensa__
138#define CBPRINTF_PACKAGE_ALIGNMENT 16
139#else
140#define CBPRINTF_PACKAGE_ALIGNMENT \
141 Z_POW2_CEIL(COND_CODE_1(CONFIG_CBPRINTF_PACKAGE_LONGDOUBLE, \
142 (sizeof(long double)), (MAX(sizeof(double), sizeof(long long)))))
143#endif
144
145BUILD_ASSERT(Z_IS_POW2(CBPRINTF_PACKAGE_ALIGNMENT));
146
147
156#define CBPRINTF_PACKAGE_CONST_CHAR_RO BIT(0)
157
159#define CBPRINTF_PACKAGE_ADD_RO_STR_POS BIT(1)
160
165#define CBPRINTF_PACKAGE_ADD_RW_STR_POS BIT(2)
166
167#define Z_CBPRINTF_PACKAGE_FIRST_RO_STR_BITS 3
168#define Z_CBPRINTF_PACKAGE_FIRST_RO_STR_OFFSET 3
169#define Z_CBPRINTF_PACKAGE_FIRST_RO_STR_MASK BIT_MASK(Z_CBPRINTF_PACKAGE_FIRST_RO_STR_BITS)
170
178#define CBPRINTF_PACKAGE_FIRST_RO_STR_CNT(n) \
179 (n << Z_CBPRINTF_PACKAGE_FIRST_RO_STR_OFFSET)
180
184#define Z_CBPRINTF_PACKAGE_FIRST_RO_STR_CNT_GET(flags) \
185 (((flags) >> Z_CBPRINTF_PACKAGE_FIRST_RO_STR_OFFSET) & Z_CBPRINTF_PACKAGE_FIRST_RO_STR_MASK)
186
193#define CBPRINTF_PACKAGE_ADD_STRING_IDXS \
194 (CBPRINTF_PACKAGE_ADD_RO_STR_POS | CBPRINTF_PACKAGE_CONST_CHAR_RO)
195
201#define CBPRINTF_PACKAGE_ARGS_ARE_TAGGED BIT(6)
202
218#define CBPRINTF_PACKAGE_CONVERT_RO_STR BIT(0)
220#define CBPRINTF_PACKAGE_COPY_RO_STR CBPRINTF_PACKAGE_CONVERT_RO_STR __DEPRECATED_MACRO
221
232#define CBPRINTF_PACKAGE_CONVERT_RW_STR BIT(1)
234#define CBPRINTF_PACKAGE_COPY_RW_STR CBPRINTF_PACKAGE_CONVERT_RW_STR __DEPRECATED_MACRO
235
241#define CBPRINTF_PACKAGE_CONVERT_KEEP_RO_STR BIT(2)
243#define CBPRINTF_PACKAGE_COPY_KEEP_RO_STR CBPRINTF_PACKAGE_CONVERT_KEEP_RO_STR __DEPRECATED_MACRO
244
262#define CBPRINTF_PACKAGE_CONVERT_PTR_CHECK BIT(3)
263
276#define Z_CBVPRINTF_PROCESS_FLAG_TAGGED_ARGS BIT(0)
277
281
299#ifdef __CHECKER__
300typedef int (*cbprintf_cb)(int c, void *ctx);
301#else
302typedef int (*cbprintf_cb)(/* int c, void *ctx */);
303#endif
304
305/* Create local cbprintf_cb type to make calng-based compilers happy when handles
306 * OUTC() macro (see below). With strict rules (Wincompatible-function-pointer-types-strict)
307 * it's prohibited to pass arguments with mismatched types.
308 */
309typedef int (*cbprintf_cb_local)(int c, void *ctx);
310
319typedef int (*cbprintf_convert_cb)(const void *buf, size_t len, void *ctx);
320
339typedef int (*cbvprintf_external_formatter_func)(cbprintf_cb out, void *ctx,
340 const char *fmt, va_list ap);
341
359#define CBPRINTF_MUST_RUNTIME_PACKAGE(flags, ... /* fmt, ... */) \
360 Z_CBPRINTF_MUST_RUNTIME_PACKAGE(flags, __VA_ARGS__)
361
391#define CBPRINTF_STATIC_PACKAGE(packaged, inlen, outlen, align_offset, flags, \
392 ... /* fmt, ... */) \
393 Z_CBPRINTF_STATIC_PACKAGE(packaged, inlen, outlen, \
394 align_offset, flags, __VA_ARGS__)
395
436__printf_like(4, 5)
437int cbprintf_package(void *packaged,
438 size_t len,
440 const char *format,
441 ...);
442
477int cbvprintf_package(void *packaged,
478 size_t len,
480 const char *format,
481 va_list ap);
482
518int cbprintf_package_convert(void *in_packaged,
519 size_t in_len,
521 void *ctx,
523 uint16_t *strl,
524 size_t strl_len);
525
526/* @internal Context used for package copying. */
527struct z_cbprintf_buf_desc {
528 void *buf;
529 size_t size;
530 size_t off;
531};
532
533/* @internal Function callback used for package copying. */
534static inline int z_cbprintf_cpy(const void *buf, size_t len, void *ctx)
535{
536 struct z_cbprintf_buf_desc *desc = (struct z_cbprintf_buf_desc *)ctx;
537
538 if ((desc->size - desc->off) < len) {
539 return -ENOSPC;
540 }
541
542 memcpy(&((uint8_t *)desc->buf)[desc->off], buf, len);
543 desc->off += len;
544
545 return len;
546}
547
578static inline int cbprintf_package_copy(void *in_packaged,
579 size_t in_len,
580 void *packaged,
581 size_t len,
583 uint16_t *strl,
584 size_t strl_len)
585{
586 struct z_cbprintf_buf_desc buf_desc = {
587 .buf = packaged,
588 .size = len,
589 .off = 0,
590 };
591
592 return cbprintf_package_convert(in_packaged, in_len,
593 packaged ? z_cbprintf_cpy : NULL, &buf_desc,
594 flags, strl, strl_len);
595}
596
626static inline int cbprintf_fsc_package(void *in_packaged,
627 size_t in_len,
628 void *packaged,
629 size_t len)
630{
631 return cbprintf_package_copy(in_packaged, in_len, packaged, len,
634}
635
658 void *ctx,
659 void *packaged);
660
687__printf_like(3, 4)
688int cbprintf(cbprintf_cb out, void *ctx, const char *format, ...);
689
718int z_cbvprintf_impl(cbprintf_cb out, void *ctx, const char *format,
719 va_list ap, uint32_t flags);
720
746#ifdef CONFIG_PICOLIBC
747int cbvprintf(cbprintf_cb out, void *ctx, const char *format, va_list ap);
748#else
749static inline
750int cbvprintf(cbprintf_cb out, void *ctx, const char *format, va_list ap)
751{
752 return z_cbvprintf_impl(out, ctx, format, ap, 0);
753}
754#endif
755
783static inline
785 const char *format, va_list ap)
786{
787 return z_cbvprintf_impl(out, ctx, format, ap,
788 Z_CBVPRINTF_PROCESS_FLAG_TAGGED_ARGS);
789}
790
808static inline
809int cbpprintf(cbprintf_cb out, void *ctx, void *packaged)
810{
811#if defined(CONFIG_CBPRINTF_PACKAGE_SUPPORT_TAGGED_ARGUMENTS)
812 union cbprintf_package_hdr *hdr =
813 (union cbprintf_package_hdr *)packaged;
814
815 if ((hdr->desc.pkg_flags & CBPRINTF_PACKAGE_ARGS_ARE_TAGGED)
818 ctx, packaged);
819 }
820#endif
821
822 return cbpprintf_external(out, cbvprintf, ctx, packaged);
823}
824
825#ifdef CONFIG_CBPRINTF_LIBC_SUBSTS
826
827#ifdef CONFIG_PICOLIBC
828
829#define fprintfcb(stream, ...) fprintf(stream, __VA_ARGS__)
830#define vfprintfcb(stream, format, ap) vfprintf(stream, format, ap)
831#define printfcb(format, ...) printf(format, __VA_ARGS__)
832#define vprintfcb(format, ap) vprintf(format, ap)
833#define snprintfcb(str, size, ...) snprintf(str, size, __VA_ARGS__)
834#define vsnprintfcb(str, size, format, ap) vsnprintf(str, size, format, ap)
835
836#else
837
856__printf_like(2, 3)
857int fprintfcb(FILE * stream, const char *format, ...);
858
876int vfprintfcb(FILE *stream, const char *format, va_list ap);
877
894__printf_like(1, 2)
895int printfcb(const char *format, ...);
896
912int vprintfcb(const char *format, va_list ap);
913
937__printf_like(3, 4)
938int snprintfcb(char *str, size_t size, const char *format, ...);
939
962int vsnprintfcb(char *str, size_t size, const char *format, va_list ap);
963
964#endif /* CONFIG_PICOLIBC */
965#endif /* CONFIG_CBPRINTF_LIBC_SUBSTS */
966
971#ifdef __cplusplus
972}
973#endif
974
975#endif /* ZEPHYR_INCLUDE_SYS_CBPRINTF_H_ */
irp nz macro MOVR cc s mov cc s endm endr irp aw macro LDR aa off
Definition asm-macro-32-bit-gnu.h:17
#define CBPRINTF_PACKAGE_CONVERT_RO_STR
Append read-only strings from source package to destination package.
Definition cbprintf.h:218
#define CBPRINTF_PACKAGE_CONVERT_RW_STR
Append read-write strings from source package to destination package.
Definition cbprintf.h:232
#define CBPRINTF_PACKAGE_ARGS_ARE_TAGGED
Indicate the incoming arguments are tagged.
Definition cbprintf.h:201
int cbprintf(cbprintf_cb out, void *ctx, const char *format,...)
*printf-like output through a callback.
int(* cbvprintf_external_formatter_func)(cbprintf_cb out, void *ctx, const char *fmt, va_list ap)
Signature for a external formatter function identical to cbvprintf.
Definition cbprintf.h:339
static int cbpprintf(cbprintf_cb out, void *ctx, void *packaged)
Generate the output for a previously captured format operation.
Definition cbprintf.h:809
int printfcb(const char *format,...)
printf using Zephyrs cbprintf infrastructure.
int vfprintfcb(FILE *stream, const char *format, va_list ap)
vfprintf using Zephyrs cbprintf infrastructure.
int fprintfcb(FILE *stream, const char *format,...)
fprintf using Zephyrs cbprintf infrastructure.
int vsnprintfcb(char *str, size_t size, const char *format, va_list ap)
vsnprintf using Zephyrs cbprintf infrastructure.
#define CBPRINTF_PACKAGE_ALIGNMENT
Required alignment of the buffer used for packaging.
Definition cbprintf.h:140
int cbprintf_package_convert(void *in_packaged, size_t in_len, cbprintf_convert_cb cb, void *ctx, uint32_t flags, uint16_t *strl, size_t strl_len)
Convert a package.
static int cbprintf_fsc_package(void *in_packaged, size_t in_len, void *packaged, size_t len)
Convert package to fully self-contained (fsc) package.
Definition cbprintf.h:626
int(* cbprintf_convert_cb)(const void *buf, size_t len, void *ctx)
Signature for a cbprintf multibyte callback function.
Definition cbprintf.h:319
static int cbprintf_package_copy(void *in_packaged, size_t in_len, void *packaged, size_t len, uint32_t flags, uint16_t *strl, size_t strl_len)
Copy package with optional appending of strings.
Definition cbprintf.h:578
static int cbvprintf(cbprintf_cb out, void *ctx, const char *format, va_list ap)
varargs-aware *printf-like output through a callback.
Definition cbprintf.h:750
int snprintfcb(char *str, size_t size, const char *format,...)
snprintf using Zephyrs cbprintf infrastructure.
int(* cbprintf_cb_local)(int c, void *ctx)
Definition cbprintf.h:309
int cbpprintf_external(cbprintf_cb out, cbvprintf_external_formatter_func formatter, void *ctx, void *packaged)
Generate the output for a previously captured format operation using an external formatter.
int vprintfcb(const char *format, va_list ap)
vprintf using Zephyrs cbprintf infrastructure.
int cbvprintf_package(void *packaged, size_t len, uint32_t flags, const char *format, va_list ap)
Capture state required to output formatted data later.
int(* cbprintf_cb)()
Signature for a cbprintf callback function.
Definition cbprintf.h:302
int cbprintf_package(void *packaged, size_t len, uint32_t flags, const char *format,...)
Capture state required to output formatted data later.
static int cbvprintf_tagged_args(cbprintf_cb out, void *ctx, const char *format, va_list ap)
varargs-aware *printf-like output through a callback with tagged arguments.
Definition cbprintf.h:784
#define ENOSPC
No space left on device.
Definition errno.h:66
flags
Definition parser.h:96
char c
Definition printk.c:169
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
int FILE
Definition stdio.h:22
void * memcpy(void *ZRESTRICT d, const void *ZRESTRICT s, size_t n)
cbprintf package descriptor.
Definition cbprintf.h:45
uint8_t len
Package length (in 32 bit words)
Definition cbprintf.h:47
uint8_t str_cnt
Number of appended strings in the package.
Definition cbprintf.h:50
uint8_t ro_str_cnt
Number of read-only strings, indexes appended to the package.
Definition cbprintf.h:53
uint8_t rw_str_cnt
Number of read-write strings, indexes appended to the package.
Definition cbprintf.h:56
cbprintf package header with format string pointer.
Definition cbprintf.h:96
union cbprintf_package_hdr hdr
Header of package.
Definition cbprintf.h:98
char * fmt
Pointer to format string.
Definition cbprintf.h:101
Macros to abstract toolchain specific capabilities.
cbprintf package header
Definition cbprintf.h:78
void * raw
Definition cbprintf.h:82
struct cbprintf_package_desc desc
Header description.
Definition cbprintf.h:80