diff options
Diffstat (limited to 'src/H5T.c')
-rw-r--r-- | src/H5T.c | 4108 |
1 files changed, 30 insertions, 4078 deletions
@@ -1,33 +1,41 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * 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. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + /* - * Copyright (C) 1998-2001 NCSA - * All rights reserved. - * - * Programmer: Robb Matzke <matzke@llnl.gov> - * Tuesday, March 31, 1998 + * Module Info: This module contains most of the "core" functionality of + * the H5T interface, including the API initialization code, etc. + * Many routines that are infrequently used, or are specialized for + * one particular datatype class are in another module. */ #define H5T_PACKAGE /*suppress error about including H5Tpkg */ #include "H5private.h" /*generic functions */ #include "H5Dprivate.h" /*datasets (for H5Tcopy) */ -#include "H5Iprivate.h" /*ID functions */ #include "H5Eprivate.h" /*error handling */ #include "H5FLprivate.h" /*Free Lists */ #include "H5Gprivate.h" /*groups */ -#include "H5HGprivate.h" /*global heap */ +#include "H5Iprivate.h" /*ID functions */ #include "H5MMprivate.h" /*memory management */ #include "H5Pprivate.h" /* Property Lists */ -#include "H5Sprivate.h" /*data space */ #include "H5Tpkg.h" /*data-type functions */ #define PABLO_MASK H5T_mask -#define H5T_COMPND_INC 64 /*typical max numb of members per struct */ - /* Interface initialization */ static int interface_initialize_g = 0; #define INTERFACE_INIT H5T_init_interface -static herr_t H5T_init_interface(void); /* * Predefined data types. These are initialized at runtime in H5Tinit.c and @@ -222,9 +230,6 @@ static struct { /* The overflow handler */ H5T_overflow_t H5T_overflow_g = NULL; -/* Local static functions */ -static herr_t H5T_print_stats(H5T_path_t *path, int *nprint/*in,out*/); - /* Declare the free list for H5T_t's */ H5FL_DEFINE(H5T_t); @@ -232,9 +237,12 @@ H5FL_DEFINE(H5T_t); H5FL_DEFINE(H5T_path_t); /* Static local functions */ +static H5T_t *H5T_open(H5G_entry_t *loc, const char *name, hid_t dxpl_id); +static herr_t H5T_print_stats(H5T_path_t *path, int *nprint/*in,out*/); +static herr_t H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src, + H5T_t *dst, H5T_conv_t func, hid_t dxpl_id); static herr_t H5T_register(H5T_pers_t pers, const char *name, H5T_t *src, H5T_t *dst, H5T_conv_t func, hid_t dxpl_id); -static H5T_t * H5T_vlen_create(H5T_t *base); /*------------------------------------------------------------------------- @@ -278,7 +286,7 @@ DESCRIPTION Initializes any interface-specific data or routines. --------------------------------------------------------------------------*/ -static herr_t +herr_t H5T_init_interface(void) { H5T_t *native_schar=NULL; /* Datatype structure for native signed char */ @@ -2126,85 +2134,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5Tcommit - * - * Purpose: Save a transient data type to a file and turn the type handle - * into a named, immutable type. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Monday, June 1, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tcommit(hid_t loc_id, const char *name, hid_t type_id) -{ - H5G_entry_t *loc = NULL; - H5T_t *type = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tcommit, FAIL); - H5TRACE3("e","isi",loc_id,name,type_id); - - /* Check arguments */ - if (NULL==(loc=H5G_loc (loc_id))) - HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a location"); - if (!name || !*name) - HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "no name"); - if (NULL==(type=H5I_object_verify(type_id, H5I_DATATYPE))) - HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - - /* Commit the type */ - if (H5T_commit (loc, name, type, H5AC_dxpl_id)<0) - HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit data type"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tcommitted - * - * Purpose: Determines if a data type is committed or not. - * - * Return: Success: TRUE if committed, FALSE otherwise. - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Thursday, June 4, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -htri_t -H5Tcommitted(hid_t type_id) -{ - H5T_t *type = NULL; - htri_t ret_value; /* Return value */ - - FUNC_ENTER_API(H5Tcommitted, FAIL); - H5TRACE1("b","i",type_id); - - /* Check arguments */ - if (NULL==(type=H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR (H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - - /* Set return value */ - ret_value= (H5T_STATE_OPEN==type->state || H5T_STATE_NAMED==type->state); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- * Function: H5Tcopy * * Purpose: Copies a data type. The resulting data type is not locked. @@ -2642,696 +2571,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5Tget_native_type - * - * Purpose: High-level API to return the native type of a datatype. - * The native type is chosen by matching the size and class of - * querried datatype from the following native premitive - * datatypes: - * H5T_NATIVE_CHAR H5T_NATIVE_UCHAR - * H5T_NATIVE_SHORT H5T_NATIVE_USHORT - * H5T_NATIVE_INT H5T_NATIVE_UINT - * H5T_NATIVE_LONG H5T_NATIVE_ULONG - * H5T_NATIVE_LLONG H5T_NATIVE_ULLONG - * - * H5T_NATIVE_FLOAT - * H5T_NATIVE_DOUBLE - * H5T_NATIVE_LDOUBLE - * - * Compound, array, enum, and VL types all choose among these - * types for theire members. Time, Bifield, Opaque, Reference - * types are only copy out. - * - * Return: Success: Returns the native data type if successful. - * - * Failure: negative - * - * Programmer: Raymond Lu - * Oct 3, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -hid_t H5Tget_native_type(hid_t type_id, H5T_direction_t direction) -{ - H5T_t *dt; /* Datatype to create native datatype from */ - H5T_t *new_dt=NULL; /* Datatype for native datatype created */ - size_t comp_size=0; /* Compound datatype's size */ - hid_t ret_value; /* Return value */ - - FUNC_ENTER_API(H5Tget_native_type, FAIL); - H5TRACE1("z","i",type_id); - - /* check argument */ - if(NULL==(dt=H5I_object_verify(type_id, H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - - if(direction!=H5T_DIR_DEFAULT && direction!=H5T_DIR_ASCEND - && direction!=H5T_DIR_DESCEND) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not valid direction value"); - - if((new_dt = H5T_get_native_type(dt, direction, NULL, NULL, &comp_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "cannot retrieve native type"); - - if((ret_value=H5I_register(H5I_DATATYPE, new_dt)) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data type"); - -done: - /* Error cleanup */ - if(ret_value<0) { - if(new_dt) - H5T_close(new_dt); - } /* end if */ - - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_native_type - * - * Purpose: Returns the native type of a datatype. - * - * Return: Success: Returns the native data type if successful. - * - * Failure: negative - * - * Programmer: Raymond Lu - * Oct 3, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_t* H5T_get_native_type(H5T_t *dtype, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size) -{ - H5T_t *dt; /* Datatype to make native */ - H5T_class_t h5_class; /* Class of datatype to make native */ - size_t size; /* Size of datatype to make native */ - int nmemb; /* Number of members in compound & enum types */ - H5T_t *super_type; /* Super type of VL, array and enum datatypes */ - H5T_t *nat_super_type; /* Native form of VL, array & enum super datatype */ - H5T_t *new_type=NULL; /* New native datatype */ - int i; /* Local index variable */ - H5T_t *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_get_native_type, NULL); - - assert(dtype); - - if((h5_class = H5T_get_class(dtype))<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a valid class"); - - if((size = H5T_get_size(dtype))==0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a valid size"); - - switch(h5_class) { - case H5T_INTEGER: - { - H5T_sign_t sign; /* Signedness of integer type */ - - if((sign = H5T_get_sign(dtype))==H5T_SGN_ERROR) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a valid signess"); - - if((ret_value = H5T_get_native_integer(size, sign, direction, struct_align, offset, comp_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve integer type"); - } - break; - - case H5T_FLOAT: - if((ret_value = H5T_get_native_float(size, direction, struct_align, offset, comp_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type"); - - break; - - case H5T_STRING: - { - size_t align; - size_t pointer_size; - - if(H5T_is_variable_str(dtype)) { - if(NULL==(dt=H5I_object(H5T_C_S1))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); - if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type"); - if(H5T_set_size(ret_value, H5T_VARIABLE)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot set size"); - - /* Update size, offset and compound alignment for parent. */ - align = H5T_POINTER_COMP_ALIGN_g; - pointer_size = sizeof(char*); - - if(H5T_cmp_offset(comp_size, offset, pointer_size, 1, align, struct_align)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset"); - - } else { - /*size_t char_size;*/ - - if(NULL==(dt=H5I_object(H5T_NATIVE_UCHAR))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); - if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type"); - if(H5T_set_size(ret_value, size)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot set size"); - - /* Update size, offset and compound alignment for parent. */ - align = H5T_NATIVE_SCHAR_COMP_ALIGN_g; - - if(H5T_cmp_offset(comp_size, offset, sizeof(char), size, align, struct_align)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset"); - - } - } - break; - - /* These three types don't need to compute compound field information since they - * can't be used as field. */ - case H5T_TIME: - case H5T_BITFIELD: - case H5T_OPAQUE: - if((ret_value=H5T_copy(dtype, H5T_COPY_TRANSIENT))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type"); - - break; - case H5T_REFERENCE: - { - size_t align; - size_t ref_size; - int not_equal; - - if((ret_value=H5T_copy(dtype, H5T_COPY_TRANSIENT))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type"); - - /* Decide if the data type is object or dataset region reference. */ - if(NULL==(dt=H5I_object(H5T_STD_REF_OBJ_g))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); - not_equal = H5T_cmp(ret_value, dt); - - /* Update size, offset and compound alignment for parent. */ - if(!not_equal) { - align = H5T_HOBJREF_COMP_ALIGN_g; - ref_size = sizeof(hobj_ref_t); - } else { - align = H5T_HDSETREGREF_COMP_ALIGN_g; - ref_size = sizeof(hdset_reg_ref_t); - } - - if(H5T_cmp_offset(comp_size, offset, ref_size, 1, align, struct_align)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset"); - } - break; - - case H5T_COMPOUND: - { - H5T_t *memb_type; /* Datatype of member */ - H5T_t **memb_list; /* List of compound member IDs */ - size_t *memb_offset; /* List of member offsets in compound type, including member size and alignment */ - size_t children_size=0;/* Total size of compound members */ - size_t children_st_align=0; /* The max alignment among compound members. This'll be the compound alignment */ - char **comp_mname; /* List of member names in compound type */ - - if((nmemb = H5T_get_nmembers(dtype))<=0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "compound data type doesn't have any member"); - - if((memb_list = (H5T_t**)H5MM_malloc(nmemb*sizeof(H5T_t*)))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory"); - if((memb_offset = (size_t*)H5MM_calloc(nmemb*sizeof(size_t)))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory"); - if((comp_mname = (char**)H5MM_malloc(nmemb*sizeof(char*)))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory"); - - /* Construct child compound type and retrieve a list of their IDs, offsets, total size, and alignment for compound type. */ - for(i=0; i<nmemb; i++) { - if((memb_type = H5T_get_member_type(dtype, i))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "member type retrieval failed"); - - if((comp_mname[i] = H5T_get_member_name(dtype, i))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "member type retrieval failed"); - - if((memb_list[i] = H5T_get_native_type(memb_type, direction, &children_st_align, &(memb_offset[i]), &children_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "member identifier retrieval failed"); - - if(H5T_close(memb_type)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - } - - /* The alignment for whole compound type */ - if(children_st_align && children_size % children_st_align) { - memb_offset[nmemb-1] += children_size % children_st_align; - children_size += children_size % children_st_align; - } - - /* Construct new compound type based on native type */ - if((new_type=H5T_create(H5T_COMPOUND, children_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot create a compound type"); - - /* Insert members for the new compound type */ - for(i=0; i<nmemb; i++) { - if(H5T_insert(new_type, comp_mname[i], memb_offset[i], memb_list[i])<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot insert member to compound datatype"); - } - - /* Update size, offset and compound alignment for parent. */ - if(offset) - *offset = *comp_size; - if(struct_align && *struct_align < children_st_align) - *struct_align = children_st_align; - *comp_size += children_size; - - /* Close member data type */ - for(i=0; i<nmemb; i++) { - if(H5T_close(memb_list[i])<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - - /* Free member names in list */ - H5MM_xfree(comp_mname[i]); - } - - /* Free lists for members */ - H5MM_xfree(memb_list); - H5MM_xfree(memb_offset); - H5MM_xfree(comp_mname); - - ret_value = new_type; - } - break; - - case H5T_ENUM: - { - char *memb_name; /* Enum's member name */ - void *memb_value; /* Enum's member value */ - - /* Don't need to do anything special for alignment, offset since the ENUM type usually is integer. */ - - /* Retrieve base type for enumarate type */ - if((super_type=H5T_get_super(dtype))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get base type for enumarate type"); - if((nat_super_type = H5T_get_native_type(super_type, direction, struct_align, offset, comp_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "base native type retrieval failed"); - - /* Allocate room for the enum values */ - if((memb_value = H5MM_malloc(H5T_get_size(super_type)))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory"); - - /* Close super type */ - if(H5T_close(super_type)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - - /* Construct new enum type based on native type */ - if((new_type=H5T_enum_create(nat_super_type))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create enum type"); - - /* Retrieve member info and insert members into new enum type */ - if((nmemb = H5T_get_nmembers(dtype))<=0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "enumarate data type doesn't have any member"); - for(i=0; i<nmemb; i++) { - if((memb_name=H5T_get_member_name(dtype, i))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get member name"); - if(H5T_get_member_value(dtype, i, memb_value)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get member value"); - if(H5T_enum_insert(new_type, memb_name, memb_value)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot insert member"); - H5MM_xfree(memb_name); - } - H5MM_xfree(memb_value); - - /* Close base type */ - if(H5T_close(nat_super_type)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - - ret_value = new_type; - } - break; - - case H5T_ARRAY: - { - int array_rank; /* Array's rank */ - hsize_t *dims = NULL; /* Dimension sizes for array */ - hsize_t nelems = 1; - size_t super_offset=0; - size_t super_size=0; - size_t super_align=0; - - /* Retrieve dimension information for array data type */ - if((array_rank=H5T_get_array_ndims(dtype))<=0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get dimension rank"); - if((dims = (hsize_t*)H5MM_malloc(array_rank*sizeof(hsize_t)))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot allocate memory"); - if(H5T_get_array_dims(dtype, dims, NULL)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot get dimension size"); - - /* Retrieve base type for array type */ - if((super_type=H5T_get_super(dtype))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for enumarate type"); - if((nat_super_type = H5T_get_native_type(super_type, direction, &super_align, - &super_offset, &super_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed"); - - /* Close super type */ - if(H5T_close(super_type)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - - /* Create a new array type based on native type */ - if((new_type=H5T_array_create(nat_super_type, array_rank, dims, NULL))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create array type"); - - /* Close base type */ - if(H5T_close(nat_super_type)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - - for(i=0; i<array_rank; i++) - nelems *= dims[i]; - H5_CHECK_OVERFLOW(nelems,hsize_t,size_t); - if(H5T_cmp_offset(comp_size, offset, super_size, (size_t)nelems, super_align, struct_align)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset"); - - H5MM_xfree(dims); - ret_value = new_type; - } - break; - - case H5T_VLEN: - { - size_t vl_align = 0; - size_t vl_size = 0; - size_t super_size=0; - - /* Retrieve base type for array type */ - if((super_type=H5T_get_super(dtype))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get parent type for enumarate type"); - /* Don't need alignment, offset information if this VL isn't a field of compound type. If it - * is, go to a few steps below to compute the information directly. */ - if((nat_super_type = H5T_get_native_type(super_type, direction, NULL, NULL, &super_size))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "parent native type retrieval failed"); - - /* Close super type */ - if(H5T_close(super_type)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - - /* Create a new array type based on native type */ - if((new_type=H5T_vlen_create(nat_super_type))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to create VL type"); - - /* Close base type */ - if(H5T_close(nat_super_type)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot close datatype"); - - /* Update size, offset and compound alignment for parent compound type directly. */ - vl_align = H5T_HVL_COMP_ALIGN_g; - vl_size = sizeof(hvl_t); - - if(H5T_cmp_offset(comp_size, offset, vl_size, 1, vl_align, struct_align)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset"); - - ret_value = new_type; - } - break; - - default: - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "data type doesn't match any native type"); - } - -done: - /* Error cleanup */ - if(ret_value==NULL) { - if(new_type) - H5T_close(new_type); - } /* end if */ - - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_native_integer - * - * Purpose: Returns the native integer type of a datatype. - * - * Return: Success: Returns the native data type if successful. - * - * Failure: negative - * - * Programmer: Raymond Lu - * Oct 3, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_t* H5T_get_native_integer(size_t size, H5T_sign_t sign, H5T_direction_t direction, - size_t *struct_align, size_t *offset, size_t *comp_size) -{ - H5T_t *dt; /* Appropriate native datatype to copy */ - hid_t tid=(-1); /* Datatype ID of appropriate native datatype */ - size_t align=0; /* Alignment necessary for native datatype */ - enum match_type { /* The different kinds of integers we can match */ - H5T_NATIVE_INT_MATCH_CHAR, - H5T_NATIVE_INT_MATCH_SHORT, - H5T_NATIVE_INT_MATCH_INT, - H5T_NATIVE_INT_MATCH_LONG, - H5T_NATIVE_INT_MATCH_LLONG, - H5T_NATIVE_INT_MATCH_UNKNOWN - } match=H5T_NATIVE_INT_MATCH_UNKNOWN; - H5T_t *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_get_native_integer, NULL); - - assert(size>0); - - if(direction == H5T_DIR_DEFAULT || direction == H5T_DIR_ASCEND) { - if(size==sizeof(char)) - match=H5T_NATIVE_INT_MATCH_CHAR; - else if(size==sizeof(short)) - match=H5T_NATIVE_INT_MATCH_SHORT; - else if(size==sizeof(int)) - match=H5T_NATIVE_INT_MATCH_INT; - else if(size==sizeof(long)) - match=H5T_NATIVE_INT_MATCH_LONG; - else if(size==sizeof(long_long)) - match=H5T_NATIVE_INT_MATCH_LLONG; - else /* If no native type matches the querried datatype, simply choose the type of biggest size. */ - match=H5T_NATIVE_INT_MATCH_LLONG; - } else if(direction == H5T_DIR_DESCEND) { - if(size==sizeof(long_long)) - match=H5T_NATIVE_INT_MATCH_LLONG; - else if(size==sizeof(long)) - match=H5T_NATIVE_INT_MATCH_LONG; - else if(size==sizeof(int)) - match=H5T_NATIVE_INT_MATCH_INT; - else if(size==sizeof(short)) - match=H5T_NATIVE_INT_MATCH_SHORT; - else if(size==sizeof(char)) - match=H5T_NATIVE_INT_MATCH_CHAR; - else /* If no native type matches the querried datatype, simple choose the type of smallest size. */ - match=H5T_NATIVE_INT_MATCH_CHAR; - } - - /* Set the appropriate native datatype information */ - switch(match) { - case H5T_NATIVE_INT_MATCH_CHAR: - if(sign==H5T_SGN_2) - tid = H5T_NATIVE_SCHAR; - else - tid = H5T_NATIVE_UCHAR; - - align = H5T_NATIVE_SCHAR_COMP_ALIGN_g; - break; - - case H5T_NATIVE_INT_MATCH_SHORT: - if(sign==H5T_SGN_2) - tid = H5T_NATIVE_SHORT; - else - tid = H5T_NATIVE_USHORT; - - align = H5T_NATIVE_SHORT_COMP_ALIGN_g; - break; - - case H5T_NATIVE_INT_MATCH_INT: - if(sign==H5T_SGN_2) - tid = H5T_NATIVE_INT; - else - tid = H5T_NATIVE_UINT; - - align = H5T_NATIVE_INT_COMP_ALIGN_g; - break; - - case H5T_NATIVE_INT_MATCH_LONG: - if(sign==H5T_SGN_2) - tid = H5T_NATIVE_LONG; - else - tid = H5T_NATIVE_ULONG; - - align = H5T_NATIVE_LONG_COMP_ALIGN_g; - break; - - case H5T_NATIVE_INT_MATCH_LLONG: - if(sign==H5T_SGN_2) - tid = H5T_NATIVE_LLONG; - else - tid = H5T_NATIVE_ULLONG; - - align = H5T_NATIVE_LLONG_COMP_ALIGN_g; - break; - - default: - assert(0 && "Unknown native integer match!"); - break; - } /* end switch */ - - /* Create new native type */ - assert(tid>=0); - if(NULL==(dt=H5I_object(tid))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); - if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type"); - - /* compute size and offset of compound type member. */ - if(H5T_cmp_offset(comp_size, offset, size, 1, align, struct_align)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_native_float - * - * Purpose: Returns the native floatt type of a datatype. - * - * Return: Success: Returns the native data type if successful. - * - * Failure: negative - * - * Programmer: Raymond Lu - * Oct 3, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_t* H5T_get_native_float(size_t size, H5T_direction_t direction, size_t *struct_align, size_t *offset, size_t *comp_size) -{ - H5T_t *dt=NULL; /* Appropriate native datatype to copy */ - hid_t tid=(-1); /* Datatype ID of appropriate native datatype */ - size_t align=0; /* Alignment necessary for native datatype */ - enum match_type { /* The different kinds of floating point types we can match */ - H5T_NATIVE_FLOAT_MATCH_FLOAT, - H5T_NATIVE_FLOAT_MATCH_DOUBLE, - H5T_NATIVE_FLOAT_MATCH_LDOUBLE, - H5T_NATIVE_FLOAT_MATCH_UNKNOWN - } match=H5T_NATIVE_FLOAT_MATCH_UNKNOWN; - H5T_t *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_get_native_integer, NULL); - - assert(size>0); - - if(direction == H5T_DIR_DEFAULT || direction == H5T_DIR_ASCEND) { - if(size==sizeof(float)) - match=H5T_NATIVE_FLOAT_MATCH_FLOAT; - else if(size==sizeof(double)) - match=H5T_NATIVE_FLOAT_MATCH_DOUBLE; - else if(size==sizeof(long double)) - match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE; - else /* If not match, return the biggest datatype */ - match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE; - } else { - if(size==sizeof(long double)) - match=H5T_NATIVE_FLOAT_MATCH_LDOUBLE; - else if(size==sizeof(double)) - match=H5T_NATIVE_FLOAT_MATCH_DOUBLE; - else if(size==sizeof(float)) - match=H5T_NATIVE_FLOAT_MATCH_FLOAT; - else - match=H5T_NATIVE_FLOAT_MATCH_FLOAT; - } - - /* Set the appropriate native floating point information */ - switch(match) { - case H5T_NATIVE_FLOAT_MATCH_FLOAT: - tid = H5T_NATIVE_FLOAT; - align = H5T_NATIVE_FLOAT_COMP_ALIGN_g; - break; - - case H5T_NATIVE_FLOAT_MATCH_DOUBLE: - tid = H5T_NATIVE_DOUBLE; - align = H5T_NATIVE_DOUBLE_COMP_ALIGN_g; - break; - - case H5T_NATIVE_FLOAT_MATCH_LDOUBLE: - tid = H5T_NATIVE_LDOUBLE; - align = H5T_NATIVE_LDOUBLE_COMP_ALIGN_g; - break; - - default: - assert(0 && "Unknown native floating-point match!"); - break; - } /* end switch */ - - /* Create new native type */ - assert(tid>=0); - if(NULL==(dt=H5I_object(tid))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); - if((ret_value=H5T_copy(dt, H5T_COPY_TRANSIENT))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot retrieve float type"); - - /* compute offset of compound type member. */ - if(H5T_cmp_offset(comp_size, offset, size, 1, align, struct_align)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "cannot compute compound offset"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_cmp_offset - * - * Purpose: This function is only for convenience. It computes the - * compound type size, offset of the member being considered - * and the alignment for the whole compound type. - * - * Return: Success: Non-negative value. - * - * Failure: Negative value. - * - * Programmer: Raymond Lu - * December 10, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t H5T_cmp_offset(size_t *comp_size, size_t *offset, size_t elem_size, - size_t nelems, size_t align, size_t *struct_align) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5T_cmp_offset, FAIL); - - if(offset && comp_size) { - if(align>1 && *comp_size%align) { - /* Add alignment value */ - *offset = *comp_size + (align - *comp_size%align); - *comp_size += (align - *comp_size%align); - } else - *offset = *comp_size; - - /* compute size of compound type member. */ - *comp_size += nelems*elem_size; - } - - if(struct_align && *struct_align < align) - *struct_align = align; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- * Function: H5Tget_size * * Purpose: Determines the total size of a data type in bytes. @@ -3431,1839 +2670,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5Tget_order - * - * Purpose: Returns the byte order of a data type. - * - * Return: Success: A byte order constant - * - * Failure: H5T_ORDER_ERROR (Negative) - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -H5T_order_t -H5Tget_order(hid_t type_id) -{ - H5T_t *dt = NULL; - H5T_order_t ret_value; - - FUNC_ENTER_API(H5Tget_order, H5T_ORDER_ERROR); - H5TRACE1("To","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_ORDER_ERROR, "not a data type"); - - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY ==dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_ORDER_ERROR, "operation not defined for specified data type"); - - /* Order */ - assert(H5T_is_atomic(dt)); - ret_value = dt->u.atomic.order; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_order - * - * Purpose: Sets the byte order for a data type. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_order(hid_t type_id, H5T_order_t order) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_order, FAIL); - H5TRACE2("e","iTo",type_id,order); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (order < 0 || order > H5T_ORDER_NONE) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal byte order"); - if (H5T_ENUM==dt->type && dt->u.enumer.nmembs>0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY==dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_ORDER_ERROR, "operation not defined for specified data type"); - - /* Commit */ - assert(H5T_is_atomic(dt)); - dt->u.atomic.order = order; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_precision - * - * Purpose: Gets the precision of a data type. The precision is - * the number of significant bits which, unless padding is - * present, is 8 times larger than the value returned by - * H5Tget_size(). - * - * Return: Success: Number of significant bits - * - * Failure: 0 (all atomic types have at least one - * significant bit) - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -size_t -H5Tget_precision(hid_t type_id) -{ - H5T_t *dt = NULL; - size_t ret_value; - - FUNC_ENTER_API(H5Tget_precision, 0); - H5TRACE1("z","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a data type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY==dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, 0, "operation not defined for specified data type"); - - /* Precision */ - assert(H5T_is_atomic(dt)); - ret_value = dt->u.atomic.prec; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_precision - * - * Purpose: Sets the precision of a data type. The precision is - * the number of significant bits which, unless padding is - * present, is 8 times larger than the value returned by - * H5Tget_size(). - * - * If the precision is increased then the offset is decreased - * and then the size is increased to insure that significant - * bits do not "hang over" the edge of the data type. - * - * The precision property of strings is read-only. - * - * When decreasing the precision of a floating point type, set - * the locations and sizes of the sign, mantissa, and exponent - * fields first. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Moved real work to a private function. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_precision(hid_t type_id, size_t prec) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_precision, FAIL); - H5TRACE2("e","iz",type_id,prec); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (prec <= 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "precision must be positive"); - if (H5T_ENUM==dt->type && dt->u.enumer.nmembs>0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined"); - - /* Do the work */ - if (H5T_set_precision(dt, prec)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set precision"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_offset - * - * Purpose: Retrieves the bit offset of the first significant bit. The - * signficant bits of an atomic datum can be offset from the - * beginning of the memory for that datum by an amount of - * padding. The `offset' property specifies the number of bits - * of padding that appear to the "right of" the value. That is, - * if we have a 32-bit datum with 16-bits of precision having - * the value 0x1122 then it will be layed out in memory as (from - * small byte address toward larger byte addresses): - * - * Big Big Little Little - * Endian Endian Endian Endian - * offset=0 offset=16 offset=0 offset=16 - * - * 0: [ pad] [0x11] [0x22] [ pad] - * 1: [ pad] [0x22] [0x11] [ pad] - * 2: [0x11] [ pad] [ pad] [0x22] - * 3: [0x22] [ pad] [ pad] [0x11] - * - * Return: Success: The offset (non-negative) - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -int -H5Tget_offset(hid_t type_id) -{ - H5T_t *dt = NULL; - int ret_value; - - FUNC_ENTER_API(H5Tget_offset, -1); - H5TRACE1("Is","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY==dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for specified data type"); - - /* Offset */ - assert(H5T_is_atomic(dt)); - ret_value = (int)dt->u.atomic.offset; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_offset - * - * Purpose: Sets the bit offset of the first significant bit. The - * signficant bits of an atomic datum can be offset from the - * beginning of the memory for that datum by an amount of - * padding. The `offset' property specifies the number of bits - * of padding that appear to the "right of" the value. That is, - * if we have a 32-bit datum with 16-bits of precision having - * the value 0x1122 then it will be layed out in memory as (from - * small byte address toward larger byte addresses): - * - * Big Big Little Little - * Endian Endian Endian Endian - * offset=0 offset=16 offset=0 offset=16 - * - * 0: [ pad] [0x11] [0x22] [ pad] - * 1: [ pad] [0x22] [0x11] [ pad] - * 2: [0x11] [ pad] [ pad] [0x22] - * 3: [0x22] [ pad] [ pad] [0x11] - * - * If the offset is incremented then the total size is - * incremented also if necessary to prevent significant bits of - * the value from hanging over the edge of the data type. - * - * The offset of an H5T_STRING cannot be set to anything but - * zero. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Moved real work to a private function. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_offset(hid_t type_id, size_t offset) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_offset, FAIL); - H5TRACE2("e","iz",type_id,offset); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an atomic data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (H5T_STRING == dt->type && offset != 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "offset must be zero for this type"); - if (H5T_ENUM==dt->type && dt->u.enumer.nmembs>0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined"); - - /* Do the real work */ - if (H5T_set_offset(dt, offset)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set offset"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_pad - * - * Purpose: Gets the least significant pad type and the most significant - * pad type and returns their values through the LSB and MSB - * arguments, either of which may be the null pointer. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tget_pad(hid_t type_id, H5T_pad_t *lsb/*out*/, H5T_pad_t *msb/*out*/) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tget_pad, FAIL); - H5TRACE3("e","ixx",type_id,lsb,msb); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY==dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for specified data type"); - - /* Get values */ - assert(H5T_is_atomic(dt)); - if (lsb) - *lsb = dt->u.atomic.lsb_pad; - if (msb) - *msb = dt->u.atomic.msb_pad; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_pad - * - * Purpose: Sets the LSB and MSB pad types. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_pad, FAIL); - H5TRACE3("e","iTpTp",type_id,lsb,msb); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (lsb < 0 || lsb >= H5T_NPAD || msb < 0 || msb >= H5T_NPAD) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pad type"); - if (H5T_ENUM==dt->type && dt->u.enumer.nmembs>0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY==dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for specified data type"); - - /* Commit */ - assert(H5T_is_atomic(dt)); - dt->u.atomic.lsb_pad = lsb; - dt->u.atomic.msb_pad = msb; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_sign - * - * Purpose: Retrieves the sign type for an integer type. - * - * Return: Success: The sign type. - * - * Failure: H5T_SGN_ERROR (Negative) - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - *------------------------------------------------------------------------- - */ -H5T_sign_t -H5Tget_sign(hid_t type_id) -{ - H5T_t *dt = NULL; - H5T_sign_t ret_value; - - FUNC_ENTER_API(H5Tget_sign, H5T_SGN_ERROR); - H5TRACE1("Ts","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_SGN_ERROR, "not an integer data type"); - - ret_value = H5T_get_sign(dt); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_sign - * - * Purpose: Private function for H5Tget_sign. Retrieves the sign type - * for an integer type. - * - * Return: Success: The sign type. - * - * Failure: H5T_SGN_ERROR (Negative) - * - * Programmer: Raymond Lu - * October 8, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_sign_t -H5T_get_sign(H5T_t *dt) -{ - H5T_sign_t ret_value; - - FUNC_ENTER_NOAPI(H5T_get_sign, H5T_SGN_ERROR); - - assert(dt); - - /* Defer to parent */ - while(dt->parent) - dt = dt->parent; - - /* Check args */ - if (H5T_INTEGER!=dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_SGN_ERROR, "operation not defined for data type class"); - - /* Sign */ - ret_value = dt->u.atomic.u.i.sign; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - - -/*------------------------------------------------------------------------- - * Function: H5Tset_sign - * - * Purpose: Sets the sign property for an integer. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_sign(hid_t type_id, H5T_sign_t sign) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_sign, FAIL); - H5TRACE2("e","iTs",type_id,sign); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (sign < 0 || sign >= H5T_NSGN) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal sign type"); - if (H5T_ENUM==dt->type && dt->u.enumer.nmembs>0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_INTEGER!=dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - - /* Commit */ - dt->u.atomic.u.i.sign = sign; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_fields - * - * Purpose: Returns information about the locations of the various bit - * fields of a floating point data type. The field positions - * are bit positions in the significant region of the data type. - * Bits are numbered with the least significant bit number zero. - * - * Any (or even all) of the arguments can be null pointers. - * - * Return: Success: Non-negative, field locations and sizes are - * returned through the arguments. - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - *------------------------------------------------------------------------- - */ -herr_t -H5Tget_fields(hid_t type_id, size_t *spos/*out*/, - size_t *epos/*out*/, size_t *esize/*out*/, - size_t *mpos/*out*/, size_t *msize/*out*/) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tget_fields, FAIL); - H5TRACE6("e","ixxxxx",type_id,spos,epos,esize,mpos,msize); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - - /* Get values */ - if (spos) *spos = dt->u.atomic.u.f.sign; - if (epos) *epos = dt->u.atomic.u.f.epos; - if (esize) *esize = dt->u.atomic.u.f.esize; - if (mpos) *mpos = dt->u.atomic.u.f.mpos; - if (msize) *msize = dt->u.atomic.u.f.msize; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_fields - * - * Purpose: Sets the locations and sizes of the various floating point - * bit fields. The field positions are bit positions in the - * significant region of the data type. Bits are numbered with - * the least significant bit number zero. - * - * Fields are not allowed to extend beyond the number of bits of - * precision, nor are they allowed to overlap with one another. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_fields(hid_t type_id, size_t spos, size_t epos, size_t esize, - size_t mpos, size_t msize) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_fields, FAIL); - H5TRACE6("e","izzzzz",type_id,spos,epos,esize,mpos,msize); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - if (epos + esize > dt->u.atomic.prec) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "exponent bit field size/location is invalid"); - if (mpos + msize > dt->u.atomic.prec) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "mantissa bit field size/location is invalid"); - if (spos >= dt->u.atomic.prec) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign location is not valid"); - - /* Check for overlap */ - if (spos >= epos && spos < epos + esize) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign bit appears within exponent field"); - if (spos >= mpos && spos < mpos + msize) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "sign bit appears within mantissa field"); - if ((mpos < epos && mpos + msize > epos) || - (epos < mpos && epos + esize > mpos)) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "exponent and mantissa fields overlap"); - - /* Commit */ - dt->u.atomic.u.f.sign = spos; - dt->u.atomic.u.f.epos = epos; - dt->u.atomic.u.f.mpos = mpos; - dt->u.atomic.u.f.esize = esize; - dt->u.atomic.u.f.msize = msize; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_ebias - * - * Purpose: Retrieves the exponent bias of a floating-point type. - * - * Return: Success: The bias - * - * Failure: 0 - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - *------------------------------------------------------------------------- - */ -size_t -H5Tget_ebias(hid_t type_id) -{ - H5T_t *dt = NULL; - size_t ret_value; - - FUNC_ENTER_API(H5Tget_ebias, 0); - H5TRACE1("z","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a data type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, 0, "operation not defined for data type class"); - - /* bias */ - H5_ASSIGN_OVERFLOW(ret_value,dt->u.atomic.u.f.ebias,uint64_t,size_t); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_ebias - * - * Purpose: Sets the exponent bias of a floating-point type. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_ebias(hid_t type_id, size_t ebias) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_ebias, FAIL); - H5TRACE2("e","iz",type_id,ebias); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - - /* Commit */ - dt->u.atomic.u.f.ebias = ebias; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_norm - * - * Purpose: Returns the mantisssa normalization of a floating-point data - * type. - * - * Return: Success: Normalization ID - * - * Failure: H5T_NORM_ERROR (Negative) - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - * - *------------------------------------------------------------------------- - */ -H5T_norm_t -H5Tget_norm(hid_t type_id) -{ - H5T_t *dt = NULL; - H5T_norm_t ret_value; - - FUNC_ENTER_API(H5Tget_norm, H5T_NORM_ERROR); - H5TRACE1("Tn","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NORM_ERROR, "not a data type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_NORM_ERROR, "operation not defined for data type class"); - - /* norm */ - ret_value = dt->u.atomic.u.f.norm; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_norm - * - * Purpose: Sets the mantissa normalization method for a floating point - * data type. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_norm(hid_t type_id, H5T_norm_t norm) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_norm, FAIL); - H5TRACE2("e","iTn",type_id,norm); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (norm < 0 || norm > H5T_NORM_NONE) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal normalization"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - - /* Commit */ - dt->u.atomic.u.f.norm = norm; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_inpad - * - * Purpose: If any internal bits of a floating point type are unused - * (that is, those significant bits which are not part of the - * sign, exponent, or mantissa) then they will be filled - * according to the value of this property. - * - * Return: Success: The internal padding type. - * - * Failure: H5T_PAD_ERROR (Negative) - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -H5T_pad_t -H5Tget_inpad(hid_t type_id) -{ - H5T_t *dt = NULL; - H5T_pad_t ret_value; - - FUNC_ENTER_API(H5Tget_inpad, H5T_PAD_ERROR); - H5TRACE1("Tp","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_PAD_ERROR, "not a data type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_PAD_ERROR, "operation not defined for data type class"); - - /* pad */ - ret_value = dt->u.atomic.u.f.pad; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_inpad - * - * Purpose: If any internal bits of a floating point type are unused - * (that is, those significant bits which are not part of the - * sign, exponent, or mantissa) then they will be filled - * according to the value of this property. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_inpad(hid_t type_id, H5T_pad_t pad) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_inpad, FAIL); - H5TRACE2("e","iTp",type_id,pad); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (pad < 0 || pad >= H5T_NPAD) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal internal pad type"); - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_FLOAT != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - - /* Commit */ - dt->u.atomic.u.f.pad = pad; - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_cset - * - * Purpose: HDF5 is able to distinguish between character sets of - * different nationalities and to convert between them to the - * extent possible. - * - * Return: Success: The character set of an H5T_STRING type. - * - * Failure: H5T_CSET_ERROR (Negative) - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -H5T_cset_t -H5Tget_cset(hid_t type_id) -{ - H5T_t *dt = NULL; - H5T_cset_t ret_value; - - FUNC_ENTER_API(H5Tget_cset, H5T_CSET_ERROR); - H5TRACE1("Tc","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_CSET_ERROR, "not a data type"); - /* Don't see any reason for this. Causes problem for variable-length - * string. -SLU (& QAK) */ - /*if (dt->parent) dt = dt->parent;*/ /*defer to parent*/ - if (!(H5T_STRING == dt->type || (H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_CSET_ERROR, "operation not defined for data type class"); - - /* result */ - if(H5T_STRING == dt->type) - ret_value = dt->u.atomic.u.s.cset; - else if(H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type) - ret_value = dt->u.vlen.cset; - else - HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, H5T_CSET_ERROR, "can't get cset info"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_cset - * - * Purpose: HDF5 is able to distinguish between character sets of - * different nationalities and to convert between them to the - * extent possible. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_cset(hid_t type_id, H5T_cset_t cset) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_cset, FAIL); - H5TRACE2("e","iTc",type_id,cset); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (cset < 0 || cset >= H5T_NCSET) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal character set type"); - /* Don't see any reason for this. Causes problem for variable-length - * string. -SLU (& QAK) */ - /*if (dt->parent) dt = dt->parent;*/ /*defer to parent*/ - if (!(H5T_STRING == dt->type || (H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - - /* Commit */ - if(H5T_STRING == dt->type) - dt->u.atomic.u.s.cset = cset; - else if(H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type) - dt->u.vlen.cset = cset; - else - HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, "can't set cset info"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_strpad - * - * Purpose: The method used to store character strings differs with the - * programming language: C usually null terminates strings while - * Fortran left-justifies and space-pads strings. This property - * defines the storage mechanism for the string. - * - * Return: Success: The character set of an H5T_STRING type. - * - * Failure: H5T_STR_ERROR (Negative) - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -H5T_str_t -H5Tget_strpad(hid_t type_id) -{ - H5T_t *dt = NULL; - H5T_str_t ret_value; - - FUNC_ENTER_API(H5Tget_strpad, H5T_STR_ERROR); - H5TRACE1("Tz","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_STR_ERROR, "not a data type"); - /* Don't see any reason for this. Causes problem for variable-length - * string. -SLU (& QAK) */ - /* if (dt->parent) dt = dt->parent;*/ /*defer to parent*/ - if (!(H5T_STRING == dt->type || (H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5T_STR_ERROR, "operation not defined for data type class"); - - /* result */ - if(H5T_STRING == dt->type) - ret_value = dt->u.atomic.u.s.pad; - else if(H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type) - ret_value = dt->u.vlen.pad; - else - HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, H5T_STR_ERROR, "can't get strpad info"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_strpad - * - * Purpose: The method used to store character strings differs with the - * programming language: C usually null terminates strings while - * Fortran left-justifies and space-pads strings. This property - * defines the storage mechanism for the string. - * - * When converting from a long string to a short string if the - * short string is H5T_STR_NULLPAD or H5T_STR_SPACEPAD then the - * string is simply truncated; otherwise if the short string is - * H5T_STR_NULLTERM it will be truncated and a null terminator - * is appended. - * - * When converting from a short string to a long string, the - * long string is padded on the end by appending nulls or - * spaces. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Friday, January 9, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_strpad(hid_t type_id, H5T_str_t strpad) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_strpad, FAIL); - H5TRACE2("e","iTz",type_id,strpad); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (strpad < 0 || strpad >= H5T_NSTR) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "illegal string pad type"); - /* Don't see any reason for this. Causes problem for variable-length - * string. -SLU (& QAK) */ - /* if (dt->parent) dt = dt->parent;*/ /*defer to parent*/ - if (!(H5T_STRING == dt->type || (H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - - /* Commit */ - if(H5T_STRING == dt->type) - dt->u.atomic.u.s.pad = strpad; - else if(H5T_VLEN == dt->type && H5T_VLEN_STRING == dt->u.vlen.type) - dt->u.vlen.pad = strpad; - else - HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, H5T_STR_ERROR, "can't set strpad info"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_nmembers - * - * Purpose: Determines how many members TYPE_ID has. The type must be - * either a compound data type or an enumeration data type. - * - * Return: Success: Number of members defined in the data type. - * - * Failure: Negative - * - * Errors: - * - * Programmer: Robb Matzke - * Monday, December 8, 1997 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with enumeration data types. - *------------------------------------------------------------------------- - */ -int -H5Tget_nmembers(hid_t type_id) -{ - H5T_t *dt = NULL; - int ret_value; - - FUNC_ENTER_API(H5Tget_num_members, FAIL); - H5TRACE1("Is","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - - if((ret_value = H5T_get_nmembers(dt))<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "cannot return member number"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_nmembers - * - * Purpose: Private function for H5Tget_nmembers. Determines how many - * members DTYPE has. The type must be either a compound data i - * type or an enumeration data type. - * - * Return: Success: Number of members defined in the data type. - * - * Failure: Negative - * - * Errors: - * - * Programmer: Raymond Lu - * October 8, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -int -H5T_get_nmembers(const H5T_t *dt) -{ - int ret_value; - - FUNC_ENTER_NOAPI(H5T_get_nmembers, FAIL); - - assert(dt); - - if (H5T_COMPOUND==dt->type) - ret_value = dt->u.compnd.nmembs; - else if (H5T_ENUM==dt->type) - ret_value = dt->u.enumer.nmembs; - else - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "operation not supported for type class"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_member_name - * - * Purpose: Returns the name of a member of a compound or enumeration - * data type. Members are stored in no particular order with - * numbers 0 through N-1 where N is the value returned by - * H5Tget_nmembers(). - * - * Return: Success: Ptr to a string allocated with malloc(). The - * caller is responsible for freeing the string. - * - * Failure: NULL - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works with enumeration data types. - *------------------------------------------------------------------------- - */ -char * -H5Tget_member_name(hid_t type_id, int membno) -{ - H5T_t *dt = NULL; - char *ret_value; - - FUNC_ENTER_API(H5Tget_member_name, NULL); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); - - if((ret_value = H5T_get_member_name(dt, membno))==NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "unable to get member name"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_member_name - * - * Purpose: Private function for H5Tget_member_name. Returns the name - * of a member of a compound or enumeration data type. Members - * are stored in no particular order with numbers 0 through - * N-1 where N is the value returned by H5Tget_nmembers(). - * - * Return: Success: Ptr to a string allocated with malloc(). The - * caller is responsible for freeing the string. - * - * Failure: NULL - * - * Programmer: Raymond Lu - * October 9, 2002 - * - * Modifications: - *------------------------------------------------------------------------- - */ -char * -H5T_get_member_name(H5T_t *dt, int membno) -{ - char *ret_value; - - FUNC_ENTER_NOAPI(H5T_get_member_name, NULL); - - assert(dt); - - switch (dt->type) { - case H5T_COMPOUND: - if (membno<0 || membno>=dt->u.compnd.nmembs) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid member number"); - ret_value = H5MM_xstrdup(dt->u.compnd.memb[membno].name); - break; - - case H5T_ENUM: - if (membno<0 || membno>=dt->u.enumer.nmembs) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid member number"); - ret_value = H5MM_xstrdup(dt->u.enumer.name[membno]); - break; - - default: - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "operation not supported for type class"); - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_member_index - * - * Purpose: Returns the index of a member in a compound or enumeration - * data type by given name.Members are stored in no particular - * order with numbers 0 through N-1 where N is the value - * returned by H5Tget_nmembers(). - * - * Return: Success: index of the member if exists. - * Failure: -1. - * - * Programmer: Raymond Lu - * Thursday, April 4, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -int -H5Tget_member_index(hid_t type_id, const char *name) -{ - H5T_t *dt = NULL; - int ret_value=FAIL; - int nmembs, i; - - FUNC_ENTER_API(H5Tget_member_index, FAIL); - H5TRACE2("Is","is",type_id,name); - - /* Check arguments */ - assert(name); - if(NULL==(dt=H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - - /* Locate member by name */ - switch (dt->type) { - case H5T_COMPOUND: - nmembs = dt->u.compnd.nmembs; - for(i=0; i<nmembs; i++) { - if(!HDstrcmp(dt->u.compnd.memb[i].name, name)) - HGOTO_DONE(i); - } - break; - case H5T_ENUM: - nmembs = dt->u.enumer.nmembs; - for(i=0; i<nmembs; i++) { - if(!HDstrcmp(dt->u.enumer.name[i], name)) - HGOTO_DONE(i); - } - break; - default: - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "operation not supported for this type"); - } - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_member_offset - * - * Purpose: Returns the byte offset of the beginning of a member with - * respect to the beginning of the compound data type datum. - * - * Return: Success: Byte offset. - * - * Failure: Zero. Zero is a valid offset, but this - * function will fail only if a call to - * H5Tget_member_dims() fails with the same - * arguments. - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -size_t -H5Tget_member_offset(hid_t type_id, int membno) -{ - H5T_t *dt = NULL; - size_t ret_value; - - FUNC_ENTER_API(H5Tget_member_offset, 0); - H5TRACE2("z","iIs",type_id,membno); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)) || H5T_COMPOUND != dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a compound data type"); - if (membno < 0 || membno >= dt->u.compnd.nmembs) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, 0, "invalid member number"); - - /* Value */ - ret_value = H5T_get_member_offset(dt, membno); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_member_offset - * - * Purpose: Private function for H5Tget_member_offset. Returns the byte - * offset of the beginning of a member with respect to the i - * beginning of the compound data type datum. - * - * Return: Success: Byte offset. - * - * Failure: Zero. Zero is a valid offset, but this - * function will fail only if a call to - * H5Tget_member_dims() fails with the same - * arguments. - * - * Programmer: Raymond Lu - * October 8, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -size_t -H5T_get_member_offset(H5T_t *dt, int membno) -{ - size_t ret_value; - - FUNC_ENTER_NOAPI(H5T_get_member_offset, 0); - - assert(dt); - assert(membno >= 0 && membno < dt->u.compnd.nmembs); - - /* Value */ - ret_value = dt->u.compnd.memb[membno].offset; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_member_class - * - * Purpose: Returns the datatype class of a member of a compound datatype. - * - * Return: Success: Non-negative - * - * Failure: H5T_NO_CLASS - * - * Programmer: Quincey Koziol - * Thursday, November 9, 2000 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_class_t -H5Tget_member_class(hid_t type_id, int membno) -{ - H5T_t *dt = NULL; - H5T_class_t ret_value; - - FUNC_ENTER_API(H5Tget_member_class, H5T_NO_CLASS); - H5TRACE2("Tt","iIs",type_id,membno); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)) || H5T_COMPOUND != dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5T_NO_CLASS, "not a compound data type"); - if (membno < 0 || membno >= dt->u.compnd.nmembs) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5T_NO_CLASS, "invalid member number"); - - /* Value */ - ret_value = dt->u.compnd.memb[membno].type->type; - -done: - FUNC_LEAVE_API(ret_value); -} /* end H5Tget_member_class() */ - - - -/*------------------------------------------------------------------------- - * Function: H5Tget_member_type - * - * Purpose: Returns the data type of the specified member. The caller - * should invoke H5Tclose() to release resources associated with - * the type. - * - * Return: Success: An OID of a copy of the member data type; - * modifying the returned data type does not - * modify the member type. - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * - * Robb Matzke, 4 Jun 1998 - * If the member type is a named type then this function returns a - * handle to the re-opened named type. - * - *------------------------------------------------------------------------- - */ -hid_t -H5Tget_member_type(hid_t type_id, int membno) -{ - H5T_t *dt = NULL, *memb_dt = NULL; - hid_t ret_value; - - FUNC_ENTER_API(H5Tget_member_type, FAIL); - H5TRACE2("i","iIs",type_id,membno); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)) || H5T_COMPOUND != dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); - if (membno < 0 || membno >= dt->u.compnd.nmembs) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number"); - if ((memb_dt=H5T_get_member_type(dt, membno))==NULL) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to retrieve member type"); - if ((ret_value = H5I_register(H5I_DATATYPE, memb_dt)) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable register data type atom"); - -done: - if(ret_value<0) { - if(memb_dt!=NULL) - H5T_close(memb_dt); - } /* end if */ - - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_member_type - * - * Purpose: Private function for H5Tget_member_type. Returns the data - * type of the specified member. - * - * Return: Success: A copy of the member data type; - * modifying the returned data type does not - * modify the member type. - * - * Failure: NULL - * - * Programmer: Raymond Lu - * October 8, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_t * -H5T_get_member_type(H5T_t *dt, int membno) -{ - H5T_t *ret_value = NULL; - - FUNC_ENTER_NOAPI(H5T_get_member_type, NULL); - - assert(dt); - assert(membno >=0 && membno < dt->u.compnd.nmembs); - - /* Copy data type into an atom */ - if (NULL == (ret_value = H5T_copy(dt->u.compnd.memb[membno].type, H5T_COPY_REOPEN))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "unable to copy member data type"); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - - -/*------------------------------------------------------------------------- - * Function: H5Tinsert - * - * Purpose: Adds another member to the compound data type PARENT_ID. The - * new member has a NAME which must be unique within the - * compound data type. The OFFSET argument defines the start of - * the member in an instance of the compound data type, and - * MEMBER_ID is the type of the new member. - * - * Return: Success: Non-negative, the PARENT_ID compound data - * type is modified to include a copy of the - * member type MEMBER_ID. - * - * Failure: Negative - * - * Errors: - * - * Programmer: Robb Matzke - * Monday, December 8, 1997 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tinsert(hid_t parent_id, const char *name, size_t offset, hid_t member_id) -{ - H5T_t *parent = NULL; /*the compound parent data type */ - H5T_t *member = NULL; /*the atomic member type */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tinsert, FAIL); - H5TRACE4("e","iszi",parent_id,name,offset,member_id); - - /* Check args */ - if (parent_id==member_id) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "can't insert compound datatype within itself"); - if (NULL == (parent = H5I_object_verify(parent_id,H5I_DATATYPE)) || H5T_COMPOUND != parent->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); - if (H5T_STATE_TRANSIENT!=parent->state) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "parent type read-only"); - if (!name || !*name) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no member name"); - if (NULL == (member = H5I_object_verify(member_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - - /* Insert */ - if (H5T_insert(parent, name, offset, member) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "unable to insert member"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tpack - * - * Purpose: Recursively removes padding from within a compound data type - * to make it more efficient (space-wise) to store that data. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tpack(hid_t type_id) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tpack, FAIL); - H5TRACE1("e","i",type_id); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE)) || H5T_COMPOUND != dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a compound data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "data type is read-only"); - - /* Pack */ - if (H5T_pack(dt) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to pack compound data type"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tenum_create - * - * Purpose: Create a new enumeration data type based on the specified - * TYPE, which must be an integer type. - * - * Return: Success: ID of new enumeration data type - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Tuesday, December 22, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -hid_t -H5Tenum_create(hid_t parent_id) -{ - H5T_t *parent = NULL; /*base integer data type */ - H5T_t *dt = NULL; /*new enumeration data type */ - hid_t ret_value; /*return value */ - - FUNC_ENTER_API(H5Tenum_create, FAIL); - H5TRACE1("i","i",parent_id); - - /* Check args */ - if (NULL==(parent=H5I_object_verify(parent_id,H5I_DATATYPE)) || H5T_INTEGER!=parent->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an integer data type"); - - /* Build new type */ - if((dt=H5T_enum_create(parent))==NULL) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "cannot create enum type"); - /* Atomize the type */ - if ((ret_value=H5I_register(H5I_DATATYPE, dt))<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data type atom"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_enum_create - * - * Purpose: Private function for H5Tenum_create. Create a new - * enumeration data type based on the specified - * TYPE, which must be an integer type. - * - * Return: Success: new enumeration data type - * - * Failure: NULL - * - * Programmer: Raymond Lu - * October 9, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_t * -H5T_enum_create(H5T_t *parent) -{ - H5T_t *ret_value; /*new enumeration data type */ - - FUNC_ENTER_NOAPI(H5T_enum_create, NULL); - - assert(parent); - - /* Build new type */ - if (NULL==(ret_value = H5FL_CALLOC(H5T_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - ret_value->type = H5T_ENUM; - ret_value->parent = H5T_copy(parent, H5T_COPY_ALL); - assert(ret_value->parent); - ret_value->size = ret_value->parent->size; - ret_value->ent.header = HADDR_UNDEF; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - - -/*------------------------------------------------------------------------- - * Function: H5Tenum_insert - * - * Purpose: Insert a new enumeration data type member into an enumeration - * type. TYPE is the enumeration type, NAME is the name of the - * new member, and VALUE points to the value of the new member. - * The NAME and VALUE must both be unique within the TYPE. VALUE - * points to data which is of the data type defined when the - * enumeration type was created. - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Robb Matzke - * Wednesday, December 23, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tenum_insert(hid_t type, const char *name, void *value) -{ - H5T_t *dt=NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tenum_insert, FAIL); - H5TRACE3("e","isx",type,name,value); - - /* Check args */ - if (NULL==(dt=H5I_object_verify(type,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_ENUM!=dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an enumeration data type"); - if (!name || !*name) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified"); - if (!value) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no value specified"); - - /* Do work */ - if (H5T_enum_insert(dt, name, value)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to insert new enumeration member"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- * Function: H5Tget_super * * Purpose: Returns the type from which TYPE is derived. In the case of @@ -5344,362 +2750,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5Tget_member_value - * - * Purpose: Return the value for an enumeration data type member. - * - * Return: Success: non-negative with the member value copied - * into the memory pointed to by VALUE. - * - * Failure: negative, VALUE memory is undefined. - * - * Programmer: Robb Matzke - * Wednesday, December 23, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tget_member_value(hid_t type, int membno, void *value/*out*/) -{ - H5T_t *dt=NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tget_member_value, FAIL); - H5TRACE3("e","iIsx",type,membno,value); - - if (NULL==(dt=H5I_object_verify(type,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_ENUM!=dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for data type class"); - if (membno<0 || membno>=dt->u.enumer.nmembs) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid member number"); - if (!value) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null value buffer"); - - if (H5T_get_member_value(dt, membno, value)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unable to get member value"); -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_get_member_value - * - * Purpose: Private function for H5T_get_member_value. Return the - * value for an enumeration data type member. - * - * Return: Success: non-negative with the member value copied - * into the memory pointed to by VALUE. - * - * Failure: negative, VALUE memory is undefined. - * - * Programmer: Raymond Lu - * October 9, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_get_member_value(H5T_t *dt, int membno, void *value/*out*/) -{ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_get_member_value, FAIL); - - assert(dt); - assert(value); - - HDmemcpy(value, dt->u.enumer.value + membno*dt->size, dt->size); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - - -/*------------------------------------------------------------------------- - * Function: H5Tenum_nameof - * - * Purpose: Finds the symbol name that corresponds to the specified VALUE - * of an enumeration data type TYPE. At most SIZE characters of - * the symbol name are copied into the NAME buffer. If the - * entire symbol anem and null terminator do not fit in the NAME - * buffer then as many characters as possible are copied (not - * null terminated) and the function fails. - * - * Return: Success: Non-negative. - * - * Failure: Negative, first character of NAME is set to - * null if SIZE allows it. - * - * Programmer: Robb Matzke - * Monday, January 4, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tenum_nameof(hid_t type, void *value, char *name/*out*/, size_t size) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tenum_nameof, FAIL); - H5TRACE4("e","ixxz",type,value,name,size); - - /* Check args */ - if (NULL==(dt=H5I_object_verify(type,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_ENUM!=dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an enumeration data type"); - if (!value) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no value supplied"); - if (!name) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name buffer supplied"); - - if (NULL==H5T_enum_nameof(dt, value, name, size)) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "nameof query failed"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tenum_valueof - * - * Purpose: Finds the value that corresponds to the specified NAME f an - * enumeration TYPE. The VALUE argument should be at least as - * large as the value of H5Tget_size(type) in order to hold the - * result. - * - * Return: Success: Non-negative - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Monday, January 4, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tenum_valueof(hid_t type, const char *name, void *value/*out*/) -{ - H5T_t *dt = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tenum_valueof, FAIL); - H5TRACE3("e","isx",type,name,value); - - /* Check args */ - if (NULL==(dt=H5I_object_verify(type,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_ENUM!=dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an enumeration data type"); - if (!name || !*name) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name"); - if (!value) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no value buffer"); - - if (H5T_enum_valueof(dt, name, value)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "valueof query failed"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_vlen_create - * - * Purpose: Create a new variable-length data type based on the specified - * BASE_TYPE. - * - * Return: Success: new VL data type - * - * Failure: NULL - * - * Programmer: Quincey Koziol - * Tuesday, November 20, 2001 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static H5T_t * -H5T_vlen_create(H5T_t *base) -{ - H5T_t *dt = NULL; /*new VL data type */ - H5T_t *ret_value; /*return value */ - - FUNC_ENTER_NOINIT(H5T_vlen_create); - - /* Check args */ - assert(base); - - /* Build new type */ - if (NULL==(dt = H5FL_CALLOC(H5T_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - dt->ent.header = HADDR_UNDEF; - dt->type = H5T_VLEN; - - /* - * Force conversions (i.e. memory to memory conversions should duplicate - * data, not point to the same VL sequences) - */ - dt->force_conv = TRUE; - dt->parent = H5T_copy(base, H5T_COPY_ALL); - - /* This is a sequence, not a string */ - dt->u.vlen.type = H5T_VLEN_SEQUENCE; - - /* Set up VL information */ - if (H5T_vlen_mark(dt, NULL, H5T_VLEN_MEMORY)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "invalid VL location"); - - /* Set return value */ - ret_value=dt; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tvlen_create - * - * Purpose: Create a new variable-length data type based on the specified - * BASE_TYPE. - * - * Return: Success: ID of new VL data type - * - * Failure: Negative - * - * Programmer: Quincey Koziol - * Thursday, May 20, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -hid_t -H5Tvlen_create(hid_t base_id) -{ - H5T_t *base = NULL; /*base data type */ - H5T_t *dt = NULL; /*new data type */ - hid_t ret_value; /*return value */ - - FUNC_ENTER_API(H5Tvlen_create, FAIL); - H5TRACE1("i","i",base_id); - - /* Check args */ - if (NULL==(base=H5I_object_verify(base_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype"); - - /* Create up VL datatype */ - if ((dt=H5T_vlen_create(base))==NULL) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid VL location"); - - /* Atomize the type */ - if ((ret_value=H5I_register(H5I_DATATYPE, dt))<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tset_tag - * - * Purpose: Tag an opaque datatype with a unique ASCII identifier. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Thursday, May 20, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tset_tag(hid_t type_id, const char *tag) -{ - H5T_t *dt=NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_API(H5Tset_tag, FAIL); - H5TRACE2("e","is",type_id,tag); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data type"); - if (H5T_STATE_TRANSIENT!=dt->state) - HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "data type is read-only"); - if (H5T_OPAQUE!=dt->type) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an opaque data type"); - if (!tag) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no tag"); - - /* Commit */ - H5MM_xfree(dt->u.opaque.tag); - dt->u.opaque.tag = H5MM_strdup(tag); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5Tget_tag - * - * Purpose: Get tha tag associated with an opaque datatype. - * - * Return: A pointer to an allocated string. The caller should free - * the string. NULL is returned for errors. - * - * Programmer: Robb Matzke - * Thursday, May 20, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -char * -H5Tget_tag(hid_t type_id) -{ - H5T_t *dt=NULL; - char *ret_value; - - FUNC_ENTER_API(H5Tget_tag, NULL); - - /* Check args */ - if (NULL == (dt = H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a data type"); - - if (dt->parent) - dt = dt->parent; /*defer to parent*/ - if (H5T_OPAQUE != dt->type) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, NULL, "operation not defined for data type class"); - - /* result */ - if (NULL==(ret_value=H5MM_strdup(dt->u.opaque.tag))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - -done: - FUNC_LEAVE_API(ret_value); -} - - -/*------------------------------------------------------------------------- * Function: H5T_register * * Purpose: Register a hard or soft conversion function for a data type @@ -5937,7 +2987,7 @@ done: * *------------------------------------------------------------------------- */ -herr_t +static herr_t H5T_unregister(H5T_pers_t pers, const char *name, H5T_t *src, H5T_t *dst, H5T_conv_t func, hid_t dxpl_id) { @@ -6236,6 +3286,7 @@ done: *------------------------------------------------------------------------- */ + /*------------------------------------------------------------------------- * Function: H5T_create * @@ -6379,7 +3430,7 @@ done: * *------------------------------------------------------------------------- */ -H5T_t * +static H5T_t * H5T_open (H5G_entry_t *loc, const char *name, hid_t dxpl_id) { H5T_t *dt; @@ -6678,74 +3729,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5T_commit - * - * Purpose: Commit a type, giving it a name and causing it to become - * immutable. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Monday, June 1, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_commit (H5G_entry_t *loc, const char *name, H5T_t *type, hid_t dxpl_id) -{ - H5F_t *file = NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_commit, FAIL); - - assert (loc); - assert (name && *name); - assert (type); - - /* - * Check arguments. We cannot commit an immutable type because H5Tclose() - * normally fails on such types (try H5Tclose(H5T_NATIVE_INT)) but closing - * a named type should always succeed. - */ - if (H5T_STATE_NAMED==type->state || H5T_STATE_OPEN==type->state) - HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "data type is already committed"); - if (H5T_STATE_IMMUTABLE==type->state) - HGOTO_ERROR (H5E_ARGS, H5E_BADVALUE, FAIL, "data type is immutable"); - - /* Check for a "sensible" datatype to store on disk */ - if(H5T_is_sensible(type)!=TRUE) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "datatype is not sensible"); - - /* Find the insertion file */ - if (NULL==(file=H5G_insertion_file(loc, name, dxpl_id))) - HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to find insertion point"); - - /* - * Create the object header and open it for write access. Insert the data - * type message and then give the object header a name. - */ - if (H5O_create (file, dxpl_id, 64, &(type->ent))<0) - HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create data type object header"); - if (H5O_modify (&(type->ent), H5O_DTYPE, 0, H5O_FLAG_CONSTANT, 1, type, dxpl_id)<0) - HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to update type header message"); - if (H5G_insert (loc, name, &(type->ent), dxpl_id)<0) - HGOTO_ERROR (H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to name data type"); - type->state = H5T_STATE_OPEN; - -done: - if (ret_value<0) { - if ((type->state==H5T_STATE_TRANSIENT || type->state==H5T_STATE_RDONLY) && H5F_addr_defined(type->ent.header)) { - H5O_close(&(type->ent)); - type->ent.header = HADDR_UNDEF; - } - } - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- * Function: H5T_lock * * Purpose: Lock a transient data type making it read-only. If IMMUTABLE @@ -6792,7 +3775,7 @@ done: /*------------------------------------------------------------------------- - * Function: H5T_release + * Function: H5T_free * * Purpose: Frees all memory associated with a datatype, but does not * free the H5T_t structure (which should be done in H5T_close). @@ -6940,7 +3923,8 @@ H5T_is_atomic(const H5T_t *dt) assert(dt); - if (H5T_COMPOUND!=dt->type && H5T_ENUM!=dt->type && H5T_VLEN!=dt->type && H5T_OPAQUE!=dt->type && H5T_ARRAY!=dt->type) + if (H5T_COMPOUND!=dt->type && H5T_ENUM!=dt->type && H5T_VLEN!=dt->type && + H5T_OPAQUE!=dt->type && H5T_ARRAY!=dt->type) ret_value = TRUE; else ret_value = FALSE; @@ -7133,753 +4117,6 @@ H5T_get_size(const H5T_t *dt) /*------------------------------------------------------------------------- - * Function: H5T_set_precision - * - * Purpose: Sets the precision of a data type. The precision is - * the number of significant bits which, unless padding is - * present, is 8 times larger than the value returned by - * H5Tget_size(). - * - * If the precision is increased then the offset is decreased - * and then the size is increased to insure that significant - * bits do not "hang over" the edge of the data type. - * - * The precision property of strings is read-only. - * - * When decreasing the precision of a floating point type, set - * the locations and sizes of the sign, mantissa, and exponent - * fields first. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_set_precision(H5T_t *dt, size_t prec) -{ - size_t offset, size; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_set_precision, FAIL); - - /* Check args */ - assert(dt); - assert(prec>0); - assert(H5T_ENUM!=dt->type || 0==dt->u.enumer.nmembs); - - if (dt->parent) { - if (H5T_set_precision(dt->parent, prec)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set precision for base type"); - dt->size = dt->parent->size; - } else { - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY==dt->type) { - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for specified data type"); - } else if (H5T_ENUM==dt->type) { - /*nothing*/ - } else if (H5T_is_atomic(dt)) { - /* Adjust the offset and size */ - offset = dt->u.atomic.offset; - size = dt->size; - if (prec > 8*size) - offset = 0; - else if (offset+prec > 8 * size) offset = 8 * size - prec; - if (prec > 8*size) - size = (prec+7) / 8; - - /* Check that things are still kosher */ - switch (dt->type) { - case H5T_INTEGER: - case H5T_TIME: - case H5T_BITFIELD: - /* nothing to check */ - break; - - case H5T_STRING: - HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, FAIL, "precision for this type is read-only"); - - case H5T_FLOAT: - /* - * The sign, mantissa, and exponent fields should be adjusted - * first when decreasing the precision of a floating point - * type. - */ - if (dt->u.atomic.u.f.sign >= prec || - dt->u.atomic.u.f.epos + dt->u.atomic.u.f.esize > prec || - dt->u.atomic.u.f.mpos + dt->u.atomic.u.f.msize > prec) { - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "adjust sign, mantissa, and exponent fields first"); - } - break; - - default: - assert("not implemented yet" && 0); - } - - /* Commit */ - dt->size = size; - if (H5T_is_atomic(dt)) { - dt->u.atomic.offset = offset; - dt->u.atomic.prec = prec; - } - } - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_set_offset - * - * Purpose: Sets the bit offset of the first significant bit. The - * signficant bits of an atomic datum can be offset from the - * beginning of the memory for that datum by an amount of - * padding. The `offset' property specifies the number of bits - * of padding that appear to the "right of" the value. That is, - * if we have a 32-bit datum with 16-bits of precision having - * the value 0x1122 then it will be layed out in memory as (from - * small byte address toward larger byte addresses): - * - * Big Big Little Little - * Endian Endian Endian Endian - * offset=0 offset=16 offset=0 offset=16 - * - * 0: [ pad] [0x11] [0x22] [ pad] - * 1: [ pad] [0x22] [0x11] [ pad] - * 2: [0x11] [ pad] [ pad] [0x22] - * 3: [0x22] [ pad] [ pad] [0x11] - * - * If the offset is incremented then the total size is - * incremented also if necessary to prevent significant bits of - * the value from hanging over the edge of the data type. - * - * The offset of an H5T_STRING cannot be set to anything but - * zero. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * Robb Matzke, 22 Dec 1998 - * Also works for derived data types. - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_set_offset(H5T_t *dt, size_t offset) -{ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_set_offset, FAIL); - - /* Check args */ - assert(dt); - assert(H5T_STRING!=dt->type || 0==offset); - assert(H5T_ENUM!=dt->type || 0==dt->u.enumer.nmembs); - - if (dt->parent) { - if (H5T_set_offset(dt->parent, offset)<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set offset for base type"); - dt->size = dt->parent->size; - } else { - if (H5T_COMPOUND==dt->type || H5T_OPAQUE==dt->type || H5T_ARRAY==dt->type) { - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for specified data type"); - } else if (H5T_ENUM==dt->type) { - /*nothing*/ - } else { - if (offset+dt->u.atomic.prec > 8*dt->size) { - dt->size = (offset + dt->u.atomic.prec + 7) / 8; - } - dt->u.atomic.offset = offset; - } - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_insert - * - * Purpose: Adds a new MEMBER to the compound data type PARENT. The new - * member will have a NAME that is unique within PARENT and an - * instance of PARENT will have the member begin at byte offset - * OFFSET from the beginning. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Monday, December 8, 1997 - * - * Modifications: - * Took out arrayness parameters - QAK, 10/6/00 - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_insert(H5T_t *parent, const char *name, size_t offset, const H5T_t *member) -{ - int idx, i; - size_t total_size; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_insert, FAIL); - - /* check args */ - assert(parent && H5T_COMPOUND == parent->type); - assert(H5T_STATE_TRANSIENT==parent->state); - assert(member); - assert(name && *name); - - /* Does NAME already exist in PARENT? */ - for (i=0; i<parent->u.compnd.nmembs; i++) { - if (!HDstrcmp(parent->u.compnd.memb[i].name, name)) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "member name is not unique"); - } - - /* Does the new member overlap any existing member ? */ - total_size=member->size; - for (i=0; i<parent->u.compnd.nmembs; i++) { - if ((offset <= parent->u.compnd.memb[i].offset && - offset + total_size > parent->u.compnd.memb[i].offset) || - (parent->u.compnd.memb[i].offset <= offset && - parent->u.compnd.memb[i].offset + - parent->u.compnd.memb[i].size > offset)) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "member overlaps with another member"); - } - - /* Does the new member overlap the end of the compound type? */ - if(offset+total_size>parent->size) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINSERT, FAIL, "member extends past end of compound type"); - - /* Increase member array if necessary */ - if (parent->u.compnd.nmembs >= parent->u.compnd.nalloc) { - size_t na = parent->u.compnd.nalloc + H5T_COMPND_INC; - H5T_cmemb_t *x = H5MM_realloc (parent->u.compnd.memb, - na * sizeof(H5T_cmemb_t)); - - if (!x) - HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - parent->u.compnd.nalloc = (int)na; - parent->u.compnd.memb = x; - } - - /* Add member to end of member array */ - idx = parent->u.compnd.nmembs; - parent->u.compnd.memb[idx].name = H5MM_xstrdup(name); - parent->u.compnd.memb[idx].offset = offset; - parent->u.compnd.memb[idx].size = total_size; - parent->u.compnd.memb[idx].type = H5T_copy (member, H5T_COPY_ALL); - - parent->u.compnd.sorted = H5T_SORT_NONE; - parent->u.compnd.nmembs++; - - /* - * Set the "force conversion" flag if VL datatype fields exist in this type - * or any component types - */ - if(member->type==H5T_VLEN || member->force_conv==TRUE) - parent->force_conv=TRUE; - - /* Set the flag for this compound type, if the field is an array */ - if(member->type==H5T_ARRAY) - parent->u.compnd.has_array=TRUE; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_pack - * - * Purpose: Recursively packs a compound data type by removing padding - * bytes. This is done in place (that is, destructively). - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_pack(H5T_t *dt) -{ - int i; - size_t offset; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_pack, FAIL); - - assert(dt); - - if (H5T_COMPOUND == dt->type) { - assert(H5T_STATE_TRANSIENT==dt->state); - - /* Recursively pack the members */ - for (i=0; i<dt->u.compnd.nmembs; i++) { - if (H5T_pack(dt->u.compnd.memb[i].type) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to pack part of a compound data type"); - } - - /* Remove padding between members */ - H5T_sort_value(dt, NULL); - for (i=0, offset=0; i<dt->u.compnd.nmembs; i++) { - dt->u.compnd.memb[i].offset = offset; - offset += dt->u.compnd.memb[i].size; - } - - /* Change total size */ - dt->size = MAX(1, offset); - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_sort_value - * - * Purpose: Sorts the members of a compound data type by their offsets; - * sorts the members of an enum type by their values. This even - * works for locked data types since it doesn't change the value - * of the type. MAP is an optional parallel integer array which - * is also swapped along with members of DT. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Wednesday, January 7, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_sort_value(H5T_t *dt, int *map) -{ - int i, j, nmembs; - size_t size; - hbool_t swapped; - uint8_t tbuf[32]; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_sort_value, FAIL); - - /* Check args */ - assert(dt); - assert(H5T_COMPOUND==dt->type || H5T_ENUM==dt->type); - - /* Use a bubble sort because we can short circuit */ - if (H5T_COMPOUND==dt->type) { - if (H5T_SORT_VALUE!=dt->u.compnd.sorted) { - dt->u.compnd.sorted = H5T_SORT_VALUE; - nmembs = dt->u.compnd.nmembs; - for (i=nmembs-1, swapped=TRUE; i>0 && swapped; --i) { - for (j=0, swapped=FALSE; j<i; j++) { - if (dt->u.compnd.memb[j].offset > - dt->u.compnd.memb[j+1].offset) { - H5T_cmemb_t tmp = dt->u.compnd.memb[j]; - dt->u.compnd.memb[j] = dt->u.compnd.memb[j+1]; - dt->u.compnd.memb[j+1] = tmp; - if (map) { - int x = map[j]; - map[j] = map[j+1]; - map[j+1] = x; - } - swapped = TRUE; - } - } - } -#ifndef NDEBUG - /* I never trust a sort :-) -RPM */ - for (i=0; i<nmembs-1; i++) { - assert(dt->u.compnd.memb[i].offset < - dt->u.compnd.memb[i+1].offset); - } -#endif - } - } else if (H5T_ENUM==dt->type) { - if (H5T_SORT_VALUE!=dt->u.enumer.sorted) { - dt->u.enumer.sorted = H5T_SORT_VALUE; - nmembs = dt->u.enumer.nmembs; - size = dt->size; - assert(size<=sizeof(tbuf)); - for (i=nmembs-1, swapped=TRUE; i>0 && swapped; --i) { - for (j=0, swapped=FALSE; j<i; j++) { - if (HDmemcmp(dt->u.enumer.value+j*size, - dt->u.enumer.value+(j+1)*size, - size)>0) { - /* Swap names */ - char *tmp = dt->u.enumer.name[j]; - dt->u.enumer.name[j] = dt->u.enumer.name[j+1]; - dt->u.enumer.name[j+1] = tmp; - - /* Swap values */ - HDmemcpy(tbuf, dt->u.enumer.value+j*size, size); - HDmemcpy(dt->u.enumer.value+j*size, - dt->u.enumer.value+(j+1)*size, size); - HDmemcpy(dt->u.enumer.value+(j+1)*size, tbuf, size); - - /* Swap map */ - if (map) { - int x = map[j]; - map[j] = map[j+1]; - map[j+1] = x; - } - - swapped = TRUE; - } - } - } -#ifndef NDEBUG - /* I never trust a sort :-) -RPM */ - for (i=0; i<nmembs-1; i++) { - assert(HDmemcmp(dt->u.enumer.value+i*size, - dt->u.enumer.value+(i+1)*size, - size)<0); - } -#endif - } - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_sort_name - * - * Purpose: Sorts members of a compound or enumeration data type by their - * names. This even works for locked data types since it doesn't - * change the value of the types. - * - * Return: Success: Non-negative - * - * Failure: Negative - * - * Programmer: Robb Matzke - * Monday, January 4, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_sort_name(H5T_t *dt, int *map) -{ - int i, j, nmembs; - size_t size; - hbool_t swapped; - uint8_t tbuf[32]; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_sort_name, FAIL); - - /* Check args */ - assert(dt); - assert(H5T_COMPOUND==dt->type || H5T_ENUM==dt->type); - - /* Use a bubble sort because we can short circuit */ - if (H5T_COMPOUND==dt->type) { - if (H5T_SORT_NAME!=dt->u.compnd.sorted) { - dt->u.compnd.sorted = H5T_SORT_NAME; - nmembs = dt->u.compnd.nmembs; - for (i=nmembs-1, swapped=TRUE; i>0 && swapped; --i) { - for (j=0, swapped=FALSE; j<i; j++) { - if (HDstrcmp(dt->u.compnd.memb[j].name, - dt->u.compnd.memb[j+1].name)>0) { - H5T_cmemb_t tmp = dt->u.compnd.memb[j]; - dt->u.compnd.memb[j] = dt->u.compnd.memb[j+1]; - dt->u.compnd.memb[j+1] = tmp; - swapped = TRUE; - if (map) { - int x = map[j]; - map[j] = map[j+1]; - map[j+1] = x; - } - } - } - } -#ifndef NDEBUG - /* I never trust a sort :-) -RPM */ - for (i=0; i<nmembs-1; i++) { - assert(HDstrcmp(dt->u.compnd.memb[i].name, - dt->u.compnd.memb[i+1].name)<0); - } -#endif - } - } else if (H5T_ENUM==dt->type) { - if (H5T_SORT_NAME!=dt->u.enumer.sorted) { - dt->u.enumer.sorted = H5T_SORT_NAME; - nmembs = dt->u.enumer.nmembs; - size = dt->size; - assert(size<=sizeof(tbuf)); - for (i=nmembs-1, swapped=TRUE; i>0 && swapped; --i) { - for (j=0, swapped=FALSE; j<i; j++) { - if (HDstrcmp(dt->u.enumer.name[j], - dt->u.enumer.name[j+1])>0) { - /* Swap names */ - char *tmp = dt->u.enumer.name[j]; - dt->u.enumer.name[j] = dt->u.enumer.name[j+1]; - dt->u.enumer.name[j+1] = tmp; - - /* Swap values */ - HDmemcpy(tbuf, dt->u.enumer.value+j*size, size); - HDmemcpy(dt->u.enumer.value+j*size, - dt->u.enumer.value+(j+1)*size, size); - HDmemcpy(dt->u.enumer.value+(j+1)*size, tbuf, size); - - /* Swap map */ - if (map) { - int x = map[j]; - map[j] = map[j+1]; - map[j+1] = x; - } - - swapped = TRUE; - } - } - } -#ifndef NDEBUG - /* I never trust a sort :-) -RPM */ - for (i=0; i<nmembs-1; i++) - assert(HDstrcmp(dt->u.enumer.name[i], dt->u.enumer.name[i+1])<0); -#endif - } - } - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_enum_insert - * - * Purpose: Insert a new member having a NAME and VALUE into an - * enumeration data TYPE. The NAME and VALUE must both be - * unique. The VALUE points to data of the data type defined for - * the enumeration base type. - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Robb Matzke - * Wednesday, December 23, 1998 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_enum_insert(H5T_t *dt, const char *name, void *value) -{ - int i; - char **names=NULL; - uint8_t *values=NULL; - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_enum_insert, FAIL); - - assert(dt); - assert(name && *name); - assert(value); - - /* The name and value had better not already exist */ - for (i=0; i<dt->u.enumer.nmembs; i++) { - if (!HDstrcmp(dt->u.enumer.name[i], name)) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "name redefinition"); - if (!HDmemcmp(dt->u.enumer.value+i*dt->size, value, dt->size)) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "value redefinition"); - } - - /* Increase table sizes */ - if (dt->u.enumer.nmembs >= dt->u.enumer.nalloc) { - int n = MAX(32, 2*dt->u.enumer.nalloc); - if (NULL==(names=H5MM_realloc(dt->u.enumer.name, n*sizeof(char*)))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - dt->u.enumer.name = names; - - if (NULL==(values=H5MM_realloc(dt->u.enumer.value, n*dt->size))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed"); - dt->u.enumer.value = values; - dt->u.enumer.nalloc = n; - } - - /* Insert new member at end of member arrays */ - dt->u.enumer.sorted = H5T_SORT_NONE; - i = dt->u.enumer.nmembs++; - dt->u.enumer.name[i] = H5MM_xstrdup(name); - HDmemcpy(dt->u.enumer.value+i*dt->size, value, dt->size); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_enum_nameof - * - * Purpose: Finds the symbol name that corresponds the the specified - * VALUE of an enumeration data type DT. At most SIZE characters - * of the symbol name are copied into the NAME buffer. If the - * entire symbol name and null terminator do not fit in the NAME - * buffer then as many characters as possible are copied and the - * function returns failure. - * - * If NAME is the null pointer and SIZE is zero then enough - * space is allocated to hold the result and a pointer to that - * memory is returned. - * - * Return: Success: Pointer to NAME - * - * Failure: NULL, name[0] is set to null. - * - * Programmer: Robb Matzke - * Monday, January 4, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -char * -H5T_enum_nameof(H5T_t *dt, void *value, char *name/*out*/, size_t size) -{ - int lt, md, rt; /*indices for binary search */ - int cmp=(-1); /*comparison result */ - char *ret_value; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_enum_nameof, NULL); - - /* Check args */ - assert(dt && H5T_ENUM==dt->type); - assert(value); - assert(name || 0==size); - if (name && size>0) *name = '\0'; - - /* Sanity check */ - if (dt->u.enumer.nmembs == 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "datatype has no members"); - - /* Do a binary search over the values to find the correct one */ - H5T_sort_value(dt, NULL); - lt = 0; - rt = dt->u.enumer.nmembs; - md = -1; - - while (lt<rt) { - md = (lt+rt)/2; - cmp = HDmemcmp(value, dt->u.enumer.value+md*dt->size, dt->size); - if (cmp<0) { - rt = md; - } else if (cmp>0) { - lt = md+1; - } else { - break; - } - } - /* Value was not yet defined. This fixes bug # 774, 2002/06/05 EIP */ - if (cmp!=0) - HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "value is currently not defined"); - - /* Save result name */ - if (!name && NULL==(name=H5MM_malloc(HDstrlen(dt->u.enumer.name[md])+1))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - HDstrncpy(name, dt->u.enumer.name[md], size); - if (HDstrlen(dt->u.enumer.name[md])>=size) - HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, NULL, "name has been truncated"); - - /* Set return value */ - ret_value=name; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- - * Function: H5T_enum_valueof - * - * Purpose: Finds the value that corresponds the the specified symbol - * NAME of an enumeration data type DT and copy it to the VALUE - * result buffer. The VALUE should be allocated by the caller to - * be large enough for the result. - * - * Return: Success: Non-negative, value stored in VALUE. - * - * Failure: Negative, VALUE is undefined. - * - * Programmer: Robb Matzke - * Monday, January 4, 1999 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_enum_valueof(H5T_t *dt, const char *name, void *value/*out*/) -{ - int lt, md, rt; /*indices for binary search */ - int cmp=(-1); /*comparison result */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5T_enum_valueof, FAIL); - - /* Check args */ - assert(dt && H5T_ENUM==dt->type); - assert(name && *name); - assert(value); - - /* Sanity check */ - if (dt->u.enumer.nmembs == 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "datatype has no members"); - - /* Do a binary search over the names to find the correct one */ - H5T_sort_name(dt, NULL); - lt = 0; - rt = dt->u.enumer.nmembs; - md = -1; - - while (lt<rt) { - md = (lt+rt)/2; - cmp = HDstrcmp(name, dt->u.enumer.name[md]); - if (cmp<0) { - rt = md; - } else if (cmp>0) { - lt = md+1; - } else { - break; - } - } - /* Value was not yet defined. This fixes bug # 774, 2002/06/05 EIP */ - if (cmp!=0) - HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "string doesn't exist in the enumeration type"); - - HDmemcpy(value, dt->u.enumer.value+md*dt->size, dt->size); - -done: - FUNC_LEAVE_NOAPI(ret_value); -} - - -/*------------------------------------------------------------------------- * Function: H5T_cmp * * Purpose: Compares two data types. @@ -8737,291 +4974,6 @@ done: /*------------------------------------------------------------------------- - * Function: H5Tarray_create - * - * Purpose: Create a new array data type based on the specified BASE_TYPE. - * The type is an array with NDIMS dimensionality and the size of the - * array is DIMS. The total member size should be relatively small. - * PERM is currently unimplemented and unused, but is designed to contain - * the dimension permutation from C order. - * Array datatypes are currently limited to H5S_MAX_RANK number of - * dimensions and must have the number of dimensions set greater than - * 0. (i.e. 0 > ndims <= H5S_MAX_RANK) All dimensions sizes must be greater - * than 0 also. - * - * Return: Success: ID of new array data type - * - * Failure: Negative - * - * Programmer: Quincey Koziol - * Thursday, Oct 26, 2000 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -hid_t -H5Tarray_create(hid_t base_id, int ndims, const hsize_t dim[/* ndims */], - const int perm[/* ndims */]) -{ - H5T_t *base = NULL; /* base data type */ - H5T_t *dt = NULL; /* new array data type */ - int i; /* local index variable */ - hid_t ret_value; /* return value */ - - FUNC_ENTER_API(H5Tarray_create, FAIL); - H5TRACE4("i","iIs*h*Is",base_id,ndims,dim,perm); - - /* Check args */ - if (ndims<1 || ndims>H5S_MAX_RANK) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid dimensionality"); - if (ndims>0 && !dim) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no dimensions specified"); - for(i=0; i<ndims; i++) - if(!(dim[i]>0)) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "zero-sized dimension specified"); - if (NULL==(base=H5I_object_verify(base_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an valid base datatype"); - - /* Create the actual array datatype */ - if ((dt=H5T_array_create(base,ndims,dim,perm))==NULL) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to create datatype"); - - /* Atomize the type */ - if ((ret_value=H5I_register(H5I_DATATYPE, dt))<0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype"); - -done: - FUNC_LEAVE_API(ret_value); -} /* end H5Tarray_create */ - - -/*------------------------------------------------------------------------- - * Function: H5T_array_create - * - * Purpose: Internal routine to create a new array data type based on the - * specified BASE_TYPE. The type is an array with NDIMS dimensionality - * and the size of the array is DIMS. PERM is currently unimplemented - * and unused, but is designed to contain the dimension permutation from - * C order. Array datatypes are currently limited to H5S_MAX_RANK number - * of * dimensions. - * - * Return: Success: ID of new array data type - * - * Failure: Negative - * - * Programmer: Quincey Koziol - * Thursday, Oct 26, 2000 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -H5T_t * -H5T_array_create(H5T_t *base, int ndims, const hsize_t dim[/* ndims */], - const int perm[/* ndims */]) -{ - H5T_t *ret_value = NULL; /*new array data type */ - int i; /* local index variable */ - - FUNC_ENTER_NOAPI(H5T_array_create, NULL); - - assert(base); - assert(ndims>0 && ndims<=H5S_MAX_RANK); - assert(dim); - - /* Build new type */ - if (NULL==(ret_value = H5FL_CALLOC(H5T_t))) - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed"); - - ret_value->ent.header = HADDR_UNDEF; - ret_value->type = H5T_ARRAY; - - /* Copy the base type of the array */ - ret_value->parent = H5T_copy(base, H5T_COPY_ALL); - - /* Set the array parameters */ - ret_value->u.array.ndims = ndims; - - /* Copy the array dimensions & compute the # of elements in the array */ - for(i=0, ret_value->u.array.nelem=1; i<ndims; i++) { - H5_ASSIGN_OVERFLOW(ret_value->u.array.dim[i],dim[i],hsize_t,size_t); - ret_value->u.array.nelem *= (size_t)dim[i]; - } /* end for */ - - /* Copy the dimension permutations */ - for(i=0; i<ndims; i++) - ret_value->u.array.perm[i] = perm ? perm[i] : i; - - /* Set the array's size (number of elements * element datatype's size) */ - ret_value->size = ret_value->parent->size * ret_value->u.array.nelem; - - /* - * Set the "force conversion" flag if a VL base datatype is used or - * or if any components of the base datatype are VL types. - */ - if(base->type==H5T_VLEN || base->force_conv==TRUE) - ret_value->force_conv=TRUE; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5T_array_create */ - - -/*------------------------------------------------------------------------- - * Function: H5Tget_array_ndims - * - * Purpose: Query the number of dimensions for an array datatype. - * - * Return: Success: Number of dimensions of the array datatype - * Failure: Negative - * - * Programmer: Quincey Koziol - * Monday, November 6, 2000 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -int -H5Tget_array_ndims(hid_t type_id) -{ - H5T_t *dt = NULL; /* pointer to array data type */ - int ret_value; /* return value */ - - FUNC_ENTER_API(H5Tget_array_ndims, FAIL); - H5TRACE1("Is","i",type_id); - - /* Check args */ - if (NULL==(dt=H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); - if(dt->type!=H5T_ARRAY) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an array datatype"); - - /* Retrieve the number of dimensions */ - ret_value = H5T_get_array_ndims(dt); - -done: - FUNC_LEAVE_API(ret_value); -} /* end H5Tget_array_ndims */ - - -/*------------------------------------------------------------------------- - * Function: H5T_get_array_ndims - * - * Purpose: Private function for H5T_get_array_ndims. Query the number - * of dimensions for an array datatype. - * - * Return: Success: Number of dimensions of the array datatype - * Failure: Negative - * - * Programmer: Raymond Lu - * October 10, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -int -H5T_get_array_ndims(H5T_t *dt) -{ - int ret_value; /* return value */ - - FUNC_ENTER_NOAPI(H5T_get_array_ndims, FAIL); - - assert(dt); - assert(dt->type==H5T_ARRAY); - - /* Retrieve the number of dimensions */ - ret_value=dt->u.array.ndims; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5T_get_array_ndims */ - - -/*------------------------------------------------------------------------- - * Function: H5Tget_array_dims - * - * Purpose: Query the sizes of dimensions for an array datatype. - * - * Return: Success: Non-negative - * Failure: Negative - * - * Programmer: Quincey Koziol - * Monday, November 6, 2000 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5Tget_array_dims(hid_t type_id, hsize_t dims[], int perm[]) -{ - H5T_t *dt = NULL; /* pointer to array data type */ - herr_t ret_value = SUCCEED; /* return value */ - - FUNC_ENTER_API(H5Tget_array_dims, FAIL); - H5TRACE3("e","i*h*Is",type_id,dims,perm); - - /* Check args */ - if (NULL==(dt=H5I_object_verify(type_id,H5I_DATATYPE))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); - if(dt->type!=H5T_ARRAY) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an array datatype"); - - /* Retrieve the sizes of the dimensions */ - if(H5T_get_array_dims(dt, dims, perm)<0) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "unable to get dimension sizes"); -done: - FUNC_LEAVE_API(ret_value); -} /* end H5Tget_array_dims */ - - -/*------------------------------------------------------------------------- - * Function: H5T_get_array_dims - * - * Purpose: Private function for H5T_get_array_dims. Query the sizes - * of dimensions for an array datatype. - * - * Return: Success: Non-negative - * Failure: Negative - * - * Programmer: Raymond Lu - * October 10, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5T_get_array_dims(H5T_t *dt, hsize_t dims[], int perm[]) -{ - herr_t ret_value = SUCCEED; /* return value */ - int i; /* Local index variable */ - - FUNC_ENTER_NOAPI(H5T_get_array_dims, FAIL); - - assert(dt); - assert(dt->type==H5T_ARRAY); - - /* Retrieve the sizes of the dimensions */ - if(dims) - for(i=0; i<dt->u.array.ndims; i++) - dims[i]=dt->u.array.dim[i]; - - /* Retrieve the dimension permutations */ - if(perm) - for(i=0; i<dt->u.array.ndims; i++) - perm[i]=dt->u.array.perm[i]; - -done: - FUNC_LEAVE_NOAPI(ret_value); -} /* end H5T_get_array_dims */ - - - -/*------------------------------------------------------------------------- * Function: H5T_is_sensible * * Purpose: Determines if a data type is sensible to store on disk |