static int page_range_add_worker(Page_Range *pr, void *_start, unsigned long len) { unsigned long start = (unsigned long)_start; Range *r, *range_root = pr->range_root; range_root = range_splay(start, range_root); if (range_root) { if (try_extend(range_root, start, len) || try_extend(range_root->prev, start, len) || try_extend(range_root->next, start, len)) { pr->range_root = range_root; return 1; } } r = (Range *)((char *)pr->range_alloc_block + pr->range_alloc_used); pr->range_alloc_used += sizeof(Range); if (pr->range_alloc_used > pr->range_alloc_size) { return 0; } else { r->len = len; if (range_root) { if (start < range_root->start) { r->next = range_root; r->prev = range_root->prev; if (r->prev) r->prev->next = r; else pr->range_start = r; range_root->prev = r; } else { r->prev = range_root; r->next = range_root->next; if (r->next) r->next->prev = r; range_root->next = r; } range_root = range_splay_insert(start, r, range_root); } else { r->prev = r->next = NULL; r->left = r->right = NULL; range_root = r; r->start = start; pr->range_start = r; } pr->range_root = range_root; return 1; } }
uint16 DictTrie::get_lemma_splids(LemmaIdType id_lemma, uint16 *splids, uint16 splids_max, bool arg_valid) { char16 lma_str[kMaxLemmaSize + 1]; uint16 lma_len = get_lemma_str(id_lemma, lma_str, kMaxLemmaSize + 1); assert((!arg_valid && splids_max >= lma_len) || lma_len == splids_max); uint16 spl_mtrx[kMaxLemmaSize * 5]; uint16 spl_start[kMaxLemmaSize + 1]; spl_start[0] = 0; uint16 try_num = 1; for (uint16 pos = 0; pos < lma_len; pos++) { uint16 cand_splids_this = 0; if (arg_valid && spl_trie_->is_full_id(splids[pos])) { spl_mtrx[spl_start[pos]] = splids[pos]; cand_splids_this = 1; } else { cand_splids_this = dict_list_->get_splids_for_hanzi(lma_str[pos], arg_valid ? splids[pos] : 0, spl_mtrx + spl_start[pos], kMaxLemmaSize * 5 - spl_start[pos]); assert(cand_splids_this > 0); } spl_start[pos + 1] = spl_start[pos] + cand_splids_this; try_num *= cand_splids_this; } for (uint16 try_pos = 0; try_pos < try_num; try_pos++) { uint16 mod = 1; for (uint16 pos = 0; pos < lma_len; pos++) { uint16 radix = spl_start[pos + 1] - spl_start[pos]; splids[pos] = spl_mtrx[ spl_start[pos] + try_pos / mod % radix]; mod *= radix; } if (try_extend(splids, lma_len, id_lemma)) return lma_len; } return 0; }