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
uprv_icuin_lib_dummy(int32_t i)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 
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition)60 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition)
61 
62 FieldPosition::~FieldPosition() {}
63 
64 FieldPosition *
clone() const65 FieldPosition::clone() const {
66     return new FieldPosition(*this);
67 }
68 
69 // -------------------------------------
70 // default constructor
71 
Format()72 Format::Format()
73     : UObject()
74 {
75     *validLocale = *actualLocale = 0;
76 }
77 
78 // -------------------------------------
79 
~Format()80 Format::~Format()
81 {
82 }
83 
84 // -------------------------------------
85 // copy constructor
86 
Format(const Format & that)87 Format::Format(const Format &that)
88     : UObject(that)
89 {
90     *this = that;
91 }
92 
93 // -------------------------------------
94 // assignment operator
95 
96 Format&
operator =(const Format & that)97 Format::operator=(const Format& that)
98 {
99     if (this != &that) {
100         uprv_strcpy(validLocale, that.validLocale);
101         uprv_strcpy(actualLocale, that.actualLocale);
102     }
103     return *this;
104 }
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&
format(const Formattable & obj,UnicodeString & toAppendTo,UErrorCode & status) const111 Format::format(const Formattable& obj,
112                UnicodeString& toAppendTo,
113                UErrorCode& status) const
114 {
115     if (U_FAILURE(status)) return toAppendTo;
116 
117     FieldPosition pos(FieldPosition::DONT_CARE);
118 
119     return format(obj, toAppendTo, pos, status);
120 }
121 
122 // -------------------------------------
123 // Default implementation sets unsupported error; subclasses should
124 // override.
125 
126 UnicodeString&
format(const Formattable &,UnicodeString & toAppendTo,FieldPositionIterator *,UErrorCode & status) const127 Format::format(const Formattable& /* unused obj */,
128                UnicodeString& toAppendTo,
129                FieldPositionIterator* /* unused posIter */,
130                UErrorCode& status) const
131 {
132     if (!U_FAILURE(status)) {
133       status = U_UNSUPPORTED_ERROR;
134     }
135     return toAppendTo;
136 }
137 
138 // -------------------------------------
139 // Parses the source string and create the corresponding
140 // result object.  Checks the parse position for errors.
141 
142 void
parseObject(const UnicodeString & source,Formattable & result,UErrorCode & status) const143 Format::parseObject(const UnicodeString& source,
144                     Formattable& result,
145                     UErrorCode& status) const
146 {
147     if (U_FAILURE(status)) return;
148 
149     ParsePosition parsePosition(0);
150     parseObject(source, result, parsePosition);
151     if (parsePosition.getIndex() == 0) {
152         status = U_INVALID_FORMAT_ERROR;
153     }
154 }
155 
156 // -------------------------------------
157 
158 UBool
operator ==(const Format & that) const159 Format::operator==(const Format& that) const
160 {
161     // Subclasses: Call this method and then add more specific checks.
162     return typeid(*this) == typeid(that);
163 }
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 occured
171  * @param parseError The UParseError object to fill in
172  * @draft ICU 2.4
173  */
syntaxError(const UnicodeString & pattern,int32_t pos,UParseError & parseError)174 void Format::syntaxError(const UnicodeString& pattern,
175                          int32_t pos,
176                          UParseError& parseError) {
177     parseError.offset = pos;
178     parseError.line=0;  // we are not using line number
179 
180     // for pre-context
181     int32_t start = (pos < U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1
182                                                              /* subtract 1 so that we have room for null*/));
183     int32_t stop  = pos;
184     pattern.extract(start,stop-start,parseError.preContext,0);
185     //null terminate the buffer
186     parseError.preContext[stop-start] = 0;
187 
188     //for post-context
189     start = pos+1;
190     stop  = ((pos+U_PARSE_CONTEXT_LEN)<=pattern.length()) ? (pos+(U_PARSE_CONTEXT_LEN-1)) :
191         pattern.length();
192     pattern.extract(start,stop-start,parseError.postContext,0);
193     //null terminate the buffer
194     parseError.postContext[stop-start]= 0;
195 }
196 
197 Locale
getLocale(ULocDataLocaleType type,UErrorCode & status) const198 Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
199     U_LOCALE_BASED(locBased, *this);
200     return locBased.getLocale(type, status);
201 }
202 
203 const char *
getLocaleID(ULocDataLocaleType type,UErrorCode & status) const204 Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
205     U_LOCALE_BASED(locBased, *this);
206     return locBased.getLocaleID(type, status);
207 }
208 
209 void
setLocaleIDs(const char * valid,const char * actual)210 Format::setLocaleIDs(const char* valid, const char* actual) {
211     U_LOCALE_BASED(locBased, *this);
212     locBased.setLocaleIDs(valid, actual);
213 }
214 
215 U_NAMESPACE_END
216 
217 #endif /* #if !UCONFIG_NO_FORMATTING */
218 
219 //eof
220