コード例 #1
0
ファイル: aut_io.c プロジェクト: Meijuh/ltsmin
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;

}
コード例 #2
0
ファイル: sigmin-lib.c プロジェクト: Meijuh/ltsmin
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);
}
コード例 #3
0
ファイル: hre_table.c プロジェクト: graydon/ltsmin
int HREgreyboxC2I(void*map,void*data,int len){
    return VTputChunk((value_table_t)map,chunk_ld(len,data));
}