Kaydet (Commit) c564086e authored tarafından Rüdiger Timm's avatar Rüdiger Timm

INTEGRATION: CWS calc06 (1.4.36); FILE MERGED

2003/03/21 22:08:16 khong 1.4.36.1: #106680# Implementing new XExtendedTransliteration interface
üst c0220e30
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
* *
* $RCSfile: transliteration_Ignore.cxx,v $ * $RCSfile: transliteration_Ignore.cxx,v $
* *
* $Revision: 1.4 $ * $Revision: 1.5 $
* *
* last change: $Author: khong $ $Date: 2002-09-16 16:31:37 $ * last change: $Author: rt $ $Date: 2003-04-08 16:06:57 $
* *
* The Contents of this file are made available subject to the terms of * The Contents of this file are made available subject to the terms of
* either of the following licenses * either of the following licenses
...@@ -64,6 +64,7 @@ ...@@ -64,6 +64,7 @@
#include <transliteration_Ignore.hxx> #include <transliteration_Ignore.hxx>
using namespace drafts::com::sun::star::i18n;
using namespace com::sun::star::uno; using namespace com::sun::star::uno;
using namespace rtl; using namespace rtl;
...@@ -73,96 +74,97 @@ inline sal_Int32 Min( sal_Int32 a, sal_Int32 b ) { return a > b ? b : a; } ...@@ -73,96 +74,97 @@ inline sal_Int32 Min( sal_Int32 a, sal_Int32 b ) { return a > b ? b : a; }
sal_Bool SAL_CALL sal_Bool SAL_CALL
transliteration_Ignore::equals(const OUString& str1, sal_Int32 pos1, sal_Int32 nCount1, sal_Int32& nMatch1, transliteration_Ignore::equals(const OUString& str1, sal_Int32 pos1, sal_Int32 nCount1, sal_Int32& nMatch1,
const OUString& str2, sal_Int32 pos2, sal_Int32 nCount2, sal_Int32& nMatch2 ) throw(RuntimeException) const OUString& str2, sal_Int32 pos2, sal_Int32 nCount2, sal_Int32& nMatch2 ) throw(RuntimeException)
{ {
Sequence< sal_Int32 > offset1; Sequence< sal_Int32 > offset1;
Sequence< sal_Int32 > offset2; Sequence< sal_Int32 > offset2;
// The method folding is defined in a sub class. // The method folding is defined in a sub class.
OUString s1 = this->folding( str1, pos1, nCount1, offset1); OUString s1 = this->folding( str1, pos1, nCount1, offset1);
OUString s2 = this->folding( str2, pos2, nCount2, offset2); OUString s2 = this->folding( str2, pos2, nCount2, offset2);
const sal_Unicode * p1 = s1.getStr(); const sal_Unicode * p1 = s1.getStr();
const sal_Unicode * p2 = s2.getStr(); const sal_Unicode * p2 = s2.getStr();
sal_Int32 length = Min(s1.getLength(), s2.getLength()); sal_Int32 length = Min(s1.getLength(), s2.getLength());
for (sal_Int32 nmatch = 0; nmatch < length; nmatch++) for (sal_Int32 nmatch = 0; nmatch < length; nmatch++)
if (*p1++ != *p2++) if (*p1++ != *p2++)
break; break;
if (nmatch > 0) { if (nmatch > 0) {
nMatch1 = offset1[ nmatch - 1 ] + 1; // Subtract 1 from nmatch because the index starts from zero. nMatch1 = offset1[ nmatch - 1 ] + 1; // Subtract 1 from nmatch because the index starts from zero.
nMatch2 = offset2[ nmatch - 1 ] + 1; // And then, add 1 to position because it means the number of character matched. nMatch2 = offset2[ nmatch - 1 ] + 1; // And then, add 1 to position because it means the number of character matched.
} }
else { else {
nMatch1 = 0; // No character was matched. nMatch1 = 0; // No character was matched.
nMatch2 = 0; nMatch2 = 0;
} }
return (nmatch == s1.getLength()) && (nmatch == s2.getLength()); return (nmatch == s1.getLength()) && (nmatch == s2.getLength());
} }
Sequence< OUString > SAL_CALL Sequence< OUString > SAL_CALL
transliteration_Ignore::transliterateRange( const OUString& str1, const OUString& str2 ) throw(RuntimeException) transliteration_Ignore::transliterateRange( const OUString& str1, const OUString& str2 ) throw(RuntimeException)
{ {
if (str1.getLength() < 1 || str2.getLength() < 1) if (str1.getLength() < 1 || str2.getLength() < 1)
throw RuntimeException(); throw RuntimeException();
Sequence< OUString > r(2); Sequence< OUString > r(2);
r[0] = str1.copy(0, 1); r[0] = str1.copy(0, 1);
r[1] = str2.copy(0, 1); r[1] = str2.copy(0, 1);
return r; return r;
} }
sal_Int16 SAL_CALL sal_Int16 SAL_CALL
transliteration_Ignore::getType() throw(RuntimeException) transliteration_Ignore::getType() throw(RuntimeException)
{ {
// The type is also defined in com/sun/star/util/TransliterationType.hdl // The type is also defined in com/sun/star/util/TransliterationType.hdl
return TransliterationType::IGNORE; return TransliterationType::IGNORE;
} }
OUString SAL_CALL OUString SAL_CALL
transliteration_Ignore::transliterate( const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, transliteration_Ignore::transliterate( const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount,
Sequence< sal_Int32 >& offset ) throw(RuntimeException) Sequence< sal_Int32 >& offset ) throw(RuntimeException)
{ {
// The method folding is defined in a sub class. // The method folding is defined in a sub class.
return this->folding( inStr, startPos, nCount, offset); return this->folding( inStr, startPos, nCount, offset);
} }
Sequence< OUString > SAL_CALL Sequence< OUString > SAL_CALL
transliteration_Ignore::transliterateRange( const OUString& str1, const OUString& str2, transliteration_Ignore::transliterateRange( const OUString& str1, const OUString& str2,
XTransliteration& t1, XTransliteration& t2 ) throw(RuntimeException) XTransliteration& t1, XTransliteration& t2 ) throw(RuntimeException)
{ {
if (str1.getLength() < 1 || str2.getLength() < 1) if (str1.getLength() < 1 || str2.getLength() < 1)
throw RuntimeException(); throw RuntimeException();
Sequence< sal_Int32 > offset; Sequence< sal_Int32 > offset;
OUString s11 = t1.transliterate( str1, 0, 1, offset ); OUString s11 = t1.transliterate( str1, 0, 1, offset );
OUString s12 = t1.transliterate( str2, 0, 1, offset ); OUString s12 = t1.transliterate( str2, 0, 1, offset );
OUString s21 = t2.transliterate( str1, 0, 1, offset ); OUString s21 = t2.transliterate( str1, 0, 1, offset );
OUString s22 = t2.transliterate( str2, 0, 1, offset ); OUString s22 = t2.transliterate( str2, 0, 1, offset );
if ( (s11 == s21) && (s12 == s22) ) {
Sequence< OUString > r(2);
r[0] = s11;
r[1] = s12;
return r;
}
if ( (s11 == s21) && (s12 == s22) ) { Sequence< OUString > r(4);
Sequence< OUString > r(2);
r[0] = s11; r[0] = s11;
r[1] = s12; r[1] = s12;
r[2] = s21;
r[3] = s22;
return r; return r;
}
Sequence< OUString > r(4);
r[0] = s11;
r[1] = s12;
r[2] = s21;
r[3] = s22;
return r;
} }
OUString SAL_CALL OUString SAL_CALL
transliteration_Ignore::transliterate( const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, transliteration_Ignore::folding( const OUString& inStr, sal_Int32 startPos,
Sequence< sal_Int32 >& offset, oneToOneMapping& table ) throw(RuntimeException) sal_Int32 nCount, Sequence< sal_Int32 >& offset)
throw(RuntimeException)
{ {
// Create a string buffer which can hold nCount + 1 characters. // Create a string buffer which can hold nCount + 1 characters.
// The reference count is 0 now. // The reference count is 0 now.
...@@ -171,60 +173,69 @@ transliteration_Ignore::transliterate( const OUString& inStr, sal_Int32 startPos ...@@ -171,60 +173,69 @@ transliteration_Ignore::transliterate( const OUString& inStr, sal_Int32 startPos
const sal_Unicode * src = inStr.getStr() + startPos; const sal_Unicode * src = inStr.getStr() + startPos;
// Allocate nCount length to offset argument. // Allocate nCount length to offset argument.
offset.realloc( nCount ); sal_Int32 *p, position;
sal_Int32 *p = offset.getArray(); if (useOffset) {
sal_Int32 position = startPos; offset.realloc( nCount );
sal_Int32 count = 0; p = offset.getArray();
position = startPos;
// Translation
while (nCount -- > 0) {
sal_Unicode c = table[ *src++ ];
// if the "func" returns 0xffff, skip the character.
if (c != 0xffff) {
*dst ++ = c;
*p ++ = position;
count++;
}
position ++;
} }
*dst = (sal_Unicode) 0;
offset.realloc(count);
return OUString( newStr->buffer, count); // defined in rtl/usrting. The reference count is increased from 0 to 1.
}
if (map) {
sal_Unicode previousChar = *src ++;
sal_Unicode currentChar;
// Translation
while (-- nCount > 0) {
currentChar = *src ++;
Mapping *m;
for (m = map; m->replaceChar; m++) {
if (previousChar == m->previousChar && currentChar == m->currentChar ) {
if (useOffset) {
position++;
*p++ = position++;
}
*dst++ = m->replaceChar;\
previousChar = *src++;
nCount--;
break;
}
}
if (! m->replaceChar) {
if (useOffset)
*p ++ = position ++;
*dst ++ = previousChar;
previousChar = currentChar;
}
}
OUString SAL_CALL if (nCount == 0) {
transliteration_Ignore::transliterate( const OUString& inStr, sal_Int32 startPos, sal_Int32 nCount, if (useOffset)
Sequence< sal_Int32 >& offset, sal_Unicode (*func)(const sal_Unicode) ) throw(RuntimeException) *p = position;
{ *dst ++ = previousChar;
// Create a string buffer which can hold nCount + 1 characters. }
// The reference count is 0 now. newStr->length = sal_Int32(dst - newStr->buffer);
rtl_uString * newStr = x_rtl_uString_new_WithLength( nCount ); // defined in x_rtl_ustring.h if (useOffset)
sal_Unicode * dst = newStr->buffer; offset.realloc(newStr->length);
const sal_Unicode * src = inStr.getStr() + startPos; } else {
// Translation
// Allocate nCount length to offset argument. while (nCount -- > 0) {
offset.realloc( nCount ); sal_Unicode c = *src++;
sal_Int32 *p = offset.getArray(); *dst ++ = func ? func( c) : (*table)[ c ];
sal_Int32 position = startPos; if (useOffset)
sal_Int32 count = 0; *p ++ = position ++;
// Translation
while (nCount -- > 0) {
sal_Unicode c = func( *src++ );
// if the "func" returns 0xffff, skip the character.
if (c != 0xffff) {
*dst ++ = c;
*p ++ = position;
count++;
} }
position ++;
} }
*dst = (sal_Unicode) 0; *dst = (sal_Unicode) 0;
offset.realloc(count); return OUString( newStr ); // defined in rtl/usrting. The reference count is increased from 0 to 1.
return OUString( newStr->buffer, count ); // defined in rtl/usrting. The reference count is increased from 0 to 1. }
sal_Unicode SAL_CALL
transliteration_Ignore::transliterateChar2Char( sal_Unicode inChar) throw(RuntimeException, MultipleCharsOutputException)
{
return func ? func( inChar) : table ? (*table)[ inChar ] : inChar;
} }
} } } } } } } }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment