Each conversion specification consists of:
- leading '%' character
- zero or more flags
- an optional minimum field width
- an optional precision field preceded by '.'
- an optional length modifier
- a conversion specifier
- 'space'
fill up with spaces to reach the specified length
- -
left justify
- +
add sign field of decimal conversion
- #
convert to alternative form
- prepend 0 to octal output
- ignored for decimal output
- prepend 0X to hexadecimal output
- 0
fill up with zeroes to reach the specified length
The optional length modifier specifies the size of the argument.
- no modifier
bool, enum, short, int are passed as int
- %h
convert to (unsigned) short before printing. Only the low 16 bits are printed.
- %hh
not implemented
- %j
not implemented
- %l
long
- %ll, %L
long long
- %t
ptr_diff_t
- %z, %Z
size_t, ssize_t
Conversion specifiers control the output.
- %d
signed decimal
- %u
unsigned decimal
- %o
unsigned octal
- %x
unsigned lower case hexadecimal
- %X
unsigned upper case hexadecimal
The floating point conversion specifiers are not implemented:
- %a
- %A
- %e
- %E
- %f
- %F
- %g
- %G
The following tables shows the correct combinations of modifiers and specifiers for the individual integer types.
Type | Format specifier |
---|---|
bool %d, | %x |
char | %d, %x |
unsigned char | %u, %x |
short | %d, %x |
unsigned short | %u, %x |
int | %d, %x |
unsigned int | %d, %x |
long | %ld, %lx |
unsigned long | %lu, %lx |
long long | %lld, %llx |
unsigned long long | %llu, %llx |
off_t | %llu, %llx |
ptr_diff_t %td, |
|
fdt_addr_t | %pa, see pointers |
fdt_size_t | %pa, see pointers |
phys_addr_t | %pa, see pointers |
phys_size_t | %pa, see pointers |
resource_size_t | %pa, see pointers |
size_t | %zu, %zx, %zX |
ssize_t | %zd, %zx, %zX |
- %%
a '%' character is written
- %c
prints a single character
- %lc
not implemented
- %s
prints a UTF-8 string (char *)
- %ls
prints a UTF-16 string (u16 *)
- %p
prints the address the pointer points to hexadecimally
- %pa, %pap
prints the value of a phys_addr_t value that the pointer points to preceded with 0x and zero padding according to the size of phys_addr_t.
The following types should be printed this way:
- fdt_addr_t
- fdt_size_t
- phys_addr_t
- phys_size_t
- resource_size_t
- %pD
prints a UEFI device path
- %pi4, %pI4
prints IPv4 address, e.g. '192.168.0.1'
- %pm
prints MAC address without separators, e.g. '001122334455'
- %pM
print MAC address colon separated, e.g. '00:01:02:03:04:05'
- %pUb
prints GUID big endian, lower case e.g. '00112233-4455-6677-8899-aabbccddeeff'
- %pUB
prints GUID big endian, upper case e.g. '00112233-4455-6677-8899-AABBCCDDEEFF'
- %pUl
prints GUID little endian, lower case e.g. '33221100-5544-7766-8899-aabbccddeeff'
- %pUL
prints GUID little endian, upper case e.g. '33221100-5544-7766-8899-AABBCCDDEEFF'
- %pUs
prints text description of a GUID or if such is not known little endian, lower case, e.g. 'system' for a GUID identifying an EFI system
partition.