1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
22 #include <comphelper/string.hxx>
23 #include <transliteration_Ignore.hxx>
25 using namespace com::sun::star::uno
;
27 namespace com
{ namespace sun
{ namespace star
{ namespace i18n
{
29 inline sal_Int32
Min( sal_Int32 a
, sal_Int32 b
) { return a
> b
? b
: a
; }
32 transliteration_Ignore::equals(const OUString
& str1
, sal_Int32 pos1
, sal_Int32 nCount1
, sal_Int32
& nMatch1
,
33 const OUString
& str2
, sal_Int32 pos2
, sal_Int32 nCount2
, sal_Int32
& nMatch2
) throw(RuntimeException
)
35 Sequence
< sal_Int32
> offset1
;
36 Sequence
< sal_Int32
> offset2
;
38 // The method folding is defined in a sub class.
39 OUString s1
= this->folding( str1
, pos1
, nCount1
, offset1
);
40 OUString s2
= this->folding( str2
, pos2
, nCount2
, offset2
);
42 const sal_Unicode
* p1
= s1
.getStr();
43 const sal_Unicode
* p2
= s2
.getStr();
44 sal_Int32 length
= Min(s1
.getLength(), s2
.getLength());
47 for ( nmatch
= 0; nmatch
< length
; nmatch
++)
52 nMatch1
= offset1
[ nmatch
- 1 ] + 1; // Subtract 1 from nmatch because the index starts from zero.
53 nMatch2
= offset2
[ nmatch
- 1 ] + 1; // And then, add 1 to position because it means the number of character matched.
56 nMatch1
= 0; // No character was matched.
60 return (nmatch
== s1
.getLength()) && (nmatch
== s2
.getLength());
64 Sequence
< OUString
> SAL_CALL
65 transliteration_Ignore::transliterateRange( const OUString
& str1
, const OUString
& str2
) throw(RuntimeException
)
67 if (str1
.isEmpty() || str2
.isEmpty())
68 throw RuntimeException();
70 Sequence
< OUString
> r(2);
71 r
[0] = str1
.copy(0, 1);
72 r
[1] = str2
.copy(0, 1);
78 transliteration_Ignore::getType() throw(RuntimeException
)
80 // The type is also defined in com/sun/star/util/TransliterationType.hdl
81 return TransliterationType::IGNORE
;
86 transliteration_Ignore::transliterate( const OUString
& inStr
, sal_Int32 startPos
, sal_Int32 nCount
,
87 Sequence
< sal_Int32
>& offset
) throw(RuntimeException
)
89 // The method folding is defined in a sub class.
90 return this->folding( inStr
, startPos
, nCount
, offset
);
93 Sequence
< OUString
> SAL_CALL
94 transliteration_Ignore::transliterateRange( const OUString
& str1
, const OUString
& str2
,
95 XTransliteration
& t1
, XTransliteration
& t2
) throw(RuntimeException
)
97 if (str1
.isEmpty() || str2
.isEmpty())
98 throw RuntimeException();
100 Sequence
< sal_Int32
> offset
;
101 OUString s11
= t1
.transliterate( str1
, 0, 1, offset
);
102 OUString s12
= t1
.transliterate( str2
, 0, 1, offset
);
103 OUString s21
= t2
.transliterate( str1
, 0, 1, offset
);
104 OUString s22
= t2
.transliterate( str2
, 0, 1, offset
);
106 if ( (s11
== s21
) && (s12
== s22
) ) {
107 Sequence
< OUString
> r(2);
113 Sequence
< OUString
> r(4);
122 transliteration_Ignore::folding( const OUString
& inStr
, sal_Int32 startPos
,
123 sal_Int32 nCount
, Sequence
< sal_Int32
>& offset
)
124 throw(RuntimeException
)
126 // Create a string buffer which can hold nCount + 1 characters.
127 // The reference count is 1 now.
128 rtl_uString
* newStr
= rtl_uString_alloc(nCount
);
129 sal_Unicode
* dst
= newStr
->buffer
;
130 const sal_Unicode
* src
= inStr
.getStr() + startPos
;
132 // Allocate nCount length to offset argument.
134 sal_Int32 position
= 0;
136 offset
.realloc( nCount
);
137 p
= offset
.getArray();
142 sal_Unicode previousChar
= *src
++;
143 sal_Unicode currentChar
;
146 while (-- nCount
> 0) {
147 currentChar
= *src
++;
150 for (m
= map
; m
->replaceChar
; m
++) {
151 if (previousChar
== m
->previousChar
&& currentChar
== m
->currentChar
) {
158 *dst
++ = m
->replaceChar
;
160 *dst
++ = currentChar
;
161 previousChar
= *src
++;
167 if (! m
->replaceChar
) {
170 *dst
++ = previousChar
;
171 previousChar
= currentChar
;
178 *dst
++ = previousChar
;
182 while (nCount
-- > 0) {
183 sal_Unicode c
= *src
++;
184 c
= func
? func( c
) : (*table
)[ c
];
194 newStr
->length
= sal_Int32(dst
- newStr
->buffer
);
196 offset
.realloc(newStr
->length
);
197 *dst
= (sal_Unicode
) 0;
199 return OUString(newStr
, SAL_NO_ACQUIRE
); // take ownership
203 transliteration_Ignore::transliterateChar2Char( sal_Unicode inChar
) throw(RuntimeException
, MultipleCharsOutputException
)
205 return func
? func( inChar
) : table
? (*table
)[ inChar
] : inChar
;
210 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */