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