]> git.saurik.com Git - apple/libc.git/blobdiff - include/printf.h
Libc-997.1.1.tar.gz
[apple/libc.git] / include / printf.h
diff --git a/include/printf.h b/include/printf.h
new file mode 100644 (file)
index 0000000..22eb9b7
--- /dev/null
@@ -0,0 +1,284 @@
+/*-
+ * 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 */