diff options
author | Mike Frysinger <vapier@gentoo.org> | 2012-06-24 02:56:55 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2012-07-02 19:41:57 -0400 |
commit | b20192faa0aa305afaa54d4b6e79391692f9a403 (patch) | |
tree | 0aab15832a9b37850651d6f1197556162edc0b11 /libsbutil | |
parent | tests: enable color/parallel by default (diff) | |
download | sandbox-b20192faa0aa305afaa54d4b6e79391692f9a403.tar.gz sandbox-b20192faa0aa305afaa54d4b6e79391692f9a403.tar.bz2 sandbox-b20192faa0aa305afaa54d4b6e79391692f9a403.zip |
sb_printf: expand feature set slightly and fix testing
This adds support for signed ll, unsigned z, l, and ll, hex l, and ll,
ignores the # for hex output since this is what we do implicitly already.
As for testing, looks like during the autogeneration of testsuite.list.at,
the sb_printf test was lost. Restore it so it gets run again.
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'libsbutil')
-rw-r--r-- | libsbutil/sb_printf.c | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/libsbutil/sb_printf.c b/libsbutil/sb_printf.c index 1ad9e23..30b90d4 100644 --- a/libsbutil/sb_printf.c +++ b/libsbutil/sb_printf.c @@ -15,19 +15,23 @@ * p - pointer * * The following modifiers are supported: - * z - size_t - * * - width is an argument + * z - size_t + * l - long + * ll - long long + * * - width is an argument + * # - for %x, we always do this, so it's kind of ignored * - * Copyright 1999-2008 Gentoo Foundation + * Copyright 1999-2012 Gentoo Foundation * Licensed under the GPL-2 */ #include "headers.h" #include "sbutil.h" -#define MOD_STAR (1 << 0) -#define MOD_SIZE_T (1 << 1) -#define MOD_LONG_T (1 << 2) +#define MOD_STAR (1 << 0) +#define MOD_SIZE_T (1 << 1) +#define MOD_LONG_T (1 << 2) +#define MOD_LONG_LONG_T (1 << 3) void sb_vfdprintf(int fd, const char *format, va_list args) { @@ -47,7 +51,7 @@ void sb_vfdprintf(int fd, const char *format, va_list args) char buf[50]; size_t idx; - unsigned int u, x; + unsigned long long int u, x; char hex_base; size_t padding = 0; @@ -67,9 +71,12 @@ void sb_vfdprintf(int fd, const char *format, va_list args) break; case 'l': ++conv; - if (modifiers & MOD_LONG_T) - goto inv_modifier; - modifiers |= MOD_LONG_T; + if (modifiers & MOD_LONG_T) { + if (modifiers & MOD_LONG_LONG_T) + goto inv_modifier; + modifiers = (modifiers & ~MOD_LONG_T) | MOD_LONG_LONG_T; + } else + modifiers |= MOD_LONG_T; goto eat_more; case 'z': ++conv; @@ -84,6 +91,10 @@ void sb_vfdprintf(int fd, const char *format, va_list args) modifiers |= MOD_STAR; padding = va_arg(args, int); goto eat_more; + case '#': + /* ignore */ + ++conv; + goto eat_more; case 'c': { char c = va_arg(args, int); @@ -103,11 +114,13 @@ void sb_vfdprintf(int fd, const char *format, va_list args) case 'd': case 'i': { - long i; + long long i; if (modifiers & MOD_SIZE_T) i = va_arg(args, ssize_t); else if (modifiers & MOD_LONG_T) i = va_arg(args, long); + else if (modifiers & MOD_LONG_LONG_T) + i = va_arg(args, long long); else i = va_arg(args, int); u = i; @@ -125,7 +138,14 @@ void sb_vfdprintf(int fd, const char *format, va_list args) break; } case 'u': { - u = va_arg(args, unsigned int); + if (modifiers & MOD_SIZE_T) + u = va_arg(args, size_t); + else if (modifiers & MOD_LONG_T) + u = va_arg(args, unsigned long); + else if (modifiers & MOD_LONG_LONG_T) + u = va_arg(args, unsigned long long); + else + u = va_arg(args, unsigned int); goto out_uint; break; } @@ -139,6 +159,10 @@ void sb_vfdprintf(int fd, const char *format, va_list args) out_hex: if (modifiers & MOD_SIZE_T) x = va_arg(args, size_t); + else if (modifiers & MOD_LONG_T) + x = va_arg(args, unsigned long); + else if (modifiers & MOD_LONG_LONG_T) + x = va_arg(args, unsigned long long); else x = va_arg(args, unsigned int); out_ptr: |