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