1 # Formatting |
1 # Formatting |
2 |
2 |
3 <warning> |
3 In the `printf.h` header you can find various useful `printf()`-like functions that can write the formatted output |
4 Outdated - Rewrite! |
4 directly to an arbitrary stream or [buffer](buffer.h.md), or to memory allocated by an [allocator](allocator.h.md). |
5 </warning> |
|
6 |
5 |
7 In this utility header you can find `printf()`-like functions that can write the formatted output to an arbitrary |
6 With the help of these convenience functions, you do not need the libc `snprintf` to print your string to a temporary buffer anymore, |
8 stream (or UCX buffer, resp.), or to memory allocated by an allocator within a single function call. |
7 plus you do not need to worry about too small buffer sizes, because the functions will automatically allocate enough memory to contain the entire formatted string. |
9 With the help of these convenience functions, you do not need to `snprintf` your string to a temporary buffer anymore, |
|
10 plus you do not need to worry about too small buffer sizes, because the functions will automatically allocate enough |
|
11 memory to contain the entire formatted string. |
|
12 |
8 |
13 ## Undocumented Symbols (TODO) |
9 ## Print to Streams and Buffers |
14 ### cx_asprintf_a |
10 |
15 ### cx_fprintf |
11 ```C |
16 ### cx_printf_sbo_size |
12 #include <cx/printf.h> |
17 ### cx_sprintf_a |
13 |
18 ### cx_sprintf_sa |
14 int cx_fprintf(void *stream, cx_write_func wfc, |
19 ### cx_vasprintf_a |
15 const char *fmt, ...); |
20 ### cx_vfprintf |
16 |
21 ### cx_vsprintf_a |
17 int cx_vfprintf(void *stream, cx_write_func wfc, |
22 ### cx_vsprintf_sa |
18 const char *fmt, va_list ap); |
|
19 |
|
20 int cx_bprintf(CxBuffer *buf, const char *fmt, ...); |
|
21 ``` |
|
22 |
|
23 > TODO: document |
|
24 {style="warning"} |
|
25 |
|
26 The `cx_vfprintf()` function is equivalent to `cx_fprintf()`, |
|
27 except that instead of being called with a variable number of arguments, |
|
28 they are called with an argument list as defined by `<stdarg.h>`. |
|
29 |
|
30 ## Print to Freshly Allocated Memory |
|
31 |
|
32 ```C |
|
33 #include <cx/printf.h> |
|
34 |
|
35 cxmutstr cx_asprintf(const char *fmt, ...); |
|
36 |
|
37 cxmutstr cx_asprintf_a(const CxAllocator *allocator, |
|
38 const char *fmt, ...); |
|
39 |
|
40 cxmutstr cx_vasprintf(const char *fmt, va_list ap); |
|
41 |
|
42 cxmutstr cx_vasprintf_a(const CxAllocator *allocator, |
|
43 const char *fmt, va_list ap); |
|
44 ``` |
|
45 |
|
46 > TODO: document |
|
47 {style="warning"} |
|
48 |
|
49 The `cx_vasprintf()` and `cx_vasprintf_a()` functions are equivalent to `cx_asprintf()` and `cx_asprintf_a()`, |
|
50 except that instead of being called with a variable number of arguments, |
|
51 they are called with an argument list as defined by `<stdarg.h>`. |
|
52 |
|
53 ## Print to Existing Memory |
|
54 |
|
55 ```C |
|
56 #include <cx/printf.h> |
|
57 |
|
58 cx_sprintf |
|
59 cx_sprintf_a |
|
60 cx_sprintf_s |
|
61 cx_sprintf_sa |
|
62 cx_vsprintf |
|
63 cx_vsprintf_a |
|
64 cx_vsprintf_s |
|
65 cx_vsprintf_sa |
|
66 ``` |
|
67 |
|
68 > TODO: document |
|
69 {style="warning"} |
|
70 |
|
71 The `cx_vsprintf()`, `cx_vsprintf_a()`, `cx_vsprintf_s()`, and `cx_vsprintf_sa()` functions are equivalent |
|
72 to `cx_sprintf()`, `cx_sprintf_a()`, `cx_sprintf_s()`, and `cx_sprintf_sa()`, |
|
73 except that instead of being called with a variable number of arguments, |
|
74 they are called with an argument list as defined by `<stdarg.h>`. |
|
75 |
|
76 ## Small Buffer Optimization |
|
77 |
|
78 All functions that allocate internal temporary memory use small buffer optimization to avoid a heap allocation |
|
79 if the expected string length is smaller than `cx_printf_sbo_size`. |
|
80 This size cannot be changed at runtime, but modified by defining the `CX_PRINTF_SBO_SIZE` macro when [building](install.md#small-buffer-optimizations) the library. |
|
81 |
|
82 <seealso> |
|
83 <category ref="apidoc"> |
|
84 <a href="https://ucx.sourceforge.io/api/printf_8h.html">printf.h</a> |
|
85 </category> |
|
86 </seealso> |
|
87 |