1 // Copyright (C) 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 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition) 61 62 FieldPosition::~FieldPosition() {} 63 64 FieldPosition * 65 FieldPosition::clone() const { 66 return new FieldPosition(*this); 67 } 68 69 // ------------------------------------- 70 // default constructor 71 72 Format::Format() 73 : UObject() 74 { 75 *validLocale = *actualLocale = 0; 76 } 77 78 // ------------------------------------- 79 80 Format::~Format() 81 { 82 } 83 84 // ------------------------------------- 85 // copy constructor 86 87 Format::Format(const Format &that) 88 : UObject(that) 89 { 90 *this = that; 91 } 92 93 // ------------------------------------- 94 // assignment operator 95 96 Format& 97 Format::operator=(const Format& that) 98 { 99 if (this != &that) { 100 uprv_strcpy(validLocale, that.validLocale); 101 uprv_strcpy(actualLocale, that.actualLocale); 102 } 103 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 Format::format(const Formattable& obj, 112 UnicodeString& toAppendTo, 113 UErrorCode& status) const 114 { 115 if (U_FAILURE(status)) return toAppendTo; 116 117 FieldPosition pos(FieldPosition::DONT_CARE); 118 119 return format(obj, toAppendTo, pos, status); 120 } 121 122 // ------------------------------------- 123 // Default implementation sets unsupported error; subclasses should 124 // override. 125 126 UnicodeString& 127 Format::format(const Formattable& /* unused obj */, 128 UnicodeString& toAppendTo, 129 FieldPositionIterator* /* unused posIter */, 130 UErrorCode& status) const 131 { 132 if (!U_FAILURE(status)) { 133 status = U_UNSUPPORTED_ERROR; 134 } 135 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 Format::parseObject(const UnicodeString& source, 144 Formattable& result, 145 UErrorCode& status) const 146 { 147 if (U_FAILURE(status)) return; 148 149 ParsePosition parsePosition(0); 150 parseObject(source, result, parsePosition); 151 if (parsePosition.getIndex() == 0) { 152 status = U_INVALID_FORMAT_ERROR; 153 } 154 } 155 156 // ------------------------------------- 157 158 UBool 159 Format::operator==(const Format& that) const 160 { 161 // Subclasses: Call this method and then add more specific checks. 162 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 void Format::syntaxError(const UnicodeString& pattern, 175 int32_t pos, 176 UParseError& parseError) { 177 parseError.offset = pos; 178 parseError.line=0; // we are not using line number 179 180 // for pre-context 181 int32_t start = (pos < U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1 182 /* subtract 1 so that we have room for null*/)); 183 int32_t stop = pos; 184 pattern.extract(start,stop-start,parseError.preContext,0); 185 //null terminate the buffer 186 parseError.preContext[stop-start] = 0; 187 188 //for post-context 189 start = pos+1; 190 stop = ((pos+U_PARSE_CONTEXT_LEN)<=pattern.length()) ? (pos+(U_PARSE_CONTEXT_LEN-1)) : 191 pattern.length(); 192 pattern.extract(start,stop-start,parseError.postContext,0); 193 //null terminate the buffer 194 parseError.postContext[stop-start]= 0; 195 } 196 197 Locale 198 Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const { 199 U_LOCALE_BASED(locBased, *this); 200 return locBased.getLocale(type, status); 201 } 202 203 const char * 204 Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const { 205 U_LOCALE_BASED(locBased, *this); 206 return locBased.getLocaleID(type, status); 207 } 208 209 void 210 Format::setLocaleIDs(const char* valid, const char* actual) { 211 U_LOCALE_BASED(locBased, *this); 212 locBased.setLocaleIDs(valid, actual); 213 } 214 215 U_NAMESPACE_END 216 217 #endif /* #if !UCONFIG_NO_FORMATTING */ 218 219 //eof 220