summaryrefslogtreecommitdiff
path: root/i18npool/source/transliteration/numtotext_cjk.cxx
diff options
context:
space:
mode:
authorRüdiger Timm <rt@openoffice.org>2003-04-08 15:05:59 +0000
committerRüdiger Timm <rt@openoffice.org>2003-04-08 15:05:59 +0000
commitf28b6bcb23973d23ea84d43d760234a4021eddf4 (patch)
treebc328bcd1df03ea52867ef4622ddae7b818a9ad4 /i18npool/source/transliteration/numtotext_cjk.cxx
parent8f7fc3caadcdf7ac6e56ec18a2f4cd6b236c8c05 (diff)
INTEGRATION: CWS calc06 (1.9.38); FILE MERGED
2003/03/21 22:08:14 khong 1.9.38.1: #106680# Implementing new XExtendedTransliteration interface
Diffstat (limited to 'i18npool/source/transliteration/numtotext_cjk.cxx')
-rw-r--r--i18npool/source/transliteration/numtotext_cjk.cxx265
1 files changed, 47 insertions, 218 deletions
diff --git a/i18npool/source/transliteration/numtotext_cjk.cxx b/i18npool/source/transliteration/numtotext_cjk.cxx
index f9c0c2d7e5ad..be0c4e5f0a78 100644
--- a/i18npool/source/transliteration/numtotext_cjk.cxx
+++ b/i18npool/source/transliteration/numtotext_cjk.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: numtotext_cjk.cxx,v $
*
- * $Revision: 1.9 $
+ * $Revision: 1.10 $
*
- * last change: $Author: khong $ $Date: 2002-09-07 01:30:26 $
+ * last change: $Author: rt $ $Date: 2003-04-08 16:05:59 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -61,234 +61,63 @@
#define TRANSLITERATION_ALL
#include <numtotext_cjk.hxx>
-#include <data/numberchar.h>
#include <bullet.h>
-
-using namespace com::sun::star::uno;
-using namespace rtl;
+#include <drafts/com/sun/star/i18n/NativeNumberMode.hpp>
namespace com { namespace sun { namespace star { namespace i18n {
-#define NUMBER_OMIT_ZERO (1 << 0)
-#define NUMBER_OMIT_ONE (1 << 1)
-#define NUMBER_OMIT_ONLY_ZERO (1 << 2)
-
-#define NUMBER_COMMA 0x002C
-#define isComma(ch) (ch == NUMBER_COMMA)
-#define MAX_SAL_UINT32 0xFFFFFFFF
-#define MAX_VALUE (MAX_SAL_UINT32 - 9) / 10
-
-NumToText_CJK::NumToText_CJK() {
- numberChar = NULL;
- bulletCount = 0;
- number = 0;
-}
-
-OUString SAL_CALL NumToText_CJK::transliterate( const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount,
- Sequence< sal_Int32 >& offset ) throw(RuntimeException)
-{
- if (! numberChar) throw RuntimeException();
-
- sal_Int32 strLen = inStr.getLength() - startPos;
-
- if (nCount > strLen)
- nCount = strLen;
-
- if (nCount > 0) {
- const sal_Unicode *str = inStr.getStr() + startPos;
- rtl_uString *newStr = x_rtl_uString_new_WithLength(nCount * 2);
- rtl_uString *srcStr = x_rtl_uString_new_WithLength(nCount); // for keeping number without comma
- sal_Int32 i, len = 0, count = 0;
-
- offset.realloc( nCount * 2 );
- sal_Bool doDecimal = sal_False;
- sal_Bool makeBullet = bulletCount > 0;
-
- for (i = 0; i <= nCount; i++) {
- if (i < nCount && isNumber(str[i])) {
- if (doDecimal) {
- newStr->buffer[count] = numberChar[str[i] - NUMBER_ZERO];
- offset[count++] = i + startPos;
- }
- else
- srcStr->buffer[len++] = str[i];
- } else {
- if (len > 0) {
- if (isComma(str[i]) && i < nCount-1 && isNumber(str[i+1]))
- continue; // skip comma inside number string
- if (makeBullet) {
- sal_uInt32 value = 0;
- for (sal_Int32 j = 0; j < len; j++) {
- if (value < MAX_VALUE)
- value = (value * 10) + (str[j] - NUMBER_ZERO);
- else
- throw RuntimeException(); // overfollow, number is too big
- }
- if (! recycleBullet && value > bulletCount) {
- for (sal_Int32 j = 0; j < len; j++) {
- newStr->buffer[count] = str[j];
- offset[count++] = i - len + startPos + j;
- }
- } else {
- newStr->buffer[count] = value ? numberChar[(value-1) % bulletCount] : NUMBER_ZERO;
- offset[count++] = i - len + startPos;
- }
- }
- else {
- sal_Bool notZero = sal_False;
- for (sal_Int32 begin = 0, end = len % multiplierExponent[0];
- end <= len; begin = end, end += multiplierExponent[0]) {
- sal_Int32 _count = count;
- notZero |= numberMaker(srcStr->buffer, begin, end - begin, newStr->buffer, count,
- end == len ? 0 : multiplierChar[0], offset, i - len + startPos);
- if (count > 0 && newStr->buffer[count-1] == numberChar[0])
- count--;
- if (notZero && _count == count) {
- if (end != len) {
- newStr->buffer[count] = multiplierChar[0];
- offset[count++] = i - len + startPos;
- }
- }
- }
- if (! notZero && ! (numberFlag & NUMBER_OMIT_ONLY_ZERO)) {
- newStr->buffer[count] = numberChar[0];
- offset[count++] = i - len + startPos;
- }
- }
- len = 0;
- }
- if (i < nCount) {
- if (doDecimal = (!makeBullet && !doDecimal &&
- isDecimal(str[i]) && i < nCount-1 && isNumber(str[i+1])))
- newStr->buffer[count] = DecimalChar[number];
- else if (!makeBullet && isMinus(str[i]) && i < nCount-1 && isNumber(str[i+1]))
- newStr->buffer[count] = MinusChar[number];
- else
- newStr->buffer[count] = str[i];
- offset[count++] = i + startPos;
- }
- }
- }
-
- offset.realloc(count);
- return OUString(newStr->buffer, count);
- }
- return OUString();
-}
-
-sal_Bool SAL_CALL NumToText_CJK::numberMaker(const sal_Unicode *str, sal_Int32 begin, sal_Int32 len,
- sal_Unicode *dst, sal_Int32& count, sal_Unicode multiChar, Sequence< sal_Int32 >& offset, sal_Int32 startPos)
-{
- if ( len <= multiplierExponent[exponentCount-1] ) {
- if (multiplierExponent[exponentCount-1] > 1) {
- sal_Int16 i;
- sal_Bool notZero = false;
- for (i = 0; i < len; i++, begin++) {
- if (notZero || str[begin] != NUMBER_ZERO) {
- dst[count] = numberChar[str[begin] - NUMBER_ZERO];
- offset[count++] = begin + startPos;
- notZero = sal_True;
- }
- }
- if (notZero && multiChar > 0) {
- dst[count] = multiChar;
- offset[count++] = begin + startPos;
- }
- return notZero;
- } else if (str[begin] != NUMBER_ZERO) {
- if (!(numberFlag & NUMBER_OMIT_ONE) || multiChar == 0 || str[begin] != NUMBER_ONE) {
- dst[count] = numberChar[str[begin] - NUMBER_ZERO];
- offset[count++] = begin + startPos;
- }
- if (multiChar > 0) {
- dst[count] = multiChar;
- offset[count++] = begin + startPos;
- }
- } else if (!(numberFlag & NUMBER_OMIT_ZERO) && count > 0 && dst[count-1] != numberChar[0]) {
- dst[count] = numberChar[0];
- offset[count++] = begin + startPos;
- }
- return str[begin] != NUMBER_ZERO;
- } else {
- sal_Bool printPower = sal_False;
- sal_Int16 last = 0;
- for (sal_Int16 i = 1; i <= exponentCount; i++) {
- sal_Int32 tmp = len - (i == exponentCount ? 0 : multiplierExponent[i]);
- if (tmp > 0) {
- printPower |= numberMaker(str, begin, tmp, dst, count,
- (i == exponentCount ? 0 : multiplierChar[i]), offset, startPos);
- begin += tmp;
- len -= tmp;
- }
- }
- if (printPower) {
- if (count > 0 && dst[count-1] == numberChar[0])
- count--;
- if (multiChar > 0) {
- dst[count] = multiChar;
- offset[count++] = begin + startPos;
- }
- }
- return printPower;
- }
-}
-
-#define TRANSLITERATION_NUMTOTEXT( name, _number, _mult, _short, flag ) \
+#define TRANSLITERATION_NUMTOTEXT( name, number, type ) \
NumToText##name::NumToText##name() \
{ \
- number = NumberChar_##_number; \
- numberChar = NumberChar[NumberChar_##_number]; \
- multiplierChar = MultiplierChar_##_short[Multiplier_##_mult]; \
- exponentCount = ExponentCount_##_short; \
- multiplierExponent = MultiplierExponent_##_short; \
- numberFlag = flag; \
- transliterationName = "NumToText"#name; \
- implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \
+ nNativeNumberMode = number; \
+ tableSize = 0; \
+ transliterationName = "NumToText"#name; \
+ implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \
}
-TRANSLITERATION_NUMTOTEXT( Lower_zh_CN, Lower_zh, Lower_zh, CJK, 0 )
-TRANSLITERATION_NUMTOTEXT( Upper_zh_CN, Upper_zh, Upper_zh, CJK, 0 )
-TRANSLITERATION_NUMTOTEXT( Lower_zh_TW, Lower_zh, Lower_zh, CJK, 0 )
-TRANSLITERATION_NUMTOTEXT( Upper_zh_TW, Upper_zh_TW, Upper_zh_TW, CJK, 0 )
-TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_CN, FullWidth, Lower_zh, CJK, 0 )
-TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_TW, FullWidth, Lower_zh_TW, CJK, 0 )
-TRANSLITERATION_NUMTOTEXT( Fullwidth_ja_JP, FullWidth, Modern_ja, CJK, 0 )
-TRANSLITERATION_NUMTOTEXT( Fullwidth_ko, FullWidth, Hangul_ko, CJK, 0 )
-#define Multiplier_Lower_ko Multiplier_Upper_zh_TW
-#define Multiplier_Upper_ko Multiplier_Upper_zh_TW
-TRANSLITERATION_NUMTOTEXT( FormalLower_ko, Lower_ko, Lower_ko, CJK, NUMBER_OMIT_ZERO )
-TRANSLITERATION_NUMTOTEXT( FormalUpper_ko, Upper_ko, Upper_ko, CJK, NUMBER_OMIT_ZERO )
-TRANSLITERATION_NUMTOTEXT( FormalHangul_ko, Hangul_ko, Hangul_ko, CJK, NUMBER_OMIT_ZERO )
-#define NUMBER_OMIT_ALL ( NUMBER_OMIT_ZERO|NUMBER_OMIT_ONE|NUMBER_OMIT_ONLY_ZERO )
-TRANSLITERATION_NUMTOTEXT( InformalLower_ko, Lower_ko, Lower_ko, CJK, NUMBER_OMIT_ALL )
-TRANSLITERATION_NUMTOTEXT( InformalUpper_ko, Upper_ko, Upper_ko, CJK, NUMBER_OMIT_ALL )
-TRANSLITERATION_NUMTOTEXT( InformalHangul_ko, Hangul_ko, Hangul_ko, CJK, NUMBER_OMIT_ALL )
-TRANSLITERATION_NUMTOTEXT( KanjiLongTraditional_ja_JP, Traditional_ja, Traditional_ja, CJK, NUMBER_OMIT_ALL )
-TRANSLITERATION_NUMTOTEXT( KanjiLongModern_ja_JP, Modern_ja, Modern_ja, CJK, NUMBER_OMIT_ALL )
-TRANSLITERATION_NUMTOTEXT( Date_zh, Lower_zh, Lower_zh, CJK, NUMBER_OMIT_ALL )
-TRANSLITERATION_NUMTOTEXT( KanjiShortTraditional_ja_JP, Traditional_ja, Traditional_ja, short_CJK, NUMBER_OMIT_ALL )
-TRANSLITERATION_NUMTOTEXT( KanjiShortModern_ja_JP, Modern_ja, Modern_ja,short_CJK, NUMBER_OMIT_ALL )
+using namespace drafts::com::sun::star::i18n::NativeNumberMode;
+
+TRANSLITERATION_NUMTOTEXT( Lower_zh_CN, NATNUM4)
+TRANSLITERATION_NUMTOTEXT( Upper_zh_CN, NATNUM5)
+TRANSLITERATION_NUMTOTEXT( Lower_zh_TW, NATNUM4)
+TRANSLITERATION_NUMTOTEXT( Upper_zh_TW, NATNUM5)
+TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_CN, NATNUM6)
+TRANSLITERATION_NUMTOTEXT( Fullwidth_zh_TW, NATNUM6)
+TRANSLITERATION_NUMTOTEXT( Fullwidth_ja_JP, NATNUM6)
+TRANSLITERATION_NUMTOTEXT( Fullwidth_ko, NATNUM6)
+TRANSLITERATION_NUMTOTEXT( FormalLower_ko, NATNUM4)
+TRANSLITERATION_NUMTOTEXT( FormalUpper_ko, NATNUM5)
+TRANSLITERATION_NUMTOTEXT( FormalHangul_ko, NATNUM10)
+TRANSLITERATION_NUMTOTEXT( InformalLower_ko, NATNUM7)
+TRANSLITERATION_NUMTOTEXT( InformalUpper_ko, NATNUM8)
+TRANSLITERATION_NUMTOTEXT( InformalHangul_ko, NATNUM11)
+TRANSLITERATION_NUMTOTEXT( KanjiLongTraditional_ja_JP, NATNUM5)
+TRANSLITERATION_NUMTOTEXT( KanjiLongModern_ja_JP, NATNUM4)
+TRANSLITERATION_NUMTOTEXT( Date_zh, NATNUM7)
+TRANSLITERATION_NUMTOTEXT( KanjiShortTraditional_ja_JP, NATNUM8)
+TRANSLITERATION_NUMTOTEXT( KanjiShortModern_ja_JP, NATNUM7)
#undef TRANSLITERATION_NUMTOTEXT
-#define TRANSLITERATION_NUMTOTEXT( name, recycle ) \
+#define TRANSLITERATION_NUMTOTEXT( name, _table, recycle ) \
NumToText##name::NumToText##name() \
{ \
- numberChar = table_##name; \
- bulletCount = sizeof(table_##name) / sizeof(sal_Unicode); \
- transliterationName = "NumToText"#name; \
- implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \
- recycleBullet = recycle; \
+ table = _table;\
+ tableSize = sizeof(_table) / sizeof(sal_Unicode); \
+ recycleSymbol = recycle; \
+ transliterationName = "NumToText"#name; \
+ implementationName = "com.sun.star.i18n.Transliteration.NumToText"#name; \
}
-TRANSLITERATION_NUMTOTEXT( AIUFullWidth_ja_JP, sal_False )
-TRANSLITERATION_NUMTOTEXT( AIUHalfWidth_ja_JP, sal_False )
-TRANSLITERATION_NUMTOTEXT( IROHAFullWidth_ja_JP, sal_False )
-TRANSLITERATION_NUMTOTEXT( IROHAHalfWidth_ja_JP, sal_False )
-TRANSLITERATION_NUMTOTEXT( CircledNumber, sal_False )
-TRANSLITERATION_NUMTOTEXT( HangulJamo_ko, sal_False )
-TRANSLITERATION_NUMTOTEXT( HangulSyllable_ko, sal_False )
-TRANSLITERATION_NUMTOTEXT( HangulCircledJamo_ko, sal_False )
-TRANSLITERATION_NUMTOTEXT( HangulCircledSyllable_ko, sal_False )
-TRANSLITERATION_NUMTOTEXT( TianGan_zh, sal_False )
-TRANSLITERATION_NUMTOTEXT( DiZi_zh, sal_False )
+
+TRANSLITERATION_NUMTOTEXT ( AIUFullWidth_ja_JP, table_AIUFullWidth_ja_JP, sal_False)
+TRANSLITERATION_NUMTOTEXT ( AIUHalfWidth_ja_JP, table_AIUHalfWidth_ja_JP, sal_False)
+TRANSLITERATION_NUMTOTEXT ( IROHAFullWidth_ja_JP, table_IROHAFullWidth_ja_JP, sal_False)
+TRANSLITERATION_NUMTOTEXT ( IROHAHalfWidth_ja_JP, table_IROHAHalfWidth_ja_JP, sal_False)
+TRANSLITERATION_NUMTOTEXT ( CircledNumber, table_CircledNumber, sal_False)
+TRANSLITERATION_NUMTOTEXT ( TianGan_zh, table_TianGan_zh, sal_False)
+TRANSLITERATION_NUMTOTEXT ( DiZi_zh, table_DiZi_zh, sal_False)
+TRANSLITERATION_NUMTOTEXT ( HangulJamo_ko, table_HangulJamo_ko, sal_True)
+TRANSLITERATION_NUMTOTEXT ( HangulSyllable_ko, table_HangulSyllable_ko, sal_True)
+TRANSLITERATION_NUMTOTEXT ( HangulCircledJamo_ko, table_HangulCircledJamo_ko, sal_True)
+TRANSLITERATION_NUMTOTEXT ( HangulCircledSyllable_ko, table_HangulCircledSyllable_ko, sal_True)
#undef TRANSLITERATION_NUMTOTEXT
} } } }