mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
[svn-r21228] Added #ifdefs around #include unistd.h and created windows getlogin() function for building HDF5 parallel on windows.
Reviewed and tested locally and tested by user.
This commit is contained in:
parent
03a4dd9fc3
commit
8d80bf4a93
@ -13,7 +13,9 @@
|
||||
* access to either file, you may request a copy from help@hdfgroup.org. *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#ifdef H5_HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
@ -23,6 +25,11 @@
|
||||
#include "hdf5.h"
|
||||
|
||||
/* Local macros */
|
||||
#ifdef _MSC_VER /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDgetlogin() Wgetlogin()
|
||||
#else /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDgetlogin() getlogin()
|
||||
#endif /* H5_HAVE_VISUAL_STUDIO */
|
||||
|
||||
/*
|
||||
* HDF Boolean type.
|
||||
@ -115,13 +122,13 @@ static hid_t create_fapl(MPI_Comm comm, MPI_Info info, int acc_type )
|
||||
|
||||
/* set parallel access with communicator, using MPI-I/O driver */
|
||||
if (acc_type == FACC_MPIO) {
|
||||
ret = H5Pset_fapl_mpio(fapl, comm, info);
|
||||
ret = H5Pset_fapl_mpio(fapl, comm, info);
|
||||
assert(ret>=0);
|
||||
} /* end if */
|
||||
|
||||
/* set parallel access with communicator, using MPI-posix driver */
|
||||
if (acc_type == FACC_MPIPOSIX) {
|
||||
ret = H5Pset_fapl_mpiposix(fapl, comm, use_gpfs);
|
||||
ret = H5Pset_fapl_mpiposix(fapl, comm, use_gpfs);
|
||||
assert(ret>=0);
|
||||
} /* end if */
|
||||
|
||||
@ -312,7 +319,7 @@ int main(int argc, char *argv[])
|
||||
char *login; /* Pointer to login name */
|
||||
|
||||
/* Get the login name for this user */
|
||||
login=getlogin();
|
||||
login=HDgetlogin();
|
||||
if(login==NULL)
|
||||
login=DEFAULT_USERNAME;
|
||||
|
||||
|
@ -55,10 +55,19 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef H5_HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(H5_TIME_WITH_SYS_TIME)
|
||||
# include <sys/time.h>
|
||||
# include <time.h>
|
||||
#elif defined(H5_HAVE_SYS_TIME_H)
|
||||
# include <sys/time.h>
|
||||
#else
|
||||
# include <time.h>
|
||||
#endif
|
||||
#include <mpi.h>
|
||||
#ifndef MPI_FILE_NULL /*MPIO may be defined in mpi.h already */
|
||||
# include <mpio.h>
|
||||
@ -299,7 +308,7 @@ die_jar_jar_die:
|
||||
#if H5_HAVE_SETENV
|
||||
/* no setenv or unsetenv */
|
||||
/* clear the environment variable if it was set earlier */
|
||||
if (opt_pvfstab_set){
|
||||
if (opt_pvfstab_set){
|
||||
unsetenv("PVFSTAB_FILE");
|
||||
}
|
||||
#endif
|
||||
|
105
perform/perf.c
105
perform/perf.c
@ -28,10 +28,19 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef H5_HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <sys/time.h>
|
||||
#if defined(H5_TIME_WITH_SYS_TIME)
|
||||
# include <sys/time.h>
|
||||
# include <time.h>
|
||||
#elif defined(H5_HAVE_SYS_TIME_H)
|
||||
# include <sys/time.h>
|
||||
#else
|
||||
# include <time.h>
|
||||
#endif
|
||||
#include <mpi.h>
|
||||
#ifndef MPI_FILE_NULL /*MPIO may be defined in mpi.h already */
|
||||
# include <mpio.h>
|
||||
@ -45,30 +54,30 @@
|
||||
#define H5FATAL 1
|
||||
#define VRFY(val, mesg, fatal) do { \
|
||||
if (!val) { \
|
||||
printf("Proc %d: ", mynod); \
|
||||
printf("Proc %d: ", mynod); \
|
||||
printf("*** Assertion failed (%s) at line %4d in %s\n", \
|
||||
mesg, (int)__LINE__, __FILE__); \
|
||||
if (fatal){ \
|
||||
fflush(stdout); \
|
||||
goto die_jar_jar_die; \
|
||||
} \
|
||||
mesg, (int)__LINE__, __FILE__); \
|
||||
if (fatal){ \
|
||||
fflush(stdout); \
|
||||
goto die_jar_jar_die; \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
#define RANK 1
|
||||
hsize_t dims[RANK]; /* dataset dim sizes */
|
||||
hsize_t dims[RANK]; /* dataset dim sizes */
|
||||
hsize_t block[RANK], stride[RANK], count[RANK];
|
||||
hssize_t start[RANK];
|
||||
hid_t fid; /* HDF5 file ID */
|
||||
hid_t acc_tpl; /* File access templates */
|
||||
hid_t sid; /* Dataspace ID */
|
||||
hid_t file_dataspace; /* File dataspace ID */
|
||||
hid_t mem_dataspace; /* memory dataspace ID */
|
||||
hid_t dataset; /* Dataset ID */
|
||||
hsize_t opt_alignment = 1;
|
||||
hsize_t opt_threshold = 1;
|
||||
int opt_split_vfd = 0;
|
||||
char *meta_ext, *raw_ext; /* holds the meta and raw file extension if */
|
||||
/* opt_split_vfd is set */
|
||||
hid_t acc_tpl; /* File access templates */
|
||||
hid_t sid; /* Dataspace ID */
|
||||
hid_t file_dataspace; /* File dataspace ID */
|
||||
hid_t mem_dataspace; /* memory dataspace ID */
|
||||
hid_t dataset; /* Dataset ID */
|
||||
hsize_t opt_alignment = 1;
|
||||
hsize_t opt_threshold = 1;
|
||||
int opt_split_vfd = 0;
|
||||
char *meta_ext, *raw_ext; /* holds the meta and raw file extension if */
|
||||
/* opt_split_vfd is set */
|
||||
|
||||
|
||||
/* DEFAULT VALUES FOR OPTIONS */
|
||||
@ -105,7 +114,7 @@ int main(int argc, char **argv)
|
||||
MPI_File fh;
|
||||
MPI_Status status;
|
||||
int nchars;
|
||||
herr_t ret; /* Generic return value */
|
||||
herr_t ret; /* Generic return value */
|
||||
|
||||
/* startup MPI and determine the rank of this process */
|
||||
MPI_Init(&argc,&argv);
|
||||
@ -155,38 +164,38 @@ int main(int argc, char **argv)
|
||||
|
||||
/* setup file access template with parallel IO access. */
|
||||
if (opt_split_vfd){
|
||||
hid_t mpio_pl;
|
||||
hid_t mpio_pl;
|
||||
|
||||
mpio_pl = H5Pcreate (H5P_FILE_ACCESS);
|
||||
VRFY((acc_tpl >= 0), "", H5FATAL);
|
||||
ret = H5Pset_fapl_mpio(mpio_pl, MPI_COMM_WORLD, MPI_INFO_NULL);
|
||||
VRFY((ret >= 0), "", H5FATAL);
|
||||
mpio_pl = H5Pcreate (H5P_FILE_ACCESS);
|
||||
VRFY((acc_tpl >= 0), "", H5FATAL);
|
||||
ret = H5Pset_fapl_mpio(mpio_pl, MPI_COMM_WORLD, MPI_INFO_NULL);
|
||||
VRFY((ret >= 0), "", H5FATAL);
|
||||
|
||||
/* set optional allocation alignment */
|
||||
if (opt_alignment*opt_threshold != 1){
|
||||
ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
|
||||
VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
|
||||
}
|
||||
/* set optional allocation alignment */
|
||||
if (opt_alignment*opt_threshold != 1){
|
||||
ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
|
||||
VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
|
||||
}
|
||||
|
||||
/* setup file access template */
|
||||
acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
|
||||
VRFY((acc_tpl >= 0), "", H5FATAL);
|
||||
ret = H5Pset_fapl_split(acc_tpl, meta_ext, mpio_pl, raw_ext, mpio_pl);
|
||||
VRFY((ret >= 0), "H5Pset_fapl_split succeeded", H5FATAL);
|
||||
ret = H5Pclose(mpio_pl);
|
||||
VRFY((ret >= 0), "H5Pclose mpio_pl succeeded", H5FATAL);
|
||||
/* setup file access template */
|
||||
acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
|
||||
VRFY((acc_tpl >= 0), "", H5FATAL);
|
||||
ret = H5Pset_fapl_split(acc_tpl, meta_ext, mpio_pl, raw_ext, mpio_pl);
|
||||
VRFY((ret >= 0), "H5Pset_fapl_split succeeded", H5FATAL);
|
||||
ret = H5Pclose(mpio_pl);
|
||||
VRFY((ret >= 0), "H5Pclose mpio_pl succeeded", H5FATAL);
|
||||
}else{
|
||||
/* setup file access template */
|
||||
acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
|
||||
VRFY((acc_tpl >= 0), "", H5FATAL);
|
||||
ret = H5Pset_fapl_mpio(acc_tpl, MPI_COMM_WORLD, MPI_INFO_NULL);
|
||||
VRFY((ret >= 0), "", H5FATAL);
|
||||
/* setup file access template */
|
||||
acc_tpl = H5Pcreate (H5P_FILE_ACCESS);
|
||||
VRFY((acc_tpl >= 0), "", H5FATAL);
|
||||
ret = H5Pset_fapl_mpio(acc_tpl, MPI_COMM_WORLD, MPI_INFO_NULL);
|
||||
VRFY((ret >= 0), "", H5FATAL);
|
||||
|
||||
/* set optional allocation alignment */
|
||||
if (opt_alignment*opt_threshold != 1){
|
||||
ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
|
||||
VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
|
||||
}
|
||||
/* set optional allocation alignment */
|
||||
if (opt_alignment*opt_threshold != 1){
|
||||
ret = H5Pset_alignment(acc_tpl, opt_threshold, opt_alignment );
|
||||
VRFY((ret >= 0), "H5Pset_alignment succeeded", !H5FATAL);
|
||||
}
|
||||
}
|
||||
|
||||
/* create the parallel file */
|
||||
@ -198,7 +207,7 @@ int main(int argc, char **argv)
|
||||
sid = H5Screate_simple(RANK, dims, NULL);
|
||||
VRFY((sid >= 0), "H5Screate_simple succeeded", H5FATAL);
|
||||
dataset = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_CHAR, sid,
|
||||
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
||||
VRFY((dataset >= 0), "H5Dcreate2 succeeded", H5FATAL);
|
||||
|
||||
/* create the memory dataspace and the file dataspace */
|
||||
@ -366,7 +375,7 @@ die_jar_jar_die:
|
||||
#if H5_HAVE_SETENV
|
||||
/* no setenv or unsetenv */
|
||||
/* clear the environment variable if it was set earlier */
|
||||
if (opt_pvfstab_set){
|
||||
if (opt_pvfstab_set){
|
||||
unsetenv("PVFSTAB_FILE");
|
||||
}
|
||||
#endif
|
||||
|
@ -22,7 +22,9 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#ifdef H5_HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <errno.h>
|
||||
|
||||
#include "hdf5.h"
|
||||
|
@ -21,7 +21,7 @@
|
||||
|
||||
/** From H5private.h **/
|
||||
|
||||
#include "H5public.h" /* Include Public Definitions */
|
||||
#include "H5public.h" /* Include Public Definitions */
|
||||
|
||||
|
||||
/*
|
||||
@ -129,11 +129,11 @@
|
||||
#define HDfgetc(F) fgetc(F)
|
||||
#define HDfgetpos(F,P) fgetpos(F,P)
|
||||
#define HDfgets(S,N,F) fgets(S,N,F)
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDfileno(F) _fileno(F)
|
||||
#else /* _WIN32 */
|
||||
#else /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDfileno(F) fileno(F)
|
||||
#endif /* _WIN32 */
|
||||
#endif /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDfloor(X) floor(X)
|
||||
#define HDfmod(X,Y) fmod(X,Y)
|
||||
#define HDfopen(S,M) fopen(S,M)
|
||||
@ -169,7 +169,7 @@ H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
|
||||
* For Unix, if off_t is not 64bit big, try use the pseudo-standard
|
||||
* xxx64 versions if available.
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDfstat(F,B) _fstati64(F,B)
|
||||
#define HDlstat(S,B) _lstati64(S,B)
|
||||
#define HDstat(S,B) _stati64(S,B)
|
||||
@ -202,7 +202,11 @@ H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
|
||||
#define HDgetgrgid(G) getgrgid(G)
|
||||
#define HDgetgrnam(S) getgrnam(S)
|
||||
#define HDgetgroups(Z,G) getgroups(Z,G)
|
||||
#ifdef _MSC_VER /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDgetlogin() Wgetlogin()
|
||||
#else /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDgetlogin() getlogin()
|
||||
#endif /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDgetpgrp() getpgrp()
|
||||
#define HDgetpid() getpid()
|
||||
#define HDgetppid() getppid()
|
||||
@ -235,7 +239,7 @@ H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
|
||||
#define HDlog(X) log(X)
|
||||
#define HDlog10(X) log10(X)
|
||||
#define HDlongjmp(J,N) longjmp(J,N)
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDlseek(F,O,W) _lseeki64(F,O,W)
|
||||
#else
|
||||
#ifdef H5_HAVE_LSEEK64
|
||||
@ -258,18 +262,18 @@ H5_DLL int HDfprintf (FILE *stream, const char *fmt, ...);
|
||||
#define HDmemcpy(X,Y,Z) memcpy((char*)(X),(const char*)(Y),Z)
|
||||
#define HDmemmove(X,Y,Z) memmove((char*)(X),(const char*)(Y),Z)
|
||||
/*
|
||||
* The (void*) cast just avoids a compiler warning in _WIN32
|
||||
* The (void*) cast just avoids a compiler warning in H5_HAVE_VISUAL_STUDIO
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDmemset(X,C,Z) memset((void*)(X),C,Z)
|
||||
#else /* _WIN32 */
|
||||
#else /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDmemset(X,C,Z) memset(X,C,Z)
|
||||
#endif /* _WIN32 */
|
||||
#ifdef _WIN32
|
||||
#endif /* H5_HAVE_VISUAL_STUDIO */
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDmkdir(S,M) _mkdir(S)
|
||||
#else /* _WIN32 */
|
||||
#else /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDmkdir(S,M) mkdir(S,M)
|
||||
#endif /* _WIN32 */
|
||||
#endif /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDmkfifo(S,M) mkfifo(S,M)
|
||||
#define HDmktime(T) mktime(T)
|
||||
#define HDmodf(X,Y) modf(X,Y)
|
||||
@ -331,7 +335,7 @@ int HDremove_all(const char * fname);
|
||||
#define HDsetuid(U) setuid(U)
|
||||
/* Windows does not permit setting the buffer size to values
|
||||
less than 2. */
|
||||
#ifndef _WIN32
|
||||
#ifndef H5_HAVE_WIN32_API
|
||||
#define HDsetvbuf(F,S,M,Z) setvbuf(F,S,M,Z)
|
||||
#else
|
||||
#define HDsetvbuf(F,S,M,Z) setvbuf(F,S,M,(Z>1?Z:2))
|
||||
@ -350,7 +354,7 @@ int HDremove_all(const char * fname);
|
||||
#define HDsin(X) sin(X)
|
||||
#define HDsinh(X) sinh(X)
|
||||
#define HDsleep(N) sleep(N)
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDsnprintf _snprintf /*varargs*/
|
||||
#else
|
||||
#define HDsnprintf snprintf /*varargs*/
|
||||
@ -369,7 +373,7 @@ H5_DLL void HDsrand(unsigned int seed);
|
||||
#endif
|
||||
/* sscanf() variable arguments */
|
||||
|
||||
#define HDstrcasecmp(X,Y) strcasecmp(X,Y)
|
||||
#define HDstrcasecmp(X,Y) strcasecmp(X,Y)
|
||||
#define HDstrcat(X,Y) strcat(X,Y)
|
||||
#define HDstrchr(S,C) strchr(S,C)
|
||||
#define HDstrcmp(X,Y) strcmp(X,Y)
|
||||
@ -415,7 +419,7 @@ H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
|
||||
#define HDumask(N) umask(N)
|
||||
#define HDuname(S) uname(S)
|
||||
#define HDungetc(C,F) ungetc(C,F)
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDunlink(S) _unlink(S)
|
||||
#else
|
||||
#define HDunlink(S) unlink(S)
|
||||
@ -428,7 +432,7 @@ H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
|
||||
#define HDvfprintf(F,FMT,A) vfprintf(F,FMT,A)
|
||||
#define HDvprintf(FMT,A) vprintf(FMT,A)
|
||||
#define HDvsprintf(S,FMT,A) vsprintf(S,FMT,A)
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
# define HDvsnprintf(S,N,FMT,A) _vsnprintf(S,N,FMT,A)
|
||||
#else
|
||||
# define HDvsnprintf(S,N,FMT,A) vsnprintf(S,N,FMT,A)
|
||||
@ -443,9 +447,9 @@ H5_DLL int64_t HDstrtoll (const char *s, const char **rest, int base);
|
||||
* And now for a couple non-Posix functions... Watch out for systems that
|
||||
* define these in terms of macros.
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
#define HDstrdup(S) _strdup(S)
|
||||
#else /* _WIN32 */
|
||||
#else /* H5_HAVE_VISUAL_STUDIO */
|
||||
|
||||
#if !defined strdup && !defined H5_HAVE_STRDUP
|
||||
extern char *strdup(const char *s);
|
||||
@ -453,7 +457,7 @@ extern char *strdup(const char *s);
|
||||
|
||||
#define HDstrdup(S) strdup(S)
|
||||
|
||||
#endif /* _WIN32 */
|
||||
#endif /* H5_HAVE_VISUAL_STUDIO */
|
||||
|
||||
/*
|
||||
* HDF Boolean type.
|
||||
@ -487,7 +491,7 @@ extern const char *opt_arg; /* flag argument (or value) */
|
||||
|
||||
enum {
|
||||
no_arg = 0, /* doesn't take an argument */
|
||||
require_arg, /* requires an argument */
|
||||
require_arg, /* requires an argument */
|
||||
optional_arg /* argument is optional */
|
||||
};
|
||||
|
||||
|
@ -558,6 +558,9 @@ Bug Fixes since HDF5-1.8.0 release
|
||||
|
||||
Performance
|
||||
-------------
|
||||
- ifdefs added to tests around include unistd.h and function to simulate
|
||||
getlogin() on Windows.
|
||||
(ADB - 2011/08/15)
|
||||
- perf_serial test added to Windows projects and check batch file.
|
||||
(ADB - 2009/06/11)
|
||||
|
||||
|
677
src/H5system.c
677
src/H5system.c
@ -15,11 +15,11 @@
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* Created: H5system.c
|
||||
* Aug 21 2006
|
||||
* Quincey Koziol <koziol@hdfgroup.org>
|
||||
* Created: H5system.c
|
||||
* Aug 21 2006
|
||||
* Quincey Koziol <koziol@hdfgroup.org>
|
||||
*
|
||||
* Purpose: System call wrapper implementations.
|
||||
* Purpose: System call wrapper implementations.
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -32,9 +32,9 @@
|
||||
/***********/
|
||||
/* Headers */
|
||||
/***********/
|
||||
#include "H5private.h" /* Generic Functions */
|
||||
#include "H5Fprivate.h" /* File access */
|
||||
#include "H5MMprivate.h" /* Memory management */
|
||||
#include "H5private.h" /* Generic Functions */
|
||||
#include "H5Fprivate.h" /* File access */
|
||||
#include "H5MMprivate.h" /* Memory management */
|
||||
#include "H5Eprivate.h"
|
||||
|
||||
|
||||
@ -75,71 +75,71 @@
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: HDfprintf
|
||||
* Function: HDfprintf
|
||||
*
|
||||
* Purpose: Prints the optional arguments under the control of the format
|
||||
* string FMT to the stream STREAM. This function takes the
|
||||
* same format as fprintf(3c) with a few added features:
|
||||
* Purpose: Prints the optional arguments under the control of the format
|
||||
* string FMT to the stream STREAM. This function takes the
|
||||
* same format as fprintf(3c) with a few added features:
|
||||
*
|
||||
* The conversion modifier `H' refers to the size of an
|
||||
* `hsize_t' or `hssize_t' type. For instance, "0x%018Hx"
|
||||
* prints an `hsize_t' value as a hex number right justified and
|
||||
* zero filled in an 18-character field.
|
||||
* The conversion modifier `H' refers to the size of an
|
||||
* `hsize_t' or `hssize_t' type. For instance, "0x%018Hx"
|
||||
* prints an `hsize_t' value as a hex number right justified and
|
||||
* zero filled in an 18-character field.
|
||||
*
|
||||
* The conversion `a' refers to an `haddr_t' type.
|
||||
* The conversion `a' refers to an `haddr_t' type.
|
||||
*
|
||||
* Return: Success: Number of characters printed
|
||||
* Return: Success: Number of characters printed
|
||||
*
|
||||
* Failure: -1
|
||||
* Failure: -1
|
||||
*
|
||||
* Programmer: Robb Matzke
|
||||
* Programmer: Robb Matzke
|
||||
* Thursday, April 9, 1998
|
||||
*
|
||||
* Modifications:
|
||||
* Robb Matzke, 1999-07-27
|
||||
* The `%a' format refers to an argument of `haddr_t' type
|
||||
* instead of `haddr_t*' and the return value is correct.
|
||||
* Robb Matzke, 1999-07-27
|
||||
* The `%a' format refers to an argument of `haddr_t' type
|
||||
* instead of `haddr_t*' and the return value is correct.
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
int
|
||||
HDfprintf(FILE *stream, const char *fmt, ...)
|
||||
{
|
||||
int n=0, nout = 0;
|
||||
int fwidth, prec;
|
||||
int zerofill;
|
||||
int leftjust;
|
||||
int plussign;
|
||||
int ldspace;
|
||||
int prefix;
|
||||
char modifier[8];
|
||||
int conv;
|
||||
char *rest, format_templ[128];
|
||||
const char *s;
|
||||
va_list ap;
|
||||
int n=0, nout = 0;
|
||||
int fwidth, prec;
|
||||
int zerofill;
|
||||
int leftjust;
|
||||
int plussign;
|
||||
int ldspace;
|
||||
int prefix;
|
||||
char modifier[8];
|
||||
int conv;
|
||||
char *rest, format_templ[128];
|
||||
const char *s;
|
||||
va_list ap;
|
||||
|
||||
assert (stream);
|
||||
assert (fmt);
|
||||
|
||||
va_start (ap, fmt);
|
||||
while (*fmt) {
|
||||
fwidth = prec = 0;
|
||||
zerofill = 0;
|
||||
leftjust = 0;
|
||||
plussign = 0;
|
||||
prefix = 0;
|
||||
ldspace = 0;
|
||||
modifier[0] = '\0';
|
||||
fwidth = prec = 0;
|
||||
zerofill = 0;
|
||||
leftjust = 0;
|
||||
plussign = 0;
|
||||
prefix = 0;
|
||||
ldspace = 0;
|
||||
modifier[0] = '\0';
|
||||
|
||||
if ('%'==fmt[0] && '%'==fmt[1]) {
|
||||
HDputc ('%', stream);
|
||||
fmt += 2;
|
||||
nout++;
|
||||
} else if ('%'==fmt[0]) {
|
||||
s = fmt + 1;
|
||||
if ('%'==fmt[0] && '%'==fmt[1]) {
|
||||
HDputc ('%', stream);
|
||||
fmt += 2;
|
||||
nout++;
|
||||
} else if ('%'==fmt[0]) {
|
||||
s = fmt + 1;
|
||||
|
||||
/* Flags */
|
||||
while(HDstrchr ("-+ #", *s)) {
|
||||
switch(*s) {
|
||||
/* Flags */
|
||||
while(HDstrchr ("-+ #", *s)) {
|
||||
switch(*s) {
|
||||
case '-':
|
||||
leftjust = 1;
|
||||
break;
|
||||
@ -155,61 +155,61 @@ HDfprintf(FILE *stream, const char *fmt, ...)
|
||||
case '#':
|
||||
prefix = 1;
|
||||
break;
|
||||
} /* end switch */ /*lint !e744 Switch statement doesn't _need_ default */
|
||||
s++;
|
||||
} /* end while */
|
||||
} /* end switch */ /*lint !e744 Switch statement doesn't _need_ default */
|
||||
s++;
|
||||
} /* end while */
|
||||
|
||||
/* Field width */
|
||||
if (HDisdigit (*s)) {
|
||||
zerofill = ('0'==*s);
|
||||
fwidth = (int)HDstrtol (s, &rest, 10);
|
||||
s = rest;
|
||||
} else if ('*'==*s) {
|
||||
fwidth = va_arg (ap, int);
|
||||
if (fwidth<0) {
|
||||
leftjust = 1;
|
||||
fwidth = -fwidth;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
/* Field width */
|
||||
if (HDisdigit (*s)) {
|
||||
zerofill = ('0'==*s);
|
||||
fwidth = (int)HDstrtol (s, &rest, 10);
|
||||
s = rest;
|
||||
} else if ('*'==*s) {
|
||||
fwidth = va_arg (ap, int);
|
||||
if (fwidth<0) {
|
||||
leftjust = 1;
|
||||
fwidth = -fwidth;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
|
||||
/* Precision */
|
||||
if ('.'==*s) {
|
||||
s++;
|
||||
if (HDisdigit (*s)) {
|
||||
prec = (int)HDstrtol (s, &rest, 10);
|
||||
s = rest;
|
||||
} else if ('*'==*s) {
|
||||
prec = va_arg (ap, int);
|
||||
s++;
|
||||
}
|
||||
if (prec<1) prec = 1;
|
||||
}
|
||||
/* Precision */
|
||||
if ('.'==*s) {
|
||||
s++;
|
||||
if (HDisdigit (*s)) {
|
||||
prec = (int)HDstrtol (s, &rest, 10);
|
||||
s = rest;
|
||||
} else if ('*'==*s) {
|
||||
prec = va_arg (ap, int);
|
||||
s++;
|
||||
}
|
||||
if (prec<1) prec = 1;
|
||||
}
|
||||
|
||||
/* Extra type modifiers */
|
||||
if (HDstrchr ("ZHhlqLI", *s)) {
|
||||
switch (*s) {
|
||||
/* Extra type modifiers */
|
||||
if (HDstrchr ("ZHhlqLI", *s)) {
|
||||
switch (*s) {
|
||||
/*lint --e{506} Don't issue warnings about constant value booleans */
|
||||
/*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */
|
||||
case 'H':
|
||||
if (sizeof(hsize_t)<sizeof(long)) {
|
||||
modifier[0] = '\0';
|
||||
} else if (sizeof(hsize_t)==sizeof(long)) {
|
||||
HDstrcpy (modifier, "l");
|
||||
} else {
|
||||
HDstrcpy (modifier, H5_PRINTF_LL_WIDTH);
|
||||
}
|
||||
break;
|
||||
case 'Z':
|
||||
if (sizeof(size_t)<sizeof(long)) {
|
||||
modifier[0] = '\0';
|
||||
} else if (sizeof(size_t)==sizeof(long)) {
|
||||
HDstrcpy (modifier, "l");
|
||||
} else {
|
||||
HDstrcpy (modifier, H5_PRINTF_LL_WIDTH);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
case 'H':
|
||||
if (sizeof(hsize_t)<sizeof(long)) {
|
||||
modifier[0] = '\0';
|
||||
} else if (sizeof(hsize_t)==sizeof(long)) {
|
||||
HDstrcpy (modifier, "l");
|
||||
} else {
|
||||
HDstrcpy (modifier, H5_PRINTF_LL_WIDTH);
|
||||
}
|
||||
break;
|
||||
case 'Z':
|
||||
if (sizeof(size_t)<sizeof(long)) {
|
||||
modifier[0] = '\0';
|
||||
} else if (sizeof(size_t)==sizeof(long)) {
|
||||
HDstrcpy (modifier, "l");
|
||||
} else {
|
||||
HDstrcpy (modifier, H5_PRINTF_LL_WIDTH);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* Handle 'I64' modifier for Microsoft's "__int64" type */
|
||||
if(*s=='I' && *(s+1)=='6' && *(s+2)=='4') {
|
||||
modifier[0] = *s;
|
||||
@ -231,144 +231,144 @@ HDfprintf(FILE *stream, const char *fmt, ...)
|
||||
modifier[1] = '\0';
|
||||
} /* end else */
|
||||
} /* end else */
|
||||
break;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
s++;
|
||||
}
|
||||
|
||||
/* Conversion */
|
||||
conv = *s++;
|
||||
/* Conversion */
|
||||
conv = *s++;
|
||||
|
||||
/* Create the format template */
|
||||
sprintf (format_templ, "%%%s%s%s%s%s",
|
||||
leftjust?"-":"", plussign?"+":"",
|
||||
ldspace?" ":"", prefix?"#":"", zerofill?"0":"");
|
||||
if (fwidth>0)
|
||||
sprintf (format_templ+HDstrlen(format_templ), "%d", fwidth);
|
||||
if (prec>0)
|
||||
sprintf (format_templ+HDstrlen(format_templ), ".%d", prec);
|
||||
if (*modifier)
|
||||
sprintf (format_templ+HDstrlen(format_templ), "%s", modifier);
|
||||
sprintf (format_templ+HDstrlen(format_templ), "%c", conv);
|
||||
/* Create the format template */
|
||||
sprintf (format_templ, "%%%s%s%s%s%s",
|
||||
leftjust?"-":"", plussign?"+":"",
|
||||
ldspace?" ":"", prefix?"#":"", zerofill?"0":"");
|
||||
if (fwidth>0)
|
||||
sprintf (format_templ+HDstrlen(format_templ), "%d", fwidth);
|
||||
if (prec>0)
|
||||
sprintf (format_templ+HDstrlen(format_templ), ".%d", prec);
|
||||
if (*modifier)
|
||||
sprintf (format_templ+HDstrlen(format_templ), "%s", modifier);
|
||||
sprintf (format_templ+HDstrlen(format_templ), "%c", conv);
|
||||
|
||||
|
||||
/* Conversion */
|
||||
switch (conv) {
|
||||
case 'd':
|
||||
case 'i':
|
||||
if (!HDstrcmp(modifier, "h")) {
|
||||
short x = (short)va_arg (ap, int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!*modifier) {
|
||||
int x = va_arg (ap, int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!HDstrcmp (modifier, "l")) {
|
||||
long x = va_arg (ap, long);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else {
|
||||
int64_t x = va_arg(ap, int64_t);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
/* Conversion */
|
||||
switch (conv) {
|
||||
case 'd':
|
||||
case 'i':
|
||||
if (!HDstrcmp(modifier, "h")) {
|
||||
short x = (short)va_arg (ap, int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!*modifier) {
|
||||
int x = va_arg (ap, int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!HDstrcmp (modifier, "l")) {
|
||||
long x = va_arg (ap, long);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else {
|
||||
int64_t x = va_arg(ap, int64_t);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'o':
|
||||
case 'u':
|
||||
case 'x':
|
||||
case 'X':
|
||||
if (!HDstrcmp (modifier, "h")) {
|
||||
unsigned short x = (unsigned short)va_arg (ap, unsigned int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!*modifier) {
|
||||
unsigned int x = va_arg (ap, unsigned int); /*lint !e732 Loss of sign not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!HDstrcmp (modifier, "l")) {
|
||||
unsigned long x = va_arg (ap, unsigned long); /*lint !e732 Loss of sign not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else {
|
||||
uint64_t x = va_arg(ap, uint64_t); /*lint !e732 Loss of sign not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
case 'u':
|
||||
case 'x':
|
||||
case 'X':
|
||||
if (!HDstrcmp (modifier, "h")) {
|
||||
unsigned short x = (unsigned short)va_arg (ap, unsigned int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!*modifier) {
|
||||
unsigned int x = va_arg (ap, unsigned int); /*lint !e732 Loss of sign not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!HDstrcmp (modifier, "l")) {
|
||||
unsigned long x = va_arg (ap, unsigned long); /*lint !e732 Loss of sign not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else {
|
||||
uint64_t x = va_arg(ap, uint64_t); /*lint !e732 Loss of sign not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
case 'e':
|
||||
case 'E':
|
||||
case 'g':
|
||||
case 'G':
|
||||
if (!HDstrcmp (modifier, "h")) {
|
||||
float x = (float) va_arg (ap, double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!*modifier || !HDstrcmp (modifier, "l")) {
|
||||
double x = va_arg (ap, double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else {
|
||||
/*
|
||||
* Some compilers complain when `long double' and
|
||||
* `double' are the same thing.
|
||||
*/
|
||||
case 'f':
|
||||
case 'e':
|
||||
case 'E':
|
||||
case 'g':
|
||||
case 'G':
|
||||
if (!HDstrcmp (modifier, "h")) {
|
||||
float x = (float) va_arg (ap, double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else if (!*modifier || !HDstrcmp (modifier, "l")) {
|
||||
double x = va_arg (ap, double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
} else {
|
||||
/*
|
||||
* Some compilers complain when `long double' and
|
||||
* `double' are the same thing.
|
||||
*/
|
||||
#if H5_SIZEOF_LONG_DOUBLE != H5_SIZEOF_DOUBLE
|
||||
long double x = va_arg (ap, long double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
long double x = va_arg (ap, long double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
#else
|
||||
double x = va_arg (ap, double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
double x = va_arg (ap, double);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
case 'a':
|
||||
{
|
||||
haddr_t x = va_arg (ap, haddr_t); /*lint !e732 Loss of sign not really occuring */
|
||||
if (H5F_addr_defined(x)) {
|
||||
sprintf(format_templ, "%%%s%s%s%s%s",
|
||||
leftjust?"-":"", plussign?"+":"",
|
||||
ldspace?" ":"", prefix?"#":"",
|
||||
zerofill?"0":"");
|
||||
if (fwidth>0)
|
||||
sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth);
|
||||
haddr_t x = va_arg (ap, haddr_t); /*lint !e732 Loss of sign not really occuring */
|
||||
if (H5F_addr_defined(x)) {
|
||||
sprintf(format_templ, "%%%s%s%s%s%s",
|
||||
leftjust?"-":"", plussign?"+":"",
|
||||
ldspace?" ":"", prefix?"#":"",
|
||||
zerofill?"0":"");
|
||||
if (fwidth>0)
|
||||
sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth);
|
||||
|
||||
/*lint --e{506} Don't issue warnings about constant value booleans */
|
||||
/*lint --e{774} Don't issue warnings boolean within 'if' always evaluates false/true */
|
||||
if (sizeof(x)==H5_SIZEOF_INT) {
|
||||
HDstrcat(format_templ, "u");
|
||||
} else if (sizeof(x)==H5_SIZEOF_LONG) {
|
||||
HDstrcat(format_templ, "lu");
|
||||
} else if (sizeof(x)==H5_SIZEOF_LONG_LONG) {
|
||||
HDstrcat(format_templ, H5_PRINTF_LL_WIDTH);
|
||||
HDstrcat(format_templ, "u");
|
||||
}
|
||||
n = fprintf(stream, format_templ, x);
|
||||
} else {
|
||||
HDstrcpy(format_templ, "%");
|
||||
if (leftjust)
|
||||
if (sizeof(x)==H5_SIZEOF_INT) {
|
||||
HDstrcat(format_templ, "u");
|
||||
} else if (sizeof(x)==H5_SIZEOF_LONG) {
|
||||
HDstrcat(format_templ, "lu");
|
||||
} else if (sizeof(x)==H5_SIZEOF_LONG_LONG) {
|
||||
HDstrcat(format_templ, H5_PRINTF_LL_WIDTH);
|
||||
HDstrcat(format_templ, "u");
|
||||
}
|
||||
n = fprintf(stream, format_templ, x);
|
||||
} else {
|
||||
HDstrcpy(format_templ, "%");
|
||||
if (leftjust)
|
||||
HDstrcat(format_templ, "-");
|
||||
if (fwidth)
|
||||
sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth);
|
||||
HDstrcat(format_templ, "s");
|
||||
fprintf(stream, format_templ, "UNDEF");
|
||||
}
|
||||
}
|
||||
break;
|
||||
if (fwidth)
|
||||
sprintf(format_templ+HDstrlen(format_templ), "%d", fwidth);
|
||||
HDstrcat(format_templ, "s");
|
||||
fprintf(stream, format_templ, "UNDEF");
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
case 'c':
|
||||
{
|
||||
char x = (char)va_arg (ap, int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
char x = (char)va_arg (ap, int);
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
|
||||
case 's':
|
||||
case 'p':
|
||||
case 's':
|
||||
case 'p':
|
||||
{
|
||||
char *x = va_arg (ap, char*); /*lint !e64 Type mismatch not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
char *x = va_arg (ap, char*); /*lint !e64 Type mismatch not really occuring */
|
||||
n = fprintf (stream, format_templ, x);
|
||||
}
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
case 'n':
|
||||
format_templ[HDstrlen(format_templ)-1] = 'u';
|
||||
n = fprintf (stream, format_templ, nout);
|
||||
break;
|
||||
break;
|
||||
|
||||
case 't':
|
||||
{
|
||||
@ -379,18 +379,18 @@ HDfprintf(FILE *stream, const char *fmt, ...)
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
HDfputs (format_templ, stream);
|
||||
n = (int)HDstrlen (format_templ);
|
||||
break;
|
||||
}
|
||||
nout += n;
|
||||
fmt = s;
|
||||
} else {
|
||||
HDputc (*fmt, stream);
|
||||
fmt++;
|
||||
nout++;
|
||||
}
|
||||
default:
|
||||
HDfputs (format_templ, stream);
|
||||
n = (int)HDstrlen (format_templ);
|
||||
break;
|
||||
}
|
||||
nout += n;
|
||||
fmt = s;
|
||||
} else {
|
||||
HDputc (*fmt, stream);
|
||||
fmt++;
|
||||
nout++;
|
||||
}
|
||||
}
|
||||
va_end (ap);
|
||||
return nout;
|
||||
@ -398,43 +398,43 @@ HDfprintf(FILE *stream, const char *fmt, ...)
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: HDstrtoll
|
||||
* Function: HDstrtoll
|
||||
*
|
||||
* Purpose: Converts the string S to an int64_t value according to the
|
||||
* given BASE, which must be between 2 and 36 inclusive, or be
|
||||
* the special value zero.
|
||||
* Purpose: Converts the string S to an int64_t value according to the
|
||||
* given BASE, which must be between 2 and 36 inclusive, or be
|
||||
* the special value zero.
|
||||
*
|
||||
* The string must begin with an arbitrary amount of white space
|
||||
* (as determined by isspace(3c)) followed by a single optional
|
||||
* The string must begin with an arbitrary amount of white space
|
||||
* (as determined by isspace(3c)) followed by a single optional
|
||||
* `+' or `-' sign. If BASE is zero or 16 the string may then
|
||||
* include a `0x' or `0X' prefix, and the number will be read in
|
||||
* base 16; otherwise a zero BASE is taken as 10 (decimal)
|
||||
* unless the next character is a `0', in which case it is taken
|
||||
* as 8 (octal).
|
||||
* include a `0x' or `0X' prefix, and the number will be read in
|
||||
* base 16; otherwise a zero BASE is taken as 10 (decimal)
|
||||
* unless the next character is a `0', in which case it is taken
|
||||
* as 8 (octal).
|
||||
*
|
||||
* The remainder of the string is converted to an int64_t in the
|
||||
* obvious manner, stopping at the first character which is not
|
||||
* a valid digit in the given base. (In bases above 10, the
|
||||
* letter `A' in either upper or lower case represetns 10, `B'
|
||||
* represents 11, and so forth, with `Z' representing 35.)
|
||||
* The remainder of the string is converted to an int64_t in the
|
||||
* obvious manner, stopping at the first character which is not
|
||||
* a valid digit in the given base. (In bases above 10, the
|
||||
* letter `A' in either upper or lower case represetns 10, `B'
|
||||
* represents 11, and so forth, with `Z' representing 35.)
|
||||
*
|
||||
* If REST is not null, the address of the first invalid
|
||||
* character in S is stored in *REST. If there were no digits
|
||||
* at all, the original value of S is stored in *REST. Thus, if
|
||||
* *S is not `\0' but **REST is `\0' on return the entire string
|
||||
* was valid.
|
||||
* If REST is not null, the address of the first invalid
|
||||
* character in S is stored in *REST. If there were no digits
|
||||
* at all, the original value of S is stored in *REST. Thus, if
|
||||
* *S is not `\0' but **REST is `\0' on return the entire string
|
||||
* was valid.
|
||||
*
|
||||
* Return: Success: The result.
|
||||
* Return: Success: The result.
|
||||
*
|
||||
* Failure: If the input string does not contain any
|
||||
* digits then zero is returned and REST points
|
||||
* to the original value of S. If an overflow
|
||||
* or underflow occurs then the maximum or
|
||||
* minimum possible value is returned and the
|
||||
* global `errno' is set to ERANGE. If BASE is
|
||||
* incorrect then zero is returned.
|
||||
* Failure: If the input string does not contain any
|
||||
* digits then zero is returned and REST points
|
||||
* to the original value of S. If an overflow
|
||||
* or underflow occurs then the maximum or
|
||||
* minimum possible value is returned and the
|
||||
* global `errno' is set to ERANGE. If BASE is
|
||||
* incorrect then zero is returned.
|
||||
*
|
||||
* Programmer: Robb Matzke
|
||||
* Programmer: Robb Matzke
|
||||
* Thursday, April 9, 1998
|
||||
*
|
||||
* Modifications:
|
||||
@ -444,13 +444,13 @@ HDfprintf(FILE *stream, const char *fmt, ...)
|
||||
int64_t
|
||||
HDstrtoll(const char *s, const char **rest, int base)
|
||||
{
|
||||
int64_t sign=1, acc=0;
|
||||
hbool_t overflow = FALSE;
|
||||
int64_t sign=1, acc=0;
|
||||
hbool_t overflow = FALSE;
|
||||
|
||||
errno = 0;
|
||||
if (!s || (base && (base<2 || base>36))) {
|
||||
if (rest) *rest = s;
|
||||
return 0;
|
||||
if (rest) *rest = s;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Skip white space */
|
||||
@ -458,51 +458,51 @@ HDstrtoll(const char *s, const char **rest, int base)
|
||||
|
||||
/* Optional minus or plus sign */
|
||||
if ('+'==*s) {
|
||||
s++;
|
||||
s++;
|
||||
} else if ('-'==*s) {
|
||||
sign = -1;
|
||||
s++;
|
||||
sign = -1;
|
||||
s++;
|
||||
}
|
||||
|
||||
/* Zero base prefix */
|
||||
if (0==base && '0'==*s && ('x'==s[1] || 'X'==s[1])) {
|
||||
base = 16;
|
||||
s += 2;
|
||||
base = 16;
|
||||
s += 2;
|
||||
} else if (0==base && '0'==*s) {
|
||||
base = 8;
|
||||
s++;
|
||||
base = 8;
|
||||
s++;
|
||||
} else if (0==base) {
|
||||
base = 10;
|
||||
base = 10;
|
||||
}
|
||||
|
||||
/* Digits */
|
||||
while ((base<=10 && *s>='0' && *s<'0'+base) ||
|
||||
(base>10 && ((*s>='0' && *s<='9') ||
|
||||
(*s>='a' && *s<'a'+base-10) ||
|
||||
(*s>='A' && *s<'A'+base-10)))) {
|
||||
if (!overflow) {
|
||||
int64_t digit = 0;
|
||||
if (*s>='0' && *s<='9') digit = *s - '0';
|
||||
else if (*s>='a' && *s<='z') digit = (*s-'a')+10;
|
||||
else digit = (*s-'A')+10;
|
||||
(base>10 && ((*s>='0' && *s<='9') ||
|
||||
(*s>='a' && *s<'a'+base-10) ||
|
||||
(*s>='A' && *s<'A'+base-10)))) {
|
||||
if (!overflow) {
|
||||
int64_t digit = 0;
|
||||
if (*s>='0' && *s<='9') digit = *s - '0';
|
||||
else if (*s>='a' && *s<='z') digit = (*s-'a')+10;
|
||||
else digit = (*s-'A')+10;
|
||||
|
||||
if (acc*base+digit < acc) {
|
||||
overflow = TRUE;
|
||||
} else {
|
||||
acc = acc*base + digit;
|
||||
}
|
||||
}
|
||||
s++;
|
||||
if (acc*base+digit < acc) {
|
||||
overflow = TRUE;
|
||||
} else {
|
||||
acc = acc*base + digit;
|
||||
}
|
||||
}
|
||||
s++;
|
||||
}
|
||||
|
||||
/* Overflow */
|
||||
if (overflow) {
|
||||
if (sign>0) {
|
||||
acc = ((uint64_t)1<<(8*sizeof(int64_t)-1))-1;
|
||||
} else {
|
||||
acc = (int64_t)((uint64_t)1<<(8*sizeof(int64_t)-1));
|
||||
}
|
||||
errno = ERANGE;
|
||||
if (sign>0) {
|
||||
acc = ((uint64_t)1<<(8*sizeof(int64_t)-1))-1;
|
||||
} else {
|
||||
acc = (int64_t)((uint64_t)1<<(8*sizeof(int64_t)-1));
|
||||
}
|
||||
errno = ERANGE;
|
||||
}
|
||||
|
||||
/* Return values */
|
||||
@ -513,20 +513,20 @@ HDstrtoll(const char *s, const char **rest, int base)
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: HDrand/HDsrand
|
||||
* Function: HDrand/HDsrand
|
||||
*
|
||||
* Purpose: Wrapper function for rand. If rand_r exists on this system,
|
||||
* use it.
|
||||
* Purpose: Wrapper function for rand. If rand_r exists on this system,
|
||||
* use it.
|
||||
*
|
||||
* Wrapper function for srand. If rand_r is available, it will keep
|
||||
* track of the seed locally instead of using srand() which modifies
|
||||
* global state and can break other programs.
|
||||
* Wrapper function for srand. If rand_r is available, it will keep
|
||||
* track of the seed locally instead of using srand() which modifies
|
||||
* global state and can break other programs.
|
||||
*
|
||||
* Return: Success: Random number from 0 to RAND_MAX
|
||||
* Return: Success: Random number from 0 to RAND_MAX
|
||||
*
|
||||
* Failure: Cannot fail.
|
||||
* Failure: Cannot fail.
|
||||
*
|
||||
* Programmer: Leon Arber
|
||||
* Programmer: Leon Arber
|
||||
* March 6, 2006.
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
@ -548,17 +548,17 @@ void HDsrand(unsigned int seed)
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: HDremove_all
|
||||
* Function: HDremove_all
|
||||
*
|
||||
* Purpose: Wrapper function for remove on VMS systems
|
||||
* Purpose: Wrapper function for remove on VMS systems
|
||||
*
|
||||
* This function deletes all versions of a file
|
||||
* This function deletes all versions of a file
|
||||
*
|
||||
* Return: Success: 0;
|
||||
* Return: Success: 0;
|
||||
*
|
||||
* Failure: -1
|
||||
* Failure: -1
|
||||
*
|
||||
* Programmer: Elena Pourmal
|
||||
* Programmer: Elena Pourmal
|
||||
* March 22, 2006
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
@ -584,13 +584,13 @@ HDremove_all(const char *fname)
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: Wgettimeofday
|
||||
* Function: Wgettimeofday
|
||||
*
|
||||
* Purpose: Wrapper function for gettimeofday on Windows systems
|
||||
* Purpose: Wrapper function for gettimeofday on Windows systems
|
||||
*
|
||||
* This function can get the time as well as a timezone
|
||||
* This function can get the time as well as a timezone
|
||||
*
|
||||
* Return: 0
|
||||
* Return: 0
|
||||
*
|
||||
* This implementation is taken from the Cygwin source distribution at
|
||||
* src/winsup/mingw/mingwex/gettimeofday.c
|
||||
@ -599,12 +599,12 @@ HDremove_all(const char *fname)
|
||||
* Danny Smith <dannysmith@users.sourceforge.net>
|
||||
* and released in the public domain.
|
||||
*
|
||||
* Programmer: Scott Wegner
|
||||
* Programmer: Scott Wegner
|
||||
* May 19, 2009
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifdef _WIN32
|
||||
#ifdef _WIN32 /* H5_HAVE_VISUAL_STUDIO */
|
||||
|
||||
/* Offset between 1/1/1601 and 1/1/1970 in 100 nanosecond units */
|
||||
#define _W32_FT_OFFSET (116444736000000000ULL)
|
||||
@ -638,6 +638,27 @@ Wgettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
Do not set errno on error. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef H5_HAVE_WINSOCK_H
|
||||
#pragma comment(lib, "advapi32.lib")
|
||||
#endif
|
||||
|
||||
#define WloginBuffer_count 256
|
||||
static char Wlogin_buffer[WloginBuffer_count];
|
||||
|
||||
char*
|
||||
Wgetlogin()
|
||||
{
|
||||
|
||||
#ifdef H5_HAVE_WINSOCK_H
|
||||
long bufferCount = WloginBuffer_count;
|
||||
if (GetUserName(Wlogin_buffer, &bufferCount) == 0)
|
||||
return (Wlogin_buffer);
|
||||
else
|
||||
#endif /* H5_HAVE_WINSOCK_H */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@ -645,16 +666,16 @@ Wgettimeofday(struct timeval *tv, struct timezone *tz)
|
||||
* Function: H5_build_extpath
|
||||
*
|
||||
* Purpose: To build the path for later searching of target file for external
|
||||
* link. This path can be either:
|
||||
* link. This path can be either:
|
||||
* 1. The absolute path of NAME
|
||||
* or
|
||||
* 2. The current working directory + relative path of NAME
|
||||
*
|
||||
* Return: Success: 0
|
||||
* Failure: -1
|
||||
* Return: Success: 0
|
||||
* Failure: -1
|
||||
*
|
||||
* Programmer: Vailin Choi
|
||||
* April 2, 2008
|
||||
* Programmer: Vailin Choi
|
||||
* April 2, 2008
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -692,23 +713,23 @@ H5_build_extpath(const char *name, char **extpath/*out*/)
|
||||
if(NULL == (new_name = (char *)H5MM_strdup(name)))
|
||||
HGOTO_ERROR(H5E_INTERNAL, H5E_NOSPACE, FAIL, "memory allocation failed")
|
||||
|
||||
/*
|
||||
* Windows: name[0-1] is "<drive-letter>:"
|
||||
* Get current working directory on the drive specified in NAME
|
||||
* Unix: does not apply
|
||||
/*
|
||||
* Windows: name[0-1] is "<drive-letter>:"
|
||||
* Get current working directory on the drive specified in NAME
|
||||
* Unix: does not apply
|
||||
* OpenVMS: does not apply
|
||||
*/
|
||||
*/
|
||||
if(CHECK_ABS_DRIVE(name)) {
|
||||
drive = name[0] - 'A' + 1;
|
||||
retcwd = HDgetdcwd(drive, cwdpath, MAX_PATH_LEN);
|
||||
HDstrcpy(new_name, &name[2]);
|
||||
} /* end if */
|
||||
/*
|
||||
* Windows: name[0] is a '/' or '\'
|
||||
* Get current drive
|
||||
* Unix: does not apply
|
||||
/*
|
||||
* Windows: name[0] is a '/' or '\'
|
||||
* Get current drive
|
||||
* Unix: does not apply
|
||||
* OpenVMS: does not apply
|
||||
*/
|
||||
*/
|
||||
else if(CHECK_ABS_PATH(name) && (0 != (drive = HDgetdrive()))) {
|
||||
sprintf(cwdpath, "%c:%c", (drive+'A'-1), name[0]);
|
||||
retcwd = cwdpath;
|
||||
@ -764,9 +785,9 @@ H5_build_extpath(const char *name, char **extpath/*out*/)
|
||||
done:
|
||||
/* Release resources */
|
||||
if(cwdpath)
|
||||
H5MM_xfree(cwdpath);
|
||||
H5MM_xfree(cwdpath);
|
||||
if(new_name)
|
||||
H5MM_xfree(new_name);
|
||||
H5MM_xfree(new_name);
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
} /* H5_build_extpath() */
|
||||
|
@ -53,11 +53,13 @@ struct timezone {
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
H5_DLL int Wgettimeofday(struct timeval *tv, struct timezone *tz);
|
||||
H5_DLL char* Wgetlogin();
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#define HDgettimeofday(V,Z) Wgettimeofday(V,Z)
|
||||
#define HDgetlogin() Wgetlogin()
|
||||
|
||||
#define HDgetdrive() _getdrive()
|
||||
#define HDlseek(F,O,W) _lseeki64(F,O,W)
|
||||
|
@ -49,6 +49,9 @@ hid_t noblock_dxpl_id=(-1);
|
||||
#define NFILENAME 2
|
||||
#define PARATESTFILE filenames[0]
|
||||
const char *FILENAME[NFILENAME]={"CacheTestDummy", NULL};
|
||||
#ifndef PATH_MAX
|
||||
#define PATH_MAX 512
|
||||
#endif /* !PATH_MAX */
|
||||
char filenames[NFILENAME][PATH_MAX];
|
||||
hid_t fapl; /* file access property list */
|
||||
|
||||
|
@ -40,7 +40,9 @@
|
||||
* mpiexec -np 3 ./t_posix_compliant
|
||||
*/
|
||||
|
||||
#ifdef H5_HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
Loading…
Reference in New Issue
Block a user