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