Пример #1
0
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;
  }
}
Пример #2
0
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;
}