1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 ******************************************************************************
5 *
6 *   Copyright (C) 1998-2006, International Business Machines
7 *   Corporation and others.  All Rights Reserved.
8 *
9 ******************************************************************************
10 *
11 * File uprintf.h
12 *
13 * Modification History:
14 *
15 *   Date        Name        Description
16 *   11/19/98    stephen        Creation.
17 *   03/12/99    stephen     Modified for new C API.
18 ******************************************************************************
19 */
20 
21 #ifndef UPRINTF_H
22 #define UPRINTF_H
23 
24 #include "unicode/utypes.h"
25 
26 #if !UCONFIG_NO_FORMATTING
27 
28 #include "unicode/ustdio.h"
29 #include "ufmt_cmn.h"
30 #include "locbund.h"
31 
32 /**
33  * Struct encapsulating a single uprintf format specification.
34  */
35 typedef struct u_printf_spec_info {
36   int32_t    fPrecision;    /* Precision  */
37   int32_t    fWidth;        /* Width  */
38 
39   UChar     fOrigSpec;      /* Conversion specification */
40   UChar     fSpec;          /* Conversion specification */
41   UChar     fPadChar;       /* Padding character  */
42 
43   UBool     fAlt;           /* # flag  */
44   UBool     fSpace;         /* Space flag  */
45   UBool     fLeft;          /* - flag  */
46   UBool     fShowSign;      /* + flag  */
47   UBool     fZero;          /* 0 flag  */
48 
49   UBool     fIsLongDouble;  /* L flag  */
50   UBool     fIsShort;       /* h flag  */
51   UBool     fIsLong;        /* l flag  */
52   UBool     fIsLongLong;    /* ll flag  */
53 } u_printf_spec_info;
54 
55 typedef int32_t U_EXPORT2
56 u_printf_write_stream(void          *context,
57                       const UChar   *str,
58                       int32_t       count);
59 
60 typedef int32_t U_EXPORT2
61 u_printf_pad_and_justify_stream(void                        *context,
62                                 const u_printf_spec_info    *info,
63                                 const UChar                 *result,
64                                 int32_t                     resultLen);
65 
66 typedef struct u_printf_stream_handler {
67     u_printf_write_stream *write;
68     u_printf_pad_and_justify_stream *pad_and_justify;
69 } u_printf_stream_handler;
70 
71 /* Used by sprintf */
72 typedef struct u_localized_print_string {
73     UChar     *str;     /* Place to write the string */
74     int32_t   available;/* Number of codeunits available to write to */
75     int32_t   len;      /* Maximum number of code units that can be written to output */
76 
77     ULocaleBundle  fBundle;     /* formatters */
78 } u_localized_print_string;
79 
80 #define UP_PERCENT 0x0025
81 
82 /**
83  * Parse a single u_printf format string.
84  * @param fmt A pointer to a '%' character in a u_printf format specification.
85  * @param spec A pointer to a <TT>u_printf_spec</TT> to receive the parsed
86  * format specifier.
87  * @param locStringContext If present, will make sure that it will only write
88  *          to the buffer when space is available. It's done this way because
89  *          va_list sometimes can't be passed by pointer.
90  * @return The number of characters contained in this specifier.
91  */
92 U_CFUNC int32_t
93 u_printf_parse(const u_printf_stream_handler *streamHandler,
94                const UChar     *fmt,
95                void            *context,
96                u_localized_print_string *locStringContext,
97                ULocaleBundle   *formatBundle,
98                int32_t         *written,
99                va_list         ap);
100 
101 #endif /* #if !UCONFIG_NO_FORMATTING */
102 
103 #endif
104