Thu, 30 Oct 2025 19:27:18 +0100
fix typo bug in cxListDifference() - resolves #745
| 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: 
634diff
changeset | 34 | #ifndef CX_PRINTF_SBO_SIZE | 
| 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
634diff
changeset | 35 | #define CX_PRINTF_SBO_SIZE 512 | 
| 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
634diff
changeset | 36 | #endif | 
| 926 
8fdd8d78c14b
fix several survivors of east-const and some missing consts
 Mike Becker <universe@uap-core.de> parents: 
890diff
changeset | 37 | const unsigned 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: 
634diff
changeset | 39 | int cx_fprintf( | 
| 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
634diff
changeset | 40 | void *stream, | 
| 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
634diff
changeset | 41 | cx_write_func wfc, | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
849diff
changeset | 42 | const char *fmt, | 
| 643 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
634diff
changeset | 43 | ... | 
| 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
634diff
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, | |
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
849diff
changeset | 56 | const char *fmt, | 
| 644 | 57 | va_list ap | 
| 58 | ) { | |
| 643 
5700ba9154ab
#228 make buffer sizes adjustable at compile time
 Mike Becker <universe@uap-core.de> parents: 
634diff
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: 
634diff
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: 
810diff
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: 
634diff
changeset | 66 | } else if (ret < CX_PRINTF_SBO_SIZE) { | 
| 811 
b02ad05c7f2d
fix missing va_end() calls
 Mike Becker <universe@uap-core.de> parents: 
810diff
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; | 
| 1319 
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
 Mike Becker <universe@uap-core.de> parents: 
1318diff
changeset | 71 | char *newbuf = cxMallocDefault(len); | 
| 1065 
6eb7b54975ee
improve coverage metrics
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 72 | if (!newbuf) { // LCOV_EXCL_START | 
| 811 
b02ad05c7f2d
fix missing va_end() calls
 Mike Becker <universe@uap-core.de> parents: 
810diff
changeset | 73 | va_end(ap2); | 
| 599 
6536a9a75b71
#222 add printf-like functions
 Mike Becker <universe@uap-core.de> parents: diff
changeset | 74 | return -1; | 
| 1065 
6eb7b54975ee
improve coverage metrics
 Mike Becker <universe@uap-core.de> parents: 
926diff
changeset | 75 | } // LCOV_EXCL_STOP | 
| 599 
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: 
810diff
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 | } | 
| 1319 
aa1f580f8f59
add convenience macros for using the default allocator - relates to #669
 Mike Becker <universe@uap-core.de> parents: 
1318diff
changeset | 82 | cxFreeDefault(newbuf); | 
| 599 
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( | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
849diff
changeset | 88 | const CxAllocator *allocator, | 
| 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
849diff
changeset | 89 | const char *fmt, | 
| 644 | 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: 
693diff
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( | 
| 890 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
849diff
changeset | 100 | const CxAllocator *a, | 
| 
54565fd74e74
move all const keywords to the west - fixes #426
 Mike Becker <universe@uap-core.de> parents: 
849diff
changeset | 101 | const char *fmt, | 
| 644 | 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: 
634diff
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: 
634diff
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: 
811diff
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) { | 
| 1318 
12fa1d37fe48
allow changing the cxDefaultAllocator - resolves #669
 Mike Becker <universe@uap-core.de> parents: 
1285diff
changeset | 124 | cxFree(a, s.ptr); | 
| 599 
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: 
810diff
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 | |
| 1285 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 135 | int cx_sprintf_a( | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 136 | const CxAllocator *alloc, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 137 | char **str, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 138 | size_t *len, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 139 | const char *fmt, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 140 | ... | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 141 | ) { | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 142 | va_list ap; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 143 | va_start(ap, fmt); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 144 | int ret = cx_vsprintf_a(alloc, str, len, fmt, ap); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 145 | va_end(ap); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 146 | return ret; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 147 | } | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 148 | |
| 1285 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 149 | int cx_vsprintf_a( | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 150 | const CxAllocator *alloc, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 151 | char **str, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 152 | size_t *len, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 153 | const char *fmt, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 154 | va_list ap | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 155 | ) { | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 156 | va_list ap2; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 157 | va_copy(ap2, ap); | 
| 849 
edb9f875b7f9
improves interface of cx_sprintf() variants
 Mike Becker <universe@uap-core.de> parents: 
813diff
changeset | 158 | int ret = vsnprintf(*str, *len, fmt, ap); | 
| 
edb9f875b7f9
improves interface of cx_sprintf() variants
 Mike Becker <universe@uap-core.de> parents: 
813diff
changeset | 159 | if ((unsigned) ret >= *len) { | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 160 | unsigned newlen = ret + 1; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 161 | char *ptr = cxRealloc(alloc, *str, newlen); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 162 | if (ptr) { | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 163 | int newret = vsnprintf(ptr, newlen, fmt, ap2); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 164 | if (newret < 0) { | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 165 | cxFree(alloc, ptr); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 166 | } else { | 
| 849 
edb9f875b7f9
improves interface of cx_sprintf() variants
 Mike Becker <universe@uap-core.de> parents: 
813diff
changeset | 167 | *len = newlen; | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 168 | *str = ptr; | 
| 813 
aba6d37b78bd
improve program flow - relates to #353
 Mike Becker <universe@uap-core.de> parents: 
812diff
changeset | 169 | ret = newret; | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 170 | } | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 171 | } | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 172 | } | 
| 813 
aba6d37b78bd
improve program flow - relates to #353
 Mike Becker <universe@uap-core.de> parents: 
812diff
changeset | 173 | va_end(ap2); | 
| 
aba6d37b78bd
improve program flow - relates to #353
 Mike Becker <universe@uap-core.de> parents: 
812diff
changeset | 174 | return ret; | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 175 | } | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 176 | |
| 1285 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 177 | int cx_sprintf_sa( | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 178 | const CxAllocator *alloc, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 179 | char *buf, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 180 | size_t *len, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 181 | char **str, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 182 | const char *fmt, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 183 | ... | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 184 | ) { | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 185 | va_list ap; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 186 | va_start(ap, fmt); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 187 | 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: 
805diff
changeset | 188 | va_end(ap); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 189 | return ret; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 190 | } | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 191 | |
| 1285 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 192 | int cx_vsprintf_sa( | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 193 | const CxAllocator *alloc, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 194 | char *buf, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 195 | size_t *len, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 196 | char **str, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 197 | const char *fmt, | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 198 | va_list ap | 
| 
7acbaa74fbd0
fix allocator of some printf.h functions not being const - fixes #611
 Mike Becker <universe@uap-core.de> parents: 
1065diff
changeset | 199 | ) { | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 200 | va_list ap2; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 201 | va_copy(ap2, ap); | 
| 849 
edb9f875b7f9
improves interface of cx_sprintf() variants
 Mike Becker <universe@uap-core.de> parents: 
813diff
changeset | 202 | int ret = vsnprintf(buf, *len, fmt, ap); | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 203 | *str = buf; | 
| 849 
edb9f875b7f9
improves interface of cx_sprintf() variants
 Mike Becker <universe@uap-core.de> parents: 
813diff
changeset | 204 | if ((unsigned) ret >= *len) { | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 205 | unsigned newlen = ret + 1; | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 206 | char *ptr = cxMalloc(alloc, newlen); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 207 | if (ptr) { | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 208 | int newret = vsnprintf(ptr, newlen, fmt, ap2); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 209 | if (newret < 0) { | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 210 | cxFree(alloc, ptr); | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 211 | } else { | 
| 849 
edb9f875b7f9
improves interface of cx_sprintf() variants
 Mike Becker <universe@uap-core.de> parents: 
813diff
changeset | 212 | *len = newlen; | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 213 | *str = ptr; | 
| 813 
aba6d37b78bd
improve program flow - relates to #353
 Mike Becker <universe@uap-core.de> parents: 
812diff
changeset | 214 | ret = newret; | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 215 | } | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 216 | } | 
| 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 217 | } | 
| 813 
aba6d37b78bd
improve program flow - relates to #353
 Mike Becker <universe@uap-core.de> parents: 
812diff
changeset | 218 | va_end(ap2); | 
| 
aba6d37b78bd
improve program flow - relates to #353
 Mike Becker <universe@uap-core.de> parents: 
812diff
changeset | 219 | return ret; | 
| 810 
85859399a0cc
add cx_sprintf() variants - fixes #353
 Mike Becker <universe@uap-core.de> parents: 
805diff
changeset | 220 | } |