From 30b773041c37d10649a16d5f28af00a25871aac7 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sun, 19 Aug 2001 11:11:44 +0000 Subject: IP address formatting now uses the same rules as formatting of strings with two exceptions: o Any non-zero field width is automatically replaced by standard IP address width. This hides dependences on IPv4/IPv6. o %#I generates hexadecimal form of the address. Therefore |%I| generates unpadded format, |%1I| full size flush-right, and |%-1I| full size flush-left format. --- lib/printf.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/lib/printf.c b/lib/printf.c index 4bcffe5..0e3b4d9 100644 --- a/lib/printf.c +++ b/lib/printf.c @@ -118,8 +118,10 @@ static char * number(char * str, long num, int base, int size, int precision, * * This functions acts like ordinary sprintf() except that it checks * available space to avoid buffer overflows and it allows some more - * format specifiers: |%I| for formatting of IP addresses and |%M| for - * error messages (uses strerror() to translate @errno code to + * format specifiers: |%I| for formatting of IP addresses (any non-zero + * width is automatically replaced by standard IP address width which + * depends on whether we use IPv4 or IPv6; |%#I| gives hexadecimal format) + * and |%m| resp. |%M| for error messages (uses strerror() to translate @errno code to * message text). On the other hand, it doesn't support floating * point numbers. * @@ -133,6 +135,7 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args) int i, base; char *str, *start; const char *s; + char ipbuf[STD_ADDRESS_P_LENGTH+1]; int flags; /* flags to number() */ @@ -264,18 +267,15 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args) /* IP address */ case 'I': - if (size < STD_ADDRESS_P_LENGTH) - return -1; if (flags & SPECIAL) - str = ip_ntox(va_arg(args, ip_addr), str); + ip_ntox(va_arg(args, ip_addr), ipbuf); else { - len = ip_ntop(va_arg(args, ip_addr), str) - str; - str += len; - if (field_width >= 0) - while (len++ < STD_ADDRESS_P_LENGTH) - *str++ = ' '; + ip_ntop(va_arg(args, ip_addr), ipbuf); + if (field_width > 0) + field_width = STD_ADDRESS_P_LENGTH; } - continue; + s = ipbuf; + goto str; /* integer number formats - set up the flags and "break" */ case 'o': -- cgit v1.2.3