CSA *csa_load(ifstream & fp) { CSA *SA; SA = (CSA *) malloc(sizeof(CSA)); csa_init(SA); initranktables(); mkdecodetable(); SA->m = loadValue<int>(fp); SA->two = loadValue<int>(fp); SA->two2 = loadValue<int>(fp); SA->l = loadValue<int>(fp); SA->n = loadValue<int>(fp); for(int i=0; i<(SIGMA+2); i++) SA->K[i] = loadValue<int>(fp); for(int i=0; i<(SIGMA+1); i++) SA->C[i] = loadValue<int>(fp); for(int i=0; i<(SIGMA+1); i++) SA->C2[i] = loadValue<int>(fp); #ifdef USE_MMAP SA->p_size = loadValue<int>(fp); SA->B = loadValue<unsigned short>(fp, SA->p_size); SA->i_size = loadValue<int>(fp); SA->r_size = loadValue<int>(fp); SA->R = loadValue<int>(fp, SA->r_size); SA->sa_size = loadValue<int>(fp); SA->SA = loadValue<int>(fp, SA->sa_size); SA->isa_size = loadValue<int>(fp); SA->ISA = loadValue<int>(fp, SA->isa_size); SA->mapp = NULL; SA->mapi = NULL; #endif return SA; }
int load_index(char *filename, void **index){ char fname1[128],fname2[128]; CSA *SA; SA = (CSA *) malloc(sizeof(CSA)); initranktables(); mkdecodetable(); sprintf(fname1,"%s.psi",filename); sprintf(fname2,"%s.idx",filename); csa_read(SA,fname1,fname2); (*index) = SA; return 0; }
i64 psi1_read(CSA *csa, char *fname) { FILE *f1; i64 psize1,psize2; i64 n; int k,l,id,id2; char *fpsi, *fpsd, *fname2; psi1 *ps; uchar *p,*q; csa->psi_struc = ps = mymalloc(sizeof(psi1)); k = strlen(fname); fname2 = mymalloc(k-4+1); strncpy(fname2,fname,k-4); fname2[k-4] = 0; k -= 5; initranktables(); mkdecodetable(); fpsi = mymalloc(k+5+1); // fpsd = mymalloc(k+5); // sprintf(fpsd,"%s.psd",fname2); fpsd = fname; // printf("psi_read: read %s\n",fpsd); ps->mappsd = mymmap(fpsd); if (ps->mappsd->addr==NULL) { perror("psi1_read: mmap2\n"); exit(1); } p = q = (uchar *)ps->mappsd->addr; psize1 = ps->mappsd->len; id = getuint(p,0,1); p += 1; if (id != ID_PSI) { printf("read_psi: id = %d is not supported.\n",id); exit(1); } ps->k = k = getuint(p,0,1); p += 1; ps->n = n = getuint(p,0,k); p += k; ps->L = l = getuint(p,0,k); p += k; id = getuint(p,0,1); p += 1; // printf("read_psi: psi_id = %d L = %d\n",id,l); csa->id = ps->id = id; id2 = id & 0x3f; switch (id2) { case ID_DIFF_GAMMA: printf("#psi format = GAMMA L=%d C=%d\n",l,(id>>7)); sprintf(fpsi,"%s.psi",fname2); break; case ID_DIFF_GAMMA_RL: printf("#psi format = GAMMA_RL L=%d C=%d\n",l,(id>>7)); sprintf(fpsi,"%s.pri",fname2); break; case ID_DIFF_GAMMA_SPARSE: printf("#psi format = GAMMA_SPARSE L=%d C=%d\n",l,(id>>7)); sprintf(fpsi,"%s.psi",fname2); break; case ID_DIFF_GAMMA_RL_SPARSE: printf("#psi format = GAMMA_RL_SPARSE L=%d C=%d\n",l,(id>>7)); sprintf(fpsi,"%s.pri",fname2); break; case ID_DIFF_GAMMA_RR: printf("#psi format = GAMMA_RR L=%d C=%d\n",l,(id>>7)); sprintf(fpsi,"%s.pxi",fname2); break; default: printf("read_csa: ID %d is not supported.\n",id); break; } if (id & ID_COMPPTR) { printf("COMPPTR\n"); ps->sx = mymalloc(sizeof(SPARSEARRAY)); ps->sb = mymalloc(sizeof(SPARSEARRAY)); SPARSEARRAY_read(ps->sx, &p); SPARSEARRAY_read(ps->sb, &p); } else { ps->R = p; } // printf("psize = %ld\n",psize); //// read psi // printf("psi_read: map %s\n",fpsi); ps->mappsi = mymmap(fpsi); if (ps->mappsi->addr==NULL) { perror("psi1_read: mmap1\n"); exit(1); } ps->B = (unsigned short *)ps->mappsi->addr; psize2 = ps->mappsi->len; // printf("psize2 = %ld\n",psize2); // printf("psi1_read: psize1 = %ld psize2 = %ld\n",psize1,psize2); ps->psize = psize1 + psize2; free(fpsi); // free(fpsd); free(fname2); // user-specific functions csa->psi = psi1_psi; if (id2 == ID_DIFF_GAMMA_RR) { csa->psi = psi12_psi; csa->psi_pred = csa_psi_pred_naive; csa->psi_succ = csa_psi_succ_naive; } else { if ((id & ID_COMPPTR) || 0) { csa->psi_pred = csa_psi_pred_naive; csa->psi_succ = csa_psi_succ_naive; } else { csa->psi_succ = psi1_succ_tmp; csa->psi_pred = psi1_pred_tmp; // csa->psi_succ = csa_psi_succ_naive; // csa->psi_pred = csa_psi_pred_naive; } } // default functions csa->LF = csa_LF_by_psi; csa->lookup = csa_lookup; csa->inverse = csa_inverse; csa->text = csa_text; csa->substring = csa_substring; csa->T = csa_T; csa->head = csa_head_rank; csa->search = csa_search; csa->searchsub = csa_searchsub; return psize1 + psize2; }