blob: a010defff93c4095be424e4cfd5fe339b6703631 [file] [log] [blame]
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
* Copyright (C) 1997-2012, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* File FORMAT.CPP
*
* Modification History:
*
* Date Name Description
* 02/19/97 aliu Converted from java.
* 03/17/97 clhuang Implemented with new APIs.
* 03/27/97 helena Updated to pass the simple test after code review.
* 07/20/98 stephen Added explicit init values for Field/ParsePosition
********************************************************************************
*/
// *****************************************************************************
// This file was generated from the java source file Format.java
// *****************************************************************************
#include "utypeinfo.h" // for 'typeid' to work
#include "unicode/utypes.h"
#ifndef U_I18N_IMPLEMENTATION
#error U_I18N_IMPLEMENTATION not set - must be set for all ICU source files in i18n/ - see https://unicode-org.github.io/icu/userguide/howtouseicu
#endif
/*
* Dummy code:
* If all modules in the I18N library are switched off, then there are no
* library exports and MSVC 6 writes a .dll but not a .lib file.
* Unless we export _something_ in that case...
*/
#if UCONFIG_NO_COLLATION && UCONFIG_NO_FORMATTING && UCONFIG_NO_TRANSLITERATION
U_CAPI int32_t U_EXPORT2
uprv_icuin_lib_dummy(int32_t i) {
return -i;
}
#endif
/* Format class implementation ---------------------------------------------- */
#if !UCONFIG_NO_FORMATTING
#include "unicode/format.h"
#include "unicode/ures.h"
#include "cstring.h"
#include "locbased.h"
// *****************************************************************************
// class Format
// *****************************************************************************
U_NAMESPACE_BEGIN
UOBJECT_DEFINE_RTTI_IMPLEMENTATION(FieldPosition)
FieldPosition::~FieldPosition() {}
FieldPosition *
FieldPosition::clone() const {
return new FieldPosition(*this);
}
// -------------------------------------
// default constructor
Format::Format()
: UObject()
{
*validLocale = *actualLocale = 0;
}
// -------------------------------------
Format::~Format()
{
}
// -------------------------------------
// copy constructor
Format::Format(const Format &that)
: UObject(that)
{
*this = that;
}
// -------------------------------------
// assignment operator
Format&
Format::operator=(const Format& that)
{
if (this != &that) {
uprv_strcpy(validLocale, that.validLocale);
uprv_strcpy(actualLocale, that.actualLocale);
}
return *this;
}
// -------------------------------------
// Formats the obj and append the result in the buffer, toAppendTo.
// This calls the actual implementation in the concrete subclasses.
UnicodeString&
Format::format(const Formattable& obj,
UnicodeString& toAppendTo,
UErrorCode& status) const
{
if (U_FAILURE(status)) return toAppendTo;
FieldPosition pos(FieldPosition::DONT_CARE);
return format(obj, toAppendTo, pos, status);
}
// -------------------------------------
// Default implementation sets unsupported error; subclasses should
// override.
UnicodeString&
Format::format(const Formattable& /* unused obj */,
UnicodeString& toAppendTo,
FieldPositionIterator* /* unused posIter */,
UErrorCode& status) const
{
if (!U_FAILURE(status)) {
status = U_UNSUPPORTED_ERROR;
}
return toAppendTo;
}
// -------------------------------------
// Parses the source string and create the corresponding
// result object. Checks the parse position for errors.
void
Format::parseObject(const UnicodeString& source,
Formattable& result,
UErrorCode& status) const
{
if (U_FAILURE(status)) return;
ParsePosition parsePosition(0);
parseObject(source, result, parsePosition);
if (parsePosition.getIndex() == 0) {
status = U_INVALID_FORMAT_ERROR;
}
}
// -------------------------------------
UBool
Format::operator==(const Format& that) const
{
// Subclasses: Call this method and then add more specific checks.
return typeid(*this) == typeid(that);
}
//---------------------------------------
/**
* Simple function for initializing a UParseError from a UnicodeString.
*
* @param pattern The pattern to copy into the parseError
* @param pos The position in pattern where the error occured
* @param parseError The UParseError object to fill in
* @draft ICU 2.4
*/
void Format::syntaxError(const UnicodeString& pattern,
int32_t pos,
UParseError& parseError) {
parseError.offset = pos;
parseError.line=0; // we are not using line number
// for pre-context
int32_t start = (pos < U_PARSE_CONTEXT_LEN)? 0 : (pos - (U_PARSE_CONTEXT_LEN-1
/* subtract 1 so that we have room for null*/));
int32_t stop = pos;
pattern.extract(start,stop-start,parseError.preContext,0);
//null terminate the buffer
parseError.preContext[stop-start] = 0;
//for post-context
start = pos+1;
stop = ((pos+U_PARSE_CONTEXT_LEN)<=pattern.length()) ? (pos+(U_PARSE_CONTEXT_LEN-1)) :
pattern.length();
pattern.extract(start,stop-start,parseError.postContext,0);
//null terminate the buffer
parseError.postContext[stop-start]= 0;
}
Locale
Format::getLocale(ULocDataLocaleType type, UErrorCode& status) const {
U_LOCALE_BASED(locBased, *this);
return locBased.getLocale(type, status);
}
const char *
Format::getLocaleID(ULocDataLocaleType type, UErrorCode& status) const {
U_LOCALE_BASED(locBased, *this);
return locBased.getLocaleID(type, status);
}
void
Format::setLocaleIDs(const char* valid, const char* actual) {
U_LOCALE_BASED(locBased, *this);
locBased.setLocaleIDs(valid, actual);
}
U_NAMESPACE_END
#endif /* #if !UCONFIG_NO_FORMATTING */
//eof