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