Re: ffi.cdef() for module writers

  • From: Peter Colberg <peter@xxxxxxxxxxx>
  • To: luajit@xxxxxxxxxxxxx
  • Date: Tue, 23 Oct 2012 02:01:43 -0400

Hi Alek,

I recognise your name from this posting ;-).

//www.freelists.org/post/luajit/gccpythonplugin-LuaJIT-FFI-defs-collectingcoordination

On Tue, Oct 23, 2012 at 08:04:29AM +0300, Alek Paunov wrote:
> I am thinking of a variation of the same approach: LuaJIT plugin for GCC,

The Lua plugin for GCC is almost finished (documentation still has to
be written, and tests completed before publishing), so I came up with
the idea to prove its usefulness by bootstrapping a gcc-luajit plugin
using the gcc-lua plugin.

I quickly gave up that idea, since GCC uses non-standard extensions
for the AST itself, which I honestly did not grasp yet. In particular,
I have no idea what the GTY(â) constructs translate to in the AST.
Further, changing a single variable (asm_file_name = HOST_BIT_BUCKET)
would have meant the generation of large structs for ffi.cdef, only to
access one field in a struct of structs. After this experiment, I
was very glad to leave it at using the Lua C API for this task.

Basically all the plugin does is export part of the macros in tree.h
as Lua functions, and map the polymorphic tree type onto a distinct
metatable for each tree code. This allows walking the tree from a Lua
script loaded into the interpreter within the plugin.

> resulting type information stored in SQLite(*) db (possibly
> accumulating several different variants of the ABI -
> lib-version/arch/OS variations) and lazy runtime generation of the
> concrete ffi.cdefs (based on LuaJIT module/function requirement
> annotations as example).
> 
> As eventual secondary step, loading the appropriate Lua code
> (predefined specific lib shim bits or AST-macros where is suitable)
> also from the same db.
> 
> Maybe with such a metadata-centric/runtime-depsolving approach we
> would have a chance to reuse other already available typelib sources
> too (GIR, windows typelibs, etc.) plus the accuracy of loading only
> the necessary minimum cdefs and Lua code into the engine at runtime.

Could you explain the database/catalog aspect in more detail, maybe
with a short example? What are the steps from input to generated
ffi.cdef code?

So far I could keep the script for code generation generic. The
script acquires a list of global variables, and deduces a type or
function or variable declaration, which is passed to the C code
generator (roughly 200 lines of Lua code, but too messy to release
yet).

I attached an example for the HDF5 C API, of the input code, and the
generated output code. Note that the output code has minor flaws,
since I need to figure out a good way to tell the code generator
when to expand a type_decl (substitute a type with its main variant).

Regards,
Peter
/*
 * Define HDF5 C ABI for LuaJIT FFI.
 * Copyright © 2012 Peter Colberg.
 * For conditions of distribution and use, see copyright notice in LICENSE.
 */

#define _H5private_H
#include <hdf5.h>

#define FFI_C_CONST(name)            void *const        FFI_C_ ## name = (void 
*const)((intptr_t)(name))
#define FFI_C_VAR(name)              void *const        FFI_C_ ## name = (void 
*const)(&name)
#define FFI_C_NAMED_VAR(name, value) void *const        FFI_C_ ## name = (void 
*const)(&value)
#define FFI_C_FUNC(name)             void (*const       FFI_C_ ## name)() = 
(void (*const)())(name)
#define FFI_C_TYPE(name)             name *const        FFI_C_ ## name
#define FFI_C_ENUM(name)             enum name *const   FFI_C_ ## name
#define FFI_C_STRUCT(name)           struct name *const FFI_C_ ## name
#define FFI_C_UNION(name)            union name *const  FFI_C_ ## name

#ifndef H5_VERSION_GE
#define H5_VERSION_GE(maj, min, rel) H5_VERS_MAJOR > maj || H5_VERS_MAJOR == 
maj && (H5_VERS_MINOR > min || H5_VERS_MINOR == min && H5_VERS_RELEASE >= rel)
#endif

/* POSIX */
FFI_C_TYPE(ssize_t);
FFI_C_TYPE(time_t);

/* General Library Functions */
FFI_C_TYPE(herr_t);
FFI_C_TYPE(hbool_t);
FFI_C_TYPE(htri_t);
FFI_C_TYPE(hsize_t);
FFI_C_TYPE(hssize_t);
FFI_C_TYPE(haddr_t);

FFI_C_CONST(H5_VERS_MAJOR);
FFI_C_CONST(H5_VERS_MINOR);
FFI_C_CONST(H5_VERS_RELEASE);

FFI_C_CONST(H5P_DEFAULT);

FFI_C_TYPE(H5_iter_order_t);

FFI_C_CONST(H5_ITER_ERROR);
FFI_C_CONST(H5_ITER_CONT);
FFI_C_CONST(H5_ITER_STOP);

FFI_C_TYPE(H5_index_t);

FFI_C_TYPE(H5_ih_info_t);

FFI_C_FUNC(H5open);
FFI_C_FUNC(H5close);
FFI_C_FUNC(H5dont_atexit);
FFI_C_FUNC(H5garbage_collect);
FFI_C_FUNC(H5set_free_list_limits);
FFI_C_FUNC(H5get_libversion);
FFI_C_FUNC(H5check_version);

/* Identifier Interface */
FFI_C_TYPE(hid_t);

FFI_C_CONST(H5I_INVALID_HID);

FFI_C_TYPE(H5I_type_t);

FFI_C_TYPE(H5I_free_t);
FFI_C_TYPE(H5I_search_func_t);

FFI_C_FUNC(H5Iregister);
FFI_C_FUNC(H5Iobject_verify);
FFI_C_FUNC(H5Iremove_verify);
FFI_C_FUNC(H5Iget_type);
FFI_C_FUNC(H5Iget_file_id);
FFI_C_FUNC(H5Iget_name);
FFI_C_FUNC(H5Iinc_ref);
FFI_C_FUNC(H5Idec_ref);
FFI_C_FUNC(H5Iget_ref);
FFI_C_FUNC(H5Iregister_type);
FFI_C_FUNC(H5Iclear_type);
FFI_C_FUNC(H5Idestroy_type);
FFI_C_FUNC(H5Iinc_type_ref);
FFI_C_FUNC(H5Idec_type_ref);
FFI_C_FUNC(H5Iget_type_ref);
FFI_C_FUNC(H5Isearch);
FFI_C_FUNC(H5Inmembers);
FFI_C_FUNC(H5Itype_exists);
#if H5_VERSION_GE(1, 8, 3)
FFI_C_FUNC(H5Iis_valid);
#endif

/* Error Interface */
FFI_C_CONST(H5E_DEFAULT);

FFI_C_TYPE(H5E_type_t);

FFI_C_TYPE(H5E_error_t);

FFI_C_VAR(H5E_ERR_CLS);
FFI_C_VAR(H5E_DATASET);
FFI_C_VAR(H5E_FUNC);
FFI_C_VAR(H5E_STORAGE);
FFI_C_VAR(H5E_FILE);
FFI_C_VAR(H5E_SOHM);
FFI_C_VAR(H5E_SYM);
FFI_C_VAR(H5E_VFL);
FFI_C_VAR(H5E_INTERNAL);
FFI_C_VAR(H5E_BTREE);
FFI_C_VAR(H5E_REFERENCE);
FFI_C_VAR(H5E_DATASPACE);
FFI_C_VAR(H5E_RESOURCE);
FFI_C_VAR(H5E_PLIST);
FFI_C_VAR(H5E_LINK);
FFI_C_VAR(H5E_DATATYPE);
FFI_C_VAR(H5E_RS);
FFI_C_VAR(H5E_HEAP);
FFI_C_VAR(H5E_OHDR);
FFI_C_VAR(H5E_ATOM);
FFI_C_VAR(H5E_ATTR);
FFI_C_VAR(H5E_NONE_MAJOR);
FFI_C_VAR(H5E_IO);
FFI_C_VAR(H5E_SLIST);
FFI_C_VAR(H5E_EFL);
FFI_C_VAR(H5E_TST);
FFI_C_VAR(H5E_ARGS);
FFI_C_VAR(H5E_ERROR);
FFI_C_VAR(H5E_PLINE);
FFI_C_VAR(H5E_FSPACE);
FFI_C_VAR(H5E_CACHE);
FFI_C_VAR(H5E_SEEKERROR);
FFI_C_VAR(H5E_READERROR);
FFI_C_VAR(H5E_WRITEERROR);
FFI_C_VAR(H5E_CLOSEERROR);
FFI_C_VAR(H5E_OVERFLOW);
FFI_C_VAR(H5E_FCNTL);
FFI_C_VAR(H5E_NOSPACE);
FFI_C_VAR(H5E_CANTALLOC);
FFI_C_VAR(H5E_CANTCOPY);
FFI_C_VAR(H5E_CANTFREE);
FFI_C_VAR(H5E_ALREADYEXISTS);
FFI_C_VAR(H5E_CANTLOCK);
FFI_C_VAR(H5E_CANTUNLOCK);
FFI_C_VAR(H5E_CANTGC);
FFI_C_VAR(H5E_CANTGETSIZE);
FFI_C_VAR(H5E_OBJOPEN);
FFI_C_VAR(H5E_CANTRESTORE);
FFI_C_VAR(H5E_CANTCOMPUTE);
FFI_C_VAR(H5E_CANTEXTEND);
FFI_C_VAR(H5E_CANTATTACH);
FFI_C_VAR(H5E_CANTUPDATE);
FFI_C_VAR(H5E_CANTOPERATE);
FFI_C_VAR(H5E_CANTINIT);
FFI_C_VAR(H5E_ALREADYINIT);
FFI_C_VAR(H5E_CANTRELEASE);
FFI_C_VAR(H5E_CANTGET);
FFI_C_VAR(H5E_CANTSET);
FFI_C_VAR(H5E_DUPCLASS);
FFI_C_VAR(H5E_SETDISALLOWED);
FFI_C_VAR(H5E_CANTMERGE);
FFI_C_VAR(H5E_CANTREVIVE);
FFI_C_VAR(H5E_CANTSHRINK);
FFI_C_VAR(H5E_LINKCOUNT);
FFI_C_VAR(H5E_VERSION);
FFI_C_VAR(H5E_ALIGNMENT);
FFI_C_VAR(H5E_BADMESG);
FFI_C_VAR(H5E_CANTDELETE);
FFI_C_VAR(H5E_BADITER);
FFI_C_VAR(H5E_CANTPACK);
FFI_C_VAR(H5E_CANTRESET);
FFI_C_VAR(H5E_CANTRENAME);
FFI_C_VAR(H5E_SYSERRSTR);
FFI_C_VAR(H5E_NOFILTER);
FFI_C_VAR(H5E_CALLBACK);
FFI_C_VAR(H5E_CANAPPLY);
FFI_C_VAR(H5E_SETLOCAL);
FFI_C_VAR(H5E_NOENCODER);
FFI_C_VAR(H5E_CANTFILTER);
FFI_C_VAR(H5E_CANTOPENOBJ);
FFI_C_VAR(H5E_CANTCLOSEOBJ);
FFI_C_VAR(H5E_COMPLEN);
FFI_C_VAR(H5E_PATH);
FFI_C_VAR(H5E_NONE_MINOR);
FFI_C_VAR(H5E_FILEEXISTS);
FFI_C_VAR(H5E_FILEOPEN);
FFI_C_VAR(H5E_CANTCREATE);
FFI_C_VAR(H5E_CANTOPENFILE);
FFI_C_VAR(H5E_CANTCLOSEFILE);
FFI_C_VAR(H5E_NOTHDF5);
FFI_C_VAR(H5E_BADFILE);
FFI_C_VAR(H5E_TRUNCATED);
FFI_C_VAR(H5E_MOUNT);
FFI_C_VAR(H5E_BADATOM);
FFI_C_VAR(H5E_BADGROUP);
FFI_C_VAR(H5E_CANTREGISTER);
FFI_C_VAR(H5E_CANTINC);
FFI_C_VAR(H5E_CANTDEC);
FFI_C_VAR(H5E_NOIDS);
FFI_C_VAR(H5E_CANTFLUSH);
FFI_C_VAR(H5E_CANTSERIALIZE);
FFI_C_VAR(H5E_CANTLOAD);
FFI_C_VAR(H5E_PROTECT);
FFI_C_VAR(H5E_NOTCACHED);
FFI_C_VAR(H5E_SYSTEM);
FFI_C_VAR(H5E_CANTINS);
FFI_C_VAR(H5E_CANTPROTECT);
FFI_C_VAR(H5E_CANTUNPROTECT);
FFI_C_VAR(H5E_CANTPIN);
FFI_C_VAR(H5E_CANTUNPIN);
FFI_C_VAR(H5E_CANTMARKDIRTY);
FFI_C_VAR(H5E_CANTDIRTY);
FFI_C_VAR(H5E_CANTEXPUNGE);
FFI_C_VAR(H5E_CANTRESIZE);
FFI_C_VAR(H5E_TRAVERSE);
FFI_C_VAR(H5E_NLINKS);
FFI_C_VAR(H5E_NOTREGISTERED);
FFI_C_VAR(H5E_CANTMOVE);
FFI_C_VAR(H5E_CANTSORT);
FFI_C_VAR(H5E_MPI);
FFI_C_VAR(H5E_MPIERRSTR);
FFI_C_VAR(H5E_CANTRECV);
FFI_C_VAR(H5E_CANTCLIP);
FFI_C_VAR(H5E_CANTCOUNT);
FFI_C_VAR(H5E_CANTSELECT);
FFI_C_VAR(H5E_CANTNEXT);
FFI_C_VAR(H5E_BADSELECT);
FFI_C_VAR(H5E_CANTCOMPARE);
FFI_C_VAR(H5E_UNINITIALIZED);
FFI_C_VAR(H5E_UNSUPPORTED);
FFI_C_VAR(H5E_BADTYPE);
FFI_C_VAR(H5E_BADRANGE);
FFI_C_VAR(H5E_BADVALUE);
FFI_C_VAR(H5E_NOTFOUND);
FFI_C_VAR(H5E_EXISTS);
FFI_C_VAR(H5E_CANTENCODE);
FFI_C_VAR(H5E_CANTDECODE);
FFI_C_VAR(H5E_CANTSPLIT);
FFI_C_VAR(H5E_CANTREDISTRIBUTE);
FFI_C_VAR(H5E_CANTSWAP);
FFI_C_VAR(H5E_CANTINSERT);
FFI_C_VAR(H5E_CANTLIST);
FFI_C_VAR(H5E_CANTMODIFY);
FFI_C_VAR(H5E_CANTREMOVE);
FFI_C_VAR(H5E_CANTCONVERT);
FFI_C_VAR(H5E_BADSIZE);

FFI_C_TYPE(H5E_direction_t);

FFI_C_TYPE(H5E_walk_t);
FFI_C_TYPE(H5E_auto_t);

FFI_C_FUNC(H5Eregister_class);
FFI_C_FUNC(H5Eunregister_class);
FFI_C_FUNC(H5Eclose_msg);
FFI_C_FUNC(H5Ecreate_msg);
FFI_C_FUNC(H5Ecreate_stack);
FFI_C_FUNC(H5Eget_current_stack);
FFI_C_FUNC(H5Eclose_stack);
FFI_C_FUNC(H5Eget_class_name);
FFI_C_FUNC(H5Eset_current_stack);
FFI_C_FUNC(H5Epush);
FFI_C_FUNC(H5Epop);
FFI_C_FUNC(H5Eprint);
FFI_C_FUNC(H5Ewalk);
FFI_C_FUNC(H5Eget_auto);
FFI_C_FUNC(H5Eset_auto);
FFI_C_FUNC(H5Eclear);
FFI_C_FUNC(H5Eget_msg);
FFI_C_FUNC(H5Eget_num);

/* File Interface */
FFI_C_ENUM(H5C_cache_incr_mode);

FFI_C_ENUM(H5C_cache_flash_incr_mode);

FFI_C_ENUM(H5C_cache_decr_mode);

FFI_C_CONST(H5AC__CURR_CACHE_CONFIG_VERSION);
FFI_C_CONST(H5AC__MAX_TRACE_FILE_NAME_LEN);

#if H5_VERSION_GE(1, 8, 6)
FFI_C_CONST(H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY);
FFI_C_CONST(H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED);
#endif

FFI_C_TYPE(H5AC_cache_config_t);

FFI_C_CONST(H5F_ACC_RDONLY);
FFI_C_CONST(H5F_ACC_RDWR);
FFI_C_CONST(H5F_ACC_TRUNC);
FFI_C_CONST(H5F_ACC_EXCL);
FFI_C_CONST(H5F_ACC_DEBUG);
FFI_C_CONST(H5F_ACC_CREAT);
#if H5_VERSION_GE(1, 8, 3)
FFI_C_CONST(H5F_ACC_DEFAULT);
#endif

FFI_C_CONST(H5F_OBJ_FILE);
FFI_C_CONST(H5F_OBJ_DATASET);
FFI_C_CONST(H5F_OBJ_GROUP);
FFI_C_CONST(H5F_OBJ_DATATYPE);
FFI_C_CONST(H5F_OBJ_ATTR);
FFI_C_CONST(H5F_OBJ_ALL);
FFI_C_CONST(H5F_OBJ_LOCAL);

FFI_C_CONST(H5F_FAMILY_DEFAULT);

FFI_C_TYPE(H5F_scope_t);

FFI_C_CONST(H5F_UNLIMITED);

FFI_C_TYPE(H5F_close_degree_t);

FFI_C_TYPE(H5F_info_t);

FFI_C_TYPE(H5F_mem_t);

FFI_C_TYPE(H5F_libver_t);

#if H5_VERSION_GE(1, 8, 6)
FFI_C_CONST(H5F_LIBVER_18);
#endif

FFI_C_FUNC(H5Fis_hdf5);
FFI_C_FUNC(H5Fcreate);
FFI_C_FUNC(H5Fopen);
FFI_C_FUNC(H5Freopen);
FFI_C_FUNC(H5Fflush);
FFI_C_FUNC(H5Fclose);
FFI_C_FUNC(H5Fget_create_plist);
FFI_C_FUNC(H5Fget_access_plist);
FFI_C_FUNC(H5Fget_intent);
#if H5_VERSION_GE(1, 8, 2)
FFI_C_FUNC(H5Fget_obj_count);
FFI_C_FUNC(H5Fget_obj_ids);
#else
FFI_C_FUNC(H5Fget_obj_count);
FFI_C_FUNC(H5Fget_obj_ids);
#endif
FFI_C_FUNC(H5Fget_vfd_handle);
FFI_C_FUNC(H5Fmount);
FFI_C_FUNC(H5Funmount);
FFI_C_FUNC(H5Fget_freespace);
FFI_C_FUNC(H5Fget_filesize);
#if H5_VERSION_GE(1, 8, 9)
FFI_C_FUNC(H5Fget_file_image);
#endif
FFI_C_FUNC(H5Fget_mdc_config);
FFI_C_FUNC(H5Fset_mdc_config);
FFI_C_FUNC(H5Fget_mdc_hit_rate);
FFI_C_FUNC(H5Fget_mdc_size);
FFI_C_FUNC(H5Freset_mdc_hit_rate_stats);
FFI_C_FUNC(H5Fget_name);
FFI_C_FUNC(H5Fget_info);
#if H5_VERSION_GE(1, 8, 7)
FFI_C_FUNC(H5Fclear_elink_file_cache);
#endif
#if H5_HAVE_PARALLEL && H5_VERSION_GE(1, 8, 9)
FFI_C_FUNC(H5Fset_mpi_atomicity);
FFI_C_FUNC(H5Fget_mpi_atomicity);
#endif

/* Dataspace Interface */
FFI_C_CONST(H5S_ALL);
FFI_C_CONST(H5S_UNLIMITED);

FFI_C_CONST(H5S_MAX_RANK);

FFI_C_TYPE(H5S_class_t);

FFI_C_TYPE(H5S_seloper_t);

FFI_C_TYPE(H5S_sel_type);

FFI_C_FUNC(H5Screate);
FFI_C_FUNC(H5Screate_simple);
FFI_C_FUNC(H5Sset_extent_simple);
FFI_C_FUNC(H5Scopy);
FFI_C_FUNC(H5Sclose);
FFI_C_FUNC(H5Sencode);
FFI_C_FUNC(H5Sdecode);
FFI_C_FUNC(H5Sget_simple_extent_npoints);
FFI_C_FUNC(H5Sget_simple_extent_ndims);
FFI_C_FUNC(H5Sget_simple_extent_dims);
FFI_C_FUNC(H5Sis_simple);
FFI_C_FUNC(H5Sget_select_npoints);
FFI_C_FUNC(H5Sselect_hyperslab);
#ifdef NEW_HYPERSLAB_API
FFI_C_FUNC(H5Scombine_hyperslab);
FFI_C_FUNC(H5Sselect_select);
FFI_C_FUNC(H5Scombine_select);
#endif
FFI_C_FUNC(H5Sselect_elements);
FFI_C_FUNC(H5Sget_simple_extent_type);
FFI_C_FUNC(H5Sset_extent_none);
FFI_C_FUNC(H5Sextent_copy);
FFI_C_FUNC(H5Sextent_equal);
FFI_C_FUNC(H5Sselect_all);
FFI_C_FUNC(H5Sselect_none);
FFI_C_FUNC(H5Soffset_simple);
FFI_C_FUNC(H5Sselect_valid);
FFI_C_FUNC(H5Sget_select_hyper_nblocks);
FFI_C_FUNC(H5Sget_select_elem_npoints);
FFI_C_FUNC(H5Sget_select_hyper_blocklist);
FFI_C_FUNC(H5Sget_select_elem_pointlist);
FFI_C_FUNC(H5Sget_select_bounds);
FFI_C_FUNC(H5Sget_select_type);

/* Datatype Interface */
FFI_C_TYPE(H5T_class_t);

FFI_C_TYPE(H5T_order_t);

FFI_C_TYPE(H5T_sign_t);

FFI_C_TYPE(H5T_norm_t);

FFI_C_TYPE(H5T_cset_t);

FFI_C_TYPE(H5T_str_t);

FFI_C_TYPE(H5T_pad_t);

FFI_C_TYPE(H5T_cmd_t);

FFI_C_TYPE(H5T_bkg_t);

FFI_C_TYPE(H5T_pers_t);

FFI_C_TYPE(H5T_direction_t);

FFI_C_TYPE(H5T_conv_except_t);

FFI_C_TYPE(H5T_conv_ret_t);

FFI_C_TYPE(H5T_cdata_t);

FFI_C_TYPE(hvl_t);

FFI_C_CONST(H5T_VARIABLE);
FFI_C_CONST(H5T_OPAQUE_TAG_MAX);

FFI_C_VAR(H5T_IEEE_F32BE);
FFI_C_VAR(H5T_IEEE_F32LE);
FFI_C_VAR(H5T_IEEE_F64BE);
FFI_C_VAR(H5T_IEEE_F64LE);

FFI_C_VAR(H5T_STD_I8BE);
FFI_C_VAR(H5T_STD_I8LE);
FFI_C_VAR(H5T_STD_I16BE);
FFI_C_VAR(H5T_STD_I16LE);
FFI_C_VAR(H5T_STD_I32BE);
FFI_C_VAR(H5T_STD_I32LE);
FFI_C_VAR(H5T_STD_I64BE);
FFI_C_VAR(H5T_STD_I64LE);
FFI_C_VAR(H5T_STD_U8BE);
FFI_C_VAR(H5T_STD_U8LE);
FFI_C_VAR(H5T_STD_U16BE);
FFI_C_VAR(H5T_STD_U16LE);
FFI_C_VAR(H5T_STD_U32BE);
FFI_C_VAR(H5T_STD_U32LE);
FFI_C_VAR(H5T_STD_U64BE);
FFI_C_VAR(H5T_STD_U64LE);
FFI_C_VAR(H5T_STD_B8BE);
FFI_C_VAR(H5T_STD_B8LE);
FFI_C_VAR(H5T_STD_B16BE);
FFI_C_VAR(H5T_STD_B16LE);
FFI_C_VAR(H5T_STD_B32BE);
FFI_C_VAR(H5T_STD_B32LE);
FFI_C_VAR(H5T_STD_B64BE);
FFI_C_VAR(H5T_STD_B64LE);
FFI_C_VAR(H5T_STD_REF_OBJ);
FFI_C_VAR(H5T_STD_REF_DSETREG);

FFI_C_VAR(H5T_UNIX_D32BE);
FFI_C_VAR(H5T_UNIX_D32LE);
FFI_C_VAR(H5T_UNIX_D64BE);
FFI_C_VAR(H5T_UNIX_D64LE);

FFI_C_VAR(H5T_C_S1);

FFI_C_VAR(H5T_FORTRAN_S1);

FFI_C_VAR(H5T_INTEL_I8);
FFI_C_VAR(H5T_INTEL_I16);
FFI_C_VAR(H5T_INTEL_I32);
FFI_C_VAR(H5T_INTEL_I64);
FFI_C_VAR(H5T_INTEL_U8);
FFI_C_VAR(H5T_INTEL_U16);
FFI_C_VAR(H5T_INTEL_U32);
FFI_C_VAR(H5T_INTEL_U64);
FFI_C_VAR(H5T_INTEL_B8);
FFI_C_VAR(H5T_INTEL_B16);
FFI_C_VAR(H5T_INTEL_B32);
FFI_C_VAR(H5T_INTEL_B64);
FFI_C_VAR(H5T_INTEL_F32);
FFI_C_VAR(H5T_INTEL_F64);

FFI_C_VAR(H5T_ALPHA_I8);
FFI_C_VAR(H5T_ALPHA_I16);
FFI_C_VAR(H5T_ALPHA_I32);
FFI_C_VAR(H5T_ALPHA_I64);
FFI_C_VAR(H5T_ALPHA_U8);
FFI_C_VAR(H5T_ALPHA_U16);
FFI_C_VAR(H5T_ALPHA_U32);
FFI_C_VAR(H5T_ALPHA_U64);
FFI_C_VAR(H5T_ALPHA_B8);
FFI_C_VAR(H5T_ALPHA_B16);
FFI_C_VAR(H5T_ALPHA_B32);
FFI_C_VAR(H5T_ALPHA_B64);
FFI_C_VAR(H5T_ALPHA_F32);
FFI_C_VAR(H5T_ALPHA_F64);

FFI_C_VAR(H5T_MIPS_I8);
FFI_C_VAR(H5T_MIPS_I16);
FFI_C_VAR(H5T_MIPS_I32);
FFI_C_VAR(H5T_MIPS_I64);
FFI_C_VAR(H5T_MIPS_U8);
FFI_C_VAR(H5T_MIPS_U16);
FFI_C_VAR(H5T_MIPS_U32);
FFI_C_VAR(H5T_MIPS_U64);
FFI_C_VAR(H5T_MIPS_B8);
FFI_C_VAR(H5T_MIPS_B16);
FFI_C_VAR(H5T_MIPS_B32);
FFI_C_VAR(H5T_MIPS_B64);
FFI_C_VAR(H5T_MIPS_F32);
FFI_C_VAR(H5T_MIPS_F64);

FFI_C_VAR(H5T_VAX_F32);
FFI_C_VAR(H5T_VAX_F64);

#if CHAR_MIN < 0
FFI_C_NAMED_VAR(H5T_NATIVE_CHAR, H5T_NATIVE_SCHAR);
#else
FFI_C_NAMED_VAR(H5T_NATIVE_CHAR, H5T_NATIVE_UCHAR);
#endif
FFI_C_VAR(H5T_NATIVE_SCHAR);
FFI_C_VAR(H5T_NATIVE_UCHAR);
FFI_C_VAR(H5T_NATIVE_SHORT);
FFI_C_VAR(H5T_NATIVE_USHORT);
FFI_C_VAR(H5T_NATIVE_INT);
FFI_C_VAR(H5T_NATIVE_UINT);
FFI_C_VAR(H5T_NATIVE_LONG);
FFI_C_VAR(H5T_NATIVE_ULONG);
FFI_C_VAR(H5T_NATIVE_LLONG);
FFI_C_VAR(H5T_NATIVE_ULLONG);
FFI_C_VAR(H5T_NATIVE_FLOAT);
FFI_C_VAR(H5T_NATIVE_DOUBLE);
FFI_C_VAR(H5T_NATIVE_LDOUBLE);
FFI_C_VAR(H5T_NATIVE_B8);
FFI_C_VAR(H5T_NATIVE_B16);
FFI_C_VAR(H5T_NATIVE_B32);
FFI_C_VAR(H5T_NATIVE_B64);
FFI_C_VAR(H5T_NATIVE_OPAQUE);
FFI_C_VAR(H5T_NATIVE_HADDR);
FFI_C_VAR(H5T_NATIVE_HSIZE);
FFI_C_VAR(H5T_NATIVE_HSSIZE);
FFI_C_VAR(H5T_NATIVE_HERR);
FFI_C_VAR(H5T_NATIVE_HBOOL);

FFI_C_VAR(H5T_NATIVE_INT8);
FFI_C_VAR(H5T_NATIVE_UINT8);
FFI_C_VAR(H5T_NATIVE_INT_LEAST8);
FFI_C_VAR(H5T_NATIVE_UINT_LEAST8);
FFI_C_VAR(H5T_NATIVE_INT_FAST8);
FFI_C_VAR(H5T_NATIVE_UINT_FAST8);

FFI_C_VAR(H5T_NATIVE_INT16);
FFI_C_VAR(H5T_NATIVE_UINT16);
FFI_C_VAR(H5T_NATIVE_INT_LEAST16);
FFI_C_VAR(H5T_NATIVE_UINT_LEAST16);
FFI_C_VAR(H5T_NATIVE_INT_FAST16);
FFI_C_VAR(H5T_NATIVE_UINT_FAST16);

FFI_C_VAR(H5T_NATIVE_INT32);
FFI_C_VAR(H5T_NATIVE_UINT32);
FFI_C_VAR(H5T_NATIVE_INT_LEAST32);
FFI_C_VAR(H5T_NATIVE_UINT_LEAST32);
FFI_C_VAR(H5T_NATIVE_INT_FAST32);
FFI_C_VAR(H5T_NATIVE_UINT_FAST32);

FFI_C_VAR(H5T_NATIVE_INT64);
FFI_C_VAR(H5T_NATIVE_UINT64);
FFI_C_VAR(H5T_NATIVE_INT_LEAST64);
FFI_C_VAR(H5T_NATIVE_UINT_LEAST64);
FFI_C_VAR(H5T_NATIVE_INT_FAST64);
FFI_C_VAR(H5T_NATIVE_UINT_FAST64);

FFI_C_TYPE(H5T_conv_t);
FFI_C_TYPE(H5T_conv_except_func_t);

FFI_C_FUNC(H5Tcreate);
FFI_C_FUNC(H5Tcopy);
FFI_C_FUNC(H5Tclose);
FFI_C_FUNC(H5Tequal);
FFI_C_FUNC(H5Tlock);
FFI_C_FUNC(H5Tcommit);
FFI_C_FUNC(H5Topen);
FFI_C_FUNC(H5Tcommit_anon);
FFI_C_FUNC(H5Tget_create_plist);
FFI_C_FUNC(H5Tcommitted);
FFI_C_FUNC(H5Tencode);
FFI_C_FUNC(H5Tdecode);

FFI_C_FUNC(H5Tinsert);
FFI_C_FUNC(H5Tpack);

FFI_C_FUNC(H5Tenum_create);
FFI_C_FUNC(H5Tenum_insert);
FFI_C_FUNC(H5Tenum_nameof);
FFI_C_FUNC(H5Tenum_valueof);

FFI_C_FUNC(H5Tvlen_create);

FFI_C_FUNC(H5Tarray_create);
FFI_C_FUNC(H5Tget_array_ndims);
FFI_C_FUNC(H5Tget_array_dims);

FFI_C_FUNC(H5Tset_tag);
FFI_C_FUNC(H5Tget_tag);

FFI_C_FUNC(H5Tget_super);
FFI_C_FUNC(H5Tget_class);
FFI_C_FUNC(H5Tdetect_class);
FFI_C_FUNC(H5Tget_size);
FFI_C_FUNC(H5Tget_order);
FFI_C_FUNC(H5Tget_precision);
FFI_C_FUNC(H5Tget_offset);
FFI_C_FUNC(H5Tget_pad);
FFI_C_FUNC(H5Tget_sign);
FFI_C_FUNC(H5Tget_fields);
FFI_C_FUNC(H5Tget_ebias);
FFI_C_FUNC(H5Tget_norm);
FFI_C_FUNC(H5Tget_inpad);
FFI_C_FUNC(H5Tget_strpad);
FFI_C_FUNC(H5Tget_nmembers);
FFI_C_FUNC(H5Tget_member_name);
FFI_C_FUNC(H5Tget_member_index);
FFI_C_FUNC(H5Tget_member_offset);
FFI_C_FUNC(H5Tget_member_class);
FFI_C_FUNC(H5Tget_member_type);
FFI_C_FUNC(H5Tget_member_value);
FFI_C_FUNC(H5Tget_cset);
FFI_C_FUNC(H5Tis_variable_str);
FFI_C_FUNC(H5Tget_native_type);

FFI_C_FUNC(H5Tset_size);
FFI_C_FUNC(H5Tset_order);
FFI_C_FUNC(H5Tset_precision);
FFI_C_FUNC(H5Tset_offset);
FFI_C_FUNC(H5Tset_pad);
FFI_C_FUNC(H5Tset_sign);
FFI_C_FUNC(H5Tset_fields);
FFI_C_FUNC(H5Tset_ebias);
FFI_C_FUNC(H5Tset_norm);
FFI_C_FUNC(H5Tset_inpad);
FFI_C_FUNC(H5Tset_cset);
FFI_C_FUNC(H5Tset_strpad);

FFI_C_FUNC(H5Tregister);
FFI_C_FUNC(H5Tunregister);
FFI_C_FUNC(H5Tfind);
FFI_C_FUNC(H5Tcompiler_conv);
FFI_C_FUNC(H5Tconvert);

/* Link Interface */
FFI_C_CONST(H5L_SAME_LOC);
FFI_C_CONST(H5L_LINK_CLASS_T_VERS);

FFI_C_TYPE(H5L_type_t);

FFI_C_CONST(H5L_TYPE_UD_MIN);

FFI_C_TYPE(H5L_info_t);

FFI_C_TYPE(H5L_create_func_t);
FFI_C_TYPE(H5L_move_func_t);
FFI_C_TYPE(H5L_copy_func_t);
FFI_C_TYPE(H5L_traverse_func_t);
FFI_C_TYPE(H5L_delete_func_t);
FFI_C_TYPE(H5L_query_func_t);

FFI_C_TYPE(H5L_class_t);

FFI_C_TYPE(H5L_iterate_t);
#if H5_VERSION_GE(1, 8, 3)
FFI_C_TYPE(H5L_elink_traverse_t);
#endif

FFI_C_FUNC(H5Lmove);
FFI_C_FUNC(H5Lcopy);
FFI_C_FUNC(H5Lcreate_hard);
FFI_C_FUNC(H5Lcreate_soft);
FFI_C_FUNC(H5Ldelete);
FFI_C_FUNC(H5Ldelete_by_idx);
FFI_C_FUNC(H5Lget_val);
FFI_C_FUNC(H5Lget_val_by_idx);
FFI_C_FUNC(H5Lexists);
FFI_C_FUNC(H5Lget_info);
FFI_C_FUNC(H5Lget_info_by_idx);
FFI_C_FUNC(H5Lget_name_by_idx);
FFI_C_FUNC(H5Literate);
FFI_C_FUNC(H5Literate_by_name);
FFI_C_FUNC(H5Lvisit);
FFI_C_FUNC(H5Lvisit_by_name);

FFI_C_FUNC(H5Lcreate_ud);
FFI_C_FUNC(H5Lregister);
FFI_C_FUNC(H5Lunregister);
FFI_C_FUNC(H5Lis_registered);

FFI_C_FUNC(H5Lunpack_elink_val);
FFI_C_FUNC(H5Lcreate_external);

/* Object Interface */
FFI_C_CONST(H5O_COPY_SHALLOW_HIERARCHY_FLAG);
FFI_C_CONST(H5O_COPY_EXPAND_SOFT_LINK_FLAG);
FFI_C_CONST(H5O_COPY_EXPAND_EXT_LINK_FLAG);
FFI_C_CONST(H5O_COPY_EXPAND_REFERENCE_FLAG);
FFI_C_CONST(H5O_COPY_WITHOUT_ATTR_FLAG);
FFI_C_CONST(H5O_COPY_PRESERVE_NULL_FLAG);
#if H5_VERSION_GE(1, 8, 9)
FFI_C_CONST(H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG);
#endif
FFI_C_CONST(H5O_COPY_ALL);

FFI_C_CONST(H5O_SHMESG_NONE_FLAG);
FFI_C_CONST(H5O_SHMESG_SDSPACE_FLAG);
FFI_C_CONST(H5O_SHMESG_DTYPE_FLAG);
FFI_C_CONST(H5O_SHMESG_FILL_FLAG);
FFI_C_CONST(H5O_SHMESG_PLINE_FLAG);
FFI_C_CONST(H5O_SHMESG_ATTR_FLAG);
FFI_C_CONST(H5O_SHMESG_ALL_FLAG);

FFI_C_CONST(H5O_HDR_CHUNK0_SIZE);
FFI_C_CONST(H5O_HDR_ATTR_CRT_ORDER_TRACKED);
FFI_C_CONST(H5O_HDR_ATTR_CRT_ORDER_INDEXED);
FFI_C_CONST(H5O_HDR_ATTR_STORE_PHASE_CHANGE);
FFI_C_CONST(H5O_HDR_STORE_TIMES);
FFI_C_CONST(H5O_HDR_ALL_FLAGS);

FFI_C_CONST(H5O_SHMESG_MAX_NINDEXES);
FFI_C_CONST(H5O_SHMESG_MAX_LIST_SIZE);

FFI_C_TYPE(H5O_type_t);

FFI_C_TYPE(H5O_hdr_info_t);

FFI_C_TYPE(H5O_info_t);

FFI_C_TYPE(H5O_msg_crt_idx_t);

FFI_C_TYPE(H5O_iterate_t);

#if H5_VERSION_GE(1, 8, 9)
FFI_C_TYPE(H5O_mcdt_search_ret_t);

FFI_C_TYPE(H5O_mcdt_search_cb_t);

#endif
FFI_C_FUNC(H5Oopen);
FFI_C_FUNC(H5Oopen_by_addr);
FFI_C_FUNC(H5Oopen_by_idx);
#if H5_VERSION_GE(1, 8, 5)
FFI_C_FUNC(H5Oexists_by_name);
#endif
FFI_C_FUNC(H5Oget_info);
FFI_C_FUNC(H5Oget_info_by_name);
FFI_C_FUNC(H5Oget_info_by_idx);
FFI_C_FUNC(H5Olink);
FFI_C_FUNC(H5Oincr_refcount);
FFI_C_FUNC(H5Odecr_refcount);
FFI_C_FUNC(H5Ocopy);
FFI_C_FUNC(H5Oset_comment);
FFI_C_FUNC(H5Oset_comment_by_name);
FFI_C_FUNC(H5Oget_comment);
FFI_C_FUNC(H5Oget_comment_by_name);
FFI_C_FUNC(H5Ovisit);
FFI_C_FUNC(H5Ovisit_by_name);
FFI_C_FUNC(H5Oclose);

/* Group Interface */
FFI_C_TYPE(H5G_storage_type_t);

FFI_C_TYPE(H5G_info_t);

FFI_C_FUNC(H5Gcreate);
FFI_C_FUNC(H5Gcreate_anon);
FFI_C_FUNC(H5Gopen);
FFI_C_FUNC(H5Gget_create_plist);
FFI_C_FUNC(H5Gget_info);
FFI_C_FUNC(H5Gget_info_by_name);
FFI_C_FUNC(H5Gget_info_by_idx);
FFI_C_FUNC(H5Gclose);

/* Attribute Interface */
FFI_C_TYPE(H5A_info_t);

FFI_C_TYPE(H5A_operator_t);

FFI_C_FUNC(H5Acreate);
FFI_C_FUNC(H5Acreate_by_name);
FFI_C_FUNC(H5Aopen);
FFI_C_FUNC(H5Aopen_by_name);
FFI_C_FUNC(H5Aopen_by_idx);
FFI_C_FUNC(H5Awrite);
FFI_C_FUNC(H5Aread);
FFI_C_FUNC(H5Aclose);
FFI_C_FUNC(H5Aget_space);
FFI_C_FUNC(H5Aget_type);
FFI_C_FUNC(H5Aget_create_plist);
FFI_C_FUNC(H5Aget_name);
FFI_C_FUNC(H5Aget_name_by_idx);
FFI_C_FUNC(H5Aget_storage_size);
FFI_C_FUNC(H5Aget_info);
FFI_C_FUNC(H5Aget_info_by_name);
FFI_C_FUNC(H5Aget_info_by_idx);
FFI_C_FUNC(H5Arename);
FFI_C_FUNC(H5Arename_by_name);
FFI_C_FUNC(H5Aiterate);
FFI_C_FUNC(H5Aiterate_by_name);
FFI_C_FUNC(H5Adelete);
FFI_C_FUNC(H5Adelete_by_name);
FFI_C_FUNC(H5Adelete_by_idx);
FFI_C_FUNC(H5Aexists);
FFI_C_FUNC(H5Aexists_by_name);

/* Dataset Interface */
FFI_C_CONST(H5D_CHUNK_CACHE_NSLOTS_DEFAULT);
FFI_C_CONST(H5D_CHUNK_CACHE_NBYTES_DEFAULT);
FFI_C_CONST(H5D_CHUNK_CACHE_W0_DEFAULT);

FFI_C_TYPE(H5D_layout_t);

FFI_C_TYPE(H5D_chunk_index_t);

FFI_C_TYPE(H5D_alloc_time_t);

FFI_C_TYPE(H5D_space_status_t);

FFI_C_TYPE(H5D_fill_time_t);

FFI_C_TYPE(H5D_fill_value_t);

FFI_C_TYPE(H5D_operator_t);

FFI_C_FUNC(H5Dcreate);
FFI_C_FUNC(H5Dcreate_anon);
FFI_C_FUNC(H5Dopen);
FFI_C_FUNC(H5Dclose);
FFI_C_FUNC(H5Dget_space);
FFI_C_FUNC(H5Dget_space_status);
FFI_C_FUNC(H5Dget_type);
FFI_C_FUNC(H5Dget_create_plist);
FFI_C_FUNC(H5Dget_access_plist);
FFI_C_FUNC(H5Dget_storage_size);
FFI_C_FUNC(H5Dget_offset);
FFI_C_FUNC(H5Dread);
FFI_C_FUNC(H5Dwrite);
FFI_C_FUNC(H5Diterate);
FFI_C_FUNC(H5Dvlen_reclaim);
FFI_C_FUNC(H5Dvlen_get_buf_size);
FFI_C_FUNC(H5Dfill);
FFI_C_FUNC(H5Dset_extent);
FFI_C_FUNC(H5Ddebug);

/* Reference Interface */
FFI_C_TYPE(H5R_type_t);

FFI_C_CONST(H5R_OBJ_REF_BUF_SIZE);
FFI_C_TYPE(hobj_ref_t);

FFI_C_CONST(H5R_DSET_REG_REF_BUF_SIZE);
FFI_C_TYPE(hdset_reg_ref_t);

FFI_C_FUNC(H5Rcreate);
FFI_C_FUNC(H5Rdereference);
FFI_C_FUNC(H5Rget_region);
FFI_C_FUNC(H5Rget_obj_type);
FFI_C_FUNC(H5Rget_name);

/* Filter and Compression Interface */
FFI_C_TYPE(H5Z_filter_t);

FFI_C_CONST(H5Z_FILTER_ERROR);
FFI_C_CONST(H5Z_FILTER_NONE);
FFI_C_CONST(H5Z_FILTER_DEFLATE);
FFI_C_CONST(H5Z_FILTER_SHUFFLE);
FFI_C_CONST(H5Z_FILTER_FLETCHER32);
FFI_C_CONST(H5Z_FILTER_SZIP);
FFI_C_CONST(H5Z_FILTER_NBIT);
FFI_C_CONST(H5Z_FILTER_SCALEOFFSET);
FFI_C_CONST(H5Z_FILTER_RESERVED);
FFI_C_CONST(H5Z_FILTER_MAX);

FFI_C_CONST(H5Z_FILTER_ALL);
FFI_C_CONST(H5Z_MAX_NFILTERS);

FFI_C_CONST(H5Z_FLAG_DEFMASK);
FFI_C_CONST(H5Z_FLAG_MANDATORY);
FFI_C_CONST(H5Z_FLAG_OPTIONAL);

FFI_C_CONST(H5Z_FLAG_INVMASK);
FFI_C_CONST(H5Z_FLAG_REVERSE);
FFI_C_CONST(H5Z_FLAG_SKIP_EDC);

FFI_C_CONST(H5_SZIP_ALLOW_K13_OPTION_MASK);
FFI_C_CONST(H5_SZIP_CHIP_OPTION_MASK);
FFI_C_CONST(H5_SZIP_EC_OPTION_MASK);
FFI_C_CONST(H5_SZIP_NN_OPTION_MASK);
FFI_C_CONST(H5_SZIP_MAX_PIXELS_PER_BLOCK);

FFI_C_CONST(H5Z_SHUFFLE_USER_NPARMS);
FFI_C_CONST(H5Z_SHUFFLE_TOTAL_NPARMS);

FFI_C_CONST(H5Z_SZIP_USER_NPARMS);
FFI_C_CONST(H5Z_SZIP_TOTAL_NPARMS);
FFI_C_CONST(H5Z_SZIP_PARM_MASK);
FFI_C_CONST(H5Z_SZIP_PARM_PPB);
FFI_C_CONST(H5Z_SZIP_PARM_BPP);
FFI_C_CONST(H5Z_SZIP_PARM_PPS);

FFI_C_CONST(H5Z_NBIT_USER_NPARMS);

FFI_C_CONST(H5Z_SCALEOFFSET_USER_NPARMS);

FFI_C_CONST(H5Z_SO_INT_MINBITS_DEFAULT);
FFI_C_TYPE(H5Z_SO_scale_type_t);

FFI_C_CONST(H5Z_CLASS_T_VERS);

FFI_C_TYPE(H5Z_EDC_t);

FFI_C_CONST(H5Z_FILTER_CONFIG_ENCODE_ENABLED);
FFI_C_CONST(H5Z_FILTER_CONFIG_DECODE_ENABLED);

FFI_C_TYPE(H5Z_cb_return_t);

FFI_C_TYPE(H5Z_filter_func_t);

FFI_C_TYPE(H5Z_cb_t);

FFI_C_TYPE(H5Z_can_apply_func_t);

FFI_C_TYPE(H5Z_set_local_func_t);

FFI_C_TYPE(H5Z_func_t);

FFI_C_TYPE(H5Z_class_t);

FFI_C_FUNC(H5Zregister);
FFI_C_FUNC(H5Zunregister);
FFI_C_FUNC(H5Zfilter_avail);
FFI_C_FUNC(H5Zget_filter_info);

/* Property List Interface */
FFI_C_VAR(H5P_ROOT);
FFI_C_VAR(H5P_OBJECT_CREATE);
FFI_C_VAR(H5P_FILE_CREATE);
FFI_C_VAR(H5P_FILE_ACCESS);
FFI_C_VAR(H5P_DATASET_CREATE);
FFI_C_VAR(H5P_DATASET_ACCESS);
FFI_C_VAR(H5P_DATASET_XFER);
FFI_C_VAR(H5P_FILE_MOUNT);
FFI_C_VAR(H5P_GROUP_CREATE);
FFI_C_VAR(H5P_GROUP_ACCESS);
FFI_C_VAR(H5P_DATATYPE_CREATE);
FFI_C_VAR(H5P_DATATYPE_ACCESS);
FFI_C_VAR(H5P_STRING_CREATE);
FFI_C_VAR(H5P_ATTRIBUTE_CREATE);
FFI_C_VAR(H5P_OBJECT_COPY);
FFI_C_VAR(H5P_LINK_CREATE);
FFI_C_VAR(H5P_LINK_ACCESS);

FFI_C_VAR(H5P_FILE_CREATE_DEFAULT);
FFI_C_VAR(H5P_FILE_ACCESS_DEFAULT);
FFI_C_VAR(H5P_DATASET_CREATE_DEFAULT);
FFI_C_VAR(H5P_DATASET_ACCESS_DEFAULT);
FFI_C_VAR(H5P_DATASET_XFER_DEFAULT);
FFI_C_VAR(H5P_FILE_MOUNT_DEFAULT);
FFI_C_VAR(H5P_GROUP_CREATE_DEFAULT);
FFI_C_VAR(H5P_GROUP_ACCESS_DEFAULT);
FFI_C_VAR(H5P_DATATYPE_CREATE_DEFAULT);
FFI_C_VAR(H5P_DATATYPE_ACCESS_DEFAULT);
FFI_C_VAR(H5P_ATTRIBUTE_CREATE_DEFAULT);
FFI_C_VAR(H5P_OBJECT_COPY_DEFAULT);
FFI_C_VAR(H5P_LINK_CREATE_DEFAULT);
FFI_C_VAR(H5P_LINK_ACCESS_DEFAULT);

FFI_C_CONST(H5P_CRT_ORDER_TRACKED);
FFI_C_CONST(H5P_CRT_ORDER_INDEXED);

FFI_C_TYPE(H5P_cls_create_func_t);
FFI_C_TYPE(H5P_cls_copy_func_t);
FFI_C_TYPE(H5P_cls_close_func_t);

FFI_C_TYPE(H5P_prp_cb1_t);
FFI_C_TYPE(H5P_prp_cb2_t);
FFI_C_TYPE(H5P_prp_create_func_t);
FFI_C_TYPE(H5P_prp_set_func_t);
FFI_C_TYPE(H5P_prp_get_func_t);
FFI_C_TYPE(H5P_prp_delete_func_t);
FFI_C_TYPE(H5P_prp_copy_func_t);
FFI_C_TYPE(H5P_prp_compare_func_t);
FFI_C_TYPE(H5P_prp_close_func_t);

FFI_C_TYPE(H5P_iterate_t);

FFI_C_TYPE(H5D_mpio_actual_chunk_opt_mode_t);

FFI_C_TYPE(H5D_mpio_actual_io_mode_t);

FFI_C_FUNC(H5Pcreate_class);
FFI_C_FUNC(H5Pget_class_name);
FFI_C_FUNC(H5Pcreate);
FFI_C_FUNC(H5Pregister);
FFI_C_FUNC(H5Pinsert);
FFI_C_FUNC(H5Pset);
FFI_C_FUNC(H5Pexist);
FFI_C_FUNC(H5Pget_size);
FFI_C_FUNC(H5Pget_nprops);
FFI_C_FUNC(H5Pget_class);
FFI_C_FUNC(H5Pget_class_parent);
FFI_C_FUNC(H5Pget);
FFI_C_FUNC(H5Pequal);
FFI_C_FUNC(H5Pisa_class);
FFI_C_FUNC(H5Piterate);
FFI_C_FUNC(H5Pcopy_prop);
FFI_C_FUNC(H5Premove);
FFI_C_FUNC(H5Punregister);
FFI_C_FUNC(H5Pclose_class);
FFI_C_FUNC(H5Pclose);
FFI_C_FUNC(H5Pcopy);

FFI_C_FUNC(H5Pset_attr_phase_change);
FFI_C_FUNC(H5Pget_attr_phase_change);
FFI_C_FUNC(H5Pset_attr_creation_order);
FFI_C_FUNC(H5Pget_attr_creation_order);
FFI_C_FUNC(H5Pset_obj_track_times);
FFI_C_FUNC(H5Pget_obj_track_times);
FFI_C_FUNC(H5Pmodify_filter);
FFI_C_FUNC(H5Pset_filter);
FFI_C_FUNC(H5Pget_nfilters);
FFI_C_FUNC(H5Pget_filter);
FFI_C_FUNC(H5Pget_filter_by_id);
FFI_C_FUNC(H5Pall_filters_avail);
FFI_C_FUNC(H5Premove_filter);
FFI_C_FUNC(H5Pset_deflate);
FFI_C_FUNC(H5Pset_fletcher32);

FFI_C_FUNC(H5Pget_version);
FFI_C_FUNC(H5Pset_userblock);
FFI_C_FUNC(H5Pget_userblock);
FFI_C_FUNC(H5Pset_sizes);
FFI_C_FUNC(H5Pget_sizes);
FFI_C_FUNC(H5Pset_sym_k);
FFI_C_FUNC(H5Pget_sym_k);
FFI_C_FUNC(H5Pset_istore_k);
FFI_C_FUNC(H5Pget_istore_k);
FFI_C_FUNC(H5Pset_shared_mesg_nindexes);
FFI_C_FUNC(H5Pget_shared_mesg_nindexes);
FFI_C_FUNC(H5Pset_shared_mesg_index);
FFI_C_FUNC(H5Pget_shared_mesg_index);
FFI_C_FUNC(H5Pset_shared_mesg_phase_change);
FFI_C_FUNC(H5Pget_shared_mesg_phase_change);

FFI_C_FUNC(H5Pset_alignment);
FFI_C_FUNC(H5Pget_alignment);
FFI_C_FUNC(H5Pset_driver);
FFI_C_FUNC(H5Pget_driver);
FFI_C_FUNC(H5Pget_driver_info);
FFI_C_FUNC(H5Pset_family_offset);
FFI_C_FUNC(H5Pget_family_offset);
FFI_C_FUNC(H5Pset_multi_type);
FFI_C_FUNC(H5Pget_multi_type);
FFI_C_FUNC(H5Pset_cache);
FFI_C_FUNC(H5Pget_cache);
FFI_C_FUNC(H5Pset_mdc_config);
FFI_C_FUNC(H5Pget_mdc_config);
FFI_C_FUNC(H5Pset_gc_references);
FFI_C_FUNC(H5Pget_gc_references);
FFI_C_FUNC(H5Pset_fclose_degree);
FFI_C_FUNC(H5Pget_fclose_degree);
FFI_C_FUNC(H5Pset_meta_block_size);
FFI_C_FUNC(H5Pget_meta_block_size);
FFI_C_FUNC(H5Pset_sieve_buf_size);
FFI_C_FUNC(H5Pget_sieve_buf_size);
FFI_C_FUNC(H5Pset_small_data_block_size);
FFI_C_FUNC(H5Pget_small_data_block_size);
FFI_C_FUNC(H5Pset_libver_bounds);
FFI_C_FUNC(H5Pget_libver_bounds);
FFI_C_FUNC(H5Pset_elink_file_cache_size);
FFI_C_FUNC(H5Pget_elink_file_cache_size);
FFI_C_FUNC(H5Pset_file_image);
FFI_C_FUNC(H5Pget_file_image);
FFI_C_FUNC(H5Pset_file_image_callbacks);
FFI_C_FUNC(H5Pget_file_image_callbacks);

FFI_C_FUNC(H5Pset_layout);
FFI_C_FUNC(H5Pget_layout);
FFI_C_FUNC(H5Pset_chunk);
FFI_C_FUNC(H5Pget_chunk);
FFI_C_FUNC(H5Pset_external);
FFI_C_FUNC(H5Pget_external_count);
FFI_C_FUNC(H5Pget_external);
FFI_C_FUNC(H5Pset_szip);
FFI_C_FUNC(H5Pset_shuffle);
FFI_C_FUNC(H5Pset_nbit);
FFI_C_FUNC(H5Pset_scaleoffset);
FFI_C_FUNC(H5Pset_fill_value);
FFI_C_FUNC(H5Pget_fill_value);
FFI_C_FUNC(H5Pfill_value_defined);
FFI_C_FUNC(H5Pset_alloc_time);
FFI_C_FUNC(H5Pget_alloc_time);
FFI_C_FUNC(H5Pset_fill_time);
FFI_C_FUNC(H5Pget_fill_time);

FFI_C_FUNC(H5Pset_chunk_cache);
FFI_C_FUNC(H5Pget_chunk_cache);

FFI_C_FUNC(H5Pset_data_transform);
FFI_C_FUNC(H5Pget_data_transform);
FFI_C_FUNC(H5Pset_buffer);
FFI_C_FUNC(H5Pget_buffer);
FFI_C_FUNC(H5Pset_preserve);
FFI_C_FUNC(H5Pget_preserve);
FFI_C_FUNC(H5Pset_edc_check);
FFI_C_FUNC(H5Pget_edc_check);
FFI_C_FUNC(H5Pset_filter_callback);
FFI_C_FUNC(H5Pset_btree_ratios);
FFI_C_FUNC(H5Pget_btree_ratios);
FFI_C_FUNC(H5Pset_vlen_mem_manager);
FFI_C_FUNC(H5Pget_vlen_mem_manager);
FFI_C_FUNC(H5Pset_hyper_vector_size);
FFI_C_FUNC(H5Pget_hyper_vector_size);
FFI_C_FUNC(H5Pset_type_conv_cb);
FFI_C_FUNC(H5Pget_type_conv_cb);
#ifdef H5_HAVE_PARALLEL
FFI_C_FUNC(H5Pget_mpio_actual_chunk_opt_mode);
FFI_C_FUNC(H5Pget_mpio_actual_io_mode);
#endif

FFI_C_FUNC(H5Pset_create_intermediate_group);
FFI_C_FUNC(H5Pget_create_intermediate_group);

FFI_C_FUNC(H5Pset_local_heap_size_hint);
FFI_C_FUNC(H5Pget_local_heap_size_hint);
FFI_C_FUNC(H5Pset_link_phase_change);
FFI_C_FUNC(H5Pget_link_phase_change);
FFI_C_FUNC(H5Pset_est_link_info);
FFI_C_FUNC(H5Pget_est_link_info);
FFI_C_FUNC(H5Pset_link_creation_order);
FFI_C_FUNC(H5Pget_link_creation_order);

FFI_C_FUNC(H5Pset_char_encoding);
FFI_C_FUNC(H5Pget_char_encoding);

FFI_C_FUNC(H5Pset_nlinks);
FFI_C_FUNC(H5Pget_nlinks);
FFI_C_FUNC(H5Pset_elink_prefix);
FFI_C_FUNC(H5Pget_elink_prefix);
FFI_C_FUNC(H5Pget_elink_fapl);
FFI_C_FUNC(H5Pset_elink_fapl);
FFI_C_FUNC(H5Pset_elink_acc_flags);
FFI_C_FUNC(H5Pget_elink_acc_flags);
FFI_C_FUNC(H5Pset_elink_cb);
FFI_C_FUNC(H5Pget_elink_cb);

FFI_C_FUNC(H5Pset_copy_object);
FFI_C_FUNC(H5Pget_copy_object);
FFI_C_FUNC(H5Padd_merge_committed_dtype_path);
FFI_C_FUNC(H5Pfree_merge_committed_dtype_paths);
FFI_C_FUNC(H5Pset_mcdt_search_cb);
FFI_C_FUNC(H5Pget_mcdt_search_cb);
--
-- HDF5 for LuaJIT.
-- Copyright © 2012 Peter Colberg.
-- For conditions of distribution and use, see copyright notice in LICENSE.
--

local ffi = require("ffi")

ffi.cdef[[
typedef long int ssize_t;
typedef long int time_t;

typedef int herr_t;
typedef unsigned int hbool_t;
typedef int htri_t;
typedef long long unsigned int hsize_t;
typedef long long int hssize_t;
typedef long unsigned int haddr_t;

static const int H5_VERS_MAJOR = 1;
static const int H5_VERS_MINOR = 8;
static const int H5_VERS_RELEASE = 9;

static const int H5P_DEFAULT = 0;

typedef enum H5_iter_order_t {
  H5_ITER_UNKNOWN = -1,
  H5_ITER_INC = 0,
  H5_ITER_DEC = 1,
  H5_ITER_NATIVE = 2,
  H5_ITER_N = 3,
} H5_iter_order_t;

static const int H5_ITER_ERROR = -1;
static const int H5_ITER_CONT = 0;
static const int H5_ITER_STOP = 1;

typedef enum H5_index_t {
  H5_INDEX_UNKNOWN = -1,
  H5_INDEX_NAME = 0,
  H5_INDEX_CRT_ORDER = 1,
  H5_INDEX_N = 2,
} H5_index_t;

typedef struct H5_ih_info_t {
  hsize_t index_size;
  hsize_t heap_size;
} H5_ih_info_t;

herr_t H5open(void);
herr_t H5close(void);
herr_t H5dont_atexit(void);
herr_t H5garbage_collect(void);
herr_t H5set_free_list_limits(int, int, int, int, int, int);
herr_t H5get_libversion(unsigned int *, unsigned int *, unsigned int *);
herr_t H5check_version(unsigned int, unsigned int, unsigned int);

typedef int hid_t;

static const int H5I_INVALID_HID = -1;

typedef enum H5I_type_t {
  H5I_UNINIT = -2,
  H5I_BADID = -1,
  H5I_FILE = 1,
  H5I_GROUP = 2,
  H5I_DATATYPE = 3,
  H5I_DATASPACE = 4,
  H5I_DATASET = 5,
  H5I_ATTR = 6,
  H5I_REFERENCE = 7,
  H5I_VFL = 8,
  H5I_GENPROP_CLS = 9,
  H5I_GENPROP_LST = 10,
  H5I_ERROR_CLASS = 11,
  H5I_ERROR_MSG = 12,
  H5I_ERROR_STACK = 13,
  H5I_NTYPES = 14,
} H5I_type_t;

typedef herr_t (*H5I_free_t)(void *);
typedef int (*H5I_search_func_t)(void *, hid_t, void *);

hid_t H5Iregister(H5I_type_t, const void *);
void *H5Iobject_verify(hid_t, H5I_type_t);
void *H5Iremove_verify(hid_t, H5I_type_t);
H5I_type_t H5Iget_type(hid_t);
hid_t H5Iget_file_id(hid_t);
ssize_t H5Iget_name(hid_t, char *, size_t);
int H5Iinc_ref(hid_t);
int H5Idec_ref(hid_t);
int H5Iget_ref(hid_t);
H5I_type_t H5Iregister_type(size_t, unsigned int, H5I_free_t);
herr_t H5Iclear_type(H5I_type_t, hbool_t);
herr_t H5Idestroy_type(H5I_type_t);
int H5Iinc_type_ref(H5I_type_t);
int H5Idec_type_ref(H5I_type_t);
int H5Iget_type_ref(H5I_type_t);
void *H5Isearch(H5I_type_t, H5I_search_func_t, void *);
herr_t H5Inmembers(H5I_type_t, hsize_t *);
htri_t H5Itype_exists(H5I_type_t);

htri_t H5Iis_valid(hid_t);

static const int H5E_DEFAULT = 0;

typedef enum H5E_type_t {
  H5E_MAJOR = 0,
  H5E_MINOR = 1,
} H5E_type_t;

typedef struct H5E_error_t {
  hid_t cls_id;
  hid_t maj_num;
  hid_t min_num;
  unsigned int line;
  const char *func_name;
  const char *file_name;
  const char *desc;
} H5E_error_t;

extern hid_t H5E_ERR_CLS asm("H5E_ERR_CLS_g");
extern hid_t H5E_DATASET asm("H5E_DATASET_g");
extern hid_t H5E_FUNC asm("H5E_FUNC_g");
extern hid_t H5E_STORAGE asm("H5E_STORAGE_g");
extern hid_t H5E_FILE asm("H5E_FILE_g");
extern hid_t H5E_SOHM asm("H5E_SOHM_g");
extern hid_t H5E_SYM asm("H5E_SYM_g");
extern hid_t H5E_VFL asm("H5E_VFL_g");
extern hid_t H5E_INTERNAL asm("H5E_INTERNAL_g");
extern hid_t H5E_BTREE asm("H5E_BTREE_g");
extern hid_t H5E_REFERENCE asm("H5E_REFERENCE_g");
extern hid_t H5E_DATASPACE asm("H5E_DATASPACE_g");
extern hid_t H5E_RESOURCE asm("H5E_RESOURCE_g");
extern hid_t H5E_PLIST asm("H5E_PLIST_g");
extern hid_t H5E_LINK asm("H5E_LINK_g");
extern hid_t H5E_DATATYPE asm("H5E_DATATYPE_g");
extern hid_t H5E_RS asm("H5E_RS_g");
extern hid_t H5E_HEAP asm("H5E_HEAP_g");
extern hid_t H5E_OHDR asm("H5E_OHDR_g");
extern hid_t H5E_ATOM asm("H5E_ATOM_g");
extern hid_t H5E_ATTR asm("H5E_ATTR_g");
extern hid_t H5E_NONE_MAJOR asm("H5E_NONE_MAJOR_g");
extern hid_t H5E_IO asm("H5E_IO_g");
extern hid_t H5E_SLIST asm("H5E_SLIST_g");
extern hid_t H5E_EFL asm("H5E_EFL_g");
extern hid_t H5E_TST asm("H5E_TST_g");
extern hid_t H5E_ARGS asm("H5E_ARGS_g");
extern hid_t H5E_ERROR asm("H5E_ERROR_g");
extern hid_t H5E_PLINE asm("H5E_PLINE_g");
extern hid_t H5E_FSPACE asm("H5E_FSPACE_g");
extern hid_t H5E_CACHE asm("H5E_CACHE_g");
extern hid_t H5E_SEEKERROR asm("H5E_SEEKERROR_g");
extern hid_t H5E_READERROR asm("H5E_READERROR_g");
extern hid_t H5E_WRITEERROR asm("H5E_WRITEERROR_g");
extern hid_t H5E_CLOSEERROR asm("H5E_CLOSEERROR_g");
extern hid_t H5E_OVERFLOW asm("H5E_OVERFLOW_g");
extern hid_t H5E_FCNTL asm("H5E_FCNTL_g");
extern hid_t H5E_NOSPACE asm("H5E_NOSPACE_g");
extern hid_t H5E_CANTALLOC asm("H5E_CANTALLOC_g");
extern hid_t H5E_CANTCOPY asm("H5E_CANTCOPY_g");
extern hid_t H5E_CANTFREE asm("H5E_CANTFREE_g");
extern hid_t H5E_ALREADYEXISTS asm("H5E_ALREADYEXISTS_g");
extern hid_t H5E_CANTLOCK asm("H5E_CANTLOCK_g");
extern hid_t H5E_CANTUNLOCK asm("H5E_CANTUNLOCK_g");
extern hid_t H5E_CANTGC asm("H5E_CANTGC_g");
extern hid_t H5E_CANTGETSIZE asm("H5E_CANTGETSIZE_g");
extern hid_t H5E_OBJOPEN asm("H5E_OBJOPEN_g");
extern hid_t H5E_CANTRESTORE asm("H5E_CANTRESTORE_g");
extern hid_t H5E_CANTCOMPUTE asm("H5E_CANTCOMPUTE_g");
extern hid_t H5E_CANTEXTEND asm("H5E_CANTEXTEND_g");
extern hid_t H5E_CANTATTACH asm("H5E_CANTATTACH_g");
extern hid_t H5E_CANTUPDATE asm("H5E_CANTUPDATE_g");
extern hid_t H5E_CANTOPERATE asm("H5E_CANTOPERATE_g");
extern hid_t H5E_CANTINIT asm("H5E_CANTINIT_g");
extern hid_t H5E_ALREADYINIT asm("H5E_ALREADYINIT_g");
extern hid_t H5E_CANTRELEASE asm("H5E_CANTRELEASE_g");
extern hid_t H5E_CANTGET asm("H5E_CANTGET_g");
extern hid_t H5E_CANTSET asm("H5E_CANTSET_g");
extern hid_t H5E_DUPCLASS asm("H5E_DUPCLASS_g");
extern hid_t H5E_SETDISALLOWED asm("H5E_SETDISALLOWED_g");
extern hid_t H5E_CANTMERGE asm("H5E_CANTMERGE_g");
extern hid_t H5E_CANTREVIVE asm("H5E_CANTREVIVE_g");
extern hid_t H5E_CANTSHRINK asm("H5E_CANTSHRINK_g");
extern hid_t H5E_LINKCOUNT asm("H5E_LINKCOUNT_g");
extern hid_t H5E_VERSION asm("H5E_VERSION_g");
extern hid_t H5E_ALIGNMENT asm("H5E_ALIGNMENT_g");
extern hid_t H5E_BADMESG asm("H5E_BADMESG_g");
extern hid_t H5E_CANTDELETE asm("H5E_CANTDELETE_g");
extern hid_t H5E_BADITER asm("H5E_BADITER_g");
extern hid_t H5E_CANTPACK asm("H5E_CANTPACK_g");
extern hid_t H5E_CANTRESET asm("H5E_CANTRESET_g");
extern hid_t H5E_CANTRENAME asm("H5E_CANTRENAME_g");
extern hid_t H5E_SYSERRSTR asm("H5E_SYSERRSTR_g");
extern hid_t H5E_NOFILTER asm("H5E_NOFILTER_g");
extern hid_t H5E_CALLBACK asm("H5E_CALLBACK_g");
extern hid_t H5E_CANAPPLY asm("H5E_CANAPPLY_g");
extern hid_t H5E_SETLOCAL asm("H5E_SETLOCAL_g");
extern hid_t H5E_NOENCODER asm("H5E_NOENCODER_g");
extern hid_t H5E_CANTFILTER asm("H5E_CANTFILTER_g");
extern hid_t H5E_CANTOPENOBJ asm("H5E_CANTOPENOBJ_g");
extern hid_t H5E_CANTCLOSEOBJ asm("H5E_CANTCLOSEOBJ_g");
extern hid_t H5E_COMPLEN asm("H5E_COMPLEN_g");
extern hid_t H5E_PATH asm("H5E_PATH_g");
extern hid_t H5E_NONE_MINOR asm("H5E_NONE_MINOR_g");
extern hid_t H5E_FILEEXISTS asm("H5E_FILEEXISTS_g");
extern hid_t H5E_FILEOPEN asm("H5E_FILEOPEN_g");
extern hid_t H5E_CANTCREATE asm("H5E_CANTCREATE_g");
extern hid_t H5E_CANTOPENFILE asm("H5E_CANTOPENFILE_g");
extern hid_t H5E_CANTCLOSEFILE asm("H5E_CANTCLOSEFILE_g");
extern hid_t H5E_NOTHDF5 asm("H5E_NOTHDF5_g");
extern hid_t H5E_BADFILE asm("H5E_BADFILE_g");
extern hid_t H5E_TRUNCATED asm("H5E_TRUNCATED_g");
extern hid_t H5E_MOUNT asm("H5E_MOUNT_g");
extern hid_t H5E_BADATOM asm("H5E_BADATOM_g");
extern hid_t H5E_BADGROUP asm("H5E_BADGROUP_g");
extern hid_t H5E_CANTREGISTER asm("H5E_CANTREGISTER_g");
extern hid_t H5E_CANTINC asm("H5E_CANTINC_g");
extern hid_t H5E_CANTDEC asm("H5E_CANTDEC_g");
extern hid_t H5E_NOIDS asm("H5E_NOIDS_g");
extern hid_t H5E_CANTFLUSH asm("H5E_CANTFLUSH_g");
extern hid_t H5E_CANTSERIALIZE asm("H5E_CANTSERIALIZE_g");
extern hid_t H5E_CANTLOAD asm("H5E_CANTLOAD_g");
extern hid_t H5E_PROTECT asm("H5E_PROTECT_g");
extern hid_t H5E_NOTCACHED asm("H5E_NOTCACHED_g");
extern hid_t H5E_SYSTEM asm("H5E_SYSTEM_g");
extern hid_t H5E_CANTINS asm("H5E_CANTINS_g");
extern hid_t H5E_CANTPROTECT asm("H5E_CANTPROTECT_g");
extern hid_t H5E_CANTUNPROTECT asm("H5E_CANTUNPROTECT_g");
extern hid_t H5E_CANTPIN asm("H5E_CANTPIN_g");
extern hid_t H5E_CANTUNPIN asm("H5E_CANTUNPIN_g");
extern hid_t H5E_CANTMARKDIRTY asm("H5E_CANTMARKDIRTY_g");
extern hid_t H5E_CANTDIRTY asm("H5E_CANTDIRTY_g");
extern hid_t H5E_CANTEXPUNGE asm("H5E_CANTEXPUNGE_g");
extern hid_t H5E_CANTRESIZE asm("H5E_CANTRESIZE_g");
extern hid_t H5E_TRAVERSE asm("H5E_TRAVERSE_g");
extern hid_t H5E_NLINKS asm("H5E_NLINKS_g");
extern hid_t H5E_NOTREGISTERED asm("H5E_NOTREGISTERED_g");
extern hid_t H5E_CANTMOVE asm("H5E_CANTMOVE_g");
extern hid_t H5E_CANTSORT asm("H5E_CANTSORT_g");
extern hid_t H5E_MPI asm("H5E_MPI_g");
extern hid_t H5E_MPIERRSTR asm("H5E_MPIERRSTR_g");
extern hid_t H5E_CANTRECV asm("H5E_CANTRECV_g");
extern hid_t H5E_CANTCLIP asm("H5E_CANTCLIP_g");
extern hid_t H5E_CANTCOUNT asm("H5E_CANTCOUNT_g");
extern hid_t H5E_CANTSELECT asm("H5E_CANTSELECT_g");
extern hid_t H5E_CANTNEXT asm("H5E_CANTNEXT_g");
extern hid_t H5E_BADSELECT asm("H5E_BADSELECT_g");
extern hid_t H5E_CANTCOMPARE asm("H5E_CANTCOMPARE_g");
extern hid_t H5E_UNINITIALIZED asm("H5E_UNINITIALIZED_g");
extern hid_t H5E_UNSUPPORTED asm("H5E_UNSUPPORTED_g");
extern hid_t H5E_BADTYPE asm("H5E_BADTYPE_g");
extern hid_t H5E_BADRANGE asm("H5E_BADRANGE_g");
extern hid_t H5E_BADVALUE asm("H5E_BADVALUE_g");
extern hid_t H5E_NOTFOUND asm("H5E_NOTFOUND_g");
extern hid_t H5E_EXISTS asm("H5E_EXISTS_g");
extern hid_t H5E_CANTENCODE asm("H5E_CANTENCODE_g");
extern hid_t H5E_CANTDECODE asm("H5E_CANTDECODE_g");
extern hid_t H5E_CANTSPLIT asm("H5E_CANTSPLIT_g");
extern hid_t H5E_CANTREDISTRIBUTE asm("H5E_CANTREDISTRIBUTE_g");
extern hid_t H5E_CANTSWAP asm("H5E_CANTSWAP_g");
extern hid_t H5E_CANTINSERT asm("H5E_CANTINSERT_g");
extern hid_t H5E_CANTLIST asm("H5E_CANTLIST_g");
extern hid_t H5E_CANTMODIFY asm("H5E_CANTMODIFY_g");
extern hid_t H5E_CANTREMOVE asm("H5E_CANTREMOVE_g");
extern hid_t H5E_CANTCONVERT asm("H5E_CANTCONVERT_g");
extern hid_t H5E_BADSIZE asm("H5E_BADSIZE_g");

typedef enum H5E_direction_t {
  H5E_WALK_UPWARD = 0,
  H5E_WALK_DOWNWARD = 1,
} H5E_direction_t;

typedef herr_t (*H5E_walk_t)(unsigned int, const H5E_error2_t *, void *);
typedef herr_t (*H5E_auto_t)(hid_t, void *);

hid_t H5Eregister_class(const char *, const char *, const char *);
herr_t H5Eunregister_class(hid_t);
herr_t H5Eclose_msg(hid_t);
hid_t H5Ecreate_msg(hid_t, H5E_type_t, const char *);
hid_t H5Ecreate_stack(void);
hid_t H5Eget_current_stack(void);
herr_t H5Eclose_stack(hid_t);
ssize_t H5Eget_class_name(hid_t, char *, size_t);
herr_t H5Eset_current_stack(hid_t);
herr_t H5Epush(hid_t, const char *, const char *, unsigned int, hid_t, hid_t, 
hid_t, const char *, ...) asm("H5Epush2");
herr_t H5Epop(hid_t, size_t);
herr_t H5Eprint(hid_t, FILE *) asm("H5Eprint2");
herr_t H5Ewalk(hid_t, H5E_direction_t, H5E_walk2_t, void *) asm("H5Ewalk2");
herr_t H5Eget_auto(hid_t, H5E_auto2_t *, void **) asm("H5Eget_auto2");
herr_t H5Eset_auto(hid_t, H5E_auto2_t, void *) asm("H5Eset_auto2");
herr_t H5Eclear(hid_t) asm("H5Eclear2");
ssize_t H5Eget_msg(hid_t, H5E_type_t *, char *, size_t);
ssize_t H5Eget_num(hid_t);

typedef enum H5C_cache_incr_mode {
  H5C_incr__off = 0,
  H5C_incr__threshold = 1,
} H5C_cache_incr_mode;

typedef enum H5C_cache_flash_incr_mode {
  H5C_flash_incr__off = 0,
  H5C_flash_incr__add_space = 1,
} H5C_cache_flash_incr_mode;

typedef enum H5C_cache_decr_mode {
  H5C_decr__off = 0,
  H5C_decr__threshold = 1,
  H5C_decr__age_out = 2,
  H5C_decr__age_out_with_threshold = 3,
} H5C_cache_decr_mode;

static const int H5AC__CURR_CACHE_CONFIG_VERSION = 1;
static const int H5AC__MAX_TRACE_FILE_NAME_LEN = 1024;

static const int H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY = 0;
static const int H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED = 1;

typedef struct H5AC_cache_config_t {
  int version;
  hbool_t rpt_fcn_enabled;
  hbool_t open_trace_file;
  hbool_t close_trace_file;
  char trace_file_name[1025];
  hbool_t evictions_enabled;
  hbool_t set_initial_size;
  size_t initial_size;
  double min_clean_fraction;
  size_t max_size;
  size_t min_size;
  long int epoch_length;
  enum H5C_cache_incr_mode incr_mode;
  double lower_hr_threshold;
  double increment;
  hbool_t apply_max_increment;
  size_t max_increment;
  enum H5C_cache_flash_incr_mode flash_incr_mode;
  double flash_multiple;
  double flash_threshold;
  enum H5C_cache_decr_mode decr_mode;
  double upper_hr_threshold;
  double decrement;
  hbool_t apply_max_decrement;
  size_t max_decrement;
  int epochs_before_eviction;
  hbool_t apply_empty_reserve;
  double empty_reserve;
  int dirty_bytes_threshold;
  int metadata_write_strategy;
} H5AC_cache_config_t;

static const int H5F_ACC_RDONLY = 0;
static const int H5F_ACC_RDWR = 1;
static const int H5F_ACC_TRUNC = 2;
static const int H5F_ACC_EXCL = 4;
static const int H5F_ACC_DEBUG = 8;
static const int H5F_ACC_CREAT = 16;

static const int H5F_ACC_DEFAULT = 65535;

static const int H5F_OBJ_FILE = 1;
static const int H5F_OBJ_DATASET = 2;
static const int H5F_OBJ_GROUP = 4;
static const int H5F_OBJ_DATATYPE = 8;
static const int H5F_OBJ_ATTR = 16;
static const int H5F_OBJ_ALL = 31;
static const int H5F_OBJ_LOCAL = 32;

static const int H5F_FAMILY_DEFAULT = 0;

typedef enum H5F_scope_t {
  H5F_SCOPE_LOCAL = 0,
  H5F_SCOPE_GLOBAL = 1,
} H5F_scope_t;

static const int H5F_UNLIMITED = -1;

typedef enum H5F_close_degree_t {
  H5F_CLOSE_DEFAULT = 0,
  H5F_CLOSE_WEAK = 1,
  H5F_CLOSE_SEMI = 2,
  H5F_CLOSE_STRONG = 3,
} H5F_close_degree_t;

typedef struct H5F_info_t {
  hsize_t super_ext_size;
  struct {
    hsize_t hdr_size;
    H5_ih_info_t msgs_info;
  } sohm;
} H5F_info_t;

typedef enum H5F_mem_t {
  H5FD_MEM_NOLIST = -1,
  H5FD_MEM_DEFAULT = 0,
  H5FD_MEM_SUPER = 1,
  H5FD_MEM_BTREE = 2,
  H5FD_MEM_DRAW = 3,
  H5FD_MEM_GHEAP = 4,
  H5FD_MEM_LHEAP = 5,
  H5FD_MEM_OHDR = 6,
  H5FD_MEM_NTYPES = 7,
} H5F_mem_t;

typedef enum H5F_libver_t {
  H5F_LIBVER_EARLIEST = 0,
  H5F_LIBVER_LATEST = 1,
} H5F_libver_t;

static const int H5F_LIBVER_18 = 1;

htri_t H5Fis_hdf5(const char *);
hid_t H5Fcreate(const char *, unsigned int, hid_t, hid_t);
hid_t H5Fopen(const char *, unsigned int, hid_t);
hid_t H5Freopen(hid_t);
herr_t H5Fflush(hid_t, H5F_scope_t);
herr_t H5Fclose(hid_t);
hid_t H5Fget_create_plist(hid_t);
hid_t H5Fget_access_plist(hid_t);
herr_t H5Fget_intent(hid_t, unsigned int *);

ssize_t H5Fget_obj_count(hid_t, unsigned int);
ssize_t H5Fget_obj_ids(hid_t, unsigned int, size_t, hid_t *);

herr_t H5Fget_vfd_handle(hid_t, hid_t, void **);
herr_t H5Fmount(hid_t, const char *, hid_t, hid_t);
herr_t H5Funmount(hid_t, const char *);
hssize_t H5Fget_freespace(hid_t);
herr_t H5Fget_filesize(hid_t, hsize_t *);

ssize_t H5Fget_file_image(hid_t, void *, size_t);

herr_t H5Fget_mdc_config(hid_t, H5AC_cache_config_t *);
herr_t H5Fset_mdc_config(hid_t, H5AC_cache_config_t *);
herr_t H5Fget_mdc_hit_rate(hid_t, double *);
herr_t H5Fget_mdc_size(hid_t, size_t *, size_t *, size_t *, int *);
herr_t H5Freset_mdc_hit_rate_stats(hid_t);
ssize_t H5Fget_name(hid_t, char *, size_t);
herr_t H5Fget_info(hid_t, H5F_info_t *);

herr_t H5Fclear_elink_file_cache(hid_t);

herr_t H5Fset_mpi_atomicity(hid_t, hbool_t);
herr_t H5Fget_mpi_atomicity(hid_t, hbool_t *);

static const int H5S_ALL = 0;
static const int H5S_UNLIMITED = -1;

static const int H5S_MAX_RANK = 32;

typedef enum H5S_class_t {
  H5S_NO_CLASS = -1,
  H5S_SCALAR = 0,
  H5S_SIMPLE = 1,
  H5S_NULL = 2,
} H5S_class_t;

typedef enum H5S_seloper_t {
  H5S_SELECT_NOOP = -1,
  H5S_SELECT_SET = 0,
  H5S_SELECT_OR = 1,
  H5S_SELECT_AND = 2,
  H5S_SELECT_XOR = 3,
  H5S_SELECT_NOTB = 4,
  H5S_SELECT_NOTA = 5,
  H5S_SELECT_APPEND = 6,
  H5S_SELECT_PREPEND = 7,
  H5S_SELECT_INVALID = 8,
} H5S_seloper_t;

typedef enum H5S_sel_type {
  H5S_SEL_ERROR = -1,
  H5S_SEL_NONE = 0,
  H5S_SEL_POINTS = 1,
  H5S_SEL_HYPERSLABS = 2,
  H5S_SEL_ALL = 3,
  H5S_SEL_N = 4,
} H5S_sel_type;

hid_t H5Screate(H5S_class_t);
hid_t H5Screate_simple(int, const hsize_t *, const hsize_t *);
herr_t H5Sset_extent_simple(hid_t, int, const hsize_t *, const hsize_t *);
hid_t H5Scopy(hid_t);
herr_t H5Sclose(hid_t);
herr_t H5Sencode(hid_t, void *, size_t *);
hid_t H5Sdecode(const void *);
hssize_t H5Sget_simple_extent_npoints(hid_t);
int H5Sget_simple_extent_ndims(hid_t);
int H5Sget_simple_extent_dims(hid_t, hsize_t *, hsize_t *);
htri_t H5Sis_simple(hid_t);
hssize_t H5Sget_select_npoints(hid_t);
herr_t H5Sselect_hyperslab(hid_t, H5S_seloper_t, const hsize_t *, const hsize_t 
*, const hsize_t *, const hsize_t *);

herr_t H5Sselect_elements(hid_t, H5S_seloper_t, size_t, const hsize_t *);
H5S_class_t H5Sget_simple_extent_type(hid_t);
herr_t H5Sset_extent_none(hid_t);
herr_t H5Sextent_copy(hid_t, hid_t);
htri_t H5Sextent_equal(hid_t, hid_t);
herr_t H5Sselect_all(hid_t);
herr_t H5Sselect_none(hid_t);
herr_t H5Soffset_simple(hid_t, const hssize_t *);
htri_t H5Sselect_valid(hid_t);
hssize_t H5Sget_select_hyper_nblocks(hid_t);
hssize_t H5Sget_select_elem_npoints(hid_t);
herr_t H5Sget_select_hyper_blocklist(hid_t, hsize_t, hsize_t, hsize_t *);
herr_t H5Sget_select_elem_pointlist(hid_t, hsize_t, hsize_t, hsize_t *);
herr_t H5Sget_select_bounds(hid_t, hsize_t *, hsize_t *);
H5S_sel_type H5Sget_select_type(hid_t);

typedef enum H5T_class_t {
  H5T_NO_CLASS = -1,
  H5T_INTEGER = 0,
  H5T_FLOAT = 1,
  H5T_TIME = 2,
  H5T_STRING = 3,
  H5T_BITFIELD = 4,
  H5T_OPAQUE = 5,
  H5T_COMPOUND = 6,
  H5T_REFERENCE = 7,
  H5T_ENUM = 8,
  H5T_VLEN = 9,
  H5T_ARRAY = 10,
  H5T_NCLASSES = 11,
} H5T_class_t;

typedef enum H5T_order_t {
  H5T_ORDER_ERROR = -1,
  H5T_ORDER_LE = 0,
  H5T_ORDER_BE = 1,
  H5T_ORDER_VAX = 2,
  H5T_ORDER_MIXED = 3,
  H5T_ORDER_NONE = 4,
} H5T_order_t;

typedef enum H5T_sign_t {
  H5T_SGN_ERROR = -1,
  H5T_SGN_NONE = 0,
  H5T_SGN_2 = 1,
  H5T_NSGN = 2,
} H5T_sign_t;

typedef enum H5T_norm_t {
  H5T_NORM_ERROR = -1,
  H5T_NORM_IMPLIED = 0,
  H5T_NORM_MSBSET = 1,
  H5T_NORM_NONE = 2,
} H5T_norm_t;

typedef enum H5T_cset_t {
  H5T_CSET_ERROR = -1,
  H5T_CSET_ASCII = 0,
  H5T_CSET_UTF8 = 1,
  H5T_CSET_RESERVED_2 = 2,
  H5T_CSET_RESERVED_3 = 3,
  H5T_CSET_RESERVED_4 = 4,
  H5T_CSET_RESERVED_5 = 5,
  H5T_CSET_RESERVED_6 = 6,
  H5T_CSET_RESERVED_7 = 7,
  H5T_CSET_RESERVED_8 = 8,
  H5T_CSET_RESERVED_9 = 9,
  H5T_CSET_RESERVED_10 = 10,
  H5T_CSET_RESERVED_11 = 11,
  H5T_CSET_RESERVED_12 = 12,
  H5T_CSET_RESERVED_13 = 13,
  H5T_CSET_RESERVED_14 = 14,
  H5T_CSET_RESERVED_15 = 15,
} H5T_cset_t;

typedef enum H5T_str_t {
  H5T_STR_ERROR = -1,
  H5T_STR_NULLTERM = 0,
  H5T_STR_NULLPAD = 1,
  H5T_STR_SPACEPAD = 2,
  H5T_STR_RESERVED_3 = 3,
  H5T_STR_RESERVED_4 = 4,
  H5T_STR_RESERVED_5 = 5,
  H5T_STR_RESERVED_6 = 6,
  H5T_STR_RESERVED_7 = 7,
  H5T_STR_RESERVED_8 = 8,
  H5T_STR_RESERVED_9 = 9,
  H5T_STR_RESERVED_10 = 10,
  H5T_STR_RESERVED_11 = 11,
  H5T_STR_RESERVED_12 = 12,
  H5T_STR_RESERVED_13 = 13,
  H5T_STR_RESERVED_14 = 14,
  H5T_STR_RESERVED_15 = 15,
} H5T_str_t;

typedef enum H5T_pad_t {
  H5T_PAD_ERROR = -1,
  H5T_PAD_ZERO = 0,
  H5T_PAD_ONE = 1,
  H5T_PAD_BACKGROUND = 2,
  H5T_NPAD = 3,
} H5T_pad_t;

typedef enum H5T_cmd_t {
  H5T_CONV_INIT = 0,
  H5T_CONV_CONV = 1,
  H5T_CONV_FREE = 2,
} H5T_cmd_t;

typedef enum H5T_bkg_t {
  H5T_BKG_NO = 0,
  H5T_BKG_TEMP = 1,
  H5T_BKG_YES = 2,
} H5T_bkg_t;

typedef enum H5T_pers_t {
  H5T_PERS_DONTCARE = -1,
  H5T_PERS_HARD = 0,
  H5T_PERS_SOFT = 1,
} H5T_pers_t;

typedef enum H5T_direction_t {
  H5T_DIR_DEFAULT = 0,
  H5T_DIR_ASCEND = 1,
  H5T_DIR_DESCEND = 2,
} H5T_direction_t;

typedef enum H5T_conv_except_t {
  H5T_CONV_EXCEPT_RANGE_HI = 0,
  H5T_CONV_EXCEPT_RANGE_LOW = 1,
  H5T_CONV_EXCEPT_PRECISION = 2,
  H5T_CONV_EXCEPT_TRUNCATE = 3,
  H5T_CONV_EXCEPT_PINF = 4,
  H5T_CONV_EXCEPT_NINF = 5,
  H5T_CONV_EXCEPT_NAN = 6,
} H5T_conv_except_t;

typedef enum H5T_conv_ret_t {
  H5T_CONV_ABORT = -1,
  H5T_CONV_UNHANDLED = 0,
  H5T_CONV_HANDLED = 1,
} H5T_conv_ret_t;

typedef struct H5T_cdata_t {
  H5T_cmd_t command;
  H5T_bkg_t need_bkg;
  hbool_t recalc;
  void *priv;
} H5T_cdata_t;

typedef struct hvl_t {
  size_t len;
  void *p;
} hvl_t;

static const int H5T_VARIABLE = -1;
static const int H5T_OPAQUE_TAG_MAX = 256;

extern hid_t H5T_IEEE_F32BE asm("H5T_IEEE_F32BE_g");
extern hid_t H5T_IEEE_F32LE asm("H5T_IEEE_F32LE_g");
extern hid_t H5T_IEEE_F64BE asm("H5T_IEEE_F64BE_g");
extern hid_t H5T_IEEE_F64LE asm("H5T_IEEE_F64LE_g");

extern hid_t H5T_STD_I8BE asm("H5T_STD_I8BE_g");
extern hid_t H5T_STD_I8LE asm("H5T_STD_I8LE_g");
extern hid_t H5T_STD_I16BE asm("H5T_STD_I16BE_g");
extern hid_t H5T_STD_I16LE asm("H5T_STD_I16LE_g");
extern hid_t H5T_STD_I32BE asm("H5T_STD_I32BE_g");
extern hid_t H5T_STD_I32LE asm("H5T_STD_I32LE_g");
extern hid_t H5T_STD_I64BE asm("H5T_STD_I64BE_g");
extern hid_t H5T_STD_I64LE asm("H5T_STD_I64LE_g");
extern hid_t H5T_STD_U8BE asm("H5T_STD_U8BE_g");
extern hid_t H5T_STD_U8LE asm("H5T_STD_U8LE_g");
extern hid_t H5T_STD_U16BE asm("H5T_STD_U16BE_g");
extern hid_t H5T_STD_U16LE asm("H5T_STD_U16LE_g");
extern hid_t H5T_STD_U32BE asm("H5T_STD_U32BE_g");
extern hid_t H5T_STD_U32LE asm("H5T_STD_U32LE_g");
extern hid_t H5T_STD_U64BE asm("H5T_STD_U64BE_g");
extern hid_t H5T_STD_U64LE asm("H5T_STD_U64LE_g");
extern hid_t H5T_STD_B8BE asm("H5T_STD_B8BE_g");
extern hid_t H5T_STD_B8LE asm("H5T_STD_B8LE_g");
extern hid_t H5T_STD_B16BE asm("H5T_STD_B16BE_g");
extern hid_t H5T_STD_B16LE asm("H5T_STD_B16LE_g");
extern hid_t H5T_STD_B32BE asm("H5T_STD_B32BE_g");
extern hid_t H5T_STD_B32LE asm("H5T_STD_B32LE_g");
extern hid_t H5T_STD_B64BE asm("H5T_STD_B64BE_g");
extern hid_t H5T_STD_B64LE asm("H5T_STD_B64LE_g");
extern hid_t H5T_STD_REF_OBJ asm("H5T_STD_REF_OBJ_g");
extern hid_t H5T_STD_REF_DSETREG asm("H5T_STD_REF_DSETREG_g");

extern hid_t H5T_UNIX_D32BE asm("H5T_UNIX_D32BE_g");
extern hid_t H5T_UNIX_D32LE asm("H5T_UNIX_D32LE_g");
extern hid_t H5T_UNIX_D64BE asm("H5T_UNIX_D64BE_g");
extern hid_t H5T_UNIX_D64LE asm("H5T_UNIX_D64LE_g");

extern hid_t H5T_C_S1 asm("H5T_C_S1_g");

extern hid_t H5T_FORTRAN_S1 asm("H5T_FORTRAN_S1_g");

extern hid_t H5T_INTEL_I8 asm("H5T_STD_I8LE_g");
extern hid_t H5T_INTEL_I16 asm("H5T_STD_I16LE_g");
extern hid_t H5T_INTEL_I32 asm("H5T_STD_I32LE_g");
extern hid_t H5T_INTEL_I64 asm("H5T_STD_I64LE_g");
extern hid_t H5T_INTEL_U8 asm("H5T_STD_U8LE_g");
extern hid_t H5T_INTEL_U16 asm("H5T_STD_U16LE_g");
extern hid_t H5T_INTEL_U32 asm("H5T_STD_U32LE_g");
extern hid_t H5T_INTEL_U64 asm("H5T_STD_U64LE_g");
extern hid_t H5T_INTEL_B8 asm("H5T_STD_B8LE_g");
extern hid_t H5T_INTEL_B16 asm("H5T_STD_B16LE_g");
extern hid_t H5T_INTEL_B32 asm("H5T_STD_B32LE_g");
extern hid_t H5T_INTEL_B64 asm("H5T_STD_B64LE_g");
extern hid_t H5T_INTEL_F32 asm("H5T_IEEE_F32LE_g");
extern hid_t H5T_INTEL_F64 asm("H5T_IEEE_F64LE_g");

extern hid_t H5T_ALPHA_I8 asm("H5T_STD_I8LE_g");
extern hid_t H5T_ALPHA_I16 asm("H5T_STD_I16LE_g");
extern hid_t H5T_ALPHA_I32 asm("H5T_STD_I32LE_g");
extern hid_t H5T_ALPHA_I64 asm("H5T_STD_I64LE_g");
extern hid_t H5T_ALPHA_U8 asm("H5T_STD_U8LE_g");
extern hid_t H5T_ALPHA_U16 asm("H5T_STD_U16LE_g");
extern hid_t H5T_ALPHA_U32 asm("H5T_STD_U32LE_g");
extern hid_t H5T_ALPHA_U64 asm("H5T_STD_U64LE_g");
extern hid_t H5T_ALPHA_B8 asm("H5T_STD_B8LE_g");
extern hid_t H5T_ALPHA_B16 asm("H5T_STD_B16LE_g");
extern hid_t H5T_ALPHA_B32 asm("H5T_STD_B32LE_g");
extern hid_t H5T_ALPHA_B64 asm("H5T_STD_B64LE_g");
extern hid_t H5T_ALPHA_F32 asm("H5T_IEEE_F32LE_g");
extern hid_t H5T_ALPHA_F64 asm("H5T_IEEE_F64LE_g");

extern hid_t H5T_MIPS_I8 asm("H5T_STD_I8BE_g");
extern hid_t H5T_MIPS_I16 asm("H5T_STD_I16BE_g");
extern hid_t H5T_MIPS_I32 asm("H5T_STD_I32BE_g");
extern hid_t H5T_MIPS_I64 asm("H5T_STD_I64BE_g");
extern hid_t H5T_MIPS_U8 asm("H5T_STD_U8BE_g");
extern hid_t H5T_MIPS_U16 asm("H5T_STD_U16BE_g");
extern hid_t H5T_MIPS_U32 asm("H5T_STD_U32BE_g");
extern hid_t H5T_MIPS_U64 asm("H5T_STD_U64BE_g");
extern hid_t H5T_MIPS_B8 asm("H5T_STD_B8BE_g");
extern hid_t H5T_MIPS_B16 asm("H5T_STD_B16BE_g");
extern hid_t H5T_MIPS_B32 asm("H5T_STD_B32BE_g");
extern hid_t H5T_MIPS_B64 asm("H5T_STD_B64BE_g");
extern hid_t H5T_MIPS_F32 asm("H5T_IEEE_F32BE_g");
extern hid_t H5T_MIPS_F64 asm("H5T_IEEE_F64BE_g");

extern hid_t H5T_VAX_F32 asm("H5T_VAX_F32_g");
extern hid_t H5T_VAX_F64 asm("H5T_VAX_F64_g");

extern hid_t H5T_NATIVE_CHAR asm("H5T_NATIVE_SCHAR_g");

extern hid_t H5T_NATIVE_SCHAR asm("H5T_NATIVE_SCHAR_g");
extern hid_t H5T_NATIVE_UCHAR asm("H5T_NATIVE_UCHAR_g");
extern hid_t H5T_NATIVE_SHORT asm("H5T_NATIVE_SHORT_g");
extern hid_t H5T_NATIVE_USHORT asm("H5T_NATIVE_USHORT_g");
extern hid_t H5T_NATIVE_INT asm("H5T_NATIVE_INT_g");
extern hid_t H5T_NATIVE_UINT asm("H5T_NATIVE_UINT_g");
extern hid_t H5T_NATIVE_LONG asm("H5T_NATIVE_LONG_g");
extern hid_t H5T_NATIVE_ULONG asm("H5T_NATIVE_ULONG_g");
extern hid_t H5T_NATIVE_LLONG asm("H5T_NATIVE_LLONG_g");
extern hid_t H5T_NATIVE_ULLONG asm("H5T_NATIVE_ULLONG_g");
extern hid_t H5T_NATIVE_FLOAT asm("H5T_NATIVE_FLOAT_g");
extern hid_t H5T_NATIVE_DOUBLE asm("H5T_NATIVE_DOUBLE_g");
extern hid_t H5T_NATIVE_LDOUBLE asm("H5T_NATIVE_LDOUBLE_g");
extern hid_t H5T_NATIVE_B8 asm("H5T_NATIVE_B8_g");
extern hid_t H5T_NATIVE_B16 asm("H5T_NATIVE_B16_g");
extern hid_t H5T_NATIVE_B32 asm("H5T_NATIVE_B32_g");
extern hid_t H5T_NATIVE_B64 asm("H5T_NATIVE_B64_g");
extern hid_t H5T_NATIVE_OPAQUE asm("H5T_NATIVE_OPAQUE_g");
extern hid_t H5T_NATIVE_HADDR asm("H5T_NATIVE_HADDR_g");
extern hid_t H5T_NATIVE_HSIZE asm("H5T_NATIVE_HSIZE_g");
extern hid_t H5T_NATIVE_HSSIZE asm("H5T_NATIVE_HSSIZE_g");
extern hid_t H5T_NATIVE_HERR asm("H5T_NATIVE_HERR_g");
extern hid_t H5T_NATIVE_HBOOL asm("H5T_NATIVE_HBOOL_g");

extern hid_t H5T_NATIVE_INT8 asm("H5T_NATIVE_INT8_g");
extern hid_t H5T_NATIVE_UINT8 asm("H5T_NATIVE_UINT8_g");
extern hid_t H5T_NATIVE_INT_LEAST8 asm("H5T_NATIVE_INT_LEAST8_g");
extern hid_t H5T_NATIVE_UINT_LEAST8 asm("H5T_NATIVE_UINT_LEAST8_g");
extern hid_t H5T_NATIVE_INT_FAST8 asm("H5T_NATIVE_INT_FAST8_g");
extern hid_t H5T_NATIVE_UINT_FAST8 asm("H5T_NATIVE_UINT_FAST8_g");

extern hid_t H5T_NATIVE_INT16 asm("H5T_NATIVE_INT16_g");
extern hid_t H5T_NATIVE_UINT16 asm("H5T_NATIVE_UINT16_g");
extern hid_t H5T_NATIVE_INT_LEAST16 asm("H5T_NATIVE_INT_LEAST16_g");
extern hid_t H5T_NATIVE_UINT_LEAST16 asm("H5T_NATIVE_UINT_LEAST16_g");
extern hid_t H5T_NATIVE_INT_FAST16 asm("H5T_NATIVE_INT_FAST16_g");
extern hid_t H5T_NATIVE_UINT_FAST16 asm("H5T_NATIVE_UINT_FAST16_g");

extern hid_t H5T_NATIVE_INT32 asm("H5T_NATIVE_INT32_g");
extern hid_t H5T_NATIVE_UINT32 asm("H5T_NATIVE_UINT32_g");
extern hid_t H5T_NATIVE_INT_LEAST32 asm("H5T_NATIVE_INT_LEAST32_g");
extern hid_t H5T_NATIVE_UINT_LEAST32 asm("H5T_NATIVE_UINT_LEAST32_g");
extern hid_t H5T_NATIVE_INT_FAST32 asm("H5T_NATIVE_INT_FAST32_g");
extern hid_t H5T_NATIVE_UINT_FAST32 asm("H5T_NATIVE_UINT_FAST32_g");

extern hid_t H5T_NATIVE_INT64 asm("H5T_NATIVE_INT64_g");
extern hid_t H5T_NATIVE_UINT64 asm("H5T_NATIVE_UINT64_g");
extern hid_t H5T_NATIVE_INT_LEAST64 asm("H5T_NATIVE_INT_LEAST64_g");
extern hid_t H5T_NATIVE_UINT_LEAST64 asm("H5T_NATIVE_UINT_LEAST64_g");
extern hid_t H5T_NATIVE_INT_FAST64 asm("H5T_NATIVE_INT_FAST64_g");
extern hid_t H5T_NATIVE_UINT_FAST64 asm("H5T_NATIVE_UINT_FAST64_g");

typedef herr_t (*H5T_conv_t)(hid_t, hid_t, H5T_cdata_t *, size_t, size_t, 
size_t, void *, void *, hid_t);
typedef H5T_conv_ret_t (*H5T_conv_except_func_t)(H5T_conv_except_t, hid_t, 
hid_t, void *, void *, void *);

hid_t H5Tcreate(H5T_class_t, size_t);
hid_t H5Tcopy(hid_t);
herr_t H5Tclose(hid_t);
htri_t H5Tequal(hid_t, hid_t);
herr_t H5Tlock(hid_t);
herr_t H5Tcommit(hid_t, const char *, hid_t, hid_t, hid_t, hid_t) 
asm("H5Tcommit2");
hid_t H5Topen(hid_t, const char *, hid_t) asm("H5Topen2");
herr_t H5Tcommit_anon(hid_t, hid_t, hid_t, hid_t);
hid_t H5Tget_create_plist(hid_t);
htri_t H5Tcommitted(hid_t);
herr_t H5Tencode(hid_t, void *, size_t *);
hid_t H5Tdecode(const void *);

herr_t H5Tinsert(hid_t, const char *, size_t, hid_t);
herr_t H5Tpack(hid_t);

hid_t H5Tenum_create(hid_t);
herr_t H5Tenum_insert(hid_t, const char *, const void *);
herr_t H5Tenum_nameof(hid_t, const void *, char *, size_t);
herr_t H5Tenum_valueof(hid_t, const char *, void *);

hid_t H5Tvlen_create(hid_t);

hid_t H5Tarray_create(hid_t, unsigned int, const hsize_t *) 
asm("H5Tarray_create2");
int H5Tget_array_ndims(hid_t);
int H5Tget_array_dims(hid_t, hsize_t *) asm("H5Tget_array_dims2");

herr_t H5Tset_tag(hid_t, const char *);
char *H5Tget_tag(hid_t);

hid_t H5Tget_super(hid_t);
H5T_class_t H5Tget_class(hid_t);
htri_t H5Tdetect_class(hid_t, H5T_class_t);
size_t H5Tget_size(hid_t);
H5T_order_t H5Tget_order(hid_t);
size_t H5Tget_precision(hid_t);
int H5Tget_offset(hid_t);
herr_t H5Tget_pad(hid_t, H5T_pad_t *, H5T_pad_t *);
H5T_sign_t H5Tget_sign(hid_t);
herr_t H5Tget_fields(hid_t, size_t *, size_t *, size_t *, size_t *, size_t *);
size_t H5Tget_ebias(hid_t);
H5T_norm_t H5Tget_norm(hid_t);
H5T_pad_t H5Tget_inpad(hid_t);
H5T_str_t H5Tget_strpad(hid_t);
int H5Tget_nmembers(hid_t);
char *H5Tget_member_name(hid_t, unsigned int);
int H5Tget_member_index(hid_t, const char *);
size_t H5Tget_member_offset(hid_t, unsigned int);
H5T_class_t H5Tget_member_class(hid_t, unsigned int);
hid_t H5Tget_member_type(hid_t, unsigned int);
herr_t H5Tget_member_value(hid_t, unsigned int, void *);
H5T_cset_t H5Tget_cset(hid_t);
htri_t H5Tis_variable_str(hid_t);
hid_t H5Tget_native_type(hid_t, H5T_direction_t);

herr_t H5Tset_size(hid_t, size_t);
herr_t H5Tset_order(hid_t, H5T_order_t);
herr_t H5Tset_precision(hid_t, size_t);
herr_t H5Tset_offset(hid_t, size_t);
herr_t H5Tset_pad(hid_t, H5T_pad_t, H5T_pad_t);
herr_t H5Tset_sign(hid_t, H5T_sign_t);
herr_t H5Tset_fields(hid_t, size_t, size_t, size_t, size_t, size_t);
herr_t H5Tset_ebias(hid_t, size_t);
herr_t H5Tset_norm(hid_t, H5T_norm_t);
herr_t H5Tset_inpad(hid_t, H5T_pad_t);
herr_t H5Tset_cset(hid_t, H5T_cset_t);
herr_t H5Tset_strpad(hid_t, H5T_str_t);

herr_t H5Tregister(H5T_pers_t, const char *, hid_t, hid_t, H5T_conv_t);
herr_t H5Tunregister(H5T_pers_t, const char *, hid_t, hid_t, H5T_conv_t);
H5T_conv_t H5Tfind(hid_t, hid_t, H5T_cdata_t **);
htri_t H5Tcompiler_conv(hid_t, hid_t);
herr_t H5Tconvert(hid_t, hid_t, size_t, void *, void *, hid_t);

static const int H5L_SAME_LOC = 0;
static const int H5L_LINK_CLASS_T_VERS = 0;

typedef enum H5L_type_t {
  H5L_TYPE_ERROR = -1,
  H5L_TYPE_HARD = 0,
  H5L_TYPE_SOFT = 1,
  H5L_TYPE_EXTERNAL = 64,
  H5L_TYPE_MAX = 255,
} H5L_type_t;

static const int H5L_TYPE_UD_MIN = 64;

typedef struct H5L_info_t {
  H5L_type_t type;
  hbool_t corder_valid;
  int64_t corder;
  H5T_cset_t cset;
  union {
    haddr_t address;
    size_t val_size;
  } u;
} H5L_info_t;

typedef herr_t (*H5L_create_func_t)(const char *, hid_t, const void *, size_t, 
hid_t);
typedef herr_t (*H5L_move_func_t)(const char *, hid_t, const void *, size_t);
typedef herr_t (*H5L_copy_func_t)(const char *, hid_t, const void *, size_t);
typedef herr_t (*H5L_traverse_func_t)(const char *, hid_t, const void *, 
size_t, hid_t);
typedef herr_t (*H5L_delete_func_t)(const char *, hid_t, const void *, size_t);
typedef ssize_t (*H5L_query_func_t)(const char *, const void *, size_t, void *, 
size_t);

typedef struct H5L_class_t {
  int version;
  H5L_type_t id;
  const char *comment;
  H5L_create_func_t create_func;
  H5L_move_func_t move_func;
  H5L_copy_func_t copy_func;
  H5L_traverse_func_t trav_func;
  H5L_delete_func_t del_func;
  H5L_query_func_t query_func;
} H5L_class_t;

typedef herr_t (*H5L_iterate_t)(hid_t, const char *, const H5L_info_t *, void 
*);

typedef herr_t (*H5L_elink_traverse_t)(const char *, const char *, const char 
*, const char *, unsigned int *, hid_t, void *);

herr_t H5Lmove(hid_t, const char *, hid_t, const char *, hid_t, hid_t);
herr_t H5Lcopy(hid_t, const char *, hid_t, const char *, hid_t, hid_t);
herr_t H5Lcreate_hard(hid_t, const char *, hid_t, const char *, hid_t, hid_t);
herr_t H5Lcreate_soft(const char *, hid_t, const char *, hid_t, hid_t);
herr_t H5Ldelete(hid_t, const char *, hid_t);
herr_t H5Ldelete_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, hid_t);
herr_t H5Lget_val(hid_t, const char *, void *, size_t, hid_t);
herr_t H5Lget_val_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, void *, size_t, hid_t);
htri_t H5Lexists(hid_t, const char *, hid_t);
herr_t H5Lget_info(hid_t, const char *, H5L_info_t *, hid_t);
herr_t H5Lget_info_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, H5L_info_t *, hid_t);
ssize_t H5Lget_name_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, char *, size_t, hid_t);
herr_t H5Literate(hid_t, H5_index_t, H5_iter_order_t, hsize_t *, H5L_iterate_t, 
void *);
herr_t H5Literate_by_name(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t *, H5L_iterate_t, void *, hid_t);
herr_t H5Lvisit(hid_t, H5_index_t, H5_iter_order_t, H5L_iterate_t, void *);
herr_t H5Lvisit_by_name(hid_t, const char *, H5_index_t, H5_iter_order_t, 
H5L_iterate_t, void *, hid_t);

herr_t H5Lcreate_ud(hid_t, const char *, H5L_type_t, const void *, size_t, 
hid_t, hid_t);
herr_t H5Lregister(const H5L_class_t *);
herr_t H5Lunregister(H5L_type_t);
htri_t H5Lis_registered(H5L_type_t);

herr_t H5Lunpack_elink_val(const void *, size_t, unsigned int *, const char **, 
const char **);
herr_t H5Lcreate_external(const char *, const char *, hid_t, const char *, 
hid_t, hid_t);

static const int H5O_COPY_SHALLOW_HIERARCHY_FLAG = 1;
static const int H5O_COPY_EXPAND_SOFT_LINK_FLAG = 2;
static const int H5O_COPY_EXPAND_EXT_LINK_FLAG = 4;
static const int H5O_COPY_EXPAND_REFERENCE_FLAG = 8;
static const int H5O_COPY_WITHOUT_ATTR_FLAG = 16;
static const int H5O_COPY_PRESERVE_NULL_FLAG = 32;

static const int H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG = 64;

static const int H5O_COPY_ALL = 127;

static const int H5O_SHMESG_NONE_FLAG = 0;
static const int H5O_SHMESG_SDSPACE_FLAG = 2;
static const int H5O_SHMESG_DTYPE_FLAG = 8;
static const int H5O_SHMESG_FILL_FLAG = 32;
static const int H5O_SHMESG_PLINE_FLAG = 2048;
static const int H5O_SHMESG_ATTR_FLAG = 4096;
static const int H5O_SHMESG_ALL_FLAG = 6186;

static const int H5O_HDR_CHUNK0_SIZE = 3;
static const int H5O_HDR_ATTR_CRT_ORDER_TRACKED = 4;
static const int H5O_HDR_ATTR_CRT_ORDER_INDEXED = 8;
static const int H5O_HDR_ATTR_STORE_PHASE_CHANGE = 16;
static const int H5O_HDR_STORE_TIMES = 32;
static const int H5O_HDR_ALL_FLAGS = 63;

static const int H5O_SHMESG_MAX_NINDEXES = 8;
static const int H5O_SHMESG_MAX_LIST_SIZE = 5000;

typedef enum H5O_type_t {
  H5O_TYPE_UNKNOWN = -1,
  H5O_TYPE_GROUP = 0,
  H5O_TYPE_DATASET = 1,
  H5O_TYPE_NAMED_DATATYPE = 2,
  H5O_TYPE_NTYPES = 3,
} H5O_type_t;

typedef struct H5O_hdr_info_t {
  unsigned int version;
  unsigned int nmesgs;
  unsigned int nchunks;
  unsigned int flags;
  struct {
    hsize_t total;
    hsize_t meta;
    hsize_t mesg;
    hsize_t free;
  } space;
  struct {
    uint64_t present;
    uint64_t shared;
  } mesg;
} H5O_hdr_info_t;

typedef struct H5O_info_t {
  long unsigned int fileno;
  haddr_t addr;
  H5O_type_t type;
  unsigned int rc;
  time_t atime;
  time_t mtime;
  time_t ctime;
  time_t btime;
  hsize_t num_attrs;
  H5O_hdr_info_t hdr;
  struct {
    H5_ih_info_t obj;
    H5_ih_info_t attr;
  } meta_size;
} H5O_info_t;

typedef unsigned int H5O_msg_crt_idx_t;

typedef herr_t (*H5O_iterate_t)(hid_t, const char *, const H5O_info_t *, void 
*);

typedef enum H5O_mcdt_search_ret_t {
  H5O_MCDT_SEARCH_ERROR = -1,
  H5O_MCDT_SEARCH_CONT = 0,
  H5O_MCDT_SEARCH_STOP = 1,
} H5O_mcdt_search_ret_t;

typedef H5O_mcdt_search_ret_t (*H5O_mcdt_search_cb_t)(void *);

hid_t H5Oopen(hid_t, const char *, hid_t);
hid_t H5Oopen_by_addr(hid_t, haddr_t);
hid_t H5Oopen_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, hsize_t, 
hid_t);

htri_t H5Oexists_by_name(hid_t, const char *, hid_t);

herr_t H5Oget_info(hid_t, H5O_info_t *);
herr_t H5Oget_info_by_name(hid_t, const char *, H5O_info_t *, hid_t);
herr_t H5Oget_info_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, H5O_info_t *, hid_t);
herr_t H5Olink(hid_t, hid_t, const char *, hid_t, hid_t);
herr_t H5Oincr_refcount(hid_t);
herr_t H5Odecr_refcount(hid_t);
herr_t H5Ocopy(hid_t, const char *, hid_t, const char *, hid_t, hid_t);
herr_t H5Oset_comment(hid_t, const char *);
herr_t H5Oset_comment_by_name(hid_t, const char *, const char *, hid_t);
ssize_t H5Oget_comment(hid_t, char *, size_t);
ssize_t H5Oget_comment_by_name(hid_t, const char *, char *, size_t, hid_t);
herr_t H5Ovisit(hid_t, H5_index_t, H5_iter_order_t, H5O_iterate_t, void *);
herr_t H5Ovisit_by_name(hid_t, const char *, H5_index_t, H5_iter_order_t, 
H5O_iterate_t, void *, hid_t);
herr_t H5Oclose(hid_t);

typedef enum H5G_storage_type_t {
  H5G_STORAGE_TYPE_UNKNOWN = -1,
  H5G_STORAGE_TYPE_SYMBOL_TABLE = 0,
  H5G_STORAGE_TYPE_COMPACT = 1,
  H5G_STORAGE_TYPE_DENSE = 2,
} H5G_storage_type_t;

typedef struct H5G_info_t {
  H5G_storage_type_t storage_type;
  hsize_t nlinks;
  int64_t max_corder;
  hbool_t mounted;
} H5G_info_t;

hid_t H5Gcreate(hid_t, const char *, hid_t, hid_t, hid_t) asm("H5Gcreate2");
hid_t H5Gcreate_anon(hid_t, hid_t, hid_t);
hid_t H5Gopen(hid_t, const char *, hid_t) asm("H5Gopen2");
hid_t H5Gget_create_plist(hid_t);
herr_t H5Gget_info(hid_t, H5G_info_t *);
herr_t H5Gget_info_by_name(hid_t, const char *, H5G_info_t *, hid_t);
herr_t H5Gget_info_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, H5G_info_t *, hid_t);
herr_t H5Gclose(hid_t);

typedef struct H5A_info_t {
  hbool_t corder_valid;
  H5O_msg_crt_idx_t corder;
  H5T_cset_t cset;
  hsize_t data_size;
} H5A_info_t;

typedef herr_t (*H5A_operator_t)(hid_t, const char *, const H5A_info_t *, void 
*);

hid_t H5Acreate(hid_t, const char *, hid_t, hid_t, hid_t, hid_t) 
asm("H5Acreate2");
hid_t H5Acreate_by_name(hid_t, const char *, const char *, hid_t, hid_t, hid_t, 
hid_t, hid_t);
hid_t H5Aopen(hid_t, const char *, hid_t);
hid_t H5Aopen_by_name(hid_t, const char *, const char *, hid_t, hid_t);
hid_t H5Aopen_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, hsize_t, 
hid_t, hid_t);
herr_t H5Awrite(hid_t, hid_t, const void *);
herr_t H5Aread(hid_t, hid_t, void *);
herr_t H5Aclose(hid_t);
hid_t H5Aget_space(hid_t);
hid_t H5Aget_type(hid_t);
hid_t H5Aget_create_plist(hid_t);
ssize_t H5Aget_name(hid_t, size_t, char *);
ssize_t H5Aget_name_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, char *, size_t, hid_t);
hsize_t H5Aget_storage_size(hid_t);
herr_t H5Aget_info(hid_t, H5A_info_t *);
herr_t H5Aget_info_by_name(hid_t, const char *, const char *, H5A_info_t *, 
hid_t);
herr_t H5Aget_info_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, H5A_info_t *, hid_t);
herr_t H5Arename(hid_t, const char *, const char *);
herr_t H5Arename_by_name(hid_t, const char *, const char *, const char *, 
hid_t);
herr_t H5Aiterate(hid_t, H5_index_t, H5_iter_order_t, hsize_t *, 
H5A_operator2_t, void *) asm("H5Aiterate2");
herr_t H5Aiterate_by_name(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t *, H5A_operator2_t, void *, hid_t);
herr_t H5Adelete(hid_t, const char *);
herr_t H5Adelete_by_name(hid_t, const char *, const char *, hid_t);
herr_t H5Adelete_by_idx(hid_t, const char *, H5_index_t, H5_iter_order_t, 
hsize_t, hid_t);
htri_t H5Aexists(hid_t, const char *);
htri_t H5Aexists_by_name(hid_t, const char *, const char *, hid_t);

static const int H5D_CHUNK_CACHE_NSLOTS_DEFAULT = -1;
static const int H5D_CHUNK_CACHE_NBYTES_DEFAULT = -1;
static const int H5D_CHUNK_CACHE_W0_DEFAULT = -1;

typedef enum H5D_layout_t {
  H5D_LAYOUT_ERROR = -1,
  H5D_COMPACT = 0,
  H5D_CONTIGUOUS = 1,
  H5D_CHUNKED = 2,
  H5D_NLAYOUTS = 3,
} H5D_layout_t;

typedef enum H5D_chunk_index_t {
  H5D_CHUNK_BTREE = 0,
} H5D_chunk_index_t;

typedef enum H5D_alloc_time_t {
  H5D_ALLOC_TIME_ERROR = -1,
  H5D_ALLOC_TIME_DEFAULT = 0,
  H5D_ALLOC_TIME_EARLY = 1,
  H5D_ALLOC_TIME_LATE = 2,
  H5D_ALLOC_TIME_INCR = 3,
} H5D_alloc_time_t;

typedef enum H5D_space_status_t {
  H5D_SPACE_STATUS_ERROR = -1,
  H5D_SPACE_STATUS_NOT_ALLOCATED = 0,
  H5D_SPACE_STATUS_PART_ALLOCATED = 1,
  H5D_SPACE_STATUS_ALLOCATED = 2,
} H5D_space_status_t;

typedef enum H5D_fill_time_t {
  H5D_FILL_TIME_ERROR = -1,
  H5D_FILL_TIME_ALLOC = 0,
  H5D_FILL_TIME_NEVER = 1,
  H5D_FILL_TIME_IFSET = 2,
} H5D_fill_time_t;

typedef enum H5D_fill_value_t {
  H5D_FILL_VALUE_ERROR = -1,
  H5D_FILL_VALUE_UNDEFINED = 0,
  H5D_FILL_VALUE_DEFAULT = 1,
  H5D_FILL_VALUE_USER_DEFINED = 2,
} H5D_fill_value_t;

typedef herr_t (*H5D_operator_t)(void *, hid_t, unsigned int, const hsize_t *, 
void *);

hid_t H5Dcreate(hid_t, const char *, hid_t, hid_t, hid_t, hid_t, hid_t) 
asm("H5Dcreate2");
hid_t H5Dcreate_anon(hid_t, hid_t, hid_t, hid_t, hid_t);
hid_t H5Dopen(hid_t, const char *, hid_t) asm("H5Dopen2");
herr_t H5Dclose(hid_t);
hid_t H5Dget_space(hid_t);
herr_t H5Dget_space_status(hid_t, H5D_space_status_t *);
hid_t H5Dget_type(hid_t);
hid_t H5Dget_create_plist(hid_t);
hid_t H5Dget_access_plist(hid_t);
hsize_t H5Dget_storage_size(hid_t);
haddr_t H5Dget_offset(hid_t);
herr_t H5Dread(hid_t, hid_t, hid_t, hid_t, hid_t, void *);
herr_t H5Dwrite(hid_t, hid_t, hid_t, hid_t, hid_t, const void *);
herr_t H5Diterate(void *, hid_t, hid_t, H5D_operator_t, void *);
herr_t H5Dvlen_reclaim(hid_t, hid_t, hid_t, void *);
herr_t H5Dvlen_get_buf_size(hid_t, hid_t, hid_t, hsize_t *);
herr_t H5Dfill(const void *, hid_t, void *, hid_t, hid_t);
herr_t H5Dset_extent(hid_t, const hsize_t *);
herr_t H5Ddebug(hid_t);

typedef enum H5R_type_t {
  H5R_BADTYPE = -1,
  H5R_OBJECT = 0,
  H5R_DATASET_REGION = 1,
  H5R_MAXTYPE = 2,
} H5R_type_t;

static const int H5R_OBJ_REF_BUF_SIZE = 8;
typedef long unsigned int hobj_ref_t;

static const int H5R_DSET_REG_REF_BUF_SIZE = 12;
typedef unsigned char hdset_reg_ref_t[12];

herr_t H5Rcreate(void *, hid_t, const char *, H5R_type_t, hid_t);
hid_t H5Rdereference(hid_t, H5R_type_t, const void *);
hid_t H5Rget_region(hid_t, H5R_type_t, const void *);
herr_t H5Rget_obj_type(hid_t, H5R_type_t, const void *, H5O_type_t *) 
asm("H5Rget_obj_type2");
ssize_t H5Rget_name(hid_t, H5R_type_t, const void *, char *, size_t);

typedef int H5Z_filter_t;

static const int H5Z_FILTER_ERROR = -1;
static const int H5Z_FILTER_NONE = 0;
static const int H5Z_FILTER_DEFLATE = 1;
static const int H5Z_FILTER_SHUFFLE = 2;
static const int H5Z_FILTER_FLETCHER32 = 3;
static const int H5Z_FILTER_SZIP = 4;
static const int H5Z_FILTER_NBIT = 5;
static const int H5Z_FILTER_SCALEOFFSET = 6;
static const int H5Z_FILTER_RESERVED = 256;
static const int H5Z_FILTER_MAX = 65535;

static const int H5Z_FILTER_ALL = 0;
static const int H5Z_MAX_NFILTERS = 32;

static const int H5Z_FLAG_DEFMASK = 255;
static const int H5Z_FLAG_MANDATORY = 0;
static const int H5Z_FLAG_OPTIONAL = 1;

static const int H5Z_FLAG_INVMASK = 65280;
static const int H5Z_FLAG_REVERSE = 256;
static const int H5Z_FLAG_SKIP_EDC = 512;

static const int H5_SZIP_ALLOW_K13_OPTION_MASK = 1;
static const int H5_SZIP_CHIP_OPTION_MASK = 2;
static const int H5_SZIP_EC_OPTION_MASK = 4;
static const int H5_SZIP_NN_OPTION_MASK = 32;
static const int H5_SZIP_MAX_PIXELS_PER_BLOCK = 32;

static const int H5Z_SHUFFLE_USER_NPARMS = 0;
static const int H5Z_SHUFFLE_TOTAL_NPARMS = 1;

static const int H5Z_SZIP_USER_NPARMS = 2;
static const int H5Z_SZIP_TOTAL_NPARMS = 4;
static const int H5Z_SZIP_PARM_MASK = 0;
static const int H5Z_SZIP_PARM_PPB = 1;
static const int H5Z_SZIP_PARM_BPP = 2;
static const int H5Z_SZIP_PARM_PPS = 3;

static const int H5Z_NBIT_USER_NPARMS = 0;

static const int H5Z_SCALEOFFSET_USER_NPARMS = 2;

static const int H5Z_SO_INT_MINBITS_DEFAULT = 0;
typedef enum H5Z_SO_scale_type_t {
  H5Z_SO_FLOAT_DSCALE = 0,
  H5Z_SO_FLOAT_ESCALE = 1,
  H5Z_SO_INT = 2,
} H5Z_SO_scale_type_t;

static const int H5Z_CLASS_T_VERS = 1;

typedef enum H5Z_EDC_t {
  H5Z_ERROR_EDC = -1,
  H5Z_DISABLE_EDC = 0,
  H5Z_ENABLE_EDC = 1,
  H5Z_NO_EDC = 2,
} H5Z_EDC_t;

static const int H5Z_FILTER_CONFIG_ENCODE_ENABLED = 1;
static const int H5Z_FILTER_CONFIG_DECODE_ENABLED = 2;

typedef enum H5Z_cb_return_t {
  H5Z_CB_ERROR = -1,
  H5Z_CB_FAIL = 0,
  H5Z_CB_CONT = 1,
  H5Z_CB_NO = 2,
} H5Z_cb_return_t;

typedef H5Z_cb_return_t (*H5Z_filter_func_t)(H5Z_filter_t, void *, size_t, void 
*);

typedef struct H5Z_cb_t {
  H5Z_filter_func_t func;
  void *op_data;
} H5Z_cb_t;

typedef htri_t (*H5Z_can_apply_func_t)(hid_t, hid_t, hid_t);

typedef herr_t (*H5Z_set_local_func_t)(hid_t, hid_t, hid_t);

typedef size_t (*H5Z_func_t)(unsigned int, size_t, const unsigned int *, 
size_t, size_t *, void **);

typedef struct H5Z_class_t {
  int version;
  H5Z_filter_t id;
  unsigned int encoder_present;
  unsigned int decoder_present;
  const char *name;
  H5Z_can_apply_func_t can_apply;
  H5Z_set_local_func_t set_local;
  H5Z_func_t filter;
} H5Z_class_t;

herr_t H5Zregister(const void *);
herr_t H5Zunregister(H5Z_filter_t);
htri_t H5Zfilter_avail(H5Z_filter_t);
herr_t H5Zget_filter_info(H5Z_filter_t, unsigned int *);

extern hid_t H5P_ROOT asm("H5P_CLS_ROOT_g");
extern hid_t H5P_OBJECT_CREATE asm("H5P_CLS_OBJECT_CREATE_g");
extern hid_t H5P_FILE_CREATE asm("H5P_CLS_FILE_CREATE_g");
extern hid_t H5P_FILE_ACCESS asm("H5P_CLS_FILE_ACCESS_g");
extern hid_t H5P_DATASET_CREATE asm("H5P_CLS_DATASET_CREATE_g");
extern hid_t H5P_DATASET_ACCESS asm("H5P_CLS_DATASET_ACCESS_g");
extern hid_t H5P_DATASET_XFER asm("H5P_CLS_DATASET_XFER_g");
extern hid_t H5P_FILE_MOUNT asm("H5P_CLS_FILE_MOUNT_g");
extern hid_t H5P_GROUP_CREATE asm("H5P_CLS_GROUP_CREATE_g");
extern hid_t H5P_GROUP_ACCESS asm("H5P_CLS_GROUP_ACCESS_g");
extern hid_t H5P_DATATYPE_CREATE asm("H5P_CLS_DATATYPE_CREATE_g");
extern hid_t H5P_DATATYPE_ACCESS asm("H5P_CLS_DATATYPE_ACCESS_g");
extern hid_t H5P_STRING_CREATE asm("H5P_CLS_STRING_CREATE_g");
extern hid_t H5P_ATTRIBUTE_CREATE asm("H5P_CLS_ATTRIBUTE_CREATE_g");
extern hid_t H5P_OBJECT_COPY asm("H5P_CLS_OBJECT_COPY_g");
extern hid_t H5P_LINK_CREATE asm("H5P_CLS_LINK_CREATE_g");
extern hid_t H5P_LINK_ACCESS asm("H5P_CLS_LINK_ACCESS_g");

extern hid_t H5P_FILE_CREATE_DEFAULT asm("H5P_LST_FILE_CREATE_g");
extern hid_t H5P_FILE_ACCESS_DEFAULT asm("H5P_LST_FILE_ACCESS_g");
extern hid_t H5P_DATASET_CREATE_DEFAULT asm("H5P_LST_DATASET_CREATE_g");
extern hid_t H5P_DATASET_ACCESS_DEFAULT asm("H5P_LST_DATASET_ACCESS_g");
extern hid_t H5P_DATASET_XFER_DEFAULT asm("H5P_LST_DATASET_XFER_g");
extern hid_t H5P_FILE_MOUNT_DEFAULT asm("H5P_LST_FILE_MOUNT_g");
extern hid_t H5P_GROUP_CREATE_DEFAULT asm("H5P_LST_GROUP_CREATE_g");
extern hid_t H5P_GROUP_ACCESS_DEFAULT asm("H5P_LST_GROUP_ACCESS_g");
extern hid_t H5P_DATATYPE_CREATE_DEFAULT asm("H5P_LST_DATATYPE_CREATE_g");
extern hid_t H5P_DATATYPE_ACCESS_DEFAULT asm("H5P_LST_DATATYPE_ACCESS_g");
extern hid_t H5P_ATTRIBUTE_CREATE_DEFAULT asm("H5P_LST_ATTRIBUTE_CREATE_g");
extern hid_t H5P_OBJECT_COPY_DEFAULT asm("H5P_LST_OBJECT_COPY_g");
extern hid_t H5P_LINK_CREATE_DEFAULT asm("H5P_LST_LINK_CREATE_g");
extern hid_t H5P_LINK_ACCESS_DEFAULT asm("H5P_LST_LINK_ACCESS_g");

static const int H5P_CRT_ORDER_TRACKED = 1;
static const int H5P_CRT_ORDER_INDEXED = 2;

typedef herr_t (*H5P_cls_create_func_t)(hid_t, void *);
typedef herr_t (*H5P_cls_copy_func_t)(hid_t, hid_t, void *);
typedef herr_t (*H5P_cls_close_func_t)(hid_t, void *);

typedef herr_t (*H5P_prp_cb1_t)(const char *, size_t, void *);
typedef herr_t (*H5P_prp_cb2_t)(hid_t, const char *, size_t, void *);
typedef herr_t (*H5P_prp_create_func_t)(const char *, size_t, void *);
typedef herr_t (*H5P_prp_set_func_t)(hid_t, const char *, size_t, void *);
typedef herr_t (*H5P_prp_get_func_t)(hid_t, const char *, size_t, void *);
typedef herr_t (*H5P_prp_delete_func_t)(hid_t, const char *, size_t, void *);
typedef herr_t (*H5P_prp_copy_func_t)(const char *, size_t, void *);
typedef int (*H5P_prp_compare_func_t)(const void *, const void *, size_t);
typedef herr_t (*H5P_prp_close_func_t)(const char *, size_t, void *);

typedef herr_t (*H5P_iterate_t)(hid_t, const char *, void *);

typedef enum H5D_mpio_actual_chunk_opt_mode_t {
  H5D_MPIO_NO_CHUNK_OPTIMIZATION = 0,
  H5D_MPIO_LINK_CHUNK = 1,
  H5D_MPIO_MULTI_CHUNK = 2,
  H5D_MPIO_MULTI_CHUNK_NO_OPT = 3,
} H5D_mpio_actual_chunk_opt_mode_t;

typedef enum H5D_mpio_actual_io_mode_t {
  H5D_MPIO_NO_COLLECTIVE = 0,
  H5D_MPIO_CHUNK_INDEPENDENT = 1,
  H5D_MPIO_CHUNK_COLLECTIVE = 2,
  H5D_MPIO_CHUNK_MIXED = 3,
  H5D_MPIO_CONTIGUOUS_COLLECTIVE = 4,
} H5D_mpio_actual_io_mode_t;

hid_t H5Pcreate_class(hid_t, const char *, H5P_cls_create_func_t, void *, 
H5P_cls_copy_func_t, void *, H5P_cls_close_func_t, void *);
char *H5Pget_class_name(hid_t);
hid_t H5Pcreate(hid_t);
herr_t H5Pregister(hid_t, const char *, size_t, void *, H5P_prp_create_func_t, 
H5P_prp_set_func_t, H5P_prp_get_func_t, H5P_prp_delete_func_t, 
H5P_prp_copy_func_t, H5P_prp_compare_func_t, H5P_prp_close_func_t) 
asm("H5Pregister2");
herr_t H5Pinsert(hid_t, const char *, size_t, void *, H5P_prp_set_func_t, 
H5P_prp_get_func_t, H5P_prp_delete_func_t, H5P_prp_copy_func_t, 
H5P_prp_compare_func_t, H5P_prp_close_func_t) asm("H5Pinsert2");
herr_t H5Pset(hid_t, const char *, void *);
htri_t H5Pexist(hid_t, const char *);
herr_t H5Pget_size(hid_t, const char *, size_t *);
herr_t H5Pget_nprops(hid_t, size_t *);
hid_t H5Pget_class(hid_t);
hid_t H5Pget_class_parent(hid_t);
herr_t H5Pget(hid_t, const char *, void *);
htri_t H5Pequal(hid_t, hid_t);
htri_t H5Pisa_class(hid_t, hid_t);
int H5Piterate(hid_t, int *, H5P_iterate_t, void *);
herr_t H5Pcopy_prop(hid_t, hid_t, const char *);
herr_t H5Premove(hid_t, const char *);
herr_t H5Punregister(hid_t, const char *);
herr_t H5Pclose_class(hid_t);
herr_t H5Pclose(hid_t);
hid_t H5Pcopy(hid_t);

herr_t H5Pset_attr_phase_change(hid_t, unsigned int, unsigned int);
herr_t H5Pget_attr_phase_change(hid_t, unsigned int *, unsigned int *);
herr_t H5Pset_attr_creation_order(hid_t, unsigned int);
herr_t H5Pget_attr_creation_order(hid_t, unsigned int *);
herr_t H5Pset_obj_track_times(hid_t, hbool_t);
herr_t H5Pget_obj_track_times(hid_t, hbool_t *);
herr_t H5Pmodify_filter(hid_t, H5Z_filter_t, unsigned int, size_t, const 
unsigned int *);
herr_t H5Pset_filter(hid_t, H5Z_filter_t, unsigned int, size_t, const unsigned 
int *);
int H5Pget_nfilters(hid_t);
H5Z_filter_t H5Pget_filter(hid_t, unsigned int, unsigned int *, size_t *, 
unsigned int *, size_t, char *, unsigned int *) asm("H5Pget_filter2");
herr_t H5Pget_filter_by_id(hid_t, H5Z_filter_t, unsigned int *, size_t *, 
unsigned int *, size_t, char *, unsigned int *) asm("H5Pget_filter_by_id2");
htri_t H5Pall_filters_avail(hid_t);
herr_t H5Premove_filter(hid_t, H5Z_filter_t);
herr_t H5Pset_deflate(hid_t, unsigned int);
herr_t H5Pset_fletcher32(hid_t);

herr_t H5Pget_version(hid_t, unsigned int *, unsigned int *, unsigned int *, 
unsigned int *);
herr_t H5Pset_userblock(hid_t, hsize_t);
herr_t H5Pget_userblock(hid_t, hsize_t *);
herr_t H5Pset_sizes(hid_t, size_t, size_t);
herr_t H5Pget_sizes(hid_t, size_t *, size_t *);
herr_t H5Pset_sym_k(hid_t, unsigned int, unsigned int);
herr_t H5Pget_sym_k(hid_t, unsigned int *, unsigned int *);
herr_t H5Pset_istore_k(hid_t, unsigned int);
herr_t H5Pget_istore_k(hid_t, unsigned int *);
herr_t H5Pset_shared_mesg_nindexes(hid_t, unsigned int);
herr_t H5Pget_shared_mesg_nindexes(hid_t, unsigned int *);
herr_t H5Pset_shared_mesg_index(hid_t, unsigned int, unsigned int, unsigned 
int);
herr_t H5Pget_shared_mesg_index(hid_t, unsigned int, unsigned int *, unsigned 
int *);
herr_t H5Pset_shared_mesg_phase_change(hid_t, unsigned int, unsigned int);
herr_t H5Pget_shared_mesg_phase_change(hid_t, unsigned int *, unsigned int *);

herr_t H5Pset_alignment(hid_t, hsize_t, hsize_t);
herr_t H5Pget_alignment(hid_t, hsize_t *, hsize_t *);
herr_t H5Pset_driver(hid_t, hid_t, const void *);
hid_t H5Pget_driver(hid_t);
void *H5Pget_driver_info(hid_t);
herr_t H5Pset_family_offset(hid_t, hsize_t);
herr_t H5Pget_family_offset(hid_t, hsize_t *);
herr_t H5Pset_multi_type(hid_t, H5FD_mem_t);
herr_t H5Pget_multi_type(hid_t, H5FD_mem_t *);
herr_t H5Pset_cache(hid_t, int, size_t, size_t, double);
herr_t H5Pget_cache(hid_t, int *, size_t *, size_t *, double *);
herr_t H5Pset_mdc_config(hid_t, H5AC_cache_config_t *);
herr_t H5Pget_mdc_config(hid_t, H5AC_cache_config_t *);
herr_t H5Pset_gc_references(hid_t, unsigned int);
herr_t H5Pget_gc_references(hid_t, unsigned int *);
herr_t H5Pset_fclose_degree(hid_t, H5F_close_degree_t);
herr_t H5Pget_fclose_degree(hid_t, H5F_close_degree_t *);
herr_t H5Pset_meta_block_size(hid_t, hsize_t);
herr_t H5Pget_meta_block_size(hid_t, hsize_t *);
herr_t H5Pset_sieve_buf_size(hid_t, size_t);
herr_t H5Pget_sieve_buf_size(hid_t, size_t *);
herr_t H5Pset_small_data_block_size(hid_t, hsize_t);
herr_t H5Pget_small_data_block_size(hid_t, hsize_t *);
herr_t H5Pset_libver_bounds(hid_t, H5F_libver_t, H5F_libver_t);
herr_t H5Pget_libver_bounds(hid_t, H5F_libver_t *, H5F_libver_t *);
herr_t H5Pset_elink_file_cache_size(hid_t, unsigned int);
herr_t H5Pget_elink_file_cache_size(hid_t, unsigned int *);
herr_t H5Pset_file_image(hid_t, void *, size_t);
herr_t H5Pget_file_image(hid_t, void **, size_t *);
herr_t H5Pset_file_image_callbacks(hid_t, H5FD_file_image_callbacks_t *);
herr_t H5Pget_file_image_callbacks(hid_t, H5FD_file_image_callbacks_t *);

herr_t H5Pset_layout(hid_t, H5D_layout_t);
H5D_layout_t H5Pget_layout(hid_t);
herr_t H5Pset_chunk(hid_t, int, const hsize_t *);
int H5Pget_chunk(hid_t, int, hsize_t *);
herr_t H5Pset_external(hid_t, const char *, off_t, hsize_t);
int H5Pget_external_count(hid_t);
herr_t H5Pget_external(hid_t, unsigned int, size_t, char *, off_t *, hsize_t *);
herr_t H5Pset_szip(hid_t, unsigned int, unsigned int);
herr_t H5Pset_shuffle(hid_t);
herr_t H5Pset_nbit(hid_t);
herr_t H5Pset_scaleoffset(hid_t, H5Z_SO_scale_type_t, int);
herr_t H5Pset_fill_value(hid_t, hid_t, const void *);
herr_t H5Pget_fill_value(hid_t, hid_t, void *);
herr_t H5Pfill_value_defined(hid_t, H5D_fill_value_t *);
herr_t H5Pset_alloc_time(hid_t, H5D_alloc_time_t);
herr_t H5Pget_alloc_time(hid_t, H5D_alloc_time_t *);
herr_t H5Pset_fill_time(hid_t, H5D_fill_time_t);
herr_t H5Pget_fill_time(hid_t, H5D_fill_time_t *);

herr_t H5Pset_chunk_cache(hid_t, size_t, size_t, double);
herr_t H5Pget_chunk_cache(hid_t, size_t *, size_t *, double *);

herr_t H5Pset_data_transform(hid_t, const char *);
ssize_t H5Pget_data_transform(hid_t, char *, size_t);
herr_t H5Pset_buffer(hid_t, size_t, void *, void *);
size_t H5Pget_buffer(hid_t, void **, void **);
herr_t H5Pset_preserve(hid_t, hbool_t);
int H5Pget_preserve(hid_t);
herr_t H5Pset_edc_check(hid_t, H5Z_EDC_t);
H5Z_EDC_t H5Pget_edc_check(hid_t);
herr_t H5Pset_filter_callback(hid_t, H5Z_filter_func_t, void *);
herr_t H5Pset_btree_ratios(hid_t, double, double, double);
herr_t H5Pget_btree_ratios(hid_t, double *, double *, double *);
herr_t H5Pset_vlen_mem_manager(hid_t, H5MM_allocate_t, void *, H5MM_free_t, 
void *);
herr_t H5Pget_vlen_mem_manager(hid_t, H5MM_allocate_t *, void **, H5MM_free_t 
*, void **);
herr_t H5Pset_hyper_vector_size(hid_t, size_t);
herr_t H5Pget_hyper_vector_size(hid_t, size_t *);
herr_t H5Pset_type_conv_cb(hid_t, H5T_conv_except_func_t, void *);
herr_t H5Pget_type_conv_cb(hid_t, H5T_conv_except_func_t *, void **);

herr_t H5Pget_mpio_actual_chunk_opt_mode(hid_t, 
H5D_mpio_actual_chunk_opt_mode_t *);
herr_t H5Pget_mpio_actual_io_mode(hid_t, H5D_mpio_actual_io_mode_t *);

herr_t H5Pset_create_intermediate_group(hid_t, unsigned int);
herr_t H5Pget_create_intermediate_group(hid_t, unsigned int *);

herr_t H5Pset_local_heap_size_hint(hid_t, size_t);
herr_t H5Pget_local_heap_size_hint(hid_t, size_t *);
herr_t H5Pset_link_phase_change(hid_t, unsigned int, unsigned int);
herr_t H5Pget_link_phase_change(hid_t, unsigned int *, unsigned int *);
herr_t H5Pset_est_link_info(hid_t, unsigned int, unsigned int);
herr_t H5Pget_est_link_info(hid_t, unsigned int *, unsigned int *);
herr_t H5Pset_link_creation_order(hid_t, unsigned int);
herr_t H5Pget_link_creation_order(hid_t, unsigned int *);

herr_t H5Pset_char_encoding(hid_t, H5T_cset_t);
herr_t H5Pget_char_encoding(hid_t, H5T_cset_t *);

herr_t H5Pset_nlinks(hid_t, size_t);
herr_t H5Pget_nlinks(hid_t, size_t *);
herr_t H5Pset_elink_prefix(hid_t, const char *);
ssize_t H5Pget_elink_prefix(hid_t, char *, size_t);
hid_t H5Pget_elink_fapl(hid_t);
herr_t H5Pset_elink_fapl(hid_t, hid_t);
herr_t H5Pset_elink_acc_flags(hid_t, unsigned int);
herr_t H5Pget_elink_acc_flags(hid_t, unsigned int *);
herr_t H5Pset_elink_cb(hid_t, H5L_elink_traverse_t, void *);
herr_t H5Pget_elink_cb(hid_t, H5L_elink_traverse_t *, void **);

herr_t H5Pset_copy_object(hid_t, unsigned int);
herr_t H5Pget_copy_object(hid_t, unsigned int *);
herr_t H5Padd_merge_committed_dtype_path(hid_t, const char *);
herr_t H5Pfree_merge_committed_dtype_paths(hid_t);
herr_t H5Pset_mcdt_search_cb(hid_t, H5O_mcdt_search_cb_t, void *);
herr_t H5Pget_mcdt_search_cb(hid_t, H5O_mcdt_search_cb_t *, void **);
]]

-- If the HDF5 library has been linked to the application, use HDF5
-- symbols from default, global namespace. Otherwise, dynamically load
-- the HDF5 library into its own, non-global C library namespace.
local C
if pcall(function() return ffi.C.H5Open end) then
  C = ffi.C
else
  C = ffi.load("hdf5")
end
return C

Other related posts: