diff options
author | Elena Pourmal <epourmal@hdfgroup.org> | 2005-06-22 18:23:21 (GMT) |
---|---|---|
committer | Elena Pourmal <epourmal@hdfgroup.org> | 2005-06-22 18:23:21 (GMT) |
commit | ea66068977639b7b2737bb9db1e59b26db914d1e (patch) | |
tree | bc1ce12c71d0f91dba3c2d0ddccd81862a588c89 /hl/src | |
parent | ec071c6c149c44d9b3a056948502ca2af3b875b9 (diff) | |
download | hdf5-ea66068977639b7b2737bb9db1e59b26db914d1e.zip hdf5-ea66068977639b7b2737bb9db1e59b26db914d1e.tar.gz hdf5-ea66068977639b7b2737bb9db1e59b26db914d1e.tar.bz2 |
[svn-r10970] Purpose: New feature/bug #350 fix
Description:
When compiler flag was used to set the size of Fortran integer
to 8 bytes, library would fail.
Solution:
Cleaned up the code; added detection of Fortran INTEGER type size
and appropriately defined int_f type for C-stubs routines.
Platforms tested:
Solaris 2.8 32 and 64-bit, AIX 5.1 64-bit parallel
PGI Fortran with -i8 flag on heping
Absoft Fortran with -i8 flag on heping
g95 on mir (Fortran integer is 8 bytes by default that cannot be
changed - compiler bug ;-)
AIX Fortran with -qintsize=8 32 and 64-bit modes on copper
Misc. update:
Diffstat (limited to 'hl/src')
-rw-r--r-- | hl/src/H5IM.c | 67 | ||||
-rw-r--r-- | hl/src/H5IM.h | 11 | ||||
-rw-r--r-- | hl/src/H5LT.c | 80 | ||||
-rw-r--r-- | hl/src/H5LT.h | 11 |
4 files changed, 154 insertions, 15 deletions
diff --git a/hl/src/H5IM.c b/hl/src/H5IM.c index b7e8060..a6709c0 100644 --- a/hl/src/H5IM.c +++ b/hl/src/H5IM.c @@ -11,6 +11,8 @@ ****************************************************************************/ #include "H5IM.h" +#include "../../fortran/src/H5f90i_gen.h" + #include <string.h> #include <stdlib.h> @@ -24,7 +26,7 @@ herr_t H5IM_get_palette( hid_t loc_id, const char *image_name, int pal_number, hid_t tid, - void *pal_data); + int_f *pal_data); /*------------------------------------------------------------------------- @@ -1292,7 +1294,7 @@ herr_t H5IMmake_image_8bitf( hid_t loc_id, const char *dset_name, hsize_t width, hsize_t height, - void *buf ) + int_f *buf ) { hid_t did; /* dataset ID */ hid_t sid; /* space ID */ @@ -1313,13 +1315,24 @@ herr_t H5IMmake_image_8bitf( hid_t loc_id, return -1; /* create the dataset as H5T_NATIVE_UCHAR */ - if ((did=H5Dcreate(loc_id,dset_name,H5T_NATIVE_UCHAR,sid,H5P_DEFAULT))<0) + if ((did=H5Dcreate(loc_id,dset_name,H5T_NATIVE_UINT8,sid,H5P_DEFAULT))<0) return -1; /* write with memory type H5T_NATIVE_INT */ + /* Use long type if Fortran integer is 8 bytes and C long long is also 8 bytes*/ + /* Fail if otherwise */ if (buf) { + if (sizeof(int_f) == sizeof(int)) { if (H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long)) { + if (H5Dwrite(did,H5T_NATIVE_LONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long long)) { + if (H5Dwrite(did,H5T_NATIVE_LLONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else return -1; } @@ -1382,7 +1395,7 @@ herr_t H5IMmake_image_24bitf( hid_t loc_id, hsize_t width, hsize_t height, const char *interlace, - void *buf) + int_f *buf) { hid_t did; /* dataset ID */ hid_t sid; /* space ID */ @@ -1425,7 +1438,16 @@ herr_t H5IMmake_image_24bitf( hid_t loc_id, /* write with memory type H5T_NATIVE_INT */ if (buf) { + if (sizeof(int_f) == sizeof(int)) { if (H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long)) { + if (H5Dwrite(did,H5T_NATIVE_LONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long long)) { + if (H5Dwrite(did,H5T_NATIVE_LLONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,buf)<0) + return -1;} + else return -1; } @@ -1484,7 +1506,7 @@ herr_t H5IMmake_image_24bitf( hid_t loc_id, herr_t H5IMread_imagef( hid_t loc_id, const char *dset_name, - void *buf ) + int_f *buf ) { hid_t did; @@ -1493,13 +1515,21 @@ herr_t H5IMread_imagef( hid_t loc_id, return -1; /* read to memory type H5T_NATIVE_INT */ + if (sizeof(int_f) == sizeof(int)){ if ( H5Dread( did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0 ) + goto out;} + else if (sizeof(int_f) == sizeof(long)) { + if ( H5Dread( did, H5T_NATIVE_LONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0 ) + goto out;} + else if (sizeof(int_f) == sizeof(long long)) { + if ( H5Dread( did, H5T_NATIVE_LLONG, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf ) < 0 ) + goto out;} + else goto out; /* close */ if ( H5Dclose( did ) ) return -1; - return 0; out: @@ -1536,7 +1566,7 @@ out: herr_t H5IMmake_palettef( hid_t loc_id, const char *pal_name, const hsize_t *pal_dims, - void *pal_data ) + int_f *pal_data ) { @@ -1567,7 +1597,16 @@ herr_t H5IMmake_palettef( hid_t loc_id, /* write with memory type H5T_NATIVE_INT */ if (pal_data) { + if (sizeof(int_f) == sizeof(int)) { if (H5Dwrite(did,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,pal_data)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long)) { + if (H5Dwrite(did,H5T_NATIVE_LONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,pal_data)<0) + return -1;} + else if (sizeof(int_f) == sizeof(long long)) { + if (H5Dwrite(did,H5T_NATIVE_LLONG,H5S_ALL,H5S_ALL,H5P_DEFAULT,pal_data)<0) + return -1;} + else return -1; } @@ -1622,9 +1661,17 @@ herr_t H5IMmake_palettef( hid_t loc_id, herr_t H5IMget_palettef( hid_t loc_id, const char *image_name, int pal_number, - void *pal_data ) + int_f *pal_data ) { - return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_INT,pal_data); + if(sizeof(int_f) == sizeof(int)) + return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_INT,pal_data); + else if (sizeof(int_f) == sizeof(long)) + return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_LONG,pal_data); + else if (sizeof(int_f) == sizeof(long long)) + return H5IM_get_palette(loc_id,image_name,pal_number,H5T_NATIVE_LLONG,pal_data); + else + return -1; + } /*------------------------------------------------------------------------- @@ -1659,7 +1706,7 @@ herr_t H5IM_get_palette( hid_t loc_id, const char *image_name, int pal_number, hid_t tid, - void *pal_data) + int_f *pal_data) { hid_t image_id; int has_pal; diff --git a/hl/src/H5IM.h b/hl/src/H5IM.h index 6b7b6d8..27359dd 100644 --- a/hl/src/H5IM.h +++ b/hl/src/H5IM.h @@ -16,6 +16,7 @@ #define _H5IM_H #include "H5LT.h" +#include "../../fortran/src/H5f90i_gen.h" #ifdef __cplusplus extern "C" { @@ -93,28 +94,28 @@ herr_t H5IMmake_image_8bitf( hid_t loc_id, const char *dset_name, hsize_t width, hsize_t height, - void *buf ); + int_f *buf ); herr_t H5IMmake_image_24bitf( hid_t loc_id, const char *dset_name, hsize_t width, hsize_t height, const char *interlace, - void *buf); + int_f *buf); herr_t H5IMread_imagef( hid_t loc_id, const char *dset_name, - void *buf ); + int_f *buf ); herr_t H5IMmake_palettef( hid_t loc_id, const char *pal_name, const hsize_t *pal_dims, - void *pal_data ); + int_f *pal_data ); herr_t H5IMget_palettef( hid_t loc_id, const char *image_name, int pal_number, - void *pal_data ); + int_f *pal_data ); #ifdef __cplusplus diff --git a/hl/src/H5LT.c b/hl/src/H5LT.c index daa420c..acee4a7 100644 --- a/hl/src/H5LT.c +++ b/hl/src/H5LT.c @@ -1560,6 +1560,38 @@ herr_t H5LTset_attribute_long( hid_t loc_id, return 0; } +/*------------------------------------------------------------------------- + * Function: H5LTset_attribute_long_long + * + * Purpose: Create and write an attribute. + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Elena Pourmal, epourmal@ncsa.uiuc.edu + * + * Date: June 17, 2005 + * + * Comments: This function was added to support 8-bytes int_f type that + * may correspond to INTEGER*8 in Fortran + * + *------------------------------------------------------------------------- + */ + +herr_t H5LTset_attribute_long_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const long long *data, + size_t size ) +{ + + if ( H5LT_set_attribute_numerical( loc_id, obj_name, attr_name, size, + H5T_NATIVE_LLONG, data ) < 0 ) + return -1; + + return 0; + +} + /*------------------------------------------------------------------------- * Function: H5LTset_attribute_ulong @@ -2416,6 +2448,54 @@ herr_t H5LTget_attribute_long( hid_t loc_id, return 0; } +/*------------------------------------------------------------------------- + * Function: H5LTget_attribute_long_long + * + * Purpose: Reads an attribute named attr_name + * + * Return: Success: 0, Failure: -1 + * + * Programmer: Elena Pourmal, epourmal@ncsa.uiuc.edu + * + * Date: June 17, 2005 + * + * Comments: This funstion was added to suuport INTEGER*8 Fortran types + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t H5LTget_attribute_long_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + long long *data ) +{ + + /* identifiers */ + hid_t obj_id; + H5G_stat_t statbuf; + + /* Get the type of object */ + if (H5Gget_objinfo(loc_id, obj_name, 1, &statbuf)<0) + return -1; + + /* Open the object */ + if ((obj_id = H5LT_open_id( loc_id, obj_name, statbuf.type )) < 0) + return -1; + + /* Get the attribute */ + if ( H5LT_get_attribute_mem( obj_id, attr_name, H5T_NATIVE_LLONG, data ) < 0 ) + return -1; + + /* Close the object */ + if ( H5LT_close_id( obj_id, statbuf.type ) < 0 ) + return -1; + + return 0; + +} + +/*------------------------------------------------------------------------- /*------------------------------------------------------------------------- * Function: H5LTget_attribute_ulong diff --git a/hl/src/H5LT.h b/hl/src/H5LT.h index 3380888..63f9c8e 100644 --- a/hl/src/H5LT.h +++ b/hl/src/H5LT.h @@ -211,6 +211,12 @@ herr_t H5LTset_attribute_long( hid_t loc_id, const long *buffer, size_t size ); +herr_t H5LTset_attribute_long_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const long long *buffer, + size_t size ); + herr_t H5LTset_attribute_ulong( hid_t loc_id, const char *obj_name, const char *attr_name, @@ -282,6 +288,11 @@ herr_t H5LTget_attribute_long( hid_t loc_id, const char *attr_name, long *data ); +herr_t H5LTget_attribute_long_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + long long *data ); + herr_t H5LTget_attribute_ulong( hid_t loc_id, const char *obj_name, const char *attr_name, |