rktio: better file size and timestamp types

This commit is contained in:
Matthew Flatt 2017-06-14 16:09:43 -06:00
parent d9d8c7758d
commit 49e30ea6fb
6 changed files with 32 additions and 44 deletions

View File

@ -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,

View File

@ -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 */

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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 {