Tue, 20 Aug 2024 18:04:31 +0200
close feature branch
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
1 | /* |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
3 | * |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
4 | * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
5 | * |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
8 | * |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
11 | * |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
15 | * |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
27 | */ |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
28 | |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
29 | #include "cx/printf.h" |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
30 | |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
31 | #include <stdio.h> |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
32 | #include <string.h> |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
33 | |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
34 | #ifndef CX_PRINTF_SBO_SIZE |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
35 | #define CX_PRINTF_SBO_SIZE 512 |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
36 | #endif |
805
26500fc24058
add constant for reading out printf sbo size - relates to #343
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
37 | unsigned const cx_printf_sbo_size = CX_PRINTF_SBO_SIZE; |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
38 | |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
39 | int cx_fprintf( |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
40 | void *stream, |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
41 | cx_write_func wfc, |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
42 | char const *fmt, |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
43 | ... |
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
44 | ) { |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
45 | int ret; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
46 | va_list ap; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
47 | va_start(ap, fmt); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
48 | ret = cx_vfprintf(stream, wfc, fmt, ap); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
49 | va_end(ap); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
50 | return ret; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
51 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
52 | |
644 | 53 | int cx_vfprintf( |
54 | void *stream, | |
55 | cx_write_func wfc, | |
56 | char const *fmt, | |
57 | va_list ap | |
58 | ) { | |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
59 | char buf[CX_PRINTF_SBO_SIZE]; |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
60 | va_list ap2; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
61 | va_copy(ap2, ap); |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
62 | int ret = vsnprintf(buf, CX_PRINTF_SBO_SIZE, fmt, ap); |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
63 | if (ret < 0) { |
811
b02ad05c7f2d
fix missing va_end() calls
Mike Becker <universe@uap-core.de>
parents:
810
diff
changeset
|
64 | va_end(ap2); |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
65 | return ret; |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
66 | } else if (ret < CX_PRINTF_SBO_SIZE) { |
811
b02ad05c7f2d
fix missing va_end() calls
Mike Becker <universe@uap-core.de>
parents:
810
diff
changeset
|
67 | va_end(ap2); |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
68 | return (int) wfc(buf, 1, ret, stream); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
69 | } else { |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
70 | int len = ret + 1; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
71 | char *newbuf = malloc(len); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
72 | if (!newbuf) { |
811
b02ad05c7f2d
fix missing va_end() calls
Mike Becker <universe@uap-core.de>
parents:
810
diff
changeset
|
73 | va_end(ap2); |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
74 | return -1; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
75 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
76 | |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
77 | ret = vsnprintf(newbuf, len, fmt, ap2); |
811
b02ad05c7f2d
fix missing va_end() calls
Mike Becker <universe@uap-core.de>
parents:
810
diff
changeset
|
78 | va_end(ap2); |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
79 | if (ret > 0) { |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
80 | ret = (int) wfc(newbuf, 1, ret, stream); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
81 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
82 | free(newbuf); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
83 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
84 | return ret; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
85 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
86 | |
644 | 87 | cxmutstr cx_asprintf_a( |
693
494d9b20b99e
fix missing const qualifier for allocator
Mike Becker <universe@uap-core.de>
parents:
644
diff
changeset
|
88 | CxAllocator const *allocator, |
644 | 89 | char const *fmt, |
90 | ... | |
91 | ) { | |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
92 | va_list ap; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
93 | va_start(ap, fmt); |
805
26500fc24058
add constant for reading out printf sbo size - relates to #343
Mike Becker <universe@uap-core.de>
parents:
693
diff
changeset
|
94 | cxmutstr ret = cx_vasprintf_a(allocator, fmt, ap); |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
95 | va_end(ap); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
96 | return ret; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
97 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
98 | |
644 | 99 | cxmutstr cx_vasprintf_a( |
693
494d9b20b99e
fix missing const qualifier for allocator
Mike Becker <universe@uap-core.de>
parents:
644
diff
changeset
|
100 | CxAllocator const *a, |
644 | 101 | char const *fmt, |
102 | va_list ap | |
103 | ) { | |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
104 | cxmutstr s; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
105 | s.ptr = NULL; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
106 | s.length = 0; |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
107 | char buf[CX_PRINTF_SBO_SIZE]; |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
108 | va_list ap2; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
109 | va_copy(ap2, ap); |
643
5700ba9154ab
#228 make buffer sizes adjustable at compile time
Mike Becker <universe@uap-core.de>
parents:
634
diff
changeset
|
110 | int ret = vsnprintf(buf, CX_PRINTF_SBO_SIZE, fmt, ap); |
812
fda0f1910d7e
fix unnecessary printf retry when printed string is empty
Mike Becker <universe@uap-core.de>
parents:
811
diff
changeset
|
111 | if (ret >= 0 && ret < CX_PRINTF_SBO_SIZE) { |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
112 | s.ptr = cxMalloc(a, ret + 1); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
113 | if (s.ptr) { |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
114 | s.length = (size_t) ret; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
115 | memcpy(s.ptr, buf, ret); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
116 | s.ptr[s.length] = '\0'; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
117 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
118 | } else { |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
119 | int len = ret + 1; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
120 | s.ptr = cxMalloc(a, len); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
121 | if (s.ptr) { |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
122 | ret = vsnprintf(s.ptr, len, fmt, ap2); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
123 | if (ret < 0) { |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
124 | free(s.ptr); |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
125 | s.ptr = NULL; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
126 | } else { |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
127 | s.length = (size_t) ret; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
128 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
129 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
130 | } |
811
b02ad05c7f2d
fix missing va_end() calls
Mike Becker <universe@uap-core.de>
parents:
810
diff
changeset
|
131 | va_end(ap2); |
599
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
132 | return s; |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
133 | } |
6536a9a75b71
#222 add printf-like functions
Mike Becker <universe@uap-core.de>
parents:
diff
changeset
|
134 | |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
135 | int cx_sprintf_a(CxAllocator *alloc, char **str, size_t *len, const char *fmt, ... ) { |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
136 | va_list ap; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
137 | va_start(ap, fmt); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
138 | int ret = cx_vsprintf_a(alloc, str, len, fmt, ap); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
139 | va_end(ap); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
140 | return ret; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
141 | } |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
142 | |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
143 | int cx_vsprintf_a(CxAllocator *alloc, char **str, size_t *len, const char *fmt, va_list ap) { |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
144 | va_list ap2; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
145 | va_copy(ap2, ap); |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
146 | int ret = vsnprintf(*str, *len, fmt, ap); |
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
147 | if ((unsigned) ret >= *len) { |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
148 | unsigned newlen = ret + 1; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
149 | char *ptr = cxRealloc(alloc, *str, newlen); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
150 | if (ptr) { |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
151 | int newret = vsnprintf(ptr, newlen, fmt, ap2); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
152 | if (newret < 0) { |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
153 | cxFree(alloc, ptr); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
154 | } else { |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
155 | *len = newlen; |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
156 | *str = ptr; |
813
aba6d37b78bd
improve program flow - relates to #353
Mike Becker <universe@uap-core.de>
parents:
812
diff
changeset
|
157 | ret = newret; |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
158 | } |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
159 | } |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
160 | } |
813
aba6d37b78bd
improve program flow - relates to #353
Mike Becker <universe@uap-core.de>
parents:
812
diff
changeset
|
161 | va_end(ap2); |
aba6d37b78bd
improve program flow - relates to #353
Mike Becker <universe@uap-core.de>
parents:
812
diff
changeset
|
162 | return ret; |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
163 | } |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
164 | |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
165 | int cx_sprintf_sa(CxAllocator *alloc, char *buf, size_t *len, char **str, const char *fmt, ... ) { |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
166 | va_list ap; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
167 | va_start(ap, fmt); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
168 | int ret = cx_vsprintf_sa(alloc, buf, len, str, fmt, ap); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
169 | va_end(ap); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
170 | return ret; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
171 | } |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
172 | |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
173 | int cx_vsprintf_sa(CxAllocator *alloc, char *buf, size_t *len, char **str, const char *fmt, va_list ap) { |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
174 | va_list ap2; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
175 | va_copy(ap2, ap); |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
176 | int ret = vsnprintf(buf, *len, fmt, ap); |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
177 | *str = buf; |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
178 | if ((unsigned) ret >= *len) { |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
179 | unsigned newlen = ret + 1; |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
180 | char *ptr = cxMalloc(alloc, newlen); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
181 | if (ptr) { |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
182 | int newret = vsnprintf(ptr, newlen, fmt, ap2); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
183 | if (newret < 0) { |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
184 | cxFree(alloc, ptr); |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
185 | } else { |
849
edb9f875b7f9
improves interface of cx_sprintf() variants
Mike Becker <universe@uap-core.de>
parents:
813
diff
changeset
|
186 | *len = newlen; |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
187 | *str = ptr; |
813
aba6d37b78bd
improve program flow - relates to #353
Mike Becker <universe@uap-core.de>
parents:
812
diff
changeset
|
188 | ret = newret; |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
189 | } |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
190 | } |
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
191 | } |
813
aba6d37b78bd
improve program flow - relates to #353
Mike Becker <universe@uap-core.de>
parents:
812
diff
changeset
|
192 | va_end(ap2); |
aba6d37b78bd
improve program flow - relates to #353
Mike Becker <universe@uap-core.de>
parents:
812
diff
changeset
|
193 | return ret; |
810
85859399a0cc
add cx_sprintf() variants - fixes #353
Mike Becker <universe@uap-core.de>
parents:
805
diff
changeset
|
194 | } |