Line data Source code
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 http://userguide.icu-project.org/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 0 : 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 : }
68 :
69 : // -------------------------------------
70 : // default constructor
71 :
72 0 : Format::Format()
73 0 : : UObject()
74 : {
75 0 : *validLocale = *actualLocale = 0;
76 0 : }
77 :
78 : // -------------------------------------
79 :
80 0 : Format::~Format()
81 : {
82 0 : }
83 :
84 : // -------------------------------------
85 : // copy constructor
86 :
87 0 : Format::Format(const Format &that)
88 0 : : UObject(that)
89 : {
90 0 : *this = that;
91 0 : }
92 :
93 : // -------------------------------------
94 : // assignment operator
95 :
96 : Format&
97 0 : Format::operator=(const Format& that)
98 : {
99 0 : if (this != &that) {
100 0 : uprv_strcpy(validLocale, that.validLocale);
101 0 : uprv_strcpy(actualLocale, that.actualLocale);
102 : }
103 0 : 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&
111 0 : Format::format(const Formattable& obj,
112 : UnicodeString& toAppendTo,
113 : UErrorCode& status) const
114 : {
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 : }
121 :
122 : // -------------------------------------
123 : // Default implementation sets unsupported error; subclasses should
124 : // override.
125 :
126 : UnicodeString&
127 0 : Format::format(const Formattable& /* unused obj */,
128 : UnicodeString& toAppendTo,
129 : FieldPositionIterator* /* unused posIter */,
130 : UErrorCode& status) const
131 : {
132 0 : if (!U_FAILURE(status)) {
133 0 : status = U_UNSUPPORTED_ERROR;
134 : }
135 0 : 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
143 0 : Format::parseObject(const UnicodeString& source,
144 : Formattable& result,
145 : UErrorCode& status) const
146 : {
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 : }
154 : }
155 :
156 : // -------------------------------------
157 :
158 : UBool
159 0 : Format::operator==(const Format& that) const
160 : {
161 : // Subclasses: Call this method and then add more specific checks.
162 0 : 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 : */
174 0 : void Format::syntaxError(const UnicodeString& pattern,
175 : int32_t pos,
176 : 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 : 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 : }
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 : }
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
|