From 49e30ea6fbb51b23cdab02a6bd4fbe47f2e0b2db Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 14 Jun 2017 16:09:43 -0600 Subject: [PATCH] rktio: better file size and timestamp types --- racket/src/racket/src/file.c | 7 +++---- racket/src/rktio/rktio.h | 11 ++++------- racket/src/rktio/rktio_config.h.in | 13 +++++++++++++ racket/src/rktio/rktio_fs.c | 17 ++++++----------- racket/src/rktio/rktio_private.h | 13 ------------- racket/src/rktio/rktio_time.c | 15 ++++++--------- 6 files changed, 32 insertions(+), 44 deletions(-) diff --git a/racket/src/racket/src/file.c b/racket/src/racket/src/file.c index c3a3ee02c5..4ef3785b9b 100644 --- a/racket/src/racket/src/file.c +++ b/racket/src/racket/src/file.c @@ -4942,9 +4942,8 @@ static Scheme_Object *file_identity(int argc, Scheme_Object *argv[]) static Scheme_Object *file_size(int argc, Scheme_Object *argv[]) { - rktio_size_t *sz; + rktio_filesize_t *sz; char *filename; - mzlonglong len = 0; if (!SCHEME_PATH_STRINGP(argv[0])) scheme_wrong_contract("file-size", "path-string?", 0, argc, argv); @@ -4956,9 +4955,9 @@ static Scheme_Object *file_size(int argc, Scheme_Object *argv[]) sz = rktio_file_size(scheme_rktio, filename); if (sz) { - len = ((mzlonglong)sz->hi << 32) + (mzlonglong)sz->lo; + mzlonglong szv = *sz; free(sz); - return scheme_make_integer_value_from_long_long(len); + return scheme_make_integer_value_from_long_long(szv); } scheme_raise_exn(MZEXN_FAIL_FILESYSTEM, diff --git a/racket/src/rktio/rktio.h b/racket/src/rktio/rktio.h index 61597248c4..5cf6fe984e 100644 --- a/racket/src/rktio/rktio.h +++ b/racket/src/rktio/rktio.h @@ -341,13 +341,10 @@ RKTIO_EXTERN rktio_ok_t rktio_make_link(rktio_t *rktio, char *src, char *dest, /*************************************************/ /* File attributes */ -typedef struct { - unsigned lo, hi; -} rktio_size_t; - +typedef rktio_int64_t rktio_filesize_t; typedef intptr_t rktio_timestamp_t; -RKTIO_EXTERN rktio_size_t *rktio_file_size(rktio_t *rktio, char *filename); +RKTIO_EXTERN rktio_filesize_t *rktio_file_size(rktio_t *rktio, char *filename); RKTIO_EXTERN rktio_timestamp_t *rktio_get_file_modify_seconds(rktio_t *rktio, char *file); RKTIO_EXTERN rktio_ok_t rktio_set_file_modify_seconds(rktio_t *rktio, char *file, rktio_timestamp_t secs); @@ -463,8 +460,8 @@ RKTIO_EXTERN double rktio_get_inexact_milliseconds(void); RKTIO_EXTERN intptr_t rktio_get_process_milliseconds(rktio_t *rktio); RKTIO_EXTERN intptr_t rktio_get_process_children_milliseconds(rktio_t *rktio); -RKTIO_EXTERN intptr_t rktio_get_seconds(rktio_t *rktio); -RKTIO_EXTERN rktio_date_t *rktio_seconds_to_date(rktio_t *rktio, intptr_t seconds, intptr_t nanoseconds, int get_gmt); +RKTIO_EXTERN rktio_timestamp_t rktio_get_seconds(rktio_t *rktio); +RKTIO_EXTERN rktio_date_t *rktio_seconds_to_date(rktio_t *rktio, rktio_timestamp_t seconds, int nanoseconds, int get_gmt); /*************************************************/ /* Errors */ diff --git a/racket/src/rktio/rktio_config.h.in b/racket/src/rktio/rktio_config.h.in index 7bd90865e7..75adbd25d7 100644 --- a/racket/src/rktio/rktio_config.h.in +++ b/racket/src/rktio/rktio_config.h.in @@ -21,6 +21,19 @@ typedef long intptr_t; typedef unsigned long uintptr_t; #endif +#ifdef RKTIO_SYSTEM_WINDOWS +# ifdef _MSC_VER +typedef _int64 rktio_int64_t; +typedef unsigned _int64 rktio_uint64_t; +# else +typedef __int64 rktio_int64_t; +typedef unsigned __int64 rktio_uint64_t; +# endif +#else +typedef long long rktio_int64_t; +typedef unsigned long long rktio_uint64_t; +#endif + /* Whether pthread is available */ #undef RKTIO_USE_PTHREADS diff --git a/racket/src/rktio/rktio_fs.c b/racket/src/rktio/rktio_fs.c index 4098b57d36..972ae08f61 100644 --- a/racket/src/rktio/rktio_fs.c +++ b/racket/src/rktio/rktio_fs.c @@ -337,7 +337,7 @@ static char *UNC_readlink(rktio_t *rktio, const char *fn) } static int UNC_stat(rktio_t *rktio, const char *dirname, int *flags, int *isdir, int *islink, - rktio_timestamp_t **date, rktio_size_t *filesize, + rktio_timestamp_t **date, rktio_filesize_t *filesize, const char **resolved_path, int set_flags) /* dirname must be absolute */ { @@ -495,8 +495,7 @@ static int UNC_stat(rktio_t *rktio, const char *dirname, int *flags, int *isdir, *isdir = (GET_FF_ATTRIBS(fad) & FF_A_DIR); } if (filesize) { - filesize->lo = fad.nFileSizeLow; - filesize->hi = fad.nFileSizeHigh; + *filesize = ((rktio_filesize_t)fad.nFileSizeHigh << 32) + fad.nFileSizeLow; } } free(copy); @@ -1275,9 +1274,9 @@ int rktio_set_file_or_directory_permissions(rktio_t *rktio, char *filename, int # endif } -rktio_size_t *rktio_file_size(rktio_t *rktio, char *filename) +rktio_filesize_t *rktio_file_size(rktio_t *rktio, char *filename) { - rktio_size_t *sz = NULL; + rktio_filesize_t *sz = NULL; #ifdef RKTIO_SYSTEM_WINDOWS { rktio_size_t sz_v; @@ -1306,12 +1305,8 @@ rktio_size_t *rktio_file_size(rktio_t *rktio, char *filename) return NULL; } - sz = malloc(sizeof(rktio_size_t)); - sz->lo = ((unsigned)buf.st_size & 0xFFFFFFFF); - if (sizeof(buf.st_size) > 4) - sz->hi = (buf.st_size >> 32); - else - sz->hi = 0; + sz = malloc(sizeof(rktio_filesize_t)); + *sz = buf.st_size; return sz; } diff --git a/racket/src/rktio/rktio_private.h b/racket/src/rktio/rktio_private.h index 6fb4300dd3..3793136dcf 100644 --- a/racket/src/rktio/rktio_private.h +++ b/racket/src/rktio/rktio_private.h @@ -289,16 +289,3 @@ void rktio_init_wide(rktio_t *rktio); #ifdef RKTIO_USE_FCNTL_AND_FORK_FOR_FILE_LOCKS void rktio_release_lockf(rktio_t *rktio, int fd); #endif - -#ifdef RKTIO_SYSTEM_WINDOWS -# ifdef _MSC_VER -typedef _int64 rktio_int64_t; -typedef unsigned _int64 rktio_uint64_t; -# else -typedef __int64 rktio_int64_t; -typedef unsigned __int64 rktio_uint64_t; -# endif -#else -typedef long long rktio_int64_t; -typedef unsigned long long rktio_uint64_t; -#endif diff --git a/racket/src/rktio/rktio_time.c b/racket/src/rktio/rktio_time.c index c3ea75041f..eabc05f239 100644 --- a/racket/src/rktio/rktio_time.c +++ b/racket/src/rktio/rktio_time.c @@ -175,7 +175,7 @@ intptr_t rktio_get_process_children_milliseconds(rktio_t *rktio) #endif } -intptr_t rktio_get_seconds(rktio_t *rktio) +rktio_timestamp_t rktio_get_seconds(rktio_t *rktio) { #ifdef RKTIO_SYSTEM_WINDOWS return (intptr_t)(get_hectonanoseconds_as_longlong() / (rktio_int64_t)10000000); @@ -314,9 +314,8 @@ static int VALID_TIME_RANGE(intptr_t lnow) #endif -rktio_date_t *rktio_seconds_to_date(rktio_t *rktio, intptr_t seconds, intptr_t nanoseconds, int get_gmt) +rktio_date_t *rktio_seconds_to_date(rktio_t *rktio, rktio_timestamp_t seconds, int nanoseconds, int get_gmt) { - intptr_t lnow; int hour, min, sec, month, day, wday, yday, dst; intptr_t year; long tzoffset; @@ -331,17 +330,15 @@ rktio_date_t *rktio_seconds_to_date(rktio_t *rktio, intptr_t seconds, intptr_t n char *tzn; rktio_date_t *result; - lnow = seconds; - - if ((((intptr_t)(now = (CHECK_TIME_T)lnow)) == lnow) - && VALID_TIME_RANGE(lnow)) { + if ((((intptr_t)(now = (CHECK_TIME_T)seconds)) == seconds) + && VALID_TIME_RANGE(seconds)) { int success; #ifdef RKTIO_SYSTEM_WINDOWS { rktio_uint64_t tmpC; - tmpC = ((rktio_uint64_t)lnow * 10000000); - if ((rktio_int64_t)tmpC / 10000000 != lnow) { + tmpC = ((rktio_uint64_t)seconds * 10000000); + if ((rktio_int64_t)tmpC / 10000000 != seconds) { /* overflow */ success = 0; } else {