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 <typeinfo> // 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 33 U_CAPI int32_t U_EXPORT2 34 uprv_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 52 U_NAMESPACE_BEGIN 53 54 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition) 55 56 FieldPosition::~FieldPosition() {} 57 58 FieldPosition * 59 FieldPosition::clone() const { 60 return new FieldPosition(*this); 61 } 62 63 // ------------------------------------- 64 // default constructor 65 66 Format::Format() 67 : UObject() 68 { 69 *validLocale = *actualLocale = 0; 70 } 71 72 // ------------------------------------- 73 74 Format::~Format() 75 { 76 } 77 78 // ------------------------------------- 79 // copy constructor 80 81 Format::Format(const Format &that) 82 : UObject(that) 83 { 84 *this = that; 85 } 86 87 // ------------------------------------- 88 // assignment operator 89 90 Format& 91 Format::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 104 UnicodeString& 105 Format::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 120 UnicodeString& 121 Format::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 136 void 137 Format::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 152 UBool 153 Format::operator==(const Format& that) const 154 { 155 return typeid(*this) == typeid(that); 156 } 157 //--------------------------------------- 158 159 /** 160 * Simple function for initializing a UParseError from a UnicodeString. 161 * 162 * @param pattern The pattern to copy into the parseError 163 * @param pos The position in pattern where the error occured 164 * @param parseError The UParseError object to fill in 165 * @draft ICU 2.4 166 */ 167 void Format::syntaxError(const UnicodeString& pattern, 168 int32_t pos, 169 UParseError& parseError) { 170 parseError.offset = pos; 171 parseError.line=0; // we are not using line number 172 173 // for pre-context 174 int32_t start = (pos < U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1 175 /* subtract 1 so that we have room for null*/)); 176 int32_t stop = pos; 177 pattern.extract(start,stop-start,parseError.preContext,0); 178 //null terminate the buffer 179 parseError.preContext[stop-start] = 0; 180 181 //for post-context 182 start = pos+1; 183 stop = ((pos+U_PARSE_CONTEXT_LEN)<=pattern.length()) ? (pos+(U_PARSE_CONTEXT_LEN-1)) : 184 pattern.length(); 185 pattern.extract(start,stop-start,parseError.postContext,0); 186 //null terminate the buffer 187 parseError.postContext[stop-start]= 0; 188 } 189 190 Locale 191 Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const { 192 U_LOCALE_BASED(locBased, *this); 193 return locBased.getLocale(type, status); 194 } 195 196 const char * 197 Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { 198 U_LOCALE_BASED(locBased, *this); 199 return locBased.getLocaleID(type, status); 200 } 201 202 void 203 Format::setLocaleIDs(const char* valid, const char* actual) { 204 U_LOCALE_BASED(locBased, *this); 205 locBased.setLocaleIDs(valid, actual); 206 } 207 208 U_NAMESPACE_END 209 210 #endif /* #if !UCONFIG_NO_FORMATTING */ 211 212 //eof 213