summaryrefslogtreecommitdiffstats
path: root/fortran/src/H5match_types.c
diff options
context:
space:
mode:
authorJames Laird <jlaird@hdfgroup.org>2005-04-25 19:00:06 (GMT)
committerJames Laird <jlaird@hdfgroup.org>2005-04-25 19:00:06 (GMT)
commita05061f512a52832cc69211db0e382d30eecaaa5 (patch)
tree1a4d5a3e93700a3b493171e9e32527ae151d63f6 /fortran/src/H5match_types.c
parent1cc3666a270a15783574a2f2a7c6d9bc1209a76b (diff)
downloadhdf5-a05061f512a52832cc69211db0e382d30eecaaa5.zip
hdf5-a05061f512a52832cc69211db0e382d30eecaaa5.tar.gz
hdf5-a05061f512a52832cc69211db0e382d30eecaaa5.tar.bz2
[svn-r10657] Purpose:
Configuration feature Description: Fortran integer types (not reals) are now automatically detected at build-time. Solution: Two helper programs are used, one to detect what types the Fortran compiler has access to, and one to generate header files for C and Fortran matching up types. Platforms tested: mir, copper, modi4, pommier (last week) Misc. update: MANIFEST updated, H5f90fortran_types.f90 removed from configure.in, since it is not longer generated by configure.
Diffstat (limited to 'fortran/src/H5match_types.c')
-rw-r--r--fortran/src/H5match_types.c352
1 files changed, 352 insertions, 0 deletions
diff --git a/fortran/src/H5match_types.c b/fortran/src/H5match_types.c
new file mode 100644
index 0000000..47164c7
--- /dev/null
+++ b/fortran/src/H5match_types.c
@@ -0,0 +1,352 @@
+/* C Program to find type sizes */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include "H5public.h"
+/* Include H5Ipublic.h for hid_t type */
+#include "H5Ipublic.h"
+
+/* Definitions of which fortran type sizes exist */
+#include "H5fort_type_defines.h"
+
+/* File pointers for files */
+FILE * c_header;
+FILE * fort_header;
+
+#define CFILE "H5f90i_gen.h"
+#define FFILE "H5fortran_types.f90"
+
+void initCfile()
+{
+ fprintf(c_header,
+ "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\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\
+ * terms governing use, modification, and redistribution, is contained in *\n\
+ * the files COPYING and Copyright.html. COPYING can be found at the root *\n\
+ * of the source code distribution tree; Copyright.html can be found at the *\n\
+ * root level of an installed copy of the electronic HDF5 document set and *\n\
+ * is linked from the top-level documents page. It can also be found at *\n\
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *\n\
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *\n\
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n\
+\n\n\
+\#ifndef _H5f90i_gen_H\n\
+\#define _H5f90i_gen_H\n\
+\n\
+/* This file is automatically generated by H5match_types.c at build time. */\n\n");
+}
+
+void initFfile()
+{
+ fprintf(fort_header,
+ "! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * \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\
+! terms governing use, modification, and redistribution, is contained in *\n\
+! the files COPYING and Copyright.html. COPYING can be found at the root *\n\
+! of the source code distribution tree; Copyright.html can be found at the *\n\
+! root level of an installed copy of the electronic HDF5 document set and *\n\
+! is linked from the top-level documents page. It can also be found at *\n\
+! http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *\n\
+! access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *\n\
+! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\
+!\n!\n\
+! This file is automatically generated and contains HDF5 Fortran90 type definitions.\n!\n\
+ MODULE H5FORTRAN_TYPES\n\
+ !\n\
+ ! HDF5 integers\n\
+ !\n");
+
+}
+
+void endCfile()
+{
+ fprintf(c_header, "\n#endif /* _H5f90i_gen_H */\n");
+}
+void endFfile()
+{
+ fprintf(fort_header, "\n INTEGER(SIZE_T), PARAMETER :: OBJECT_NAMELEN_DEFAULT_F = -1\n\n");
+ fprintf(fort_header, " END MODULE H5FORTRAN_TYPES\n");
+}
+
+/* Define a c_int_x type in the C header */
+void writeTypedef(const char* c_type, unsigned int size)
+{
+ fprintf(c_header, "#define c_int_%d %s\n", size, c_type);
+}
+
+/* Call this function if there is no matching C type for sizes > 1 */
+void writeTypedefDefault(unsigned int size)
+{
+ assert(size %2 == 0);
+
+ fprintf(c_header, "typedef struct {c_int_%d a; c_int_%d b;} c_int_%d\n", size / 2, size / 2, size);
+}
+
+/* Create matching Fortran and C types by writing to both files */
+void writeToFiles(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_int_%d %s;\n", size, c_type);
+}
+
+/* hid_t and hssize_t don't have their sizes defined anywhere.
+ * Use sizeof() instead. */
+#define H5_SIZEOF_HID_T sizeof(hid_t)
+#define H5_SIZEOF_HSSIZE_T sizeof(hssize_t)
+
+int main()
+{
+ /* Open target files */
+ c_header = fopen(CFILE, "w");
+ fort_header = fopen(FFILE, "w");
+
+ /* Write copyright, boilerplate to both files */
+ initCfile();
+ initFfile();
+
+ /* First, define c_int_x */
+ if(sizeof(long long) == 1)
+ writeTypedef("long long", 1);
+ else if(sizeof(long) == 1)
+ writeTypedef("long", 1);
+ else if(sizeof(int) == 1)
+ writeTypedef("int", 1);
+ else if(sizeof(short) == 1)
+ writeTypedef("short", 1);
+ else
+ writeTypedef("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(long long) == 2)
+ writeTypedef("long long", 2);
+ else if(sizeof(long) == 2)
+ writeTypedef("long", 2);
+ else if(sizeof(int) == 2)
+ writeTypedef("int", 2);
+ else if(sizeof(short) == 2)
+ writeTypedef("short", 2);
+ else
+ writeTypedefDefault(2);
+
+ if(sizeof(long long) == 4)
+ writeTypedef("long long", 4);
+ else if(sizeof(long) == 4)
+ writeTypedef("long", 4);
+ else if(sizeof(int) == 4)
+ writeTypedef("int", 4);
+ else if(sizeof(short) == 4)
+ writeTypedef("short", 4);
+ else
+ writeTypedefDefault(4);
+
+ if(sizeof(long long) == 8)
+ writeTypedef("long long", 8);
+ else if(sizeof(long) == 8)
+ writeTypedef("long", 8);
+ else if(sizeof(int) == 8)
+ writeTypedef("int", 8);
+ else if(sizeof(short) == 8)
+ writeTypedef("short", 8);
+ else
+ writeTypedefDefault(8);
+
+ /* Now begin defining fortran types. */
+ fprintf(c_header, "\n");
+
+ /* haddr_t */
+ if( H5_SIZEOF_HADDR_T >= 8) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_8
+ writeToFiles("HADDR_T", "haddr_t_f", 8);
+ goto hsize_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HADDR_T >= 4) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_4
+ writeToFiles("HADDR_T", "haddr_t_f", 4);
+ goto hsize_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HADDR_T >= 2) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_2
+ writeToFiles("HADDR_T", "haddr_t_f", 2);
+ goto hsize_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HADDR_T >= 1) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_1
+ writeToFiles("HADDR_T", "haddr_t_f", 1);
+ goto hsize_t_start;
+ #endif
+ }
+ /* Error: couldn't find a size for haddr_t */
+ return -1;
+
+ hsize_t_start:
+
+ /* hsize_t */
+ if( H5_SIZEOF_HSIZE_T >= 8) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_8
+ writeToFiles("HSIZE_T", "hsize_t_f", 8);
+ goto hssize_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HSIZE_T >= 4) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_4
+ writeToFiles("HSIZE_T", "hsize_t_f", 4);
+ goto hssize_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HSIZE_T >= 2) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_2
+ writeToFiles("HSIZE_T", "hsize_t_f", 2);
+ goto hssize_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HSIZE_T >= 1) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_1
+ writeToFiles("HSIZE_T", "hsize_t_f", 1);
+ goto hssize_t_start;
+ #endif
+ }
+ /* Error: couldn't find a size for hsize_t */
+ return -1;
+
+ hssize_t_start:
+
+ /* hssize_t */
+ if( H5_SIZEOF_HSSIZE_T >= 8) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_8
+ writeToFiles("HSSIZE_T", "hssize_t_f", 8);
+ goto size_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HSSIZE_T >= 4) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_4
+ writeToFiles("HSSIZE_T", "hssize_t_f", 4);
+ goto size_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HSSIZE_T >= 2) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_2
+ writeToFiles("HSSIZE_T", "hssize_t_f", 2);
+ goto size_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_HSSIZE_T >= 1) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_1
+ writeToFiles("HSSIZE_T", "hssize_t_f", 1);
+ goto size_t_start;
+ #endif
+ }
+ /* Error: couldn't find a size for hssize_t */
+ return -1;
+
+
+ size_t_start:
+ /* size_t */
+ if( H5_SIZEOF_SIZE_T >= 8) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_8
+ writeToFiles("SIZE_T", "size_t_f", 8);
+ goto int_start;
+ #endif
+ }
+ if( H5_SIZEOF_SIZE_T >= 4) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_4
+ writeToFiles("SIZE_T", "size_t_f", 4);
+ goto int_start;
+ #endif
+ }
+ if( H5_SIZEOF_SIZE_T >= 2) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_2
+ writeToFiles("SIZE_T", "size_t_f", 2);
+ goto int_start;
+ #endif
+ }
+ if( H5_SIZEOF_SIZE_T >= 1) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_1
+ writeToFiles("SIZE_T", "size_t_f", 1);
+ goto int_start;
+ #endif
+ }
+ /* Error: couldn't find a size for size_t */
+ return -1;
+
+ int_start:
+ /* int */
+ if( H5_SIZEOF_INT >= 8) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_8
+ writeToFiles("INT", "int_f", 8);
+ goto hid_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_INT >= 4) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_4
+ writeToFiles("INT", "int_f", 4);
+ goto hid_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_INT >= 2) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_2
+ writeToFiles("INT", "int_f", 2);
+ goto hid_t_start;
+ #endif
+ }
+ if( H5_SIZEOF_INT >= 1) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_1
+ writeToFiles("INT", "int_f", 1);
+ goto hid_t_start;
+ #endif
+ }
+ /* Error: couldn't find a size for int */
+ return -1;
+
+ hid_t_start:
+ /* hid_t */
+ if( H5_SIZEOF_HID_T >= 8) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_8
+ writeToFiles("HID_T", "hid_t_f", 8);
+ goto real_start;
+ #endif
+ }
+ if( H5_SIZEOF_HID_T >= 4) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_4
+ writeToFiles("HID_T", "hid_t_f", 4);
+ goto real_start;
+ #endif
+ }
+ if( H5_SIZEOF_HID_T >= 2) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_2
+ writeToFiles("HID_T", "hid_t_f", 2);
+ goto real_start;
+ #endif
+ }
+ if( H5_SIZEOF_HID_T >= 1) {
+ #ifdef H5_FORTRAN_HAS_INTEGER_1
+ writeToFiles("HID_T", "hid_t_f", 1);
+ goto real_start;
+ #endif
+ }
+ /* Error: couldn't find a size for hid_t */
+ return -1;
+
+ real_start:
+ goto done;
+ done:
+
+ /* Close files */
+ endCfile();
+ endFfile();
+ fclose(c_header);
+ fclose(fort_header);
+ return 0;
+}
+