1.1 --- a/src/printf.c Tue Jan 16 23:12:43 2024 +0100 1.2 +++ b/src/printf.c Tue Jan 16 23:13:01 2024 +0100 1.3 @@ -127,3 +127,73 @@ 1.4 return s; 1.5 } 1.6 1.7 +int cx_sprintf_a(CxAllocator *alloc, char **str, size_t len, const char *fmt, ... ) { 1.8 + va_list ap; 1.9 + va_start(ap, fmt); 1.10 + int ret = cx_vsprintf_a(alloc, str, len, fmt, ap); 1.11 + va_end(ap); 1.12 + return ret; 1.13 +} 1.14 + 1.15 +int cx_vsprintf_a(CxAllocator *alloc, char **str, size_t len, const char *fmt, va_list ap) { 1.16 + va_list ap2; 1.17 + va_copy(ap2, ap); 1.18 + int ret = vsnprintf(*str, len, fmt, ap); 1.19 + if (ret < 0 || ((unsigned)ret) < len) { 1.20 + va_end(ap2); 1.21 + return ret; 1.22 + } else { 1.23 + unsigned newlen = ret + 1; 1.24 + char *ptr = cxRealloc(alloc, *str, newlen); 1.25 + if (ptr) { 1.26 + int newret = vsnprintf(ptr, newlen, fmt, ap2); 1.27 + va_end(ap2); 1.28 + if (newret < 0) { 1.29 + cxFree(alloc, ptr); 1.30 + return ret; 1.31 + } else { 1.32 + *str = ptr; 1.33 + return newret; 1.34 + } 1.35 + } else { 1.36 + va_end(ap2); 1.37 + return ret; 1.38 + } 1.39 + } 1.40 +} 1.41 + 1.42 +int cx_sprintf_sa(CxAllocator *alloc, char *buf, size_t len, char **str, const char *fmt, ... ) { 1.43 + va_list ap; 1.44 + va_start(ap, fmt); 1.45 + int ret = cx_vsprintf_sa(alloc, buf, len, str, fmt, ap); 1.46 + va_end(ap); 1.47 + return ret; 1.48 +} 1.49 + 1.50 +int cx_vsprintf_sa(CxAllocator *alloc, char *buf, size_t len, char **str, const char *fmt, va_list ap) { 1.51 + va_list ap2; 1.52 + va_copy(ap2, ap); 1.53 + int ret = vsnprintf(buf, len, fmt, ap); 1.54 + *str = buf; 1.55 + if (ret < 0 || ((unsigned)ret) < len) { 1.56 + va_end(ap2); 1.57 + return ret; 1.58 + } else { 1.59 + unsigned newlen = ret + 1; 1.60 + char *ptr = cxMalloc(alloc, newlen); 1.61 + if (ptr) { 1.62 + int newret = vsnprintf(ptr, newlen, fmt, ap2); 1.63 + va_end(ap2); 1.64 + if (newret < 0) { 1.65 + cxFree(alloc, ptr); 1.66 + return ret; 1.67 + } else { 1.68 + *str = ptr; 1.69 + return newret; 1.70 + } 1.71 + } else { 1.72 + va_end(ap2); 1.73 + return ret; 1.74 + } 1.75 + } 1.76 +}