diff --git a/asprintf.c b/asprintf.c new file mode 100644 index 0000000000000000000000000000000000000000..a4f200cf59a5fb1c8576a130ab2c4cde6f9bc728 --- /dev/null +++ b/asprintf.c @@ -0,0 +1,34 @@ +#include <stdio.h> +#include <stdlib.h> +#include "asprintf.h" + +int vasprintf(char** pbuffer, const char* format, va_list ap) +{ + va_list ap2; + int len; + FILE* f; + + /* print to null device to get required buffer length */ + f = fopen("/null","w"); + if (f == NULL) return -1; + __va_copy(ap2, ap); + len = vfprintf(f, format, ap2); + va_end(ap2); + fclose(f); + if (len < 0) return len; + + *pbuffer = malloc(len+1); + if (*pbuffer == NULL) return -1; + return vsprintf(*pbuffer, format, ap); +} + +int asprintf(char** pbuffer, const char* format, ...) +{ + va_list ap; + int len; + + va_start(ap, format); + len = vasprintf(pbuffer, format, ap); + va_end(ap); + return len; +} diff --git a/asprintf.h b/asprintf.h new file mode 100644 index 0000000000000000000000000000000000000000..7625d11f485e9238ee139fca91276586bbea5508 --- /dev/null +++ b/asprintf.h @@ -0,0 +1,12 @@ +#ifndef asprintf_h +#define asprintf_h +#ifdef __cplusplus +extern "C" { +#endif +#include <stdarg.h> +int asprintf(char** pbuffer, const char* format, ...) __attribute__((format(printf,2,3))); +int vasprintf(char** pbuffer, const char* format, va_list ap) __attribute__((format(printf,2,0))); +#ifdef __cplusplus +} +#endif +#endif diff --git a/strdup.c b/strdup.c new file mode 100644 index 0000000000000000000000000000000000000000..bc708537b7ef72bc5f6c57bc581eb371b5fd549c --- /dev/null +++ b/strdup.c @@ -0,0 +1,22 @@ +#include <string.h> +#include <stdlib.h> + +char *strdup(const char *s) +{ + char *d = malloc(strlen(s)+1); + if (d) strcpy(d,s); + return d; +} + +char *strndup(const char *s, size_t n) +{ + size_t l; + char *d; + + l = strlen(s); + if (n > l) n = l; + d = malloc(n+1); + strncpy(d,s,l); + d[n] = 0; + return d; +} diff --git a/strdup.h b/strdup.h new file mode 100644 index 0000000000000000000000000000000000000000..f20c9f9bc969727f68746d7bf3383b088e47f391 --- /dev/null +++ b/strdup.h @@ -0,0 +1,11 @@ +#ifndef strdup_h +#define strdup_h +#ifdef __cplusplus +extern "C" { +#endif +char *strdup(const char *s); +char *strndup(const char *s, size_t n); +#ifdef __cplusplus +} +#endif +#endif