1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius*   Copyright (C) 1998-2011, 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 ufmt_cmn.h
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Modification History:
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Date        Name        Description
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   12/02/98    stephen        Creation.
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   03/12/99    stephen     Modified for new C API.
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   03/15/99    stephen     Added defaultCPToUnicode, unicodeToDefaultCP
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef UFMT_CMN_H
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UFMT_CMN_H
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
2483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#include "unicode/utf16.h"
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define UFMT_DEFAULT_BUFFER_SIZE 128
2783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define MAX_UCHAR_BUFFER_SIZE(buffer) (sizeof(buffer)/(U16_MAX_LENGTH*sizeof(UChar)))
2883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius#define MAX_UCHAR_BUFFER_NEEDED(strLen) ((strLen+1)*U16_MAX_LENGTH*sizeof(UChar))
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Enum representing the possible argument types for uprintf/uscanf
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef enum ufmt_type_info {
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_empty = 0,
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_simple_percent, /* %% do nothing */
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_count,      /* special flag for count */
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_int,        /* int */
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_char,       /* int, cast to char */
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_string,     /* char* */
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_pointer,    /* void* */
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_float,      /* float */
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_double,     /* double */
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_uchar,      /* int, cast to UChar */
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ufmt_ustring     /* UChar* */
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*ufmt_wchar,*/      /* wchar_t */
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*ufmt_wstring,*/    /* wchar_t* */
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*ufmt_date,*/       /* Date */
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*ufmt_last*/
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} ufmt_type_info;
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Union representing a uprintf/uscanf argument
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef union ufmt_args {
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int64_t int64Value;    /* int, UChar */
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    float   floatValue;    /* float */
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    double  doubleValue;   /* double */
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    void    *ptrValue;     /* any pointer - void*, char*, wchar_t*, UChar* */
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*wchar_t wcharValue;*/    /* wchar_t */    /* TODO: Should wchar_t be used? */
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /*UDate dateValue;*/     /* Date */
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} ufmt_args;
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Macro for determining the minimum of two numbers.
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param a An integer
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param b An integer
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return <TT>a</TT> if </TT>a < b</TT>, <TT>b</TT> otherwise
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define ufmt_min(a,b) ((a) < (b) ? (a) : (b))
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert a UChar in hex radix to an integer value.
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param c The UChar to convert.
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The integer value of <TT>c</TT>.
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruufmt_digitvalue(UChar c);
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Determine if a UChar is a digit for a specified radix.
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param c The UChar to check.
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param radix The desired radix.
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return TRUE if <TT>c</TT> is a digit in <TT>radix</TT>, FALSE otherwise.
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruufmt_isdigit(UChar     c,
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         int32_t     radix);
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert an int64_t to a UChar* in a specified radix
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param buffer The target buffer
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param len On input, the size of <TT>buffer</TT>.  On output,
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the number of UChars written to <TT>buffer</TT>.
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param value The value to be converted
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param radix The desired radix
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param uselower TRUE means lower case will be used, FALSE means upper case
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param minDigits The minimum number of digits for for the formatted number,
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * which will be padded with zeroes. -1 means do not pad.
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruufmt_64tou(UChar     *buffer,
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      int32_t     *len,
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      uint64_t     value,
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      uint8_t     radix,
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      UBool    uselower,
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      int32_t    minDigits);
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * It's like ufmt_64tou, but with a pointer.
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * This functions avoids size constraints of 64-bit types.
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Pointers can be at 32-128 bits in size.
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruufmt_ptou(UChar    *buffer,
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          int32_t   *len,
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          void      *value,
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru          UBool     uselower);
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert a UChar* in a specified radix to an int64_t.
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param buffer The target buffer
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param len On input, the size of <TT>buffer</TT>.  On output,
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the number of UChars read from <TT>buffer</TT>.
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param radix The desired radix
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The numeric value.
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint64_t
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruufmt_uto64(const UChar     *buffer,
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      int32_t     *len,
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      int8_t     radix);
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert a UChar* in a specified radix to a pointer,
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param buffer The target buffer
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param len On input, the size of <TT>buffer</TT>.  On output,
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * the number of UChars read from <TT>buffer</TT>.
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param radix The desired radix
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return The pointer value.
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid *
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruufmt_utop(const UChar     *buffer,
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru      int32_t     *len);
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/**
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Convert a string from the default codepage to Unicode.
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param s The string to convert, in the default codepage.
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param sSize The size of s to convert.
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param target The buffer to convert to.
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param tSize The size of target
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @return A pointer to a newly allocated converted version of s, or 0
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * on error.
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUChar*
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruufmt_defaultCPToUnicode(const char *s, int32_t sSize,
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        UChar *target, int32_t tSize);
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
161