1#ifndef _GPXE_VSPRINTF_H
2#define _GPXE_VSPRINTF_H
3
4/** @file
5 *
6 * printf() and friends
7 *
8 * Etherboot's printf() functions understand the following subset of
9 * the standard C printf()'s format specifiers:
10 *
11 *	- Flag characters
12 *		- '#'		- Alternate form (i.e. "0x" prefix)
13 *		- '0'		- Zero-pad
14 *	- Field widths
15 *	- Length modifiers
16 *		- 'hh'		- Signed / unsigned char
17 *		- 'h'		- Signed / unsigned short
18 *		- 'l'		- Signed / unsigned long
19 *		- 'll'		- Signed / unsigned long long
20 *		- 'z'		- Signed / unsigned size_t
21 *	- Conversion specifiers
22 *		- 'd'		- Signed decimal
23 *		- 'x','X'	- Unsigned hexadecimal
24 *		- 'c'		- Character
25 *		- 's'		- String
26 *		- 'p'		- Pointer
27 *
28 * Hexadecimal numbers are always zero-padded to the specified field
29 * width (if any); decimal numbers are always space-padded.  Decimal
30 * long longs are not supported.
31 *
32 */
33
34FILE_LICENCE ( GPL2_OR_LATER );
35
36#include <stdint.h>
37#include <stdarg.h>
38#include <stdio.h>
39
40/**
41 * A printf context
42 *
43 * Contexts are used in order to be able to share code between
44 * vprintf() and vsnprintf(), without requiring the allocation of a
45 * buffer for vprintf().
46 */
47struct printf_context {
48	/**
49	 * Character handler
50	 *
51	 * @v ctx	Context
52	 * @v c		Character
53	 *
54	 * This method is called for each character written to the
55	 * formatted string.
56	 */
57	void ( * handler ) ( struct printf_context *ctx, unsigned int c );
58	/** Length of formatted string
59	 *
60	 * When handler() is called, @len will be set to the number of
61	 * characters written so far (i.e. zero for the first call to
62	 * handler()).
63	 */
64	size_t len;
65};
66
67extern size_t vcprintf ( struct printf_context *ctx, const char *fmt,
68			 va_list args );
69extern int vssnprintf ( char *buf, ssize_t ssize, const char *fmt,
70			va_list args );
71extern int __attribute__ (( format ( printf, 3, 4 ) ))
72ssnprintf ( char *buf, ssize_t ssize, const char *fmt, ... );
73
74#endif /* _GPXE_VSPRINTF_H */
75