/* Burrows-Wheeler transform. */ saint_t bw_transform(const sauchar_t *T, sauchar_t *U, saidx_t *SA, saidx_t n, saidx_t *idx) { saidx_t *A, i, j, p, t; saint_t c; /* Check arguments. */ if((T == NULL) || (U == NULL) || (n < 0) || (idx == NULL)) { return -1; } if(n <= 1) { if(n == 1) { U[0] = T[0]; } *idx = n; return 0; } if((A = SA) == NULL) { i = divbwt(T, U, NULL, n); if(0 <= i) { *idx = i; i = 0; } return (saint_t)i; } /* BW transform. */ if(T == U) { t = n; for(i = 0, j = 0; i < n; ++i) { p = t - 1; t = A[i]; if(0 <= p) { c = T[j]; U[j] = (j <= p) ? T[p] : (sauchar_t)A[p]; A[j] = c; j++; } else { *idx = i; } } p = t - 1; if(0 <= p) { c = T[j]; U[j] = (j <= p) ? T[p] : (sauchar_t)A[p]; A[j] = c; } else { *idx = i; } } else { U[0] = T[n - 1]; for(i = 0; A[i] != 0; ++i) { U[i + 1] = T[A[i] - 1]; } *idx = i + 1; for(++i; i < n; ++i) { U[i] = T[A[i] - 1]; } } if(SA == NULL) { /* Deallocate memory. */ free(A); } return 0; }
int bsc_bwt_encode(unsigned char * T, int n, unsigned char * num_indexes, int * indexes, int features) { int index = divbwt(T, T, NULL, n, num_indexes, indexes, features & LIBBSC_FEATURE_MULTITHREADING); switch (index) { case -1 : return LIBBSC_BAD_PARAMETER; case -2 : return LIBBSC_NOT_ENOUGH_MEMORY; } return index; }