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 | %u, %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, %tx |
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.