aboutsummaryrefslogtreecommitdiffstats
path: root/vweprintf.c
diff options
context:
space:
mode:
Diffstat (limited to 'vweprintf.c')
-rw-r--r--vweprintf.c83
1 files changed, 82 insertions, 1 deletions
diff --git a/vweprintf.c b/vweprintf.c
index a46363d..491763b 100644
--- a/vweprintf.c
+++ b/vweprintf.c
@@ -7,7 +7,7 @@ extern char *argv0;
void
-libsimple_vweprintf(const char *fmt, va_list ap) /* TODO test (weprintf, enprintf, eprintf) */
+libsimple_vweprintf(const char *fmt, va_list ap)
{
int saved_errno = errno, r;
const char *end = strchr(fmt, '\0');
@@ -60,9 +60,90 @@ libsimple_vweprintf(const char *fmt, va_list ap) /* TODO test (weprintf, enprint
#else
#include "test.h"
+#if defined(__GNUC__) && !defined(__clang__)
+# pragma GCC diagnostic ignored "-Wformat-zero-length"
+#endif
+
int
main(void)
{
+ char prefix[100];
+ int i, j;
+
+#define T(...)\
+ do {\
+ stderr_n = 0;\
+ if (j == 0) {\
+ libsimple_weprintf(__VA_ARGS__);\
+ } else if (j == 1) {\
+ assert_exit(libsimple_enprintf(107, __VA_ARGS__));\
+ assert(exit_status == 107);\
+ } else {\
+ libsimple_default_failure_exit = 108;\
+ assert_exit(libsimple_eprintf(__VA_ARGS__));\
+ assert(exit_status == 108);\
+ }\
+ } while (0)
+
+ sprintf(prefix, "%s: ", argv0);
+ stderr_ok = 1;
+
+ for (i = 0; i < 2; i++, argv0 = NULL, *prefix = '\0') {
+ for (j = 0; j < 3; j++) {
+ T("%s%s%s\n", "abc", "123", "xyz");
+ assert_stderr("%s%s\n", prefix, "abc123xyz");
+ T("%s%s%s\n", "abc", "123", "\n");
+ assert_stderr("%s%s\n", prefix, "abc123\n");
+ T("%s%s%s", "abc", "123", "xyz");
+ assert_stderr("%s%s\n", prefix, "abc123xyz");
+ T("%s%s%s", "abc", "123", "\n");
+ assert_stderr("%s%s\n", prefix, "abc123\n");
+ errno = EDOM;
+ T("%s%s%s:", "abc", "123", "\n");
+ assert_stderr("%s%s: %s\n", prefix, "abc123\n", strerror(EDOM));
+ errno = ERANGE;
+ T("%s%s%s:", "abc", "123", "\n");
+ assert_stderr("%s%s: %s\n", prefix, "abc123\n", strerror(ERANGE));
+ errno = EOVERFLOW;
+ T("");
+ assert_stderr("%s%s\n", prefix, strerror(EOVERFLOW));
+
+ T("%s%s%s\n", "usage: ", "123", "xyz");
+ assert_stderr("%s%s\n", prefix, "usage: 123xyz");
+ T("%s%s%s\n", "usage: ", "123", "\n");
+ assert_stderr("%s%s\n", prefix, "usage: 123\n");
+ T("%s%s%s", "usage: ", "123", "xyz");
+ assert_stderr("%s%s\n", prefix, "usage: 123xyz");
+ T("%s%s%s", "usage: ", "123", "\n");
+ assert_stderr("%s%s\n", prefix, "usage: 123\n");
+ errno = EDOM;
+ T("%s%s%s:", "usage: ", "123", "\n");
+ assert_stderr("%s%s: %s\n", prefix, "usage: 123\n", strerror(EDOM));
+ errno = ERANGE;
+ T("%s%s%s:", "usage: ", "123", "\n");
+ assert_stderr("%s%s: %s\n", prefix, "usage: 123\n", strerror(ERANGE));
+
+ T("usage: %s%s%s\n", "abc", "123", "xyz");
+ assert_stderr("%s: %s\n", "usage", "abc123xyz");
+ T("usage: %s%s%s\n", "abc", "123", "\n");
+ assert_stderr("%s: %s\n", "usage", "abc123\n");
+ T("usage: %s%s%s", "abc", "123", "xyz");
+ assert_stderr("%s: %s\n", "usage", "abc123xyz");
+ T("usage: %s%s%s", "abc", "123", "\n");
+ assert_stderr("%s: %s\n", "usage", "abc123\n");
+ errno = EDOM;
+ T("usage: %s%s%s:", "abc", "123", "\n");
+ assert_stderr("%s: %s: %s\n", "usage", "abc123\n", strerror(EDOM));
+ errno = ERANGE;
+ T("usage: %s%s%s:", "abc", "123", "\n");
+ assert_stderr("%s: %s: %s\n", "usage", "abc123\n", strerror(ERANGE));
+ T("usage: ");
+ assert_stderr("%s", "usage: \n");
+ }
+ }
+
+#undef T
+
return 0;
}