diff options
Diffstat (limited to 'fortran/src/H5match_types.c')
-rw-r--r-- | fortran/src/H5match_types.c | 577 |
1 files changed, 345 insertions, 232 deletions
diff --git a/fortran/src/H5match_types.c b/fortran/src/H5match_types.c index 37509a0..c4b7f73 100644 --- a/fortran/src/H5match_types.c +++ b/fortran/src/H5match_types.c @@ -9,7 +9,7 @@ * PURPOSE * C Program to match C types to Fortran types. * Creates the files H5f90i_gen.h for the C code and - * H5fortran_types.F90 for the Fortran code. + * H5fortran_types.f90 for the Fortran code. * * COPYRIGHT * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -31,7 +31,6 @@ */ #include <stdio.h> -#include <string.h> #include <assert.h> #include "H5public.h" @@ -46,13 +45,12 @@ FILE * c_header; FILE * fort_header; #define CFILE "H5f90i_gen.h" -#define FFILE "H5fortran_types.F90" +#define FFILE "H5fortran_types.f90" /* Prototypes for the write routines */ -void writeTypedef(const char* c_typedef, const char* c_type, int size); -void writeTypedefDefault(const char* c_typedef, int size); -void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size, int kind); -void writeToFilesChr(const char* c_typedef, const char* fortran_type, const char* c_type, int size, char* kind); +void writeTypedef(const char* c_typedef, const char* c_type, unsigned int size); +void writeTypedefDefault(const char* c_typedef, unsigned int size); +void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size, unsigned int kind); static void initCfile(void) @@ -102,7 +100,6 @@ initFfile(void) !\n!\n\ ! This file is automatically generated and contains HDF5 Fortran90 type definitions.\n!\n\ MODULE H5FORTRAN_TYPES\n\ - USE ISO_C_BINDING\n\ !\n\ ! HDF5 integers\n\ !\n"); @@ -122,198 +119,253 @@ endFfile(void) } /* Define a c_int_x type in the C header */ -void writeTypedef(const char* c_typedef, const char* c_type, int size) +void writeTypedef(const char* c_typedef, const char* c_type, unsigned int size) { fprintf(c_header, "#define c_%s_%u %s\n", c_typedef, size, c_type); } /* Call this function if there is no matching C type for sizes > 1 */ -void writeTypedefDefault(const char* c_typedef, int size) +void writeTypedefDefault(const char* c_typedef, unsigned int size) { assert(size %2 == 0); - fprintf(c_header, "typedef struct {c_%s_%u a; c_%s_%u b;} c_%s_%u;\n", c_typedef, size / 2, c_typedef, size / 2, c_typedef, size); + fprintf(c_header, "typedef struct {c_%s_%u a; c_%s_%u b;} c_%s_%u\n", c_typedef, size / 2, c_typedef, size / 2, c_typedef, size); } /* Create matching Fortran and C types by writing to both files */ -void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size, int kind) +void writeToFiles(const char* c_typedef, const char* fortran_type, const char* c_type, int size, unsigned int kind) { fprintf(fort_header, " INTEGER, PARAMETER :: %s = %u\n", fortran_type, kind); fprintf(c_header, "typedef c_%s_%d %s;\n", c_typedef, size, c_type); } -void writeToFilesChr(const char* c_typedef, const char* fortran_type, const char* c_type, int size, char* kind) -{ - fprintf(fort_header, " INTEGER, PARAMETER :: %s = %s\n", fortran_type, kind); - fprintf(c_header, "typedef c_%s_%d %s;\n", c_typedef, size, c_type); -} + int main(void) { - int FoundIntSize[10]; - int FoundIntSizeKind[10]; - int FoundRealSize[10]; - int FoundRealSizeKind[10]; - int i, j,flag; - char chrA[32],chrB[32]; - - int IntKinds[] = H5_FORTRAN_INTEGER_KINDS; - int IntKinds_SizeOf[] = H5_FORTRAN_INTEGER_KINDS_SIZEOF; - int RealKinds[] = H5_FORTRAN_REAL_KINDS; - int RealKinds_SizeOf[] = H5_FORTRAN_REAL_KINDS_SIZEOF; - char Real_C_TYPES[10][32]; - - int H5_FORTRAN_NUM_INTEGER_KINDS; - int H5_FORTRAN_NUM_REAL_KINDS; - int found_long_double = 0; + int FoundIntSize[4]; + unsigned FoundIntSizeKind[4]; + int FoundRealSize[3]; + unsigned FoundRealSizeKind[3]; + int i,j,flag; + char chrA[20],chrB[20]; + int H5_C_HAS_REAL_NATIVE_16; /* Open target files */ c_header = fopen(CFILE, "w"); fort_header = fopen(FFILE, "w"); + /* Default is C has 16 byte float */ + H5_C_HAS_REAL_NATIVE_16 = 1; + /* Write copyright, boilerplate to both files */ initCfile(); initFfile(); - /* (a) define c_int_x */ - - H5_FORTRAN_NUM_INTEGER_KINDS = (int)(sizeof(IntKinds)/sizeof(IntKinds[0])); - H5_FORTRAN_NUM_REAL_KINDS = (int)(sizeof(RealKinds)/sizeof(RealKinds[0])); - - for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - if(sizeof(long long) == IntKinds_SizeOf[i]) - writeTypedef("int", "long long", IntKinds[i]); - else if(sizeof(long) == IntKinds[i]) - writeTypedef("int", "long", IntKinds[i]); - else if(sizeof(int) == IntKinds_SizeOf[i]) - writeTypedef("int", "int", IntKinds[i]); - else if(sizeof(short) == IntKinds_SizeOf[i]) - writeTypedef("int", "short", IntKinds[i]); - else - if(IntKinds_SizeOf[i] == 1) { - writeTypedef("int", "char", IntKinds[i]); - /* Actually, char is not necessarily one byte. - * But if char isn't, then nothing is, so this - * is as close as we can get. */ - } else { - writeTypedefDefault("int",IntKinds[i]); - } - if(sizeof(size_t) == IntKinds_SizeOf[i]) - writeTypedef("size_t", "size_t", IntKinds[i]); - if(sizeof(hsize_t) == IntKinds_SizeOf[i]) - writeTypedef("hsize_t", "hsize_t", IntKinds[i]); - } - - /* (b) Define c_float_x */ - - for(i=0;i< H5_FORTRAN_NUM_REAL_KINDS;i++) { - if (sizeof(float) == RealKinds_SizeOf[i]) { - writeTypedef("float", "float", RealKinds[i]); - strcpy(Real_C_TYPES[i], "C_FLOAT"); - } - else if(sizeof(double) == RealKinds_SizeOf[i]) { - writeTypedef("float", "double", RealKinds[i]); - strcpy(Real_C_TYPES[i], "C_DOUBLE"); - } -#if H5_FORTRAN_HAVE_C_LONG_DOUBLE!=0 - else if(sizeof(long double) == RealKinds_SizeOf[i] && found_long_double == 0) { - writeTypedef("float", "long double", RealKinds[i]); - strcpy(Real_C_TYPES[i], "C_LONG_DOUBLE"); - found_long_double = 1; - } -# ifdef H5_HAVE_FLOAT128 - /* Don't select a higher precision than Fortran can support */ - else if(sizeof(__float128) == RealKinds_SizeOf[i] && found_long_double == 1 && H5_PAC_FC_MAX_REAL_PRECISION > 28) { - writeTypedef("float", "__float128", RealKinds[i]); - strcpy(Real_C_TYPES[i], "C_FLOAT128"); - } -# else - else if(sizeof(long double) == RealKinds_SizeOf[i] && found_long_double == 1 && H5_PAC_FC_MAX_REAL_PRECISION > 28) { - writeTypedef("float", "long double", RealKinds[i]); - strcpy(Real_C_TYPES[i], "C_FLOAT128"); - } -# endif -#else /* There is no C_LONG_DOUBLE intrinsic */ -# ifdef H5_HAVE_FLOAT128 - /* Don't select a higher precision than Fortran can support */ - else if(sizeof(__float128) == RealKinds_SizeOf[i] ) { - writeTypedef("float", "__float128", RealKinds[i]); - strcpy(Real_C_TYPES[i], "C_FLOAT128"); - } -# else - else if(sizeof(long double) == RealKinds_SizeOf[i] ) { - writeTypedef("float", "long double", RealKinds[i]); - strcpy(Real_C_TYPES[i], "C_FLOAT128"); - } -# endif -#endif - else { - printf("\n **** HDF5 WARNING ****\n"); - printf("Fortran REAL(KIND=%d) is %d Bytes, but no corresponding C float type exists of that size\n",RealKinds[i],RealKinds_SizeOf[i]); - printf(" !!! Fortran interfaces will not be generated for REAL(KIND=%d) !!!\n\n",RealKinds[i]); - - RealKinds_SizeOf[i] = -1; - RealKinds[i] = -1; - } - } + /* First, define c_int_x */ + +#if defined H5_FORTRAN_HAS_INTEGER_1_KIND + if(sizeof(long long) == 1) + writeTypedef("int", "long long", 1); + else if(sizeof(long) == 1) + writeTypedef("int", "long", 1); + else if(sizeof(int) == 1) + writeTypedef("int", "int", 1); + else if(sizeof(short) == 1) + writeTypedef("int", "short", 1); + else + writeTypedef("int", "char", 1); + /* Actually, char is not necessarily one byte. + * But if char isn't, then nothing is, so this + * is as close as we can get. */ + if(sizeof(size_t) == 1) + writeTypedef("size_t", "size_t", 1); + if(sizeof(hsize_t) == 1) + writeTypedef("hsize_t", "hsize_t", 1); +#endif /*H5_FORTRAN_HAS_INTEGER_1_KIND*/ + +#if defined H5_FORTRAN_HAS_INTEGER_2_KIND + if(sizeof(long long) == 2) + writeTypedef("int", "long long", 2); + else if(sizeof(long) == 2) + writeTypedef("int", "long", 2); + else if(sizeof(int) == 2) + writeTypedef("int", "int", 2); + else if(sizeof(short) == 2) + writeTypedef("int", "short", 2); + else + writeTypedefDefault("int",2); + + if(sizeof(size_t) == 2) + writeTypedef("size_t", "size_t", 2); + if(sizeof(hsize_t) == 2) + writeTypedef("hsize_t", "hsize_t", 2); +#endif /*H5_FORTRAN_HAS_INTEGER_2_KIND*/ + +#if defined H5_FORTRAN_HAS_INTEGER_4_KIND + if(sizeof(long long) == 4) + writeTypedef("int", "long long", 4); + else if(sizeof(long) == 4) + writeTypedef("int", "long", 4); + else if(sizeof(int) == 4) + writeTypedef("int", "int", 4); + else if(sizeof(short) == 4) + writeTypedef("int", "short", 4); + else + writeTypedefDefault("int",4); + + if(sizeof(size_t) == 4) + writeTypedef("size_t", "size_t", 4); + if(sizeof(hsize_t) == 4) + writeTypedef("hsize_t", "hsize_t", 4); + +#endif /*H5_FORTRAN_HAS_INTEGER_4_KIND*/ + +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND + if(sizeof(long long) == 8) + writeTypedef("int", "long long", 8); + else if(sizeof(long) == 8) + writeTypedef("int", "long", 8); + else if(sizeof(int) == 8) + writeTypedef("int", "int", 8); + else if(sizeof(short) == 8) + writeTypedef("int", "short", 8); + else + writeTypedefDefault("int",8); + + if(sizeof(size_t) == 8) + writeTypedef("size_t", "size_t", 8); + if(sizeof(hsize_t) == 8) + writeTypedef("hsize_t", "hsize_t", 8); + +#endif /*H5_FORTRAN_HAS_INTEGER_8_KIND*/ + + /* Define c_float_x */ + +#if defined H5_FORTRAN_HAS_REAL_NATIVE_4_KIND || defined H5_FORTRAN_HAS_REAL_4_KIND + if(sizeof(long double) == 4) + writeTypedef("float", "long double", 4); + else if(sizeof(double) == 4) + writeTypedef("float", "double", 4); + else if(sizeof(float) == 4) + writeTypedef("float", "float", 4); + else + { printf("Fortran REAL is 4 bytes, no corresponding C floating type\n"); + printf("Quitting....\n"); + return -1; + } +#endif /*H5_FORTRAN_HAS_REAL_NATIVE_4_KIND*/ + +#if defined H5_FORTRAN_HAS_REAL_NATIVE_8_KIND || defined H5_FORTRAN_HAS_REAL_8_KIND + if(sizeof(long double) == 8) + writeTypedef("float", "long double", 8); + else if(sizeof(double) == 8) + writeTypedef("float", "double", 8); + else if(sizeof(float) == 8) + writeTypedef("float", "float", 8); + else + { printf("Fortran REAL is 16 bytes, no corresponding C floating type\n"); + printf("Quitting....\n"); + return -1; + } +#endif /*H5_FORTRAN_HAS_REAL_NATIVE_8_KIND*/ + +#if defined H5_FORTRAN_HAS_REAL_NATIVE_16_KIND || defined H5_FORTRAN_HAS_REAL_16_KIND + if(sizeof(long double) == 16) + writeTypedef("float", "long double", 16); + else if(sizeof(double) == 16) + writeTypedef("float", "double", 16); + else if(sizeof(float) == 16) + writeTypedef("float", "float", 16); + else /*C has no 16 byte float so disable it in Fortran*/ + { printf("warning: Fortran REAL is 16 bytes, no corresponding C floating type\n"); + printf(" Disabling Fortran 16 byte REALs\n"); + H5_C_HAS_REAL_NATIVE_16 = 0; + } +#endif /*H5_FORTRAN_HAS_REAL_NATIVE_16_KIND*/ /* Now begin defining fortran types. */ fprintf(c_header, "\n"); - /* haddr_t */ - for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - if(IntKinds_SizeOf[i] == H5_SIZEOF_HADDR_T) { - writeToFiles("int","HADDR_T", "haddr_t_f", H5_SIZEOF_HADDR_T, IntKinds[i]); - break; - } - if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) ) - /* Error: couldn't find a size for haddr_t */ - return -1; - } +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HADDR_T >= 8 + writeToFiles("int","HADDR_T", "haddr_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HADDR_T >= 4 + writeToFiles("int","HADDR_T", "haddr_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HADDR_T >= 2 + writeToFiles("int","HADDR_T", "haddr_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HADDR_T >= 1 + writeToFiles("int","HADDR_T", "haddr_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND); +#else + /* Error: couldn't find a size for haddr_t */ + return -1; +#endif /* hsize_t */ - for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - if(IntKinds_SizeOf[i] == H5_SIZEOF_HSIZE_T) { - writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", H5_SIZEOF_HSIZE_T, IntKinds[i]); - break; - } - if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) ) - /* Error: couldn't find a size for hsize_t */ - return -1; - } +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HSIZE_T >= 8 + writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HSIZE_T >= 4 + writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HSIZE_T >= 2 + writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HSIZE_T >= 1 + writeToFiles("hsize_t","HSIZE_T", "hsize_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND); +#else + /* Error: couldn't find a size for hsize_t */ + return -1; +#endif /* hssize_t */ - for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - if(IntKinds_SizeOf[i] == H5_SIZEOF_HSSIZE_T) { - writeToFiles("int","HSSIZE_T", "hssize_t_f", H5_SIZEOF_HSSIZE_T, IntKinds[i]); - break; - } - if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) ) - /* Error: couldn't find a size for hssize_t */ - return -1; - } +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HSSIZE_T >= 8 + writeToFiles("int","HSSIZE_T", "hssize_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HSSIZE_T >= 4 + writeToFiles("int","HSSIZE_T", "hssize_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HSSIZE_T >= 2 + writeToFiles("int","HSSIZE_T", "hssize_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HSSIZE_T >= 1 + writeToFiles("int","HSSIZE_T", "hssize_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND); +#else + /* Error: couldn't find a size for hssize_t */ + return -1; +#endif /* off_t */ - for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - if(IntKinds_SizeOf[i] == H5_SIZEOF_OFF_T) { - writeToFiles("int","OFF_T", "off_t_f", H5_SIZEOF_OFF_T, IntKinds[i]); - break; - } - if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) ) - /* Error: couldn't find a size for off_t */ - return -1; - } +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_OFF_T >= 8 + writeToFiles("int","OFF_T", "off_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_OFF_T >= 4 + writeToFiles("int","OFF_T", "off_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_OFF_T >= 2 + writeToFiles("int","OFF_T", "off_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_OFF_T >= 1 + writeToFiles("int","OFF_T", "off_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND); +#else + /* Error: couldn't find a size for off_t */ + return -1; +#endif /* size_t */ - for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - if(IntKinds_SizeOf[i] == H5_SIZEOF_SIZE_T) { - writeToFiles("size_t","SIZE_T", "size_t_f", H5_SIZEOF_SIZE_T, IntKinds[i]); - break; - } - if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) ) - /* Error: couldn't find a size for size_t */ - return -1; - } +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_SIZE_T >= 8 + writeToFiles("size_t","SIZE_T", "size_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_SIZE_T >= 4 + writeToFiles("size_t","SIZE_T", "size_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_SIZE_T >= 2 + writeToFiles("size_t","SIZE_T", "size_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_SIZE_T >= 1 + writeToFiles("size_t","SIZE_T", "size_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND); +#else + /* Error: couldn't find a size for size_t */ + return -1; +#endif /* int */ - writeToFiles("int","Fortran_INTEGER", "int_f", H5_FORTRAN_NATIVE_INTEGER_SIZEOF, H5_FORTRAN_NATIVE_INTEGER_KIND); +#if defined H5_FORTRAN_HAS_NATIVE_8_KIND + writeToFiles("int","Fortran_INTEGER", "int_f", 8, H5_FORTRAN_HAS_NATIVE_8_KIND); +#elif defined H5_FORTRAN_HAS_NATIVE_4_KIND + writeToFiles("int","Fortran_INTEGER", "int_f", 4, H5_FORTRAN_HAS_NATIVE_4_KIND); +#elif defined H5_FORTRAN_HAS_NATIVE_2_KIND + writeToFiles("int","Fortran_INTEGER", "int_f", 2, H5_FORTRAN_HAS_NATIVE_2_KIND); +#elif defined H5_FORTRAN_HAS_NATIVE_1_KIND + writeToFiles("int","Fortran_INTEGER", "int_f", 1, H5_FORTRAN_HAS_NATIVE_1_KIND); +#else + /* Error: couldn't find a size for int */ + return -1; +#endif /* int_1, int_2, int_4, int_8 */ @@ -322,20 +374,29 @@ int main(void) /* it a value of the next larger one, but if the next */ /* higher one is not available we assigned it the next lowest */ + FoundIntSize[0] = -1; + FoundIntSize[1] = -2; + FoundIntSize[2] = -4; + FoundIntSize[3] = -8; - FoundIntSize[0] = -1; - FoundIntSize[1] = -1; - FoundIntSize[2] = -1; - FoundIntSize[3] = -1; - FoundIntSize[4] = -1; - - for(i=0;i<H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - FoundIntSize[i] = (int)IntKinds[i]; - FoundIntSizeKind[i] = (int)IntKinds_SizeOf[i]; -/* writeToFiles("int",chrA, chrB, FoundIntSize[i], FoundIntSizeKind[i]); */ - } +#if defined H5_FORTRAN_HAS_INTEGER_1_KIND + FoundIntSize[0] = 1; + FoundIntSizeKind[0] = H5_FORTRAN_HAS_INTEGER_1_KIND; +#endif +#if defined H5_FORTRAN_HAS_INTEGER_2_KIND + FoundIntSize[1] = 2; + FoundIntSizeKind[1] = H5_FORTRAN_HAS_INTEGER_2_KIND; +#endif +#if defined H5_FORTRAN_HAS_INTEGER_4_KIND + FoundIntSize[2] = 4; + FoundIntSizeKind[2] = H5_FORTRAN_HAS_INTEGER_4_KIND; +#endif +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND + FoundIntSize[3] = 8; + FoundIntSizeKind[3] = H5_FORTRAN_HAS_INTEGER_8_KIND ; +#endif - for(i=0;i<H5_FORTRAN_NUM_INTEGER_KINDS;i++) { + for(i=0;i<4;i++) { if( FoundIntSize[i] > 0) /* Found the integer type */ { sprintf(chrA, "Fortran_INTEGER_%d", FoundIntSize[i]); @@ -382,77 +443,129 @@ int main(void) /* it a value of the next larger one, but if the next */ /* higher one is not available we assigned it the next lowest */ - FoundRealSize[0] = -1; - FoundRealSize[1] = -1; - FoundRealSize[2] = -1; - FoundRealSize[3] = -1; - FoundRealSize[4] = -1; - - for(i=0;i<H5_FORTRAN_NUM_REAL_KINDS;i++) { - if (RealKinds[i] > 0) { - FoundRealSize[i] = (int)RealKinds[i]; - FoundRealSizeKind[i] = (int)RealKinds_SizeOf[i]; - sprintf(chrA, "Fortran_REAL_%s", Real_C_TYPES[i]); - sprintf(chrB, "real_%s_f", Real_C_TYPES[i]); - writeToFiles("float",chrA, chrB, RealKinds[i], RealKinds_SizeOf[i]); + FoundRealSize[0] = -4; + FoundRealSize[1] = -8; + FoundRealSize[2] = -16; + +#if defined H5_FORTRAN_HAS_REAL_4_KIND + FoundRealSize[0] = 4; + FoundRealSizeKind[0] = H5_FORTRAN_HAS_REAL_4_KIND; +#endif +#if defined H5_FORTRAN_HAS_REAL_8_KIND + FoundRealSize[1] = 8; + FoundRealSizeKind[1] = H5_FORTRAN_HAS_REAL_8_KIND; +#endif + +#if defined H5_FORTRAN_HAS_REAL_16_KIND + if(H5_C_HAS_REAL_NATIVE_16 != 0) { + FoundRealSize[2] = 16; + FoundRealSizeKind[2] = H5_FORTRAN_HAS_REAL_16_KIND; } - } +#endif - /* hid_t */ - for(i=0;i< H5_FORTRAN_NUM_INTEGER_KINDS;i++) { - if(IntKinds_SizeOf[i] == H5_SIZEOF_HID_T) { - writeToFiles("int","HID_T", "hid_t_f", H5_SIZEOF_HID_T, IntKinds[i]); - break; + for(i=0;i<3;i++) { + if( FoundRealSize[i] > 0) /* Found the real type */ + { + sprintf(chrA, "Fortran_REAL_%d", FoundRealSize[i]); + sprintf(chrB, "real_%d_f", FoundRealSize[i]); + writeToFiles("float",chrA, chrB, FoundRealSize[i], FoundRealSizeKind[i]); + } + else /* Did not find the real type */ + { + flag = 0; /* flag indicating if found the next highest */ + for(j=i+1;j<3;j++) /* search for next highest */ + { + if( FoundRealSize[j] > 0) /* Found the next highest */ + { + sprintf(chrA, "Fortran_REAL_%d", (-1)*FoundRealSize[i]); + sprintf(chrB, "real_%d_f", (-1)*FoundRealSize[i]); + if(FoundRealSize[j]>4) { + writeToFiles("float",chrA, chrB, FoundRealSize[j], FoundRealSizeKind[j]); + flag = 1; + } + /* else { */ +/* writeToFiles("float", chrA, chrB, FoundRealSize[j]); */ +/* } */ + flag = 1; + break; + } + } + if(flag == 0) /* No higher one found, so find next lowest */ + { + for(j=1;j>-1;j--) /* Search for next lowest */ + { + if( FoundRealSize[j] > 0) /* Found the next lowest */ + { + sprintf(chrA, "Fortran_REAL_%d", (-1)*FoundRealSize[i]); + sprintf(chrB, "real_%d_f", (-1)*FoundRealSize[i]); + if(FoundRealSize[j]>4) + writeToFiles("float",chrA, chrB, FoundRealSize[j], FoundRealSizeKind[j]); + /* else { */ +/* writeToFiles("float", chrA, chrB, FoundRealSize[j]); */ +/* } */ + flag = 1; + break; + } + } + } + if(flag == 0) /* No higher or lower one found, indicating an error */ + return -1; + } } - if(i == (H5_FORTRAN_NUM_INTEGER_KINDS-1) ) - /* Error: couldn't find a size for hid_t */ - return -1; - } + + /* hid_t */ +#if defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HID_T >= 8 + writeToFiles("int","HID_T", "hid_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_4_KIND && H5_SIZEOF_HID_T >= 4 + writeToFiles("int","HID_T", "hid_t_f", 4, H5_FORTRAN_HAS_INTEGER_4_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_2_KIND && H5_SIZEOF_HID_T >= 2 + writeToFiles("int","HID_T", "hid_t_f", 2, H5_FORTRAN_HAS_INTEGER_2_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_1_KIND && H5_SIZEOF_HID_T >= 1 + writeToFiles("int","HID_T", "hid_t_f", 1, H5_FORTRAN_HAS_INTEGER_1_KIND); +#elif defined H5_FORTRAN_HAS_INTEGER_8_KIND && H5_SIZEOF_HID_T >= 4 + writeToFiles("int","HID_T", "hid_t_f", 8, H5_FORTRAN_HAS_INTEGER_8_KIND); +#else + /* Error: couldn't find a size for hid_t */ + return -1; +#endif /* real_f */ - if(H5_FORTRAN_NATIVE_REAL_SIZEOF == sizeof(long double)) - writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_LONG_DOUBLE"); - else if(H5_FORTRAN_NATIVE_REAL_SIZEOF == sizeof(double)) - writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_DOUBLE"); - else if(H5_FORTRAN_NATIVE_REAL_SIZEOF == sizeof(float)) - writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_FLOAT"); - else { - /* No exact match, choose the next highest */ - if(H5_FORTRAN_NATIVE_REAL_SIZEOF > sizeof(long double)) - writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_LONG_DOUBLE"); - else if(H5_FORTRAN_NATIVE_REAL_SIZEOF > sizeof(double)) - writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_DOUBLE"); - else if(H5_FORTRAN_NATIVE_REAL_SIZEOF > sizeof(float)) - writeToFilesChr("float","Fortran_REAL", "real_f", H5_FORTRAN_NATIVE_REAL_KIND, "C_FLOAT"); - else { - /* Error: couldn't find a size for real_f */ - printf("Error: couldn't find a size for real_f \n"); - return -1; +#if defined H5_FORTRAN_HAS_REAL_NATIVE_16_KIND + if(H5_C_HAS_REAL_NATIVE_16 != 0) { + writeToFiles("float","Fortran_REAL", "real_f", 16, H5_FORTRAN_HAS_REAL_NATIVE_16_KIND); } - } +#elif defined H5_FORTRAN_HAS_REAL_NATIVE_8_KIND + writeToFiles("float", "Fortran_REAL", "real_f", 8, H5_FORTRAN_HAS_REAL_NATIVE_8_KIND); +#elif defined H5_FORTRAN_HAS_REAL_NATIVE_4_KIND + writeToFiles("float", "Fortran_REAL", "real_f", 4, H5_FORTRAN_HAS_REAL_NATIVE_4_KIND); +#else + /* Error: couldn't find a size for real_f */ + return -1; +#endif /* double_f */ - if(H5_FORTRAN_NATIVE_DOUBLE_SIZEOF == sizeof(long double)) - writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_LONG_DOUBLE"); - else if(H5_FORTRAN_NATIVE_DOUBLE_SIZEOF == sizeof(double)) - writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_DOUBLE"); - else if(H5_FORTRAN_NATIVE_DOUBLE_SIZEOF == sizeof(float)) - writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_FLOAT"); -#ifdef H5_HAVE_FLOAT128 - /* Don't select a higher precision than Fortran can support */ - else if(sizeof(__float128) == H5_FORTRAN_NATIVE_DOUBLE_SIZEOF && H5_PAC_FC_MAX_REAL_PRECISION > 28) { - writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_FLOAT128"); +#if defined H5_FORTRAN_HAS_DOUBLE_NATIVE_16_KIND + if(H5_C_HAS_REAL_NATIVE_16 != 0) { /* Check if C has 16 byte floats */ + writeToFiles("float", "Fortran_DOUBLE", "double_f", 16, H5_FORTRAN_HAS_DOUBLE_NATIVE_16_KIND); + } else { +#if defined H5_FORTRAN_HAS_REAL_NATIVE_8_KIND /* Fall back to 8 byte floats */ + writeToFiles("float", "Fortran_DOUBLE", "double_f", 8, H5_FORTRAN_HAS_REAL_NATIVE_8_KIND); + } +#elif defined H5_FORTRAN_HAS_REAL_NATIVE_4_KIND /* Fall back to 4 byte floats */ + writeToFiles("float", "Fortran_DOUBLE", "double_f", 4, H5_FORTRAN_HAS_REAL_NATIVE_4_KIND); } #else - else if(sizeof(long double) == H5_FORTRAN_NATIVE_DOUBLE_SIZEOF && H5_PAC_FC_MAX_REAL_PRECISION > 28) { - writeToFilesChr("float","Fortran_DOUBLE", "double_f", H5_FORTRAN_NATIVE_DOUBLE_KIND, "C_FLOAT128"); + /* Error: couldn't find a size for double_f when fortran has 16 byte reals */ + return -1; } #endif - else { - /* Error: couldn't find a size for double_f */ - printf("Error: couldn't find a size for double_f \n"); + +#elif defined H5_FORTRAN_HAS_DOUBLE_NATIVE_8_KIND + writeToFiles("float", "Fortran_DOUBLE", "double_f", 8, H5_FORTRAN_HAS_DOUBLE_NATIVE_8_KIND); +#else + /* Error: couldn't find a size for real_f */ return -1; - } +#endif /* Need the buffer size for the fortran derive type 'hdset_reg_ref_t_f03' * in order to be interoperable with C's structure, the C buffer size @@ -461,12 +574,12 @@ int main(void) fprintf(fort_header, " INTEGER, PARAMETER :: H5R_DSET_REG_REF_BUF_SIZE_F = %u\n", H5_SIZEOF_HADDR_T + 4 ); + /* Close files */ endCfile(); endFfile(); fclose(c_header); fclose(fort_header); - return 0; } |