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