OLD | NEW |
1 /******************************************************************** | 1 /******************************************************************** |
2 * COPYRIGHT: | 2 * COPYRIGHT: |
3 * Copyright (c) 1997-2014, International Business Machines Corporation and | 3 * Copyright (c) 1997-2015, International Business Machines Corporation and |
4 * others. All Rights Reserved. | 4 * others. All Rights Reserved. |
5 ******************************************************************** | 5 ******************************************************************** |
6 * | 6 * |
7 * File MSGFMT.CPP | 7 * File MSGFMT.CPP |
8 * | 8 * |
9 * Modification History: | 9 * Modification History: |
10 * | 10 * |
11 * Date Name Description | 11 * Date Name Description |
12 * 02/19/97 aliu Converted from java. | 12 * 02/19/97 aliu Converted from java. |
13 * 03/20/97 helena Finished first cut of implementation. | 13 * 03/20/97 helena Finished first cut of implementation. |
(...skipping 25 matching lines...) Expand all Loading... |
39 #include "patternprops.h" | 39 #include "patternprops.h" |
40 #include "messageimpl.h" | 40 #include "messageimpl.h" |
41 #include "msgfmt_impl.h" | 41 #include "msgfmt_impl.h" |
42 #include "plurrule_impl.h" | 42 #include "plurrule_impl.h" |
43 #include "uassert.h" | 43 #include "uassert.h" |
44 #include "uelement.h" | 44 #include "uelement.h" |
45 #include "uhash.h" | 45 #include "uhash.h" |
46 #include "ustrfmt.h" | 46 #include "ustrfmt.h" |
47 #include "util.h" | 47 #include "util.h" |
48 #include "uvector.h" | 48 #include "uvector.h" |
| 49 #include "visibledigits.h" |
49 | 50 |
50 // ***************************************************************************** | 51 // ***************************************************************************** |
51 // class MessageFormat | 52 // class MessageFormat |
52 // ***************************************************************************** | 53 // ***************************************************************************** |
53 | 54 |
54 #define SINGLE_QUOTE ((UChar)0x0027) | 55 #define SINGLE_QUOTE ((UChar)0x0027) |
55 #define COMMA ((UChar)0x002C) | 56 #define COMMA ((UChar)0x002C) |
56 #define LEFT_CURLY_BRACE ((UChar)0x007B) | 57 #define LEFT_CURLY_BRACE ((UChar)0x007B) |
57 #define RIGHT_CURLY_BRACE ((UChar)0x007D) | 58 #define RIGHT_CURLY_BRACE ((UChar)0x007D) |
58 | 59 |
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 if (customFormatArgStarts == NULL) { | 407 if (customFormatArgStarts == NULL) { |
407 return TRUE; | 408 return TRUE; |
408 } | 409 } |
409 | 410 |
410 UErrorCode ec = U_ZERO_ERROR; | 411 UErrorCode ec = U_ZERO_ERROR; |
411 const int32_t count = uhash_count(customFormatArgStarts); | 412 const int32_t count = uhash_count(customFormatArgStarts); |
412 const int32_t rhs_count = uhash_count(that.customFormatArgStarts); | 413 const int32_t rhs_count = uhash_count(that.customFormatArgStarts); |
413 if (count != rhs_count) { | 414 if (count != rhs_count) { |
414 return FALSE; | 415 return FALSE; |
415 } | 416 } |
416 int32_t idx = 0, rhs_idx = 0, pos = -1, rhs_pos = -1; | 417 int32_t idx = 0, rhs_idx = 0, pos = UHASH_FIRST, rhs_pos = UHASH_FIRST; |
417 for (; idx < count && rhs_idx < rhs_count && U_SUCCESS(ec); ++idx, ++rhs_idx
) { | 418 for (; idx < count && rhs_idx < rhs_count && U_SUCCESS(ec); ++idx, ++rhs_idx
) { |
418 const UHashElement* cur = uhash_nextElement(customFormatArgStarts, &pos)
; | 419 const UHashElement* cur = uhash_nextElement(customFormatArgStarts, &pos)
; |
419 const UHashElement* rhs_cur = uhash_nextElement(that.customFormatArgStar
ts, &rhs_pos); | 420 const UHashElement* rhs_cur = uhash_nextElement(that.customFormatArgStar
ts, &rhs_pos); |
420 if (cur->key.integer != rhs_cur->key.integer) { | 421 if (cur->key.integer != rhs_cur->key.integer) { |
421 return FALSE; | 422 return FALSE; |
422 } | 423 } |
423 const Format* format = (const Format*)uhash_iget(cachedFormatters, cur->
key.integer); | 424 const Format* format = (const Format*)uhash_iget(cachedFormatters, cur->
key.integer); |
424 const Format* rhs_format = (const Format*)uhash_iget(that.cachedFormatte
rs, rhs_cur->key.integer); | 425 const Format* rhs_format = (const Format*)uhash_iget(that.cachedFormatte
rs, rhs_cur->key.integer); |
425 if (*format != *rhs_format) { | 426 if (*format != *rhs_format) { |
426 return FALSE; | 427 return FALSE; |
(...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 cachedFormatters=uhash_open(uhash_hashLong, uhash_compareLong, | 1326 cachedFormatters=uhash_open(uhash_hashLong, uhash_compareLong, |
1326 equalFormatsForHash, &ec); | 1327 equalFormatsForHash, &ec); |
1327 if (U_FAILURE(ec)) { | 1328 if (U_FAILURE(ec)) { |
1328 return; | 1329 return; |
1329 } | 1330 } |
1330 uhash_setValueDeleter(cachedFormatters, uprv_deleteUObject); | 1331 uhash_setValueDeleter(cachedFormatters, uprv_deleteUObject); |
1331 } | 1332 } |
1332 | 1333 |
1333 const int32_t count = uhash_count(that.cachedFormatters); | 1334 const int32_t count = uhash_count(that.cachedFormatters); |
1334 int32_t pos, idx; | 1335 int32_t pos, idx; |
1335 for (idx = 0, pos = -1; idx < count && U_SUCCESS(ec); ++idx) { | 1336 for (idx = 0, pos = UHASH_FIRST; idx < count && U_SUCCESS(ec); ++idx) { |
1336 const UHashElement* cur = uhash_nextElement(that.cachedFormatters, &
pos); | 1337 const UHashElement* cur = uhash_nextElement(that.cachedFormatters, &
pos); |
1337 Format* newFormat = ((Format*)(cur->value.pointer))->clone(); | 1338 Format* newFormat = ((Format*)(cur->value.pointer))->clone(); |
1338 if (newFormat) { | 1339 if (newFormat) { |
1339 uhash_iput(cachedFormatters, cur->key.integer, newFormat, &ec); | 1340 uhash_iput(cachedFormatters, cur->key.integer, newFormat, &ec); |
1340 } else { | 1341 } else { |
1341 ec = U_MEMORY_ALLOCATION_ERROR; | 1342 ec = U_MEMORY_ALLOCATION_ERROR; |
1342 return; | 1343 return; |
1343 } | 1344 } |
1344 } | 1345 } |
1345 } | 1346 } |
1346 if (that.customFormatArgStarts) { | 1347 if (that.customFormatArgStarts) { |
1347 if (customFormatArgStarts == NULL) { | 1348 if (customFormatArgStarts == NULL) { |
1348 customFormatArgStarts=uhash_open(uhash_hashLong, uhash_compareLong, | 1349 customFormatArgStarts=uhash_open(uhash_hashLong, uhash_compareLong, |
1349 NULL, &ec); | 1350 NULL, &ec); |
1350 } | 1351 } |
1351 const int32_t count = uhash_count(that.customFormatArgStarts); | 1352 const int32_t count = uhash_count(that.customFormatArgStarts); |
1352 int32_t pos, idx; | 1353 int32_t pos, idx; |
1353 for (idx = 0, pos = -1; idx < count && U_SUCCESS(ec); ++idx) { | 1354 for (idx = 0, pos = UHASH_FIRST; idx < count && U_SUCCESS(ec); ++idx) { |
1354 const UHashElement* cur = uhash_nextElement(that.customFormatArgStar
ts, &pos); | 1355 const UHashElement* cur = uhash_nextElement(that.customFormatArgStar
ts, &pos); |
1355 uhash_iputi(customFormatArgStarts, cur->key.integer, cur->value.inte
ger, &ec); | 1356 uhash_iputi(customFormatArgStarts, cur->key.integer, cur->value.inte
ger, &ec); |
1356 } | 1357 } |
1357 } | 1358 } |
1358 } | 1359 } |
1359 | 1360 |
1360 | 1361 |
1361 Formattable* | 1362 Formattable* |
1362 MessageFormat::parse(int32_t msgStart, | 1363 MessageFormat::parse(int32_t msgStart, |
1363 const UnicodeString& source, | 1364 const UnicodeString& source, |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1948 (const Format*)uhash_iget(msgFormat.cachedFormatters, context.number
ArgIndex); | 1949 (const Format*)uhash_iget(msgFormat.cachedFormatters, context.number
ArgIndex); |
1949 } | 1950 } |
1950 if(context.formatter == NULL) { | 1951 if(context.formatter == NULL) { |
1951 context.formatter = msgFormat.getDefaultNumberFormat(ec); | 1952 context.formatter = msgFormat.getDefaultNumberFormat(ec); |
1952 context.forReplaceNumber = TRUE; | 1953 context.forReplaceNumber = TRUE; |
1953 } | 1954 } |
1954 U_ASSERT(context.number.getDouble(ec) == number); // argument number minus
the offset | 1955 U_ASSERT(context.number.getDouble(ec) == number); // argument number minus
the offset |
1955 context.formatter->format(context.number, context.numberString, ec); | 1956 context.formatter->format(context.number, context.numberString, ec); |
1956 const DecimalFormat *decFmt = dynamic_cast<const DecimalFormat *>(context.fo
rmatter); | 1957 const DecimalFormat *decFmt = dynamic_cast<const DecimalFormat *>(context.fo
rmatter); |
1957 if(decFmt != NULL) { | 1958 if(decFmt != NULL) { |
1958 FixedDecimal dec = decFmt->getFixedDecimal(context.number, ec); | 1959 VisibleDigitsWithExponent digits; |
1959 return rules->select(dec); | 1960 decFmt->initVisibleDigitsWithExponent(context.number, digits, ec); |
| 1961 if (U_FAILURE(ec)) { |
| 1962 return UnicodeString(FALSE, OTHER_STRING, 5); |
| 1963 } |
| 1964 return rules->select(digits); |
1960 } else { | 1965 } else { |
1961 return rules->select(number); | 1966 return rules->select(number); |
1962 } | 1967 } |
1963 } | 1968 } |
1964 | 1969 |
1965 void MessageFormat::PluralSelectorProvider::reset() { | 1970 void MessageFormat::PluralSelectorProvider::reset() { |
1966 delete rules; | 1971 delete rules; |
1967 rules = NULL; | 1972 rules = NULL; |
1968 } | 1973 } |
1969 | 1974 |
1970 | 1975 |
1971 U_NAMESPACE_END | 1976 U_NAMESPACE_END |
1972 | 1977 |
1973 #endif /* #if !UCONFIG_NO_FORMATTING */ | 1978 #endif /* #if !UCONFIG_NO_FORMATTING */ |
1974 | 1979 |
1975 //eof | 1980 //eof |
OLD | NEW |