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