1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #include <i18nutil/oneToOneMapping.hxx> 25 26 namespace com { namespace sun { namespace star { namespace i18n { 27 28 oneToOneMapping::oneToOneMapping( OneToOneMappingTable_t *rpTable, const size_t rnBytes, const size_t rnUnitSize ) 29 : mpTable( rpTable ), 30 mnSize( rnBytes / rnUnitSize ) 31 { 32 } 33 34 oneToOneMapping::~oneToOneMapping() 35 { 36 } 37 38 sal_Unicode oneToOneMapping::find(const sal_Unicode nKey) const 39 { 40 if( mpTable ) 41 { 42 // binary search 43 int bottom = 0; 44 int top = mnSize - 1; 45 int current; 46 47 for (;;) { 48 current = (top + bottom) / 2; 49 if( nKey < mpTable[current].first ) 50 top = current - 1; 51 else if( nKey > mpTable[current].first ) 52 bottom = current + 1; 53 else 54 return mpTable[current].second; 55 56 if( bottom > top ) 57 return sal_Unicode( nKey ); 58 } 59 } 60 else 61 return sal_Unicode( nKey ); 62 } 63 64 oneToOneMappingWithFlag::oneToOneMappingWithFlag( UnicodePairWithFlag *rpTableWF, const size_t rnSize, const UnicodePairFlag rnFlag ) 65 : oneToOneMapping( NULL, rnSize, sizeof(UnicodePairWithFlag) ), 66 mpTableWF ( rpTableWF ), 67 mnFlag ( rnFlag ), 68 mbHasIndex( sal_False ) 69 { 70 } 71 72 oneToOneMappingWithFlag::~oneToOneMappingWithFlag() 73 { 74 if( mbHasIndex ) 75 for( int i = 0; i < 256; i++ ) 76 if( mpIndex[i] ) 77 delete [] mpIndex[i]; 78 } 79 80 81 void oneToOneMappingWithFlag::makeIndex() 82 { 83 if( !mbHasIndex && mpTableWF ) 84 { 85 int i, j, high, low, current = -1; 86 87 for( i = 0; i < 256; i++ ) 88 mpIndex[i] = NULL; 89 90 for( size_t k = 0; k < mnSize; k++ ) 91 { 92 high = (mpTableWF[k].first >> 8) & 0xFF; 93 low = (mpTableWF[k].first) & 0xFF; 94 if( high != current ) 95 { 96 current = high; 97 mpIndex[high] = new UnicodePairWithFlag*[256]; 98 99 for( j = 0; j < 256; j++ ) 100 mpIndex[high][j] = NULL; 101 } 102 mpIndex[high][low] = &mpTableWF[k]; 103 } 104 105 mbHasIndex = sal_True; 106 } 107 } 108 109 sal_Unicode oneToOneMappingWithFlag::find( const sal_Unicode nKey ) const 110 { 111 if( mpTableWF ) 112 { 113 if( mbHasIndex ) 114 { 115 // index search 116 int high, low; 117 high = (nKey >> 8) & 0xFF; 118 low = nKey & 0xFF; 119 if( mpIndex[high] != NULL && 120 mpIndex[high][low] != NULL && 121 mpIndex[high][low]->flag & mnFlag ) 122 return mpIndex[high][low]->second; 123 else 124 return sal_Unicode( nKey ); 125 } 126 else 127 { 128 // binary search 129 int bottom = 0; 130 int top = mnSize - 1; 131 int current; 132 133 for (;;) { 134 current = (top + bottom) / 2; 135 if( nKey < mpTableWF[current].first ) 136 top = current - 1; 137 else if( nKey > mpTableWF[current].first ) 138 bottom = current + 1; 139 else 140 { 141 if( mpTableWF[current].flag & mnFlag ) 142 return mpTableWF[current].second; 143 else 144 return sal_Unicode( nKey ); 145 } 146 147 if( bottom > top ) 148 return sal_Unicode( nKey ); 149 } 150 } 151 } 152 else 153 return sal_Unicode( nKey ); 154 } 155 156 157 } } } } 158