1 /*
2  * Open Chinese Convert
3  *
4  * Copyright 2010-2014 BYVoid <byvoid@byvoid.com>
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include "Dict.hpp"
20 
21 using namespace opencc;
22 
MatchPrefix(const char * word) const23 Optional<const DictEntry*> Dict::MatchPrefix(const char* word) const {
24   string wordTrunc = UTF8Util::TruncateUTF8(word, KeyMaxLength());
25   const char* wordTruncPtr = wordTrunc.c_str() + wordTrunc.length();
26   for (long len = static_cast<long>(wordTrunc.length()); len > 0;) {
27     wordTrunc.resize(static_cast<size_t>(len));
28     wordTruncPtr = wordTrunc.c_str() + len;
29     const Optional<const DictEntry*>& result = Match(wordTrunc.c_str());
30     if (!result.IsNull()) {
31       return result;
32     }
33     len -= static_cast<long>(UTF8Util::PrevCharLength(wordTruncPtr));
34   }
35   return Optional<const DictEntry*>::Null();
36 }
37 
MatchAllPrefixes(const char * word) const38 vector<const DictEntry*> Dict::MatchAllPrefixes(const char* word) const {
39   vector<const DictEntry*> matchedLengths;
40   string wordTrunc = UTF8Util::TruncateUTF8(word, KeyMaxLength());
41   const char* wordTruncPtr = wordTrunc.c_str() + wordTrunc.length();
42   for (long len = static_cast<long>(wordTrunc.length()); len > 0;
43        len -= static_cast<long>(UTF8Util::PrevCharLength(wordTruncPtr))) {
44     wordTrunc.resize(static_cast<size_t>(len));
45     wordTruncPtr = wordTrunc.c_str() + len;
46     const Optional<const DictEntry*>& result = Match(wordTrunc.c_str());
47     if (!result.IsNull()) {
48       matchedLengths.push_back(result.Get());
49     }
50   }
51   return matchedLengths;
52 }
53