static int aut_read_edge(lts_file_t file,int *src_seg,void* src_state, int *dst_seg,void*dst_state,void* labels){ *src_seg=0; *dst_seg=0; char buffer[BUFFER_SIZE]; errno=0; if (fgets(buffer,BUFFER_SIZE,file->f)==NULL){ if (errno) AbortCall("while reading %s",lts_file_get_name(file)); return 0; } int from_idx,from_end,label_idx,to_idx,i; // find destination state and end of label for(i=strlen(buffer);!isdigit((unsigned char)buffer[i]);i--); buffer[i+1]=0; for(;isdigit((unsigned char)buffer[i]);i--); to_idx=i+1; for(;buffer[i]!=',';i--); for(i--;isblank((unsigned char)buffer[i]);i--); buffer[i+1]=0; // find source state and begin of label for(i=0;!isdigit((unsigned char)buffer[i]);i++); from_idx=i; for(;isdigit((unsigned char)buffer[i]);i++); from_end=i; for(;buffer[i]!=',';i++); for(i++;isblank((unsigned char)buffer[i]);i++); buffer[from_end]='\00'; label_idx=i; int lbl_len=strlen(buffer+label_idx); char tmp_data[lbl_len]; chunk tmp_chunk=chunk_ld(lbl_len,tmp_data); string2chunk(buffer+label_idx,&tmp_chunk); // write the results *((uint32_t*)src_state)=(uint32_t)atoll(buffer+from_idx); *((uint32_t*)labels)=VTputChunk(lts_file_get_table(file,file->type_no),tmp_chunk); *((uint32_t*)dst_state)=(uint32_t)atoll(buffer+to_idx); return 1; }
static void lts_write_dir(archive_t archive,string_map_t map,lts_t lts,int segments){ if (map) arch_set_write_policy(archive,map); dir_info_t info=DIRinfoCreate(segments); int i,j; uint32_t k; char filename[1024]; stream_t output; stream_t *src_out; stream_t *lbl_out; stream_t *dst_out; if (lts->root_count !=1) Abort("LTS has %u initial states DIR requires 1",lts->root_count); lts_set_type(lts,LTS_BLOCK); info->label_tau=lts->tau; int type_no=lts_type_get_edge_label_typeno(lts->ltstype,0); switch(lts_type_get_format(lts->ltstype,type_no)){ case LTStypeChunk: case LTStypeEnum: break; default: Abort("DIR is limited to Chunk/Enum edge labels."); } info->label_count=VTgetCount(lts->values[type_no]); info->initial_seg=lts->root_list[0]%segments; info->initial_ofs=lts->root_list[0]/segments; output=arch_write(archive,"TermDB"); int last_idx = 0; table_iterator_t it = VTiterator (lts->values[type_no]); while (IThasNext(it)) { chunk label_c = ITnext (it); int idx = VTputChunk (lts->values[type_no], label_c); while (last_idx < idx) { // fill non-dense indices write_chunk (output, (chunk){0, ""}); last_idx++; } write_chunk (output, label_c); } DSclose(&output); src_out=(stream_t*)RTmalloc(segments*sizeof(stream_t)); lbl_out=(stream_t*)RTmalloc(segments*sizeof(stream_t)); dst_out=(stream_t*)RTmalloc(segments*sizeof(stream_t)); for(i=0;i<segments;i++) { for(j=0;j<segments;j++) { sprintf(filename,"src-%d-%d",i,j); src_out[j]=arch_write(archive,filename); sprintf(filename,"label-%d-%d",i,j); lbl_out[j]=arch_write(archive,filename); sprintf(filename,"dest-%d-%d",i,j); dst_out[j]=arch_write(archive,filename); } for(j=i;j<(int)lts->states;j+=segments){ for(k=lts->begin[j];k<lts->begin[j+1];k++){ int dseg=(lts->dest[k])%segments; info->transition_count[i][dseg]++; DSwriteU32(src_out[dseg],info->state_count[i]); DSwriteU32(lbl_out[dseg],lts->label[k]); DSwriteU32(dst_out[dseg],(lts->dest[k])/segments); } info->state_count[i]++; } for(j=0;j<segments;j++) { DSclose(&src_out[j]); DSclose(&lbl_out[j]); DSclose(&dst_out[j]); } } info->info="bsim2 output"; output=arch_write(archive,"info"); DIRinfoWrite(output,info); DSclose(&output); info->info=NULL; DIRinfoDestroy(info); }
int HREgreyboxC2I(void*map,void*data,int len){ return VTputChunk((value_table_t)map,chunk_ld(len,data)); }