/src/icu/source/i18n/format.cpp
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | // © 2016 and later: Unicode, Inc. and others.  | 
2  |  | // License & terms of use: http://www.unicode.org/copyright.html  | 
3  |  | /*  | 
4  |  | *******************************************************************************  | 
5  |  | * Copyright (C) 1997-2012, International Business Machines Corporation and    *  | 
6  |  | * others. All Rights Reserved.                                                *  | 
7  |  | *******************************************************************************  | 
8  |  | *  | 
9  |  | * File FORMAT.CPP  | 
10  |  | *  | 
11  |  | * Modification History:  | 
12  |  | *  | 
13  |  | *   Date        Name        Description  | 
14  |  | *   02/19/97    aliu        Converted from java.  | 
15  |  | *   03/17/97    clhuang     Implemented with new APIs.  | 
16  |  | *   03/27/97    helena      Updated to pass the simple test after code review.  | 
17  |  | *   07/20/98    stephen        Added explicit init values for Field/ParsePosition  | 
18  |  | ********************************************************************************  | 
19  |  | */  | 
20  |  | // *****************************************************************************  | 
21  |  | // This file was generated from the java source file Format.java  | 
22  |  | // *****************************************************************************  | 
23  |  |  | 
24  |  | #include "utypeinfo.h"  // for 'typeid' to work  | 
25  |  |  | 
26  |  | #include "unicode/utypes.h"  | 
27  |  |  | 
28  |  | #ifndef U_I18N_IMPLEMENTATION  | 
29  |  | #error U_I18N_IMPLEMENTATION not set - must be set for all ICU source files in i18n/ - see https://unicode-org.github.io/icu/userguide/howtouseicu  | 
30  |  | #endif  | 
31  |  |  | 
32  |  | /*  | 
33  |  |  * Dummy code:  | 
34  |  |  * If all modules in the I18N library are switched off, then there are no  | 
35  |  |  * library exports and MSVC 6 writes a .dll but not a .lib file.  | 
36  |  |  * Unless we export _something_ in that case...  | 
37  |  |  */  | 
38  |  | #if UCONFIG_NO_COLLATION && UCONFIG_NO_FORMATTING && UCONFIG_NO_TRANSLITERATION  | 
39  |  | U_CAPI int32_t U_EXPORT2  | 
40  |  | uprv_icuin_lib_dummy(int32_t i) { | 
41  |  |     return -i;  | 
42  |  | }  | 
43  |  | #endif  | 
44  |  |  | 
45  |  | /* Format class implementation ---------------------------------------------- */  | 
46  |  |  | 
47  |  | #if !UCONFIG_NO_FORMATTING  | 
48  |  |  | 
49  |  | #include "unicode/format.h"  | 
50  |  | #include "unicode/ures.h"  | 
51  |  | #include "cstring.h"  | 
52  |  | #include "locbased.h"  | 
53  |  |  | 
54  |  | // *****************************************************************************  | 
55  |  | // class Format  | 
56  |  | // *****************************************************************************  | 
57  |  |  | 
58  |  | U_NAMESPACE_BEGIN  | 
59  |  |  | 
60  |  | UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition)  | 
61  |  |  | 
62  | 0  | FieldPosition::~FieldPosition() {} | 
63  |  |  | 
64  |  | FieldPosition *  | 
65  | 0  | FieldPosition::clone() const { | 
66  | 0  |     return new FieldPosition(*this);  | 
67  | 0  | }  | 
68  |  |  | 
69  |  | // -------------------------------------  | 
70  |  | // default constructor  | 
71  |  |  | 
72  |  | Format::Format()  | 
73  | 0  |     : UObject()  | 
74  | 0  | { | 
75  | 0  |     *validLocale = *actualLocale = 0;  | 
76  | 0  | }  | 
77  |  |  | 
78  |  | // -------------------------------------  | 
79  |  |  | 
80  |  | Format::~Format()  | 
81  | 0  | { | 
82  | 0  | }  | 
83  |  |  | 
84  |  | // -------------------------------------  | 
85  |  | // copy constructor  | 
86  |  |  | 
87  |  | Format::Format(const Format &that)  | 
88  | 0  |     : UObject(that)  | 
89  | 0  | { | 
90  | 0  |     *this = that;  | 
91  | 0  | }  | 
92  |  |  | 
93  |  | // -------------------------------------  | 
94  |  | // assignment operator  | 
95  |  |  | 
96  |  | Format&  | 
97  |  | Format::operator=(const Format& that)  | 
98  | 0  | { | 
99  | 0  |     if (this != &that) { | 
100  | 0  |         uprv_strcpy(validLocale, that.validLocale);  | 
101  | 0  |         uprv_strcpy(actualLocale, that.actualLocale);  | 
102  | 0  |     }  | 
103  | 0  |     return *this;  | 
104  | 0  | }  | 
105  |  |  | 
106  |  | // -------------------------------------  | 
107  |  | // Formats the obj and append the result in the buffer, toAppendTo.  | 
108  |  | // This calls the actual implementation in the concrete subclasses.  | 
109  |  |  | 
110  |  | UnicodeString&  | 
111  |  | Format::format(const Formattable& obj,  | 
112  |  |                UnicodeString& toAppendTo,  | 
113  |  |                UErrorCode& status) const  | 
114  | 0  | { | 
115  | 0  |     if (U_FAILURE(status)) return toAppendTo;  | 
116  |  |  | 
117  | 0  |     FieldPosition pos(FieldPosition::DONT_CARE);  | 
118  |  | 
  | 
119  | 0  |     return format(obj, toAppendTo, pos, status);  | 
120  | 0  | }  | 
121  |  |  | 
122  |  | // -------------------------------------  | 
123  |  | // Default implementation sets unsupported error; subclasses should  | 
124  |  | // override.  | 
125  |  |  | 
126  |  | UnicodeString&  | 
127  |  | Format::format(const Formattable& /* unused obj */,  | 
128  |  |                UnicodeString& toAppendTo,  | 
129  |  |                FieldPositionIterator* /* unused posIter */,  | 
130  |  |                UErrorCode& status) const  | 
131  | 0  | { | 
132  | 0  |     if (!U_FAILURE(status)) { | 
133  | 0  |       status = U_UNSUPPORTED_ERROR;  | 
134  | 0  |     }  | 
135  | 0  |     return toAppendTo;  | 
136  | 0  | }  | 
137  |  |  | 
138  |  | // -------------------------------------  | 
139  |  | // Parses the source string and create the corresponding  | 
140  |  | // result object.  Checks the parse position for errors.  | 
141  |  |  | 
142  |  | void  | 
143  |  | Format::parseObject(const UnicodeString& source,  | 
144  |  |                     Formattable& result,  | 
145  |  |                     UErrorCode& status) const  | 
146  | 0  | { | 
147  | 0  |     if (U_FAILURE(status)) return;  | 
148  |  |  | 
149  | 0  |     ParsePosition parsePosition(0);  | 
150  | 0  |     parseObject(source, result, parsePosition);  | 
151  | 0  |     if (parsePosition.getIndex() == 0) { | 
152  | 0  |         status = U_INVALID_FORMAT_ERROR;  | 
153  | 0  |     }  | 
154  | 0  | }  | 
155  |  |  | 
156  |  | // -------------------------------------  | 
157  |  |  | 
158  |  | bool  | 
159  |  | Format::operator==(const Format& that) const  | 
160  | 0  | { | 
161  |  |     // Subclasses: Call this method and then add more specific checks.  | 
162  | 0  |     return typeid(*this) == typeid(that);  | 
163  | 0  | }  | 
164  |  | //---------------------------------------  | 
165  |  |  | 
166  |  | /**  | 
167  |  |  * Simple function for initializing a UParseError from a UnicodeString.  | 
168  |  |  *  | 
169  |  |  * @param pattern The pattern to copy into the parseError  | 
170  |  |  * @param pos The position in pattern where the error occurred  | 
171  |  |  * @param parseError The UParseError object to fill in  | 
172  |  |  * @draft ICU 2.4  | 
173  |  |  */  | 
174  |  | void Format::syntaxError(const UnicodeString& pattern,  | 
175  |  |                          int32_t pos,  | 
176  | 0  |                          UParseError& parseError) { | 
177  | 0  |     parseError.offset = pos;  | 
178  | 0  |     parseError.line=0;  // we are not using line number  | 
179  |  |  | 
180  |  |     // for pre-context  | 
181  | 0  |     int32_t start = (pos < U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1  | 
182  | 0  |                                                              /* subtract 1 so that we have room for null*/));  | 
183  | 0  |     int32_t stop  = pos;  | 
184  | 0  |     pattern.extract(start,stop-start,parseError.preContext,0);  | 
185  |  |     //null terminate the buffer  | 
186  | 0  |     parseError.preContext[stop-start] = 0;  | 
187  |  |  | 
188  |  |     //for post-context  | 
189  | 0  |     start = pos+1;  | 
190  | 0  |     stop  = ((pos+U_PARSE_CONTEXT_LEN)<=pattern.length()) ? (pos+(U_PARSE_CONTEXT_LEN-1)) :  | 
191  | 0  |         pattern.length();  | 
192  | 0  |     pattern.extract(start,stop-start,parseError.postContext,0);  | 
193  |  |     //null terminate the buffer  | 
194  | 0  |     parseError.postContext[stop-start]= 0;  | 
195  | 0  | }  | 
196  |  |  | 
197  |  | Locale  | 
198  | 0  | Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const { | 
199  | 0  |     U_LOCALE_BASED(locBased, *this);  | 
200  | 0  |     return locBased.getLocale(type, status);  | 
201  | 0  | }  | 
202  |  |  | 
203  |  | const char *  | 
204  | 0  | Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { | 
205  | 0  |     U_LOCALE_BASED(locBased, *this);  | 
206  | 0  |     return locBased.getLocaleID(type, status);  | 
207  | 0  | }  | 
208  |  |  | 
209  |  | void  | 
210  | 0  | Format::setLocaleIDs(const char* valid, const char* actual) { | 
211  | 0  |     U_LOCALE_BASED(locBased, *this);  | 
212  | 0  |     locBased.setLocaleIDs(valid, actual);  | 
213  | 0  | }  | 
214  |  |  | 
215  |  | U_NAMESPACE_END  | 
216  |  |  | 
217  |  | #endif /* #if !UCONFIG_NO_FORMATTING */  | 
218  |  |  | 
219  |  | //eof  |