#include #include #include #include #include #include #include "mprintf.h" // TODO: check for asprintf in configure and // write a replacement for such situations. char * mprintf(const char *fmt, ...) { char *p; int r; va_list va; va_start(va, fmt); r = vasprintf(&p, fmt, va); va_end(va); /* return NULL both when r is < 0 and when NULL was returned */ if (r < 0) return NULL; else return p; } char * vmprintf(const char *fmt, va_list va) { char *p; int r; r = vasprintf(&p, fmt, va); /* return NULL both when r is < 0 and when NULL was returned */ if (r < 0) return NULL; else return p; } #ifndef HAVE_DPRINTF int dprintf(int fd, const char *format, ...){ char *buffer; int ret; va_list va; va_start(va, format); buffer = vmprintf(format, va); va_end(va); if (buffer == NULL) return -1; ret = write(fd, buffer, strlen(buffer)); free(buffer); return ret; } #endif #ifndef HAVE_STRNDUP /* That's not the best possible strndup implementation, but it suffices for what * it is used here */ char *strndup(const char *str, size_t n) { char *r = malloc(n+1); if (r == NULL) return r; memcpy(r, str, n); r[n] = '\0'; return r; } #endif