summaryrefslogtreecommitdiff
path: root/src/shared.c
diff options
context:
space:
mode:
author@syxhe <https://t.me/syxhe>2025-01-06 21:19:38 -0600
committer@syxhe <https://t.me/syxhe>2025-01-06 21:19:38 -0600
commit5a5e604eac5cf7473c2d129b38b517dc1968c441 (patch)
tree34e87a69b4fd0b72a7c2d6db24a601eecfa6ad97 /src/shared.c
parent227bc3560762ae770564fcd8bad36b334696bb0b (diff)
Use GNU macro (v)asprintf only if _GNU_SOURCE is defined
Diffstat (limited to 'src/shared.c')
-rw-r--r--src/shared.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/shared.c b/src/shared.c
index 2beaeb8..2f6dd5b 100644
--- a/src/shared.c
+++ b/src/shared.c
@@ -34,3 +34,41 @@ void* xreallocarray(void *ptr, size_t nmemb, size_t size) {
34 34
35 return mem; 35 return mem;
36} 36}
37
38#if !defined _GNU_SOURCE
39
40int vasprintf(char **str, const char *format, va_list ap) {
41 va_list ap2;
42 int length, ret;
43
44 va_copy(ap2, ap);
45 if((length = vsnprintf(NULL, 0, format, ap2)) < 0)
46 return -1;
47 length++; // + 1 because sprintf does not count the null byte
48 va_end(ap2);
49
50 char *temp = reallocarray(*str, length, sizeof(char));
51 if(temp == NULL)
52 return -1;
53
54 if((ret = vsnprintf(temp, length, format, ap)) < 0) {
55 free(temp);
56 return -1;
57 } else {
58 *str = temp;
59 }
60
61 return ret;
62}
63
64int asprintf(char **str, const char *format, ...) {
65 va_list ap;
66
67 va_start(ap, format);
68 int ret = vasprintf(str, format, ap);
69 va_end(ap);
70
71 return ret;
72}
73
74#endif \ No newline at end of file