nfa* nfa_star (nfa* old) { atm_context* context = old->context; atm* fa = atm_create(context); atm_state *source, *dest; dbg_assert(ilist_size(old->accept_states) == 1); foreach_v(ilist_itr_begin(old->states), ilist_itr_end(old->states), add_state, fa); source = atm_state_create(fa); dest = atm_state_create(fa); dbg_assert(source != NULL && dest != NULL); ilist_add_back(fa->states, source); ilist_add_back(fa->states, dest); fa->start_state = source; ilist_add_back(fa->accept_states, dest); atm_transform_create(fa, source, old->start_state, Epsilon); atm_transform_create(fa, source, dest, Epsilon); atm_transform_create(fa, (atm_state*)ilist_front(old->accept_states), dest, Epsilon); atm_transform_create(fa, (atm_state*)ilist_front(old->accept_states), old->start_state, Epsilon); ilist_clear(old->accept_states); ilist_clear(old->states); old->start_state = NULL; old->lifestate = atm_joined; fa->lifestate = atm_active; return fa; }
nfa* nfa_union (nfa* first, nfa* second) { atm_context* context = first->context; atm* fa = atm_create(context); atm_state *source, *dest; dbg_assert(first->context == second->context); dbg_assert(ilist_size(first->accept_states) == 1); dbg_assert(ilist_size(second->accept_states) == 1); foreach_v(ilist_itr_begin(first->states), ilist_itr_end(first->states), add_state, fa); foreach_v(ilist_itr_begin(second->states), ilist_itr_end(second->states), add_state, fa); source = atm_state_create(fa); dest = atm_state_create(fa); dbg_assert(source != NULL && dest != NULL); ilist_add_back(fa->states, source); ilist_add_back(fa->states, dest); fa->start_state = source; ilist_add_back(fa->accept_states, dest); atm_transform_create(fa, source, first->start_state, Epsilon); atm_transform_create(fa, source, second->start_state, Epsilon); atm_transform_create(fa, (atm_state*)ilist_front(first->accept_states), dest, Epsilon); atm_transform_create(fa, (atm_state*)ilist_front(second->accept_states), dest, Epsilon); ilist_clear(first->accept_states); ilist_clear(first->states); first->start_state = NULL; first->lifestate = atm_joined; ilist_clear(second->accept_states); ilist_clear(second->states); second->start_state = NULL; second->lifestate = atm_joined; fa->lifestate = atm_active; return fa; }
int pool_free_space(PoolObject *pool){ ssize_t size_list_zero = ilist_size(&pool->list_zero); if (size_list_zero < 0) return -1; int i; iNode *inode; for (i = 0; i < size_list_zero/2; i++){ inode = ilist_remove_last(&pool->list_zero); if (inode == NULL) return -1; hash_table_remove(&pool->table, &inode->node); data_free(inode->node.value); } return 0; }