74 {
76 if (debug_level) {
77 tprintf(
"Reading ambiguities\n");
78 }
79
80 int test_ambig_part_size;
81 int replacement_ambig_part_size;
82
83
85 char *buffer = new char[kBufferSize];
88 int line_num = 0;
90
91
92 int version = 0;
93 ASSERT_HOST(ambig_file->FGets(buffer, kBufferSize) !=
nullptr && buffer[0] !=
'\0');
94 if (*buffer == 'v') {
95 version = static_cast<int>(strtol(buffer + 1, nullptr, 10));
96 ++line_num;
97 } else {
98 ambig_file->Rewind();
99 }
100 while (ambig_file->FGets(buffer, kBufferSize) != nullptr) {
102 if (debug_level > 2) {
103 tprintf(
"read line %s\n", buffer);
104 }
105 ++line_num;
106 if (!ParseAmbiguityLine(line_num, version, debug_level, encoder_set, buffer,
107 &test_ambig_part_size, test_unichar_ids, &replacement_ambig_part_size,
108 replacement_string, &
type)) {
109 continue;
110 }
111
112 auto *ambig_spec = new AmbigSpec();
114 test_ambig_part_size, test_unichar_ids, replacement_ambig_part_size,
115 replacement_string,
type, ambig_spec, unicharset)) {
116 continue;
117 }
118
119
120 if (test_ambig_part_size == 1 && replacement_ambig_part_size == 1 &&
type ==
DEFINITE_AMBIG) {
121 if (one_to_one_definite_ambigs_[test_unichar_ids[0]] == nullptr) {
122 one_to_one_definite_ambigs_[test_unichar_ids[0]] =
new UnicharIdVector();
123 }
124 one_to_one_definite_ambigs_[test_unichar_ids[0]]->push_back(ambig_spec->correct_ngram_id);
125 }
126
127 if (use_ambigs_for_adaption) {
128 std::vector<UNICHAR_ID> encoding;
129
130
131 if (unicharset->encode_string(replacement_string, true, &encoding, nullptr, nullptr)) {
132 for (
int i = 0;
i < test_ambig_part_size; ++
i) {
133 if (ambigs_for_adaption_[test_unichar_ids[
i]] ==
nullptr) {
135 }
136 adaption_ambigs_entry = ambigs_for_adaption_[test_unichar_ids[
i]];
137 for (int id_to_insert : encoding) {
139
140
141 size_t j;
142 for (j = 0;
143 j < adaption_ambigs_entry->size() && (*adaption_ambigs_entry)[j] > id_to_insert;
144 ++j) {
145 }
146 if (j < adaption_ambigs_entry->size()) {
147 if ((*adaption_ambigs_entry)[j] != id_to_insert) {
148 adaption_ambigs_entry->insert(adaption_ambigs_entry->begin() + j, id_to_insert);
149 }
150 } else {
151 adaption_ambigs_entry->push_back(id_to_insert);
152 }
153 }
154 }
155 }
156 }
157 }
158 delete[] buffer;
159
160
161 if (use_ambigs_for_adaption) {
162 for (
size_t i = 0;
i < ambigs_for_adaption_.size(); ++
i) {
163 adaption_ambigs_entry = ambigs_for_adaption_[
i];
164 if (adaption_ambigs_entry == nullptr) {
165 continue;
166 }
167 for (size_t j = 0; j < adaption_ambigs_entry->size(); ++j) {
168 UNICHAR_ID ambig_id = (*adaption_ambigs_entry)[j];
169 if (reverse_ambigs_for_adaption_[ambig_id] == nullptr) {
171 }
172 reverse_ambigs_for_adaption_[ambig_id]->push_back(
i);
173 }
174 }
175 }
176
177
178 if (debug_level > 1) {
179 for (int tbl = 0; tbl < 2; ++tbl) {
181 for (
size_t i = 0;
i < print_table.size(); ++
i) {
182 AmbigSpec_LIST *lst = print_table[
i];
183 if (lst == nullptr) {
184 continue;
185 }
186 if (!lst->empty()) {
187 tprintf(
"%s Ambiguities for %s:\n", (tbl == 0) ?
"Replaceable" :
"Dangerous",
188 unicharset->debug_str(
i).c_str());
189 }
190 AmbigSpec_IT lst_it(lst);
191 for (lst_it.mark_cycle_pt(); !lst_it.cycled_list(); lst_it.forward()) {
192 AmbigSpec *ambig_spec = lst_it.data();
197 }
198 }
199 }
200 if (use_ambigs_for_adaption) {
201 for (int vec_id = 0; vec_id < 2; ++vec_id) {
202 const std::vector<UnicharIdVector *> &vec =
203 (vec_id == 0) ? ambigs_for_adaption_ : reverse_ambigs_for_adaption_;
204 for (
size_t i = 0;
i < vec.size(); ++
i) {
205 adaption_ambigs_entry = vec[
i];
206 if (adaption_ambigs_entry != nullptr) {
207 tprintf(
"%sAmbigs for adaption for %s:\n", (vec_id == 0) ?
"" :
"Reverse ",
208 unicharset->debug_str(
i).c_str());
209 for (size_t j = 0; j < adaption_ambigs_entry->size(); ++j) {
210 tprintf(
"%s ", unicharset->debug_str((*adaption_ambigs_entry)[j]).c_str());
211 }
213 }
214 }
215 }
216 }
217 }
218}
std::vector< AmbigSpec_LIST * > UnicharAmbigsVector
void tprintf(const char *format,...)
void chomp_string(char *str)
const int kMaxAmbigStringSize
std::vector< UNICHAR_ID > UnicharIdVector
static void print(const UNICHAR_ID array[], const UNICHARSET &unicharset)