mirror of
https://github.com/tihmstar/futurerestore.git
synced 2026-01-26 14:39:15 +00:00
285 lines
11 KiB
C
285 lines
11 KiB
C
/*-
|
|
* Copyright (c) 2005 Poul-Henning Kamp
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD: src/include/printf.h,v 1.5 2011/03/06 17:45:37 pjd Exp $
|
|
*/
|
|
|
|
#ifndef _PRINTF_H_
|
|
#define _PRINTF_H_
|
|
|
|
/****************************************************************************
|
|
* This is the header file for extensible printf, a set of APIs that allow
|
|
* adding/modifying conversion specifier(s) for stdio formatted printing.
|
|
* It is based on the GLIBC API documented in:
|
|
*
|
|
* http://www.gnu.org/software/libc/manual/html_node/Customizing-Printf.html
|
|
*
|
|
* Because that API affects printf behavior process-wide and so is unsafe,
|
|
* we adapt a modified form, based on the concept of printf domains in which
|
|
* changes to conversion specifiers can be made independent of one another
|
|
* and which don't affect the normal printf behavior. In addition, there
|
|
* is now a set of printf variants that take a printf domain as an argument.
|
|
*
|
|
* See xprintf(5) for more details.
|
|
****************************************************************************/
|
|
|
|
#include <stdio.h>
|
|
#include <wchar.h>
|
|
#include <xlocale.h>
|
|
#include <Availability.h>
|
|
|
|
#ifdef __GNUC__
|
|
#define __XPRINTF_ATTR(x) __attribute__(x)
|
|
#else /* !__GNUC__ */
|
|
#define __XPRINTF_ATTR(x) /* nothing */
|
|
#endif /* !__GNUC__ */
|
|
|
|
/*
|
|
* The API defined by GLIBC allows a renderer to take multiple arguments
|
|
* This is obviously usable for things like (ptr+len) pairs etc.
|
|
* The current limit is to deal with up to __PRINTFMAXARG arguments (any
|
|
* above this limit are ignored).
|
|
*/
|
|
#define __PRINTFMAXARG 2
|
|
|
|
struct printf_info {
|
|
/* Mac OS X extensions */
|
|
void *context; /* User context pointer */
|
|
locale_t loc; /* Extended locale */
|
|
wchar_t vsep; /* Vector separator char */
|
|
/* one of ,:;_ flag or X by default */
|
|
|
|
/* GLIBC compatible */
|
|
int prec; /* precision */
|
|
int width; /* Width */
|
|
wchar_t spec; /* Format letter */
|
|
wchar_t pad; /* Padding char */
|
|
/* 0 if 0 flag set, otherwise space */
|
|
|
|
/* FreeBSD extensions */
|
|
wchar_t signchar; /* Sign char */
|
|
|
|
/* GLIBC compatible flags */
|
|
unsigned is_long_double :1; /* L or ll flag */
|
|
unsigned is_char :1; /* hh flag */
|
|
unsigned is_short :1; /* h flag */
|
|
unsigned is_long :1; /* l flag */
|
|
unsigned alt :1; /* # flag */
|
|
unsigned space :1; /* Space flag */
|
|
unsigned left :1; /* - flag */
|
|
unsigned showsign :1; /* + flag */
|
|
unsigned group :1; /* ' flag */
|
|
unsigned extra :1; /* For special use (currently unused) */
|
|
unsigned wide :1; /* Nonzero for wide character streams (currently unused) */
|
|
|
|
/* FreeBSD flags */
|
|
unsigned is_quad :1; /* q flag */
|
|
unsigned is_intmax :1; /* j flag */
|
|
unsigned is_ptrdiff :1; /* t flag */
|
|
unsigned is_size :1; /* z flag */
|
|
|
|
/* Mac OS X flags */
|
|
unsigned is_vec :1; /* v flag */
|
|
|
|
/* private */
|
|
int sofar;
|
|
unsigned get_width;
|
|
unsigned get_prec;
|
|
const char *begin;
|
|
const char *end;
|
|
void *arg[__PRINTFMAXARG];
|
|
};
|
|
|
|
enum {
|
|
PA_INT = (1 << 0), /* int */
|
|
PA_CHAR = (1 << 1), /* int, cast to char */
|
|
PA_WCHAR = (1 << 2), /* wide char */
|
|
PA_STRING = (1 << 3), /* const char * (with '\0') */
|
|
PA_WSTRING = (1 << 4), /* const wchar_t * */
|
|
PA_POINTER = (1 << 5), /* void * */
|
|
PA_FLOAT = (1 << 6), /* float (Defined but unused; best to avoid.) */
|
|
PA_DOUBLE = (1 << 7), /* double */
|
|
PA_VECTOR = (1 << 8), /* vector */
|
|
};
|
|
|
|
#define PA_FLAG_MASK 0xff0000
|
|
#define PA_FLAG_LONG_LONG (1 << 16)
|
|
#define PA_FLAG_LONG (1 << 17)
|
|
#define PA_FLAG_SHORT (1 << 18)
|
|
#define PA_FLAG_PTR (1 << 19)
|
|
#define PA_FLAG_QUAD (1 << 20)
|
|
#define PA_FLAG_INTMAX (1 << 21)
|
|
#define PA_FLAG_SIZE (1 << 22)
|
|
#define PA_FLAG_PTRDIFF (1 << 23)
|
|
#define PA_FLAG_LONG_DOUBLE PA_FLAG_LONG_LONG
|
|
|
|
/************************ Basic Extensible Printf APIs ************************/
|
|
|
|
typedef int printf_arginfo_function(const struct printf_info *__info,
|
|
size_t __n, int *__argtypes);
|
|
typedef int printf_function(FILE *__stream,
|
|
const struct printf_info *__info, const void *const *__args);
|
|
|
|
/*
|
|
* We don't support the GLIBC register_printf_function() or FreeBSD
|
|
* register_printf_render_std(), because they affect printf globally
|
|
* and are unsafe.
|
|
*/
|
|
|
|
/*************** Extensible Printf Domains APIs ****************/
|
|
|
|
struct _printf_domain; /* forward reference */
|
|
typedef struct _printf_domain *printf_domain_t;
|
|
|
|
__BEGIN_DECLS
|
|
|
|
printf_domain_t copy_printf_domain(printf_domain_t __domain)
|
|
__XPRINTF_ATTR((__nonnull__(1)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
void free_printf_domain(printf_domain_t __domain)
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
printf_domain_t new_printf_domain(void)
|
|
__XPRINTF_ATTR((__malloc__))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int register_printf_domain_function(printf_domain_t __domain,
|
|
int __spec, printf_function *__render,
|
|
printf_arginfo_function *__arginfo, void *__context)
|
|
__XPRINTF_ATTR((__nonnull__(1)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int register_printf_domain_render_std(printf_domain_t __domain,
|
|
const char *__specs)
|
|
__XPRINTF_ATTR((__nonnull__(1)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
|
|
/**** All-in-one extensible printf variants ****/
|
|
int asxprintf(char ** __restrict __ret,
|
|
printf_domain_t __restrict __domain, locale_t __restrict __loc,
|
|
const char * __restrict __format, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2, 4)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int dxprintf(int __fd, printf_domain_t __restrict __domain,
|
|
locale_t __restrict __loc, const char * __restrict __format, ...)
|
|
__XPRINTF_ATTR((__nonnull__(2, 4)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int fxprintf(FILE * __restrict __stream,
|
|
printf_domain_t __restrict __domain, locale_t __restrict __loc,
|
|
const char * __restrict __format, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2, 4)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int sxprintf(char * __restrict __str, size_t __size,
|
|
printf_domain_t __restrict __domain, locale_t __restrict __loc,
|
|
const char * __restrict __format, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1, 3, 5)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int xprintf(printf_domain_t __restrict __domain,
|
|
locale_t __restrict __loc, const char * __restrict __format, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1, 3)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
|
|
int vasxprintf(char ** __restrict __ret,
|
|
printf_domain_t __restrict __domain, locale_t __restrict __loc,
|
|
const char * __restrict __format, va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2, 4)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vdxprintf(int __fd, printf_domain_t __restrict __domain,
|
|
locale_t __restrict __loc, const char * __restrict __format,
|
|
va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(2, 4)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vfxprintf(FILE * __restrict __stream,
|
|
printf_domain_t __restrict __domain, locale_t __restrict __loc,
|
|
const char * __restrict __format, va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2, 4)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vsxprintf(char * __restrict __str, size_t __size,
|
|
printf_domain_t __restrict __domain, locale_t __restrict __loc,
|
|
const char * __restrict __format, va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1, 3, 5)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vxprintf(printf_domain_t __restrict __domain,
|
|
locale_t __restrict __loc, const char * __restrict __format,
|
|
va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1, 3)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
|
|
__END_DECLS
|
|
|
|
/******** Extensible Printf Compilation/Execution APIs *********/
|
|
struct _printf_compiled; /* forward reference */
|
|
typedef struct _printf_compiled *printf_comp_t;
|
|
|
|
__BEGIN_DECLS
|
|
|
|
void free_printf_comp(printf_comp_t __pc)
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
printf_comp_t new_printf_comp(printf_domain_t __restrict __domain,
|
|
locale_t __restrict __loc, const char * __restrict __fmt)
|
|
__XPRINTF_ATTR((__nonnull__(1, 3)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
|
|
/**** Extensible printf execution ****/
|
|
int asxprintf_exec(char ** __restrict __ret,
|
|
printf_comp_t __restrict __pc, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int dxprintf_exec(int __fd, printf_comp_t __restrict __pc, ...)
|
|
__XPRINTF_ATTR((__nonnull__(2)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int fxprintf_exec(FILE * __restrict __stream,
|
|
printf_comp_t __restrict __pc, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int sxprintf_exec(char * __restrict __str, size_t __size,
|
|
printf_comp_t __restrict __pc, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1, 3)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int xprintf_exec(printf_comp_t __restrict __pc, ...)
|
|
__XPRINTF_ATTR((__nonnull__(1)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
|
|
int vasxprintf_exec(char ** __restrict __ret,
|
|
printf_comp_t __restrict __pc, va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vdxprintf_exec(int __fd, printf_comp_t __restrict __pc,
|
|
va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(2)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vfxprintf_exec(FILE * __restrict __stream,
|
|
printf_comp_t __restrict __pc, va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1, 2)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vsxprintf_exec(char * __restrict __str, size_t __size,
|
|
printf_comp_t __restrict __pc, va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1, 3)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
int vxprintf_exec(printf_comp_t __restrict __pc, va_list __ap)
|
|
__XPRINTF_ATTR((__nonnull__(1)))
|
|
__OSX_AVAILABLE_STARTING(__MAC_10_9,__IPHONE_7_0);
|
|
|
|
__END_DECLS
|
|
|
|
#endif /* !_PRINTF_H */
|