void init_fast_matcher(Sentence sent) { int w, len, size, i; Match_node ** t; Disjunct * d; match_cost = 0; for (w=0; w<sent->length; w++) { len = left_disjunct_list_length(sent->word[w].d); size = next_power_of_two_up(len); l_table_size[w] = size; t = l_table[w] = (Match_node **) xalloc(size * sizeof(Match_node *)); for (i=0; i<size; i++) t[i] = NULL; for (d=sent->word[w].d; d!=NULL; d=d->next) { if (d->left != NULL) { put_into_match_table(size, t, d, d->left, -1); } } len = right_disjunct_list_length(sent->word[w].d); size = next_power_of_two_up(len); r_table_size[w] = size; t = r_table[w] = (Match_node **) xalloc(size * sizeof(Match_node *)); for (i=0; i<size; i++) t[i] = NULL; for (d=sent->word[w].d; d!=NULL; d=d->next) { if (d->right != NULL) { put_into_match_table(size, t, d, d->right, 1); } } } }
fast_matcher_t* alloc_fast_matcher(const Sentence sent) { unsigned int size; size_t w; int len; Match_node ** t; Disjunct * d; fast_matcher_t *ctxt; ctxt = (fast_matcher_t *) xalloc(sizeof(fast_matcher_t)); ctxt->size = sent->length; ctxt->l_table_size = xalloc(2 * sent->length * sizeof(unsigned int)); ctxt->r_table_size = ctxt->l_table_size + sent->length; ctxt->l_table = xalloc(2 * sent->length * sizeof(Match_node **)); ctxt->r_table = ctxt->l_table + sent->length; memset(ctxt->l_table, 0, 2 * sent->length * sizeof(Match_node **)); ctxt->match_cost = 0; ctxt->mn_free_list = NULL; for (w=0; w<sent->length; w++) { len = left_disjunct_list_length(sent->word[w].d); size = next_power_of_two_up(len); ctxt->l_table_size[w] = size; t = ctxt->l_table[w] = (Match_node **) xalloc(size * sizeof(Match_node *)); memset(t, 0, size * sizeof(Match_node *)); for (d = sent->word[w].d; d != NULL; d = d->next) { if (d->left != NULL) { put_into_match_table(size, t, d, d->left, -1); } } len = right_disjunct_list_length(sent->word[w].d); size = next_power_of_two_up(len); ctxt->r_table_size[w] = size; t = ctxt->r_table[w] = (Match_node **) xalloc(size * sizeof(Match_node *)); memset(t, 0, size * sizeof(Match_node *)); for (d = sent->word[w].d; d != NULL; d = d->next) { if (d->right != NULL) { put_into_match_table(size, t, d, d->right, 1); } } } return ctxt; }