From: Christian P. <cp...@us...> - 2005-07-08 08:15:52
|
Update of /cvsroot/pclasses/pclasses2/src/Unicode In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19784/src/Unicode Modified Files: NumberFormat.cpp String.cpp Converter.cpp Makefile.am Added Files: DateTimeFormat.cpp Log Message: - Added Unicode::DateTimeFormat - Added String::realSize() to determine String's internal char count - Fixed Unicode::Converter - Changed Unicode::NumberFormat text-attributes from Char to String Index: Converter.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/Unicode/Converter.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Converter.cpp 6 Jul 2005 12:59:10 -0000 1.2 +++ Converter.cpp 8 Jul 2005 08:15:42 -0000 1.3 @@ -119,7 +119,7 @@ if(str.empty()) return std::string(); - return fromUnicodeChars((UConverter*)_private, str.data(), str.size()); + return fromUnicodeChars((UConverter*)_private, str.data(), str.realSize()); } std::string Converter::fromUnicode(Char ch) throw(UnicodeError) Index: Makefile.am =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/Unicode/Makefile.am,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- Makefile.am 6 Jul 2005 12:59:10 -0000 1.14 +++ Makefile.am 8 Jul 2005 08:15:42 -0000 1.15 @@ -6,7 +6,7 @@ CPPFLAGS = -DPUNICODE_BUILD $(ICU_CFLAGS) libpclasses_unicode_la_SOURCES = Char.cpp String.cpp Converter.cpp \ - NumberFormat.cpp UnicodeError.cpp + NumberFormat.cpp DateTimeFormat.cpp UnicodeError.cpp libpclasses_unicode_la_LDFLAGS = -no-undefined Index: String.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/Unicode/String.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- String.cpp 1 Jul 2005 13:55:10 -0000 1.13 +++ String.cpp 8 Jul 2005 08:15:42 -0000 1.14 @@ -161,6 +161,14 @@ return 0; } +size_t String::realSize() const throw() +{ + if(!_data.null()) + return _data->length; + + return 0; +} + size_t String::capacity() const throw() { if(!_data.null()) --- NEW FILE: DateTimeFormat.cpp --- /*************************************************************************** * Copyright (C) 2004 by Christian Prochnow * * cp...@se... * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Library General Public License as * * published by the Free Software Foundation; either version 2 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "pclasses/ScopedArrayPtr.h" #include "pclasses/Unicode/DateTimeFormat.h" #include <cstring> #include <unicode/udat.h> namespace P { namespace Unicode { UDateFormatStyle DateTimeFormatStyle2UDateFormatStyle(DateTimeFormat::Style style) { UDateFormatStyle ret; switch(style) { case DateTimeFormat::Full: ret = UDAT_FULL; break; case DateTimeFormat::Long: ret = UDAT_LONG; break; case DateTimeFormat::Medium: ret = UDAT_MEDIUM; break; case DateTimeFormat::Short: default: ret = UDAT_SHORT; break; } return ret; } DateTimeFormat::Style UDateFormatStyle2DateTimeFormatStyle(UDateFormatStyle style) { DateTimeFormat::Style ret; switch(style) { case UDAT_FULL: ret = DateTimeFormat::Full; break; case UDAT_LONG: ret = DateTimeFormat::Long; break; case UDAT_MEDIUM: ret = DateTimeFormat::Medium; break; case UDAT_SHORT: default: ret = DateTimeFormat::Short; break; } return ret; } // we use this DateTimeFormatImpl class for lazy creation of the ICU // UDateFormater's. Cause the ICU API does not directly support formatting // of only Date or Time values we may use up to three different UDateFormaters - // one for each formatable value... struct DateTimeFormatImpl { UDateFormatStyle _dateStyle, _dateTimeDateStyle; UDateFormatStyle _timeStyle, _dateTimeTimeStyle; mutable UDateFormat* _dateFormater; mutable UDateFormat* _timeFormater; mutable UDateFormat* _dateTimeFormater; char* _locale; DateTimeFormatImpl(UDateFormatStyle dateStyle, UDateFormatStyle timeStyle, const char* locale) { _dateTimeDateStyle = _dateStyle = dateStyle; _dateTimeTimeStyle = _timeStyle = timeStyle; _dateFormater = 0; _timeFormater = 0; _dateTimeFormater = 0; if(locale) { _locale = new char[std::strlen(locale)+1]; std::strcpy(_locale, locale); } else { _locale = 0; } } ~DateTimeFormatImpl() { if(_locale) delete[] _locale; if(_dateFormater) udat_close(_dateFormater); if(_timeFormater) udat_close(_timeFormater); if(_dateTimeFormater) udat_close(_dateTimeFormater); } String format(const Date& date) const { if(!_dateFormater) _dateFormater = createFormater(_dateStyle, UDAT_NONE, _locale); return format(_dateFormater, 0.0f); } String format(const Time& time) const { if(!_timeFormater) _timeFormater = createFormater(UDAT_NONE, _timeStyle, _locale); return format(_timeFormater, 0.0f); } String format(const DateTime& dt) const { if(!_dateTimeFormater) _dateTimeFormater = createFormater(_dateTimeDateStyle, _dateTimeTimeStyle, _locale); return format(_dateTimeFormater, 0.0f); } static UDateFormat* createFormater(UDateFormatStyle dateStyle, UDateFormatStyle timeStyle, const char* locale) { UErrorCode errorCode = U_ZERO_ERROR; UDateFormat* formater = udat_open(timeStyle, dateStyle, locale, NULL, 0, NULL, 0, &errorCode); if(U_FAILURE(errorCode)) throw UnicodeError(errorCode, "Could not init date formater for given locale", P_SOURCEINFO); return formater; } static String format(UDateFormat* formater, UDate val) { UErrorCode errorCode = U_ZERO_ERROR; size_t strLen = udat_format(formater, val, NULL, 0, NULL, &errorCode); ScopedArrayPtr<uchar16_t> ret(new uchar16_t[strLen + 1]); errorCode = U_ZERO_ERROR; udat_format(formater, val, ret.get(), strLen + 1, NULL, &errorCode); if(U_FAILURE(errorCode)) throw UnicodeError(errorCode, "Could not convert number to string", P_SOURCEINFO); String retStr; retStr.acquire(ret.release(), strLen + 1, strLen); return retStr; } }; DateTimeFormat::DateTimeFormat(Style dateStyle, Style timeStyle, const char* locale) throw(OutOfMemory, UnicodeError) { _private = (void*)new DateTimeFormatImpl( DateTimeFormatStyle2UDateFormatStyle(dateStyle), DateTimeFormatStyle2UDateFormatStyle(timeStyle), locale); } DateTimeFormat::~DateTimeFormat() throw() { delete (DateTimeFormatImpl*)_private; } void DateTimeFormat::setDateTimeStyle(Style dateStyle, Style timeStyle) throw() { DateTimeFormatImpl* impl = (DateTimeFormatImpl*)_private; if(impl->_dateTimeFormater) { delete impl->_dateTimeFormater; impl->_dateTimeFormater = 0; } impl->_dateTimeDateStyle = DateTimeFormatStyle2UDateFormatStyle(dateStyle); impl->_dateTimeTimeStyle = DateTimeFormatStyle2UDateFormatStyle(timeStyle); } std::pair<DateTimeFormat::Style, DateTimeFormat::Style> DateTimeFormat::dateTimeStyle() const throw() { DateTimeFormatImpl* impl = (DateTimeFormatImpl*)_private; return std::make_pair( UDateFormatStyle2DateTimeFormatStyle(impl->_dateTimeDateStyle), UDateFormatStyle2DateTimeFormatStyle(impl->_dateTimeTimeStyle)); } void DateTimeFormat::setDateStyle(Style dateStyle) throw() { DateTimeFormatImpl* impl = (DateTimeFormatImpl*)_private; if(impl->_dateFormater) { delete impl->_dateFormater; impl->_dateFormater = 0; } impl->_dateStyle = DateTimeFormatStyle2UDateFormatStyle(dateStyle); } DateTimeFormat::Style DateTimeFormat::dateStyle() const throw() { DateTimeFormatImpl* impl = (DateTimeFormatImpl*)_private; return UDateFormatStyle2DateTimeFormatStyle(impl->_dateStyle); } void DateTimeFormat::setTimeStyle(Style timeStyle) throw() { DateTimeFormatImpl* impl = (DateTimeFormatImpl*)_private; if(impl->_timeFormater) { delete impl->_timeFormater; impl->_timeFormater = 0; } impl->_timeStyle = DateTimeFormatStyle2UDateFormatStyle(timeStyle); } DateTimeFormat::Style DateTimeFormat::timeStyle() const throw() { DateTimeFormatImpl* impl = (DateTimeFormatImpl*)_private; return UDateFormatStyle2DateTimeFormatStyle(impl->_timeStyle); } String DateTimeFormat::format(const Date& date) const throw(OutOfMemory, UnicodeError) { return ((DateTimeFormatImpl*)_private)->format(date); } String DateTimeFormat::format(const Time& time) const throw(OutOfMemory, UnicodeError) { return ((DateTimeFormatImpl*)_private)->format(time); } String DateTimeFormat::format(const DateTime& dt) const throw(OutOfMemory, UnicodeError) { return ((DateTimeFormatImpl*)_private)->format(dt); } } // !namespace Unicode } // !namespace P Index: NumberFormat.cpp =================================================================== RCS file: /cvsroot/pclasses/pclasses2/src/Unicode/NumberFormat.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- NumberFormat.cpp 6 Jul 2005 12:59:10 -0000 1.1 +++ NumberFormat.cpp 8 Jul 2005 08:15:42 -0000 1.2 @@ -62,6 +62,7 @@ } NumberFormat::NumberFormat(Style s, const char* locale) + throw(OutOfMemory, UnicodeError) { UErrorCode error = U_ZERO_ERROR; _private = (void*)unum_open(Style2UNumberFormatStyle(s), NULL, 0, locale, NULL, &error); @@ -75,7 +76,7 @@ unum_close((UNumberFormat*)_private); } -void NumberFormat::setWidth(unsigned int width) +void NumberFormat::setWidth(unsigned int width) throw() { unum_setAttribute((UNumberFormat*)_private, UNUM_FORMAT_WIDTH, width); } @@ -109,7 +110,7 @@ return ret; } -void NumberFormat::setPadPosition(PadPosition p) +void NumberFormat::setPadPosition(PadPosition p) throw() { unum_setAttribute((UNumberFormat*)_private, UNUM_PADDING_POSITION, PadPosition2UNumberFormatPadPosition(p)); @@ -145,87 +146,82 @@ (UNumberFormatPadPosition)unum_getAttribute((UNumberFormat*)_private, UNUM_PADDING_POSITION)); } -void NumberFormatSetTextAttr(UNumberFormat* format, UNumberFormatTextAttribute attr, Unicode::Char ch) +void NumberFormatSetTextAttr(UNumberFormat* format, UNumberFormatTextAttribute attr, const String& str) { - uchar16_t tmp[2]; - size_t offset = 0; - - U16_APPEND_UNSAFE(tmp, offset, (uint32_t)ch); - UErrorCode errorCode = U_ZERO_ERROR; - unum_setTextAttribute(format, attr, tmp, offset, &errorCode); + unum_setTextAttribute(format, attr, str.data(), str.realSize(), &errorCode); if(U_FAILURE(errorCode)) - throw UnicodeError(errorCode, "Could not set padding character", P_SOURCEINFO); + throw UnicodeError(errorCode, "Could not set text attribute", P_SOURCEINFO); } -Char NumberFormatGetTextAttr(UNumberFormat* format, UNumberFormatTextAttribute attr) +String NumberFormatGetTextAttr(UNumberFormat* format, UNumberFormatTextAttribute attr) { - uchar16_t tmp[3]; - size_t len; - UErrorCode errorCode = U_ZERO_ERROR; - len = unum_getTextAttribute(format, attr, tmp, sizeof(tmp), &errorCode); - if(U_FAILURE(errorCode)) - throw UnicodeError(errorCode, "Could not set padding character", P_SOURCEINFO); + size_t strLen = unum_getTextAttribute(format, attr, NULL, 0, &errorCode); - size_t offset = 0; - uint32_t ch; + ScopedArrayPtr<uchar16_t> ret(new uchar16_t[strLen + 1]); + errorCode = U_ZERO_ERROR; - U16_GET_UNSAFE(tmp, offset, ch); - return Char(ch); + unum_getTextAttribute(format, attr, ret.get(), strLen + 1, &errorCode); + if(U_FAILURE(errorCode)) + throw UnicodeError(errorCode, "Could not get text attribute", P_SOURCEINFO); + + String retStr; + retStr.acquire(ret.release(), strLen + 1, strLen); + return retStr; } -void NumberFormat::setPadChar(Char ch) +void NumberFormat::setPadChar(const String& str) throw(UnicodeError) { - NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_PADDING_CHARACTER, ch); + NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_PADDING_CHARACTER, str); } -Char NumberFormat::padChar() const throw() +String NumberFormat::padChar() const throw(OutOfMemory, UnicodeError) { return NumberFormatGetTextAttr((UNumberFormat*)_private, UNUM_PADDING_CHARACTER); } -void NumberFormat::setPositivePrefix(Char ch) +void NumberFormat::setPositivePrefix(const String& str) throw(UnicodeError) { - NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_POSITIVE_PREFIX, ch); + NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_POSITIVE_PREFIX, str); } -Char NumberFormat::positivePrefix() +String NumberFormat::positivePrefix() const throw(OutOfMemory, UnicodeError) { return NumberFormatGetTextAttr((UNumberFormat*)_private, UNUM_POSITIVE_PREFIX); } -void NumberFormat::setPositiveSuffix(Char ch) +void NumberFormat::setPositiveSuffix(const String& str) throw(UnicodeError) { - NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_POSITIVE_SUFFIX, ch); + NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_POSITIVE_SUFFIX, str); } -Char NumberFormat::positiveSuffix() +String NumberFormat::positiveSuffix() const throw(OutOfMemory, UnicodeError) { return NumberFormatGetTextAttr((UNumberFormat*)_private, UNUM_POSITIVE_SUFFIX); } -void NumberFormat::setNegativePrefix(Char ch) +void NumberFormat::setNegativePrefix(const String& str) throw(UnicodeError) { - NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_NEGATIVE_PREFIX, ch); + NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_NEGATIVE_PREFIX, str); } -Char NumberFormat::negativePrefix() +String NumberFormat::negativePrefix() const throw(OutOfMemory, UnicodeError) { return NumberFormatGetTextAttr((UNumberFormat*)_private, UNUM_NEGATIVE_PREFIX); } -void NumberFormat::setNegativeSuffix(Char ch) +void NumberFormat::setNegativeSuffix(const String& str) throw(UnicodeError) { - NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_NEGATIVE_SUFFIX, ch); + NumberFormatSetTextAttr((UNumberFormat*)_private, UNUM_NEGATIVE_SUFFIX, str); } -Char NumberFormat::negativeSuffix() +String NumberFormat::negativeSuffix() const throw(OutOfMemory, UnicodeError) { return NumberFormatGetTextAttr((UNumberFormat*)_private, UNUM_NEGATIVE_SUFFIX); } -String NumberFormat::format(Int32 val) throw(UnicodeError) +String NumberFormat::format(Int32 val) throw(OutOfMemory, UnicodeError) { UErrorCode errorCode = U_ZERO_ERROR; size_t strLen = unum_format((UNumberFormat*)_private, val, NULL, 0, NULL, &errorCode); @@ -242,7 +238,7 @@ return retStr; } -String NumberFormat::format(Int64 val) throw(UnicodeError) +String NumberFormat::format(Int64 val) throw(OutOfMemory, UnicodeError) { UErrorCode errorCode = U_ZERO_ERROR; size_t strLen = unum_formatInt64((UNumberFormat*)_private, val, NULL, 0, NULL, &errorCode); @@ -259,7 +255,7 @@ return retStr; } -String NumberFormat::format(double val) throw(UnicodeError) +String NumberFormat::format(double val) throw(OutOfMemory, UnicodeError) { UErrorCode errorCode = U_ZERO_ERROR; size_t strLen = unum_formatDouble((UNumberFormat*)_private, val, NULL, 0, NULL, &errorCode); |