mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
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:
parent
16319aebd3
commit
30b773041c
22
lib/printf.c
22
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
|
* 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':
|
||||||
|
Loading…
Reference in New Issue
Block a user