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.
This commit is contained in:
Martin Mares 2001-08-19 11:11:44 +00:00
parent 16319aebd3
commit 30b773041c

View file

@ -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 * This functions acts like ordinary sprintf() except that it checks
* available space to avoid buffer overflows and it allows some more * available space to avoid buffer overflows and it allows some more
* format specifiers: |%I| for formatting of IP addresses and |%M| for * format specifiers: |%I| for formatting of IP addresses (any non-zero
* error messages (uses strerror() to translate @errno code to * 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 * message text). On the other hand, it doesn't support floating
* point numbers. * point numbers.
* *
@ -133,6 +135,7 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args)
int i, base; int i, base;
char *str, *start; char *str, *start;
const char *s; const char *s;
char ipbuf[STD_ADDRESS_P_LENGTH+1];
int flags; /* flags to number() */ int flags; /* flags to number() */
@ -264,18 +267,15 @@ int bvsnprintf(char *buf, int size, const char *fmt, va_list args)
/* IP address */ /* IP address */
case 'I': case 'I':
if (size < STD_ADDRESS_P_LENGTH)
return -1;
if (flags & SPECIAL) if (flags & SPECIAL)
str = ip_ntox(va_arg(args, ip_addr), str); ip_ntox(va_arg(args, ip_addr), ipbuf);
else { else {
len = ip_ntop(va_arg(args, ip_addr), str) - str; ip_ntop(va_arg(args, ip_addr), ipbuf);
str += len; if (field_width > 0)
if (field_width >= 0) field_width = STD_ADDRESS_P_LENGTH;
while (len++ < STD_ADDRESS_P_LENGTH)
*str++ = ' ';
} }
continue; s = ipbuf;
goto str;
/* integer number formats - set up the flags and "break" */ /* integer number formats - set up the flags and "break" */
case 'o': case 'o':