From ab11e076bf90ee2f59016bbbc4a781c9142f30b2 Mon Sep 17 00:00:00 2001 From: Dana Robinson <43805+derobins@users.noreply.github.com> Date: Thu, 18 Jan 2024 09:03:59 -0800 Subject: Replace off_t with HDoff_t internally (#3944) off_t is a 32-bit signed value on Windows, so we should use HDoff_t (which is __int64 on Windows) internally instead. Also defines HDftell on Windows to be _ftelli64(). --- hl/tools/gif2h5/gif2hdf.c | 6 +++--- src/H5Pdcpl.c | 2 +- src/H5Ppublic.h | 3 +++ src/H5win32defs.h | 3 ++- test/h5test.c | 18 +++++++++--------- testpar/t_subfiling_vfd.c | 2 +- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/hl/tools/gif2h5/gif2hdf.c b/hl/tools/gif2h5/gif2hdf.c index 9220655..161761c 100644 --- a/hl/tools/gif2h5/gif2hdf.c +++ b/hl/tools/gif2h5/gif2hdf.c @@ -26,8 +26,8 @@ main(int argv, char *argc[]) FILE *fpGif; /* replacing int32 with long */ - long i, ImageCount; - long filesize; + long i, ImageCount; + HDoff_t filesize; GIFBYTE *MemGif; GIFBYTE *StartPos; @@ -71,7 +71,7 @@ main(int argv, char *argc[]) /* Get the whole file into memory. Mem's much faster than I/O */ fseek(fpGif, 0L, 2); - filesize = ftell(fpGif); + filesize = HDftell(fpGif); fseek(fpGif, 0L, 0); if (filesize == 0) diff --git a/src/H5Pdcpl.c b/src/H5Pdcpl.c index cdee942..ae426ee 100644 --- a/src/H5Pdcpl.c +++ b/src/H5Pdcpl.c @@ -1550,7 +1550,7 @@ H5P__dcrt_ext_file_list_dec(const void **_pp, void *_value) enc_size = *(*pp)++; assert(enc_size < 256); UINT64DECODE_VAR(*pp, enc_value, enc_size); - efl->slot[u].offset = (off_t)enc_value; + efl->slot[u].offset = (HDoff_t)enc_value; /* decode size */ enc_size = *(*pp)++; diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h index df0ede1..98b7c2f 100644 --- a/src/H5Ppublic.h +++ b/src/H5Ppublic.h @@ -6477,6 +6477,9 @@ H5_DLL herr_t H5Pset_dset_no_attrs_hint(hid_t dcpl_id, hbool_t minimize); * when H5Dwrite() is called to write data to it, the library * will create the file. * + * \note On Windows, off_t is typically a 32-bit signed long value, which + * limits the valid offset that can be set to 2 GiB. + * * \since 1.0.0 * */ diff --git a/src/H5win32defs.h b/src/H5win32defs.h index ba6028a..a9a4628 100644 --- a/src/H5win32defs.h +++ b/src/H5win32defs.h @@ -22,7 +22,7 @@ /* off_t exists on Windows, but is always a 32-bit long, even on 64-bit Windows, * so we define HDoff_t to be __int64, which is the type of the st_size field - * of the _stati64 struct. + * of the _stati64 struct and what is returned by _ftelli64(). */ #define HDoff_t __int64 @@ -42,6 +42,7 @@ struct timezone { #define HDcreat(S, M) Wopen_utf8(S, O_CREAT | O_TRUNC | O_RDWR, M) #define HDflock(F, L) Wflock(F, L) #define HDfstat(F, B) _fstati64(F, B) +#define HDftell(F) _ftelli64(F) #define HDgetdcwd(D, S, Z) _getdcwd(D, S, Z) #define HDgetdrive() _getdrive() #define HDgettimeofday(V, Z) Wgettimeofday(V, Z) diff --git a/test/h5test.c b/test/h5test.c index 8efebd7..77a65c2 100644 --- a/test/h5test.c +++ b/test/h5test.c @@ -1809,7 +1809,7 @@ h5_get_version_string(H5F_libver_t libver) /*------------------------------------------------------------------------- * Function: h5_compare_file_bytes() * - * Purpose: Helper function to compare two files byte-for-byte. + * Purpose: Helper function to compare two files byte-for-byte * * Return: Success: 0, if files are identical * Failure: -1, if files differ @@ -1819,14 +1819,14 @@ h5_get_version_string(H5F_libver_t libver) int h5_compare_file_bytes(char *f1name, char *f2name) { - FILE *f1ptr = NULL; /* two file pointers */ - FILE *f2ptr = NULL; - off_t f1size = 0; /* size of the files */ - off_t f2size = 0; - char f1char = 0; /* one char from each file */ - char f2char = 0; - off_t ii = 0; - int ret_value = 0; /* for error handling */ + FILE *f1ptr = NULL; /* two file pointers */ + FILE *f2ptr = NULL; + HDoff_t f1size = 0; /* size of the files */ + HDoff_t f2size = 0; + char f1char = 0; /* one char from each file */ + char f2char = 0; + HDoff_t ii = 0; + int ret_value = 0; /* for error handling */ /* Open files for reading */ f1ptr = fopen(f1name, "rb"); diff --git a/testpar/t_subfiling_vfd.c b/testpar/t_subfiling_vfd.c index 4f109cb..2ebb0e4 100644 --- a/testpar/t_subfiling_vfd.c +++ b/testpar/t_subfiling_vfd.c @@ -320,7 +320,7 @@ test_config_file(void) FILE *config_file; char *config_filename = NULL; char *config_buf = NULL; - long config_file_len; + HDoff_t config_file_len; hid_t file_id = H5I_INVALID_HID; hid_t fapl_id = H5I_INVALID_HID; int read_stripe_count; -- cgit v0.12