From 605b34f1cdb8eb10c05198cfdf4e0a628592d9cf Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 28 Oct 2009 21:40:50 -0400 Subject: Set the locale to `C' during tokenization. --- dimension/tokenize.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) (limited to 'dimension/tokenize.c') diff --git a/dimension/tokenize.c b/dimension/tokenize.c index 4e3244a..9eeab45 100644 --- a/dimension/tokenize.c +++ b/dimension/tokenize.c @@ -18,13 +18,13 @@ *************************************************************************/ #include "tokenize.h" -#include +#include /* For strtoul(), etc. */ #include #include -#include -#include -#include -#include +#include /* For isalpha(), etc. */ +#include /* For mmap() */ +#include /* For dirname() */ +#include static void dmnsn_diagnostic(const char *filename, unsigned int line, unsigned int col, @@ -277,6 +277,14 @@ dmnsn_tokenize_string(const char *filename, dmnsn_array * dmnsn_tokenize(const char *filename, FILE *file) { + /* Save the current locale */ + char *lc_ctype = strdup(setlocale(LC_CTYPE, NULL)); + char *lc_numeric = strdup(setlocale(LC_NUMERIC, NULL)); + + /* Set the locale to `C' to make isalpha(), strtoul(), etc. consistent */ + setlocale(LC_CTYPE, "C"); + setlocale(LC_NUMERIC, "C"); + if (fseeko(file, 0, SEEK_END) != 0) { fprintf(stderr, "Couldn't seek on input stream\n"); return NULL; @@ -471,11 +479,25 @@ dmnsn_tokenize(const char *filename, FILE *file) } munmap(map, size); + + /* Restore the original locale */ + setlocale(LC_CTYPE, lc_ctype); + setlocale(LC_NUMERIC, lc_numeric); + free(lc_ctype); + free(lc_numeric); + return tokens; bailout: dmnsn_delete_tokens(tokens); munmap(map, size); + + /* Restore the original locale */ + setlocale(LC_CTYPE, lc_ctype); + setlocale(LC_NUMERIC, lc_numeric); + free(lc_ctype); + free(lc_numeric); + return NULL; } -- cgit v1.2.3