175067f4fSPoul-Henning Kamp /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3e58eb3c4SPedro F. Giffuni * 475067f4fSPoul-Henning Kamp * Copyright (c) 2005 Poul-Henning Kamp 575067f4fSPoul-Henning Kamp * All rights reserved. 675067f4fSPoul-Henning Kamp * 775067f4fSPoul-Henning Kamp * Redistribution and use in source and binary forms, with or without 875067f4fSPoul-Henning Kamp * modification, are permitted provided that the following conditions 975067f4fSPoul-Henning Kamp * are met: 1075067f4fSPoul-Henning Kamp * 1. Redistributions of source code must retain the above copyright 1175067f4fSPoul-Henning Kamp * notice, this list of conditions and the following disclaimer. 1275067f4fSPoul-Henning Kamp * 2. Redistributions in binary form must reproduce the above copyright 1375067f4fSPoul-Henning Kamp * notice, this list of conditions and the following disclaimer in the 1475067f4fSPoul-Henning Kamp * documentation and/or other materials provided with the distribution. 1575067f4fSPoul-Henning Kamp * 1675067f4fSPoul-Henning Kamp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1775067f4fSPoul-Henning Kamp * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1875067f4fSPoul-Henning Kamp * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1975067f4fSPoul-Henning Kamp * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2075067f4fSPoul-Henning Kamp * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2175067f4fSPoul-Henning Kamp * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2275067f4fSPoul-Henning Kamp * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2375067f4fSPoul-Henning Kamp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2475067f4fSPoul-Henning Kamp * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2575067f4fSPoul-Henning Kamp * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2675067f4fSPoul-Henning Kamp * SUCH DAMAGE. 2775067f4fSPoul-Henning Kamp */ 2875067f4fSPoul-Henning Kamp 2975067f4fSPoul-Henning Kamp #ifndef _PRINTF_H_ 3075067f4fSPoul-Henning Kamp #define _PRINTF_H_ 3175067f4fSPoul-Henning Kamp 324551abd0SPawel Jakub Dawidek #include <stdio.h> 33f3fede8aSPoul-Henning Kamp #include <wchar.h> 34f3fede8aSPoul-Henning Kamp 3575067f4fSPoul-Henning Kamp /* 3675067f4fSPoul-Henning Kamp * The API defined by glibc allows a renderer to take multiple arguments 3775067f4fSPoul-Henning Kamp * This is obviously usable for things like (ptr+len) pairs etc. 3875067f4fSPoul-Henning Kamp * But the do not actually provide support for it at the end of the day, 3975067f4fSPoul-Henning Kamp * they offer only one argument to the arginfo function, but do accept 4075067f4fSPoul-Henning Kamp * >1 returns, although the do not check the types of those arguments 4175067f4fSPoul-Henning Kamp * argument 4275067f4fSPoul-Henning Kamp * Be compatible for now. 4375067f4fSPoul-Henning Kamp */ 4475067f4fSPoul-Henning Kamp #define __PRINTFMAXARG 2 4575067f4fSPoul-Henning Kamp 4675067f4fSPoul-Henning Kamp struct printf_info { 4775067f4fSPoul-Henning Kamp /* GLIBC compatible */ 4875067f4fSPoul-Henning Kamp int prec; 4975067f4fSPoul-Henning Kamp int width; 5075067f4fSPoul-Henning Kamp wchar_t spec; 5175067f4fSPoul-Henning Kamp unsigned is_long_double; 5275067f4fSPoul-Henning Kamp unsigned is_char; 5375067f4fSPoul-Henning Kamp unsigned is_short; 5475067f4fSPoul-Henning Kamp unsigned is_long; 5575067f4fSPoul-Henning Kamp unsigned alt; 5675067f4fSPoul-Henning Kamp unsigned space; 5775067f4fSPoul-Henning Kamp unsigned left; 5875067f4fSPoul-Henning Kamp unsigned showsign; 5975067f4fSPoul-Henning Kamp unsigned group; 6075067f4fSPoul-Henning Kamp unsigned extra; 6175067f4fSPoul-Henning Kamp unsigned wide; 6275067f4fSPoul-Henning Kamp wchar_t pad; 6375067f4fSPoul-Henning Kamp 6475067f4fSPoul-Henning Kamp /* FreeBSD extensions */ 6575067f4fSPoul-Henning Kamp 6675067f4fSPoul-Henning Kamp unsigned is_quad; 6775067f4fSPoul-Henning Kamp unsigned is_intmax; 6875067f4fSPoul-Henning Kamp unsigned is_ptrdiff; 6975067f4fSPoul-Henning Kamp unsigned is_size; 7075067f4fSPoul-Henning Kamp 7175067f4fSPoul-Henning Kamp /* private */ 7275067f4fSPoul-Henning Kamp int sofar; 7375067f4fSPoul-Henning Kamp unsigned get_width; 7475067f4fSPoul-Henning Kamp unsigned get_prec; 7575067f4fSPoul-Henning Kamp const char *begin; 7675067f4fSPoul-Henning Kamp const char *end; 7775067f4fSPoul-Henning Kamp void *arg[__PRINTFMAXARG]; 7875067f4fSPoul-Henning Kamp }; 7975067f4fSPoul-Henning Kamp 8075067f4fSPoul-Henning Kamp enum { 8175067f4fSPoul-Henning Kamp PA_INT = (1 << 0), /* int */ 8275067f4fSPoul-Henning Kamp PA_CHAR = (1 << 1), /* int, cast to char */ 8375067f4fSPoul-Henning Kamp PA_WCHAR = (1 << 2), /* wide char */ 8475067f4fSPoul-Henning Kamp PA_STRING = (1 << 3), /* const char * (with '\0') */ 8575067f4fSPoul-Henning Kamp PA_WSTRING = (1 << 4), /* const wchar_t * */ 8675067f4fSPoul-Henning Kamp PA_POINTER = (1 << 5), /* void * */ 8775067f4fSPoul-Henning Kamp PA_FLOAT = (1 << 6), /* float */ 8875067f4fSPoul-Henning Kamp PA_DOUBLE = (1 << 7) /* double */ 8975067f4fSPoul-Henning Kamp }; 9075067f4fSPoul-Henning Kamp 9175067f4fSPoul-Henning Kamp #define PA_FLAG_MASK 0xff0000 9275067f4fSPoul-Henning Kamp #define PA_FLAG_LONG_LONG (1 << 16) 9375067f4fSPoul-Henning Kamp #define PA_FLAG_LONG (1 << 17) 9475067f4fSPoul-Henning Kamp #define PA_FLAG_SHORT (1 << 18) 9575067f4fSPoul-Henning Kamp #define PA_FLAG_PTR (1 << 19) 9675067f4fSPoul-Henning Kamp #define PA_FLAG_QUAD (1 << 20) 9775067f4fSPoul-Henning Kamp #define PA_FLAG_INTMAX (1 << 21) 9875067f4fSPoul-Henning Kamp #define PA_FLAG_SIZE (1 << 22) 9975067f4fSPoul-Henning Kamp #define PA_FLAG_PTRDIFF (1 << 23) 10075067f4fSPoul-Henning Kamp #define PA_FLAG_LONG_DOUBLE PA_FLAG_LONG_LONG 10175067f4fSPoul-Henning Kamp 10275067f4fSPoul-Henning Kamp typedef int printf_arginfo_function(const struct printf_info *, size_t, int *); 10375067f4fSPoul-Henning Kamp typedef int printf_function(FILE *, const struct printf_info *, const void *const *); 10475067f4fSPoul-Henning Kamp 10575067f4fSPoul-Henning Kamp /* FreeBSD extension */ 10675067f4fSPoul-Henning Kamp struct __printf_io; 10775067f4fSPoul-Henning Kamp typedef int printf_render(struct __printf_io *, const struct printf_info *, const void *const *); 10875067f4fSPoul-Henning Kamp 10975067f4fSPoul-Henning Kamp /* vprintf.c */ 11075067f4fSPoul-Henning Kamp extern const char __lowercase_hex[17]; 11175067f4fSPoul-Henning Kamp extern const char __uppercase_hex[17]; 11275067f4fSPoul-Henning Kamp 11375067f4fSPoul-Henning Kamp void __printf_flush(struct __printf_io *io); 11475067f4fSPoul-Henning Kamp int __printf_puts(struct __printf_io *io, const void *ptr, int len); 11575067f4fSPoul-Henning Kamp int __printf_pad(struct __printf_io *io, int n, int zero); 11675067f4fSPoul-Henning Kamp int __printf_out(struct __printf_io *io, const struct printf_info *pi, const void *ptr, int len); 11775067f4fSPoul-Henning Kamp 11875067f4fSPoul-Henning Kamp int __xvprintf(FILE *fp, const char *fmt0, va_list ap); 11975067f4fSPoul-Henning Kamp extern int __use_xprintf; 12075067f4fSPoul-Henning Kamp 12175067f4fSPoul-Henning Kamp /* GLIBC compat */ 12275067f4fSPoul-Henning Kamp int register_printf_function(int spec, printf_function *render, printf_arginfo_function *arginfo); 12375067f4fSPoul-Henning Kamp 12475067f4fSPoul-Henning Kamp /* FreeBSD */ 12575067f4fSPoul-Henning Kamp int register_printf_render(int spec, printf_render *render, printf_arginfo_function *arginfo); 126988a521bSPawel Jakub Dawidek int register_printf_render_std(const char *specs); 12775067f4fSPoul-Henning Kamp 1286dbacee2SPoul-Henning Kamp /* vprintf_errno.c */ 1296dbacee2SPoul-Henning Kamp printf_arginfo_function __printf_arginfo_errno; 1306dbacee2SPoul-Henning Kamp printf_render __printf_render_errno; 1316dbacee2SPoul-Henning Kamp 13275067f4fSPoul-Henning Kamp /* vprintf_float.c */ 13375067f4fSPoul-Henning Kamp printf_arginfo_function __printf_arginfo_float; 13475067f4fSPoul-Henning Kamp printf_render __printf_render_float; 13575067f4fSPoul-Henning Kamp 1366dbacee2SPoul-Henning Kamp /* vprintf_hexdump.c */ 1376dbacee2SPoul-Henning Kamp printf_arginfo_function __printf_arginfo_hexdump; 1386dbacee2SPoul-Henning Kamp printf_render __printf_render_hexdump; 1396dbacee2SPoul-Henning Kamp 14075067f4fSPoul-Henning Kamp /* vprintf_int.c */ 14175067f4fSPoul-Henning Kamp printf_arginfo_function __printf_arginfo_ptr; 14275067f4fSPoul-Henning Kamp printf_arginfo_function __printf_arginfo_int; 14375067f4fSPoul-Henning Kamp printf_render __printf_render_ptr; 14475067f4fSPoul-Henning Kamp printf_render __printf_render_int; 14575067f4fSPoul-Henning Kamp 1466dbacee2SPoul-Henning Kamp /* vprintf_quoute.c */ 1476dbacee2SPoul-Henning Kamp printf_arginfo_function __printf_arginfo_quote; 1486dbacee2SPoul-Henning Kamp printf_render __printf_render_quote; 1496dbacee2SPoul-Henning Kamp 15075067f4fSPoul-Henning Kamp /* vprintf_str.c */ 15175067f4fSPoul-Henning Kamp printf_arginfo_function __printf_arginfo_chr; 15275067f4fSPoul-Henning Kamp printf_render __printf_render_chr; 15375067f4fSPoul-Henning Kamp printf_arginfo_function __printf_arginfo_str; 15475067f4fSPoul-Henning Kamp printf_render __printf_render_str; 15575067f4fSPoul-Henning Kamp 15675067f4fSPoul-Henning Kamp /* vprintf_time.c */ 15775067f4fSPoul-Henning Kamp printf_arginfo_function __printf_arginfo_time; 15875067f4fSPoul-Henning Kamp printf_render __printf_render_time; 15975067f4fSPoul-Henning Kamp 16075067f4fSPoul-Henning Kamp /* vprintf_vis.c */ 16175067f4fSPoul-Henning Kamp printf_arginfo_function __printf_arginfo_vis; 16275067f4fSPoul-Henning Kamp printf_render __printf_render_vis; 16375067f4fSPoul-Henning Kamp 16475067f4fSPoul-Henning Kamp #endif /* !_PRINTF_H */ 165