/*
********************************************************************************
*                                                                              *
* COPYRIGHT:                                                                   *
*   (C) Copyright Taligent, Inc.,  1997                                        *
*   (C) Copyright International Business Machines Corporation,  1997-1998      *
*   Licensed Material - Program-Property of IBM - All Rights Reserved.         *
*   US Government Users Restricted Rights - Use, duplication, or disclosure    *
*   restricted by GSA ADP Schedule Contract with IBM Corp.                     *
*                                                                              *
********************************************************************************
*
* File DCFMTSYM.CPP
*
* Modification History:
*
*   Date        Name        Description
*   02/19/97    aliu        Converted from java.
*   03/18/97    clhuang     Implemented with C++ APIs.
*   03/27/97    helena      Updated to pass the simple test after code review.
*   08/26/97    aliu        Added currency/intl currency symbol support.
*    07/20/98    stephen        Slightly modified initialization of monetarySeparator
********************************************************************************
*/
 
#include "dcfmtsym.h"
#include "resbund.h"
#include "decimfmt.h"

// *****************************************************************************
// class DecimalFormatSymbols
// *****************************************************************************
 
const int32_t DecimalFormatSymbols::fgNumberElementsLength = 11;
const int32_t DecimalFormatSymbols::fgCurrencyElementsLength = 3;

/**
 * These are the tags we expect to see in normal resource bundle files associated
 * with a locale.
 */
const UnicodeString DecimalFormatSymbols::fgNumberElements("NumberElements");
const UnicodeString DecimalFormatSymbols::fgCurrencyElements("CurrencyElements");

// Because the C-compiler doesn't parse \u escape sequences, we encode the
// \u last resort strings as UChar arrays.
const UChar DecimalFormatSymbols::fgLastResortPerMill[]      = { 0x2030, 0 };
const UChar DecimalFormatSymbols::fgLastResortInfinity[]     = { 0x221E, 0 };
const UChar DecimalFormatSymbols::fgLastResortNaN[]          = { 0xFFFD, 0 };
const UChar DecimalFormatSymbols::fgLastResortCurrency[]     = { 0x00A4, 0 };
const UChar DecimalFormatSymbols::fgLastResortIntlCurrency[] = { 0x00A4, 0x00A4, 0 };

const UnicodeString DecimalFormatSymbols::fgLastResortNumberElements[] =
{
    ".",    // decimal separator
    "",     // group (thousands) separator
    ";",    // pattern separator
    "%",    // percent sign
    "0",    // native 0 digit
    "#",    // pattern digit
    "-",    // minus sign
    "E",    // exponential
    DecimalFormatSymbols::fgLastResortPerMill,  // per mill
    DecimalFormatSymbols::fgLastResortInfinity, // infinite
    DecimalFormatSymbols::fgLastResortNaN       // NaN
};

const UnicodeString DecimalFormatSymbols::fgLastResortCurrencyElements[] =
{
    DecimalFormatSymbols::fgLastResortCurrency,
    DecimalFormatSymbols::fgLastResortIntlCurrency,
    "."     // monetary decimal separator
};

// -------------------------------------
// Initializes this with the decimal format symbols in the default locale.
 
DecimalFormatSymbols::DecimalFormatSymbols(UErrorCode& status)
{
    initialize(Locale::getDefault(), status, TRUE);
}
 
// -------------------------------------
// Initializes this with the decimal format symbols in the desired locale.
 
DecimalFormatSymbols::DecimalFormatSymbols(const Locale& locale, UErrorCode& status)
{
    initialize(locale, status);
}
 
// -------------------------------------

DecimalFormatSymbols::~DecimalFormatSymbols()
{
}

// -------------------------------------
// copy constructor

DecimalFormatSymbols::DecimalFormatSymbols(const DecimalFormatSymbols &source)
    :   fZeroDigit(source.fZeroDigit),
        fGroupingSeparator(source.fGroupingSeparator),
        fDecimalSeparator(source.fDecimalSeparator),
        fPercent(source.fPercent),
        fPerMill(source.fPerMill),
        fDigit(source.fDigit),
        fPlusSign(source.fPlusSign),
        fMinusSign(source.fMinusSign),
        fExponential(source.fExponential),
        fPatternSeparator(source.fPatternSeparator),
        fInfinity(source.fInfinity),
        fNaN(source.fNaN),
        fCurrencySymbol(source.fCurrencySymbol),
        fIntlCurrencySymbol(source.fIntlCurrencySymbol),
        fMonetarySeparator(source.fMonetarySeparator),
        fPadEscape(source.fPadEscape)
{
}

// -------------------------------------
// assignment operator

DecimalFormatSymbols&
DecimalFormatSymbols::operator=(const DecimalFormatSymbols& rhs)
{
    if (this != &rhs)
    {
        fZeroDigit = rhs.fZeroDigit;
        fGroupingSeparator = rhs.fGroupingSeparator;
        fDecimalSeparator = rhs.fDecimalSeparator;
        fPercent = rhs.fPercent;
        fPerMill = rhs.fPerMill;
        fDigit = rhs.fDigit;
        fPlusSign = rhs.fPlusSign;
        fMinusSign = rhs.fMinusSign;
        fExponential = rhs.fExponential;
        fPatternSeparator = rhs.fPatternSeparator;
        fInfinity = rhs.fInfinity;
        fNaN = rhs.fNaN;
        fCurrencySymbol = rhs.fCurrencySymbol;
        fIntlCurrencySymbol = rhs.fIntlCurrencySymbol;
        fMonetarySeparator = rhs.fMonetarySeparator;
        fPadEscape = rhs.fPadEscape;
    }
    return *this;
}

// -------------------------------------

bool_t
DecimalFormatSymbols::operator==(const DecimalFormatSymbols& that) const
{
    if (this == &that) return TRUE;

    return (fZeroDigit == that.fZeroDigit &&
        fGroupingSeparator == that.fGroupingSeparator &&
        fDecimalSeparator == that.fDecimalSeparator &&
        fPercent == that.fPercent &&
        fPerMill == that.fPerMill &&
        fDigit == that.fDigit &&
        fPlusSign == that.fPlusSign &&
        fMinusSign == that.fMinusSign &&
        fExponential == that.fExponential &&
        fPatternSeparator == that.fPatternSeparator &&
        fInfinity == that.fInfinity &&
        fNaN == that.fNaN &&
        fCurrencySymbol == that.fCurrencySymbol &&
        fIntlCurrencySymbol == that.fIntlCurrencySymbol &&
        fMonetarySeparator == that.fMonetarySeparator &&
        fPadEscape == that.fPadEscape
        );
}
 
// -------------------------------------
 
void
DecimalFormatSymbols::initialize(const Locale& locale, UErrorCode& status,
                                 bool_t useLastResortData)
{
    if (FAILURE(status)) return;

    ResourceBundle resource(Locale::getDataDirectory(), locale, status);
    if (FAILURE(status))
    {
        // Initializes with last resort data if necessary.
        if (useLastResortData)
        {
            status = USING_FALLBACK_ERROR;
            initialize(fgLastResortNumberElements, fgLastResortCurrencyElements);
        }
        return;
    }

    int32_t numberElementsLength=0;
    // Gets the number element array.
    const UnicodeString* numberElements = resource.getStringArray(fgNumberElements, numberElementsLength, status);
    int32_t currencyElementsLength=0;
    // Gets the currency element array.
    const UnicodeString* currencyElements = resource.getStringArray(fgCurrencyElements, currencyElementsLength, status);
    if (FAILURE(status)) return;

    // If the array size is too small, something is wrong with the resource
    // bundle, returns the failure error code.
    if (numberElementsLength < fgNumberElementsLength ||
        currencyElementsLength < fgCurrencyElementsLength) {
        status = INVALID_FORMAT_ERROR;
        return;
    }

    initialize(numberElements, currencyElements);
}

// Initializes the DecimalFormatSymbol instance with the data obtained
// from ResourceBundle in the desired locale.

void
DecimalFormatSymbols::initialize(const UnicodeString* numberElements, const UnicodeString* currencyElements)
{
    fDecimalSeparator  = numberElements[0][(UTextOffset)0];
    fGroupingSeparator = numberElements[1][(UTextOffset)0];
    fPatternSeparator  = numberElements[2][(UTextOffset)0];
    fPercent           = numberElements[3][(UTextOffset)0];
    fZeroDigit         = numberElements[4][(UTextOffset)0];
    fDigit             = numberElements[5][(UTextOffset)0];
    fPlusSign          = 0x002B; // '+' Hard coded for now; get from resource later
    fMinusSign         = numberElements[6][(UTextOffset)0];
    fExponential       = numberElements[7][(UTextOffset)0];
    fPerMill           = numberElements[8][(UTextOffset)0];
    fInfinity          = numberElements[9];
    fNaN               = numberElements[10];
    fCurrencySymbol     = currencyElements[0];
    fIntlCurrencySymbol = currencyElements[1];
    fPadEscape         = 0x002A; // '*' Hard coded for now; get from resource later

    // if the resource data specified the empty string as the monetary decimal
    // separator, that means we should just use the regular separator as the
    // monetary separator
    if(currencyElements[2].size() == 0)
        fMonetarySeparator = fDecimalSeparator;
    else
        fMonetarySeparator = currencyElements[2][(UTextOffset)0];
}

//eof
