struct fsm_read_handle *fsm_read_init(struct fsm *net) { struct fsm_read_handle *handle; struct fsm_state *fsm; int i, j, k, num_states, num_initials, num_finals, sno, *finals_head, *initials_head, *states_head; unsigned char *lookuptable; if (net == NULL) {return (NULL);} num_states = net->statecount; lookuptable = xxcalloc(num_states, sizeof(unsigned char)); num_initials = num_finals = 0; for (i=0, fsm=net->states; (fsm+i)->state_no != -1; i++) { sno = (fsm+i)->state_no; if ((fsm+i)->start_state) { if (!(*(lookuptable+sno) & 1)) { *(lookuptable+sno) |= 1; num_initials++; } } if ((fsm+i)->final_state) { if (!(*(lookuptable+sno) & 2)) { *(lookuptable+sno) |= 2; num_finals++; } } } finals_head = xxcalloc(num_finals+1,sizeof(int)); initials_head = xxcalloc(num_initials+1,sizeof(int)); states_head = xxcalloc(num_states+1,sizeof(int)); for (i=j=k=0; i < num_states; i++) { if (*(lookuptable+i) & 1) { *(initials_head+j) = i; j++; } if (*(lookuptable+i) & 2) { *(finals_head+k) = i; k++; } *(states_head+i) = i; } *(initials_head+j) = -1; *(finals_head+k) = -1; *(states_head+i) = -1; xxfree(lookuptable); handle = xxcalloc(1,sizeof(struct fsm_read_handle)); handle->finals_head = finals_head; handle->initials_head = initials_head; handle->states_head = states_head; handle->fsm_sigma_list = sigma_to_list(net->sigma); handle->sigma_list_size = sigma_max(net->sigma)+1; handle->arcs_head = fsm; return(handle); }
int net_print_att(struct fsm *net, FILE *outfile) { struct fsm_state *fsm; struct fsm_sigma_list *sl; int i, prev; fsm = net->states; sl = sigma_to_list(net->sigma); if (sigma_max(net->sigma) >= 0) { (sl+0)->symbol = g_att_epsilon; } for (i=0; (fsm+i)->state_no != -1; i++) { if ((fsm+i)->target != -1) { fprintf(outfile, "%i\t%i\t%s\t%s\n",(fsm+i)->state_no,(fsm+i)->target, (sl+(fsm+i)->in)->symbol, (sl+(fsm+i)->out)->symbol); } } prev = -1; for (i=0; (fsm+i)->state_no != -1; prev = (fsm+i)->state_no, i++) { if ((fsm+i)->state_no != prev && (fsm+i)->final_state == 1) { fprintf(outfile, "%i\n",(fsm+i)->state_no); } } xxfree(sl); return(1); }
struct fsm_read_handle *fsm_read_init(struct fsm *net) { struct fsm_read_handle *handle; struct fsm_state *fsm, **states_head; int i, j, k, num_states, num_initials, num_finals, sno, *finals_head, *initials_head, laststate; unsigned char *lookuptable; if (net == NULL) {return (NULL);} num_states = net->statecount; lookuptable = xxcalloc(num_states, sizeof(unsigned char)); num_initials = num_finals = 0; handle = xxcalloc(1,sizeof(struct fsm_read_handle)); states_head = xxcalloc(num_states+1,sizeof(struct fsm **)); laststate = -1; for (i=0, fsm=net->states; (fsm+i)->state_no != -1; i++) { sno = (fsm+i)->state_no; if ((fsm+i)->start_state) { if (!(*(lookuptable+sno) & 1)) { *(lookuptable+sno) |= 1; num_initials++; } } if ((fsm+i)->final_state) { if (!(*(lookuptable+sno) & 2)) { *(lookuptable+sno) |= 2; num_finals++; } } if ((fsm+i)->in == UNKNOWN || (fsm+i)->out == UNKNOWN || (fsm+i)->in == IDENTITY || (fsm+i)->out == IDENTITY) { handle->has_unknowns = 1; } if ((fsm+i)->state_no != laststate) { *(states_head+(fsm+i)->state_no) = fsm+i; } laststate = (fsm+i)->state_no; } finals_head = xxcalloc(num_finals+1,sizeof(int)); initials_head = xxcalloc(num_initials+1,sizeof(int)); for (i=j=k=0; i < num_states; i++) { if (*(lookuptable+i) & 1) { *(initials_head+j) = i; j++; } if (*(lookuptable+i) & 2) { *(finals_head+k) = i; k++; } } *(initials_head+j) = -1; *(finals_head+k) = -1; handle->finals_head = finals_head; handle->initials_head = initials_head; handle->states_head = states_head; handle->fsm_sigma_list = sigma_to_list(net->sigma); handle->sigma_list_size = sigma_max(net->sigma)+1; handle->arcs_head = fsm; handle->lookuptable = lookuptable; handle->net = net; return(handle); }