diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | libsimple.h | 2 | ||||
-rw-r--r-- | vputenvf.c | 39 |
3 files changed, 36 insertions, 6 deletions
@@ -88,6 +88,7 @@ TESTS =\ timespectostr.test\ timevaltostr.test\ vasprintf.test\ + vputenvf.test\ libsimple.test all: libsimple.a $(TESTS) diff --git a/libsimple.h b/libsimple.h index 371cd83..3a18365 100644 --- a/libsimple.h +++ b/libsimple.h @@ -1224,7 +1224,7 @@ void libsimple_envputenvf(int, const char *, va_list); _LIBSIMPLE_GCC_ONLY(__attribute__((__nonnull__, __format__(__printf__, 1, 2)))) static inline int -libsimple_putenvf(const char *__fmt, ...) /* TODO test */ +libsimple_putenvf(const char *__fmt, ...) { va_list __ap; va_start(__ap, __fmt); @@ -1,9 +1,10 @@ /* See LICENSE file for copyright and license details. */ #include "libsimple.h" +#ifndef TEST int -libsimple_vputenvf(const char *fmt, va_list ap) /* TODO test */ +libsimple_vputenvf(const char *fmt, va_list ap) { va_list ap2; int n; @@ -13,11 +14,39 @@ libsimple_vputenvf(const char *fmt, va_list ap) /* TODO test */ va_end(ap2); if (n < 0) return -1; - if ((size_t)n == SIZE_MAX) { - errno = ENOMEM; - return -1; - } s = alloca((size_t)n + 1); vsprintf(s, fmt, ap); return putenv(s); } + + +#else +#include "test.h" + +int +main(void) +{ + unsetenv("X"); + assert(!getenv("X")); + unsetenv("Y"); + assert(!getenv("Y")); + + putenvf("X=xyz"); + assert(!strcmpnul(getenv("X"), "xyz")); + putenvf("Y=xyz"); + assert(!strcmpnul(getenv("Y"), "xyz")); + + putenvf("X=x%sz", "abc"); + assert(!strcmpnul(getenv("X"), "xabcz")); + putenvf("Y=x%sz", "abc"); + assert(!strcmpnul(getenv("Y"), "xabcz")); + + putenvf("X=%ix%sz%i", 10, "abc", -11); + assert(!strcmpnul(getenv("X"), "10xabcz-11")); + putenvf("Y=%ix%sz%i", 10, "abc", -11); + assert(!strcmpnul(getenv("Y"), "10xabcz-11")); + + return 0; +} + +#endif |