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 34 FILE_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 */ 47 struct 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 67 extern size_t vcprintf ( struct printf_context *ctx, const char *fmt, 68 va_list args ); 69 extern int vssnprintf ( char *buf, ssize_t ssize, const char *fmt, 70 va_list args ); 71 extern int __attribute__ (( format ( printf, 3, 4 ) )) 72 ssnprintf ( char *buf, ssize_t ssize, const char *fmt, ... ); 73 74 #endif /* _GPXE_VSPRINTF_H */ 75