diff options
Diffstat (limited to 'examples/suftest.c')
-rw-r--r-- | examples/suftest.c | 137 |
1 files changed, 84 insertions, 53 deletions
diff --git a/examples/suftest.c b/examples/suftest.c index 90b7c83..71892ac 100644 --- a/examples/suftest.c +++ b/examples/suftest.c @@ -24,85 +24,116 @@ * 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 -#include <time.h> -#if HAVE_SYS_STAT_H -# include <sys/stat.h> +#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 +void +print_help(const char *progname, int status) { + fprintf(stderr, + "suftest, a suffixsort tester, version %s.\n", + divsufsort_version()); + fprintf(stderr, "usage: %s FILE\n\n", progname); + exit(status); +} + int main(int argc, const char *argv[]) { FILE *fp; + const char *fname; sauchar_t *T; saidx_t *SA; - saidx_t n; + LFS_OFF_T n; clock_t start, finish; -#if HAVE_SYS_STAT_H - struct stat s; -#endif + saint_t needclose = 1; - /* Check argument. */ - if((argc != 2) || + /* Check arguments. */ + if((argc == 1) || (strcmp(argv[1], "-h") == 0) || - (strcmp(argv[1], "--help") == 0)) { - fprintf(stderr, - "suftest, a suffixsort tester, version %s.\n" - , divsufsort_version()); - fprintf(stderr, - "usage: %s FILE\n\n" - , argv[0]); - exit(EXIT_FAILURE); - } + (strcmp(argv[1], "--help") == 0)) { print_help(argv[0], EXIT_SUCCESS); } + if(argc != 2) { print_help(argv[0], EXIT_FAILURE); } - /* Get a file's status information. */ -#if HAVE_SYS_STAT_H - if(stat(argv[1], &s) != 0) { - fprintf(stderr, "%s: Cannot stat file `%s': ", argv[0], argv[1]); - perror(NULL); - exit(EXIT_FAILURE); - } - n = s.st_size; + /* Open a file for reading. */ + if(strcmp(argv[1], "-") != 0) { +#if HAVE_FOPEN_S + if(fopen_s(&fp, fname = argv[1], "rb") != 0) { +#else + if((fp = LFS_FOPEN(fname = argv[1], "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 = 0; + } - /* Open a file for reading. */ - if((fp = fopen(argv[1], "rb")) == NULL) { - fprintf(stderr, "%s: Cannot open file `%s': ", argv[0], argv[1]); + /* 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(0x7fffffff <= n) { + fprintf(stderr, "%s: Input file `%s' is too big.\n", argv[0], fname); + exit(EXIT_FAILURE); + } + } else { + fprintf(stderr, "%s: Cannot fseek `%s': ", argv[0], fname); perror(NULL); exit(EXIT_FAILURE); } -#if !HAVE_SYS_STAT_H - fseek(fp, 0, SEEK_END); - n = ftell(fp); - rewind(fp); -#endif - /* Allocate 5n bytes of memory. */ - if(((T = malloc(n * sizeof(sauchar_t))) == NULL) || - ((SA = malloc(n * sizeof(saidx_t))) == NULL)) { + T = (sauchar_t *)malloc((size_t)n * sizeof(sauchar_t)); + SA = (saidx_t *)malloc((size_t)n * sizeof(saidx_t)); + if((T == NULL) || (SA == NULL)) { fprintf(stderr, "%s: Cannot allocate memory.\n", argv[0]); exit(EXIT_FAILURE); } /* Read n bytes of data. */ - if(fread(T, sizeof(sauchar_t), n, fp) != n) { + if(fread(T, sizeof(sauchar_t), (size_t)n, fp) != (size_t)n) { fprintf(stderr, "%s: %s `%s': ", argv[0], (ferror(fp) || !feof(fp)) ? "Cannot read from" : "Unexpected EOF in", @@ -110,20 +141,20 @@ main(int argc, const char *argv[]) { perror(NULL); exit(EXIT_FAILURE); } - fclose(fp); + if(needclose & 1) { fclose(fp); } /* Construct the suffix array. */ - fprintf(stderr, "%s: %d bytes ... ", argv[1], (int)n); + fprintf(stderr, "%s: %" PRIdOFF_T " bytes ... ", fname, n); start = clock(); - divsufsort(T, SA, n); + if(divsufsort(T, SA, (saidx_t)n) != 0) { + fprintf(stderr, "%s: Cannot allocate memory.\n", argv[0]); + exit(EXIT_FAILURE); + } finish = clock(); - fprintf(stderr, "%.4f sec\n", - (double)(finish - start) / (double)CLOCKS_PER_SEC); + fprintf(stderr, "%.4f sec\n", (double)(finish - start) / (double)CLOCKS_PER_SEC); /* Check the suffix array. */ - if(sufcheck(T, SA, n, 1) != 0) { - exit(EXIT_FAILURE); - } + if(sufcheck(T, SA, (saidx_t)n, 1) != 0) { exit(EXIT_FAILURE); } /* Deallocate memory. */ free(SA); |