void fsm_construct_add_arc(struct fsm_construct_handle *handle, int source, int target, char *in, char *out) { struct fsm_state_list *sl; struct fsm_trans_list *tl; int symin, symout; fsm_construct_check_size(handle, source); fsm_construct_check_size(handle, target); if (source > handle->maxstate) handle->maxstate = source; if (target > handle->maxstate) handle->maxstate = target; sl = (handle->fsm_state_list)+target; sl->used = 1; sl = (handle->fsm_state_list)+source; sl->used = 1; tl = xxmalloc(sizeof(struct fsm_trans_list)); tl->next = sl->fsm_trans_list; sl->fsm_trans_list = tl; if ((symin = fsm_construct_check_symbol(handle,in)) == -1) symin = fsm_construct_add_symbol(handle,in); if ((symout = fsm_construct_check_symbol(handle,out)) == -1) symout = fsm_construct_add_symbol(handle,out); tl->in = symin; tl->out = symout; tl->target = target; }
void fsm_construct_set_initial(struct fsm_construct_handle *handle, int state_no) { struct fsm_state_list *sl; fsm_construct_check_size(handle, state_no); if (state_no > handle->maxstate) handle->maxstate = state_no; sl = handle->fsm_state_list; (sl+state_no)->is_initial = 1; }
void fsm_construct_add_arc_nums(struct fsm_construct_handle *handle, int source, int target, int in, int out) { struct fsm_state_list *sl; struct fsm_trans_list *tl; fsm_construct_check_size(handle, source); fsm_construct_check_size(handle, target); if (source > handle->maxstate) handle->maxstate = source; if (target > handle->maxstate) handle->maxstate = target; sl = (handle->fsm_state_list)+target; sl->used = 1; sl = (handle->fsm_state_list)+source; sl->used = 1; tl = xxmalloc(sizeof(struct fsm_trans_list)); tl->next = sl->fsm_trans_list; sl->fsm_trans_list = tl; tl->in = in; tl->out = out; tl->target = target; }
void fsm_construct_set_final(struct fsm_construct_handle *handle, int state_no) { struct fsm_state_list *sl; fsm_construct_check_size(handle, state_no); if (state_no > handle->maxstate) handle->maxstate = state_no; sl = handle->fsm_state_list; if (!(sl+state_no)->is_final) { (sl+state_no)->is_final = 1; handle->numfinals++; } }