void bw_to_psi(FILE *out, CSA *csa, char *fbw, char *flst, int *k) { FILE *in; i64 last,i,j; i64 C2[SIGMA]; i64 c; in = fopen(flst,"r"); if (in == NULL) { perror("bw_to_psi:"); exit(1); } fscanf(in,"%ld",&last); fclose(in); for (c=0; c<SIGMA; c++) { csa->C[c] = 0; } in = fopen(fbw,"r"); if (in == NULL) { perror("bw_to_psi:"); exit(1); } csa->n = 0; while (1) { display_progressbar("reading ",csa->n,0L); c = fgetc(in); if (c == EOF) break; csa->C[c]++; csa->n++; } rewind(in); printf("n = %ld last = %ld\n",csa->n,last); *k = (blog(csa->n+1)+1+8-1)/8; for (c=0; c<SIGMA; c++) { psi[c] = open_diskbuf(out,*k); } for (j=1,c=0; c<SIGMA; c++) { C2[c] = j; j += csa->C[c]; } for (i = 0; i<=csa->n; i++) { display_progressbar("computing psi ",i,csa->n); if (i == last) { setint_diskbuf(psi[0], 0, i); } else { c = fgetc(in); setint_diskbuf(psi[c], C2[c]++, i); } } fclose(in); for (c=0; c<SIGMA; c++) { close_diskbuf(psi[c]); } }
void bw_to_psi(FILE *out, CSA *csa, char *fbw, char *flst, int *k) { FILE *in; i64 last,i,j; i64 *C2; i64 c; diskbuf **psi; int sigma; int k2; in = fopen(flst,"r"); if (in == NULL) { perror("bw_to_psi:"); exit(1); } fscanf(in,"%ld",&last); fclose(in); sigma = csa->sigma; k2 = csa->k2; csa->C = mymalloc(sizeof(*csa->C)*sigma); C2 = mymalloc(sizeof(*C2)*sigma); for (c=0; c<sigma; c++) { csa->C[c] = 0; } in = fopen(fbw,"r"); if (in == NULL) { perror("bw_to_psi:"); exit(1); } csa->n = 0; while (1) { display_progressbar("reading ",csa->n,0L); // c = fgetc(in); c = readint(k2,in); if (c == EOF) break; if (c >= sigma) { printf("bw_to_psi: c = %d sigma = %d\n", c, sigma); exit(1); } csa->C[c]++; csa->n++; } rewind(in); printf("n = %ld last = %ld\n",csa->n,last); psi = mymalloc(sizeof(diskbuf)*sigma); *k = (blog(csa->n+1)+1+8-1)/8; for (c=0; c<sigma; c++) { psi[c] = open_diskbuf(out,*k); } for (j=1,c=0; c<sigma; c++) { C2[c] = j; j += csa->C[c]; } for (i = 0; i<=csa->n; i++) { display_progressbar("computing psi ",i,csa->n); if (i == last) { setint_diskbuf(psi[0], 0, i); } else { // c = fgetc(in); c = readint(k2,in); setint_diskbuf(psi[c], C2[c]++, i); } } fclose(in); for (c=0; c<sigma; c++) { close_diskbuf(psi[c]); } free(psi); free(C2); }