summaryrefslogtreecommitdiffstats
path: root/fortran/src/H5match_types.c
diff options
context:
space:
mode:
authorScot Breitenfeld <brtnfld@hdfgroup.org>2008-10-13 17:54:42 (GMT)
committerScot Breitenfeld <brtnfld@hdfgroup.org>2008-10-13 17:54:42 (GMT)
commitc22b3f133b8fbf81c84c926637e8e09601bb8412 (patch)
tree64a77734453598cbfc0880333b547d6cfecacc4b /fortran/src/H5match_types.c
parent6176a8a2869339e28c452fd9da2634427997ba40 (diff)
downloadhdf5-c22b3f133b8fbf81c84c926637e8e09601bb8412.zip
hdf5-c22b3f133b8fbf81c84c926637e8e09601bb8412.tar.gz
hdf5-c22b3f133b8fbf81c84c926637e8e09601bb8412.tar.bz2
[svn-r15849] Description:
Changed the datatype test programs such that we don't distinguish between writeDoubleToFiles and writeFloatToFiles so that we only define c_float_4, c_float_8, and c_float_16 in H5f90i_gen.h Added the definition of real_4_f, real_8_f, real_16_f depending on if they are available, also in H5f90i_gen.h
Diffstat (limited to 'fortran/src/H5match_types.c')
-rw-r--r--fortran/src/H5match_types.c209
1 files changed, 156 insertions, 53 deletions
diff --git a/fortran/src/H5match_types.c b/fortran/src/H5match_types.c
index 7d969ad..fb6afe4 100644
--- a/fortran/src/H5match_types.c
+++ b/fortran/src/H5match_types.c
@@ -1,4 +1,5 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
@@ -8,8 +9,8 @@
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
- * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
- * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* C Program to match C types to Fortran types
@@ -39,7 +40,7 @@ initCfile(void)
{
fprintf(c_header,
"/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\
-* Copyright by the Board of Trustees of the University of Illinois. *\n\
+ * Copyright by the Board of Trustees of the University of Illinois. *\n\
* All rights reserved. *\n\
* *\n\
* This file is part of HDF5. The full HDF5 copyright notice, including *\n\
@@ -110,12 +111,6 @@ void writeFloatTypedef(const char* c_type, unsigned int size)
fprintf(c_header, "#define c_float_%d %s\n", size, c_type);
}
-/* Define a c_double_x type in the C header */
-void writeDoubleTypedef(const char* c_type, unsigned int size)
-{
- fprintf(c_header, "#define c_double_%d %s\n", size, c_type);
-}
-
/* Call this function if there is no matching C type for sizes > 1 */
void writeTypedefDefault(unsigned int size)
{
@@ -139,21 +134,17 @@ void writeFloatToFiles(const char* fortran_type, const char* c_type, unsigned in
fprintf(c_header, "typedef c_float_%d %s;\n", size, c_type);
}
-/* Create matching Fortran and C floating types by writing to both files */
-void writeDoubleToFiles(const char* fortran_type, const char* c_type, unsigned int size)
-{
- fprintf(fort_header, " INTEGER, PARAMETER :: %s = %d\n", fortran_type, size);
-
- fprintf(c_header, "typedef c_double_%d %s;\n", size, c_type);
-}
-
-
int main()
{
/* Open target files */
c_header = fopen(CFILE, "w");
fort_header = fopen(FFILE, "w");
+ int FoundIntSize[4];
+ int FoundRealSize[3];
+ int i,j,flag;
+ char chrA[20],chrB[20];
+
/* Write copyright, boilerplate to both files */
initCfile();
initFfile();
@@ -217,7 +208,7 @@ int main()
/* Define c_float_x */
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_4
+#if defined H5_FORTRAN_HAS_REAL_NATIVE_4 || defined H5_FORTRAN_HAS_REAL_4
if(sizeof(long double) == 4)
writeFloatTypedef("long double", 4);
else if(sizeof(double) == 4)
@@ -231,7 +222,7 @@ int main()
}
#endif /*H5_FORTRAN_HAS_REAL_NATIVE_4*/
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_8
+#if defined H5_FORTRAN_HAS_REAL_NATIVE_8 || defined H5_FORTRAN_HAS_REAL_8
if(sizeof(long double) == 8)
writeFloatTypedef("long double", 8);
else if(sizeof(double) == 8)
@@ -245,7 +236,7 @@ int main()
}
#endif /*H5_FORTRAN_HAS_REAL_NATIVE_8*/
-#if defined H5_FORTRAN_HAS_REAL_NATIVE_16
+#if defined H5_FORTRAN_HAS_REAL_NATIVE_16 || defined H5_FORTRAN_HAS_REAL_16
if(sizeof(long double) == 16)
writeFloatTypedef("long double", 16);
else if(sizeof(double) == 16)
@@ -259,36 +250,6 @@ int main()
}
#endif /*H5_FORTRAN_HAS_REAL_NATIVE_16*/
- /* Define c_double_x */
-
-#if defined H5_FORTRAN_HAS_DOUBLE_NATIVE_8
- if(sizeof(long double) == 8)
- writeDoubleTypedef("long double", 8);
- else if(sizeof(double) == 8)
- writeDoubleTypedef("double", 8);
- else if(sizeof(float) == 8)
- writeDoubleTypedef("float", 8);
- else
- { printf("Fortran DOUBLE is 16 bytes, no corresponding C floating type\n");
- printf("Quitting....\n");
- return -1;
- }
-#endif /*H5_FORTRAN_HAS_DOUBLE_NATIVE_8*/
-
-#if defined H5_FORTRAN_HAS_DOUBLE_NATIVE_16
- if(sizeof(long double) == 16)
- writeDoubleTypedef("long double", 16);
- else if(sizeof(double) == 16)
- writeDoubleTypedef("double", 16);
- else if(sizeof(float) == 16)
- writeDoubleTypedef("float", 16);
- else
- { printf("Fortran DOUBLE is 16 bytes, no corresponding C floating type\n");
- printf("Quitting....\n");
- return -1;
- }
-#endif /*H5_FORTRAN_HAS_DOUBLE_NATIVE_16*/
-
/* Now begin defining fortran types. */
fprintf(c_header, "\n");
/* haddr_t */
@@ -362,6 +323,148 @@ int main()
return -1;
#endif
+
+ /* int_1, int_2, int_4, int_8 */
+
+/* Defined different KINDs of integers: */
+/* if the integer kind is not available then we assign */
+/* 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;
+
+#if defined H5_FORTRAN_HAS_INTEGER_1
+ FoundIntSize[0] = 1;
+#endif
+#if defined H5_FORTRAN_HAS_INTEGER_2
+ FoundIntSize[1] = 2;
+#endif
+#if defined H5_FORTRAN_HAS_INTEGER_4
+ FoundIntSize[2] = 4;
+#endif
+#if defined H5_FORTRAN_HAS_INTEGER_8
+ FoundIntSize[3] = 8;
+#endif
+
+ for(i=0;i<4;i++) {
+ if( FoundIntSize[i] > 0) /* Found the integer type */
+ {
+ sprintf(chrA, "Fortran_INTEGER_%d", FoundIntSize[i]);
+ sprintf(chrB, "int_%d_f", FoundIntSize[i]);
+ writeToFiles(chrA, chrB, FoundIntSize[i]);
+ }
+ else /* Did not find the integer type */
+ {
+ flag = 0; /* flag indicating if found the next highest */
+ for(j=i+1;j<4;j++) /* search for next highest */
+ {
+ if( FoundIntSize[j] > 0) /* Found the next highest */
+ {
+ sprintf(chrA, "Fortran_INTEGER_%d", (-1)*FoundIntSize[i]);
+ sprintf(chrB, "int_%d_f", (-1)*FoundIntSize[i]);
+ writeToFiles(chrA, chrB, FoundIntSize[j]);
+ flag = 1;
+ break;
+ }
+ }
+ if(flag == 0) /* No higher one found, so find next lowest */
+ {
+ for(j=2;j>-1;j--) /* Search for next lowest */
+ {
+ if( FoundIntSize[j] > 0) /* Found the next lowest */
+ {
+ sprintf(chrA, "Fortran_INTEGER_%d", (-1)*FoundIntSize[i]);
+ sprintf(chrB, "int_%d_f", (-1)*FoundIntSize[i]);
+ writeToFiles(chrA, chrB, FoundIntSize[j]);
+ flag = 1;
+ break;
+ }
+ }
+ }
+ if(flag == 0) /* No higher or lower one found, indicating an error */
+ {
+ return -1;
+ }
+ }
+ }
+
+ /* real_4, real_8, real_16 */
+
+/* Defined different KINDs of reals: */
+/* if the REAL kind is not available then we assign */
+/* 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] = -4;
+ FoundRealSize[1] = -8;
+ FoundRealSize[2] = -16;
+
+#if defined H5_FORTRAN_HAS_REAL_4
+ FoundRealSize[0] = 4;
+#endif
+#if defined H5_FORTRAN_HAS_REAL_8
+ FoundRealSize[1] = 8;
+#endif
+#if defined H5_FORTRAN_HAS_REAL_16
+ FoundRealSize[2] = 16;
+#endif
+
+ 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]);
+ writeFloatToFiles(chrA, chrB, FoundRealSize[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) {
+ writeFloatToFiles(chrA, chrB, FoundRealSize[j]);
+ flag = 1;
+ }
+ /* else { */
+/* writeFloatToFiles(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) {
+ writeFloatToFiles(chrA, chrB, FoundRealSize[j]);
+ }
+ /* else { */
+/* writeFloatToFiles(chrA, chrB, FoundRealSize[j]); */
+/* } */
+ flag = 1;
+ break;
+ }
+ }
+ }
+ if(flag == 0) /* No higher or lower one found, indicating an error */
+ {
+ return -1;
+ }
+ }
+ }
+
/* hid_t */
#if defined H5_FORTRAN_HAS_INTEGER_8 && H5_SIZEOF_HID_T >= 8
writeToFiles("HID_T", "hid_t_f", 8);
@@ -392,9 +495,9 @@ int main()
/* double_f */
#if defined H5_FORTRAN_HAS_DOUBLE_NATIVE_16
- writeDoubleToFiles("Fortran_DOUBLE", "double_f", 16);
+ writeFloatToFiles("Fortran_DOUBLE", "double_f", 16);
#elif defined H5_FORTRAN_HAS_DOUBLE_NATIVE_8
- writeDoubleToFiles("Fortran_DOUBLE", "double_f", 8);
+ writeFloatToFiles("Fortran_DOUBLE", "double_f", 8);
#else
/* Error: couldn't find a size for real_f */
return -1;