aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryuta.256 <yuta.256@b7c3aa3b-274f-0410-ae0b-edc9d07c929d>2008-07-12 23:38:41 +0000
committeryuta.256 <yuta.256@b7c3aa3b-274f-0410-ae0b-edc9d07c929d>2008-07-12 23:38:41 +0000
commit7347305730fb9cc87bee02744c06fbc2089b1680 (patch)
tree61201f354fba719bf15ac0669e7b0bae3c6cea09
parentbf31e1e0579e95f60b8084055282382b07a9ef21 (diff)
downloadplatform_external_libdivsufsort-7347305730fb9cc87bee02744c06fbc2089b1680.tar.gz
platform_external_libdivsufsort-7347305730fb9cc87bee02744c06fbc2089b1680.tar.bz2
platform_external_libdivsufsort-7347305730fb9cc87bee02744c06fbc2089b1680.zip
Rewrote bwt.c.
-rw-r--r--examples/bwt.c208
1 files changed, 138 insertions, 70 deletions
diff --git a/examples/bwt.c b/examples/bwt.c
index 842712d..5a362d0 100644
--- a/examples/bwt.c
+++ b/examples/bwt.c
@@ -24,129 +24,197 @@
* OTHER DEALINGS IN THE SOFTWARE.
*/
-#ifdef HAVE_CONFIG_H
+#if HAVE_CONFIG_H
# include "config.h"
#endif
-#include <divsufsort.h>
#include <stdio.h>
+#if HAVE_STRING_H
+# include <string.h>
+#endif
#if HAVE_STDLIB_H
# include <stdlib.h>
#endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
+#if HAVE_MEMORY_H
+# include <memory.h>
+#endif
+#if HAVE_STDDEF_H
+# include <stddef.h>
#endif
#if HAVE_STRINGS_H
# include <strings.h>
#endif
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_IO_H && HAVE_FCNTL_H
+# include <io.h>
+# include <fcntl.h>
+#endif
#include <time.h>
+#include <divsufsort.h>
+#include "lfs.h"
static
-saidx_t
-_str2size(const char *str) {
- saidx_t s[3];
- saidx_t t;
- int i, c;
- for(i = 0, t = s[0] = s[1] = s[2] = 0; (c = str[i]) != '\0'; ++i) {
- if(('0' <= c) && (c <= '9')) {
- t = (t * 10) + (c - '0');
- } else {
- switch(c) {
- case 'm':
- case 'M':
- s[0] += t << 20;
- break;
- case 'k':
- case 'K':
- s[1] += t << 10;
- break;
- case 'b':
- case 'B':
- s[2] += t;
- break;
- }
- t = 0;
- }
- }
- return s[0] + s[1] + s[2];
+size_t
+write_int(FILE *fp, saidx_t n) {
+ unsigned char c[4];
+ c[0] = (unsigned char)((n >> 0) & 0xff), c[1] = (unsigned char)((n >> 8) & 0xff),
+ c[2] = (unsigned char)((n >> 16) & 0xff), c[3] = (unsigned char)((n >> 24) & 0xff);
+ return fwrite(c, sizeof(unsigned char), 4, fp);
+}
+
+static
+void
+print_help(const char *progname, int status) {
+ fprintf(stderr,
+ "bwt, a burrows-wheeler transform program, version %s.\n",
+ divsufsort_version());
+ fprintf(stderr, "usage: %s [-b num] INFILE OUTFILE\n", progname);
+ fprintf(stderr, " -b num set block size to num MiB [1..512] (default: 32)\n\n");
+ exit(status);
}
int
main(int argc, const char *argv[]) {
+ FILE *fp, *ofp;
+ const char *fname, *ofname;
sauchar_t *T;
saidx_t *SA;
- saidx_t m, n, blocksize, idx;
+ LFS_OFF_T n;
+ size_t m;
+ saidx_t pidx;
clock_t start,finish;
+ saint_t i, blocksize = 32, needclose = 3;
- /* Check argument. */
- if(((argc != 1) && (argc != 2)) ||
- ((argc == 2) && (strcmp(argv[1], "-h") == 0)) ||
- ((argc == 2) && (strcmp(argv[1], "--help") == 0))) {
- fprintf(stderr,
- "bwt, a burrows-wheeler transform program, version %s.\n"
- , divsufsort_version());
- fprintf(stderr,
- "usage: %s [BLOCKSIZE] < STDIN > STDOUT\n\n"
- , argv[0]);
- exit(EXIT_FAILURE);
+ /* Check arguments. */
+ if((argc == 1) ||
+ (strcmp(argv[1], "-h") == 0) ||
+ (strcmp(argv[1], "--help") == 0)) { print_help(argv[0], EXIT_SUCCESS); }
+ if((argc != 3) && (argc != 5)) { print_help(argv[0], EXIT_FAILURE); }
+ i = 1;
+ if(argc == 5) {
+ if(strcmp(argv[i], "-b") != 0) { print_help(argv[0], EXIT_FAILURE); }
+ blocksize = atoi(argv[i + 1]);
+ if(blocksize < 0) { blocksize = 1; }
+ else if(512 < blocksize) { blocksize = 512; }
+ i += 2;
+ }
+ blocksize <<= 20;
+
+ /* Open a file for reading. */
+ if(strcmp(argv[i], "-") != 0) {
+#if HAVE_FOPEN_S
+ if(fopen_s(&fp, fname = argv[i], "rb") != 0) {
+#else
+ if((fp = LFS_FOPEN(fname = argv[i], "rb")) == NULL) {
+#endif
+ fprintf(stderr, "%s: Cannot open file `%s': ", argv[0], fname);
+ perror(NULL);
+ exit(EXIT_FAILURE);
+ }
+ } else {
+#if HAVE__SETMODE && HAVE__FILENO
+ if(_setmode(_fileno(stdin), _O_BINARY) == -1) {
+ fprintf(stderr, "%s: Cannot set mode: ", argv[0]);
+ perror(NULL);
+ exit(EXIT_FAILURE);
+ }
+#endif
+ fp = stdin;
+ fname = "stdin";
+ needclose ^= 1;
}
- blocksize = (argc == 2) ? _str2size(argv[1]) : 0;
- if(blocksize <= 0) {
- fseek(stdin, 0, SEEK_END);
- blocksize = ftell(stdin);
- if(blocksize < 0) { blocksize = BUFSIZ; }
- rewind(stdin);
+ i += 1;
+
+ /* Open a file for writing. */
+ if(strcmp(argv[i], "-") != 0) {
+#if HAVE_FOPEN_S
+ if(fopen_s(&ofp, ofname = argv[i], "wb") != 0) {
+#else
+ if((ofp = LFS_FOPEN(ofname = argv[i], "wb")) == NULL) {
+#endif
+ fprintf(stderr, "%s: Cannot open file `%s': ", argv[0], ofname);
+ perror(NULL);
+ exit(EXIT_FAILURE);
+ }
+ } else {
+#if HAVE__SETMODE && HAVE__FILENO
+ if(_setmode(_fileno(stdout), _O_BINARY) == -1) {
+ fprintf(stderr, "%s: Cannot set mode: ", argv[0]);
+ perror(NULL);
+ exit(EXIT_FAILURE);
+ }
+#endif
+ ofp = stdout;
+ ofname = "stdout";
+ needclose ^= 2;
}
+ /* Get the file size. */
+ if(LFS_FSEEK(fp, 0, SEEK_END) == 0) {
+ n = LFS_FTELL(fp);
+ rewind(fp);
+ if(n < 0) {
+ fprintf(stderr, "%s: Cannot ftell `%s': ", argv[0], fname);
+ perror(NULL);
+ exit(EXIT_FAILURE);
+ }
+ if(0x20000000L < n) { n = 0x20000000L; }
+ if((blocksize == 0) || (n < blocksize)) { blocksize = (saidx_t)n; }
+ } else if(blocksize == 0) { blocksize = 32 << 20; }
+
/* Allocate 5blocksize bytes of memory. */
- if(((T = malloc(blocksize * sizeof(sauchar_t))) == NULL) ||
- ((SA = malloc(blocksize * sizeof(saidx_t))) == NULL)) {
+ T = (sauchar_t *)malloc(blocksize * sizeof(sauchar_t));
+ SA = (saidx_t *)malloc(blocksize * sizeof(saidx_t));
+ if((T == NULL) || (SA == NULL)) {
fprintf(stderr, "%s: Cannot allocate memory.\n", argv[0]);
exit(EXIT_FAILURE);
}
/* Write the blocksize. */
- if(fwrite(&blocksize, sizeof(saidx_t), 1, stdout) != 1) {
- fprintf(stderr, "%s: Cannot write to `stdout': ", argv[0]);
+ if(write_int(ofp, blocksize) != 4) {
+ fprintf(stderr, "%s: Cannot write to `%s': ", argv[0], ofname);
perror(NULL);
exit(EXIT_FAILURE);
}
- fprintf(stderr, " BWT (blocksize %d) ... ", (int)blocksize);
- start=clock();
- for(n = 0; 0 < (m = fread(T, sizeof(sauchar_t), blocksize, stdin)); n += m) {
+ fprintf(stderr, " BWT (blocksize %" PRIdSAINT_T ") ... ", blocksize);
+ start = clock();
+ for(n = 0; 0 < (m = fread(T, sizeof(sauchar_t), blocksize, fp)); n += m) {
/* Burrows-Wheeler Transform. */
- idx = divbwt(T, T, SA, m);
- if(idx < 0) {
+ pidx = divbwt(T, T, SA, m);
+ if(pidx < 0) {
fprintf(stderr, "%s (bw_transform): %s.\n",
argv[0],
- (idx == -1) ? "Invalid arguments" : "Cannot allocate memory");
+ (pidx == -1) ? "Invalid arguments" : "Cannot allocate memory");
exit(EXIT_FAILURE);
}
/* Write the bwted data. */
- if((fwrite(&idx, sizeof(saidx_t), 1, stdout) != 1) ||
- (fwrite(T, sizeof(sauchar_t), m, stdout) != m)) {
- fprintf(stderr, "%s: Cannot write to `stdout': ", argv[0]);
+ if((write_int(ofp, pidx) != 4) ||
+ (fwrite(T, sizeof(sauchar_t), m, ofp) != m)) {
+ fprintf(stderr, "%s: Cannot write to `%s': ", argv[0], ofname);
perror(NULL);
exit(EXIT_FAILURE);
}
}
- if(ferror(stdin)) {
- fprintf(stderr, "%s: Cannot read from `stdin': ", argv[0]);
+ if(ferror(fp)) {
+ fprintf(stderr, "%s: Cannot read from `%s': ", argv[0], fname);
perror(NULL);
exit(EXIT_FAILURE);
}
finish = clock();
- fprintf(stderr, "%d bytes: %.4f sec\n",
- (int)n, (double)(finish - start) / (double)CLOCKS_PER_SEC);
+ fprintf(stderr, "%" PRIdOFF_T " bytes: %.4f sec\n",
+ n, (double)(finish - start) / (double)CLOCKS_PER_SEC);
+
+ /* Close files */
+ if(needclose & 1) { fclose(fp); }
+ if(needclose & 2) { fclose(ofp); }
/* Deallocate memory. */
- free(T);
free(SA);
+ free(T);
return 0;
}