示例#1
0
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]);
	}
}
示例#2
0
文件: csa.c 项目: sadakane/csalib
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);
}