From 9d093988213e7471a5d8ba6042e16c8d2ab5f053 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 27 Oct 2009 17:08:31 -0400 Subject: Make tokenizer a bit more robust. --- dimension/tokenize.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'dimension') diff --git a/dimension/tokenize.c b/dimension/tokenize.c index fc715b8..e1c2fce 100644 --- a/dimension/tokenize.c +++ b/dimension/tokenize.c @@ -27,11 +27,26 @@ dmnsn_array * dmnsn_tokenize(FILE *file) { + if (fseeko(file, 0, SEEK_END) != 0) { + fprintf(stderr, "Couldn't seek on input stream.\n"); + return NULL; + } + + off_t size = ftello(file); + int fd = fileno(file); - off_t size = lseek(fd, 0, SEEK_END); - lseek(fd, 0, SEEK_SET); + if (fd == -1) { + fprintf(stderr, "Couldn't get file descriptor to input stream.\n"); + return NULL; + } + char *map = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0), *next = map; + if (map == MAP_FAILED) { + fprintf(stderr, "Couldn't mmap() input stream.\n"); + return NULL; + } + dmnsn_token token; dmnsn_array *tokens = dmnsn_new_array(sizeof(dmnsn_token)); @@ -60,7 +75,8 @@ dmnsn_tokenize(FILE *file) default: /* Unrecognised character */ - fprintf(stderr, "Unrecognized character 0x%X in input.\n", (unsigned int)*next); + fprintf(stderr, "Unrecognized character 0x%X in input.\n", + (unsigned int)*next); dmnsn_delete_tokens(tokens); munmap(map, size); return NULL; -- cgit v1.2.3