1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Copyright (C) 1998-2004, 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.c
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*                           Added conversion from default codepage.
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   08/07/2003  george      Reunify printf implementations
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustdio.h"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unum.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/udat.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/putil.h"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uprintf.h"
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ufile.h"
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "locbund.h"
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t U_EXPORT2
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruu_printf_write(void          *context,
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               const UChar   *str,
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               int32_t       count)
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return u_file_write(str, count, (UFILE *)context);
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruu_printf_pad_and_justify(void                        *context,
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         const u_printf_spec_info    *info,
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         const UChar                 *result,
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         int32_t                     resultLen)
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UFILE   *output = (UFILE *)context;
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t written, i;
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* pad and justify, if needed */
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(info->fWidth != -1 && resultLen < info->fWidth) {
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* left justify */
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(info->fLeft) {
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            written = u_file_write(result, resultLen, output);
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(i = 0; i < info->fWidth - resultLen; ++i) {
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                written += u_file_write(&info->fPadChar, 1, output);
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        /* right justify */
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        else {
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            written = 0;
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            for(i = 0; i < info->fWidth - resultLen; ++i) {
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                written += u_file_write(&info->fPadChar, 1, output);
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            written += u_file_write(result, resultLen, output);
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* just write the formatted output */
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else {
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        written = u_file_write(result, resultLen, output);
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return written;
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruu_fprintf(    UFILE        *f,
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          const char    *patternSpecification,
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          ... )
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_list ap;
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t count;
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_start(ap, patternSpecification);
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    count = u_vfprintf(f, patternSpecification, ap);
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_end(ap);
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return count;
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruu_fprintf_u(    UFILE        *f,
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            const UChar    *patternSpecification,
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            ... )
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_list ap;
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t count;
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_start(ap, patternSpecification);
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    count = u_vfprintf_u(f, patternSpecification, ap);
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    va_end(ap);
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return count;
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t  U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruu_vfprintf(    UFILE        *f,
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           const char    *patternSpecification,
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           va_list        ap)
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t count;
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar *pattern;
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UChar buffer[UFMT_DEFAULT_BUFFER_SIZE];
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t size = (int32_t)strlen(patternSpecification) + 1;
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* convert from the default codepage to Unicode */
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (size >= MAX_UCHAR_BUFFER_SIZE(buffer)) {
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        pattern = (UChar *)uprv_malloc(size * sizeof(UChar));
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(pattern == 0) {
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return 0;
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else {
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        pattern = buffer;
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_charsToUChars(patternSpecification, pattern, size);
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* do the work */
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    count = u_vfprintf_u(f, pattern, ap);
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* clean up */
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (pattern != buffer) {
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        uprv_free(pattern);
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return count;
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const u_printf_stream_handler g_stream_handler = {
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_printf_write,
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_printf_pad_and_justify
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t  U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruu_vfprintf_u(    UFILE        *f,
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             const UChar    *patternSpecification,
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru             va_list        ap)
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t          written = 0;   /* haven't written anything yet */
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* parse and print the whole format string */
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_printf_parse(&g_stream_handler, patternSpecification, f, NULL, &f->str.fBundle, &written, ap);
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* return # of UChars written */
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return written;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
164